[GRASS-SVN] r50351 - grass-addons/grass7/vector/v.in.ply

svn_grass at osgeo.org svn_grass at osgeo.org
Sat Jan 21 08:53:22 EST 2012


Author: mmetz
Date: 2012-01-21 05:53:22 -0800 (Sat, 21 Jan 2012)
New Revision: 50351

Modified:
   grass-addons/grass7/vector/v.in.ply/header.c
   grass-addons/grass7/vector/v.in.ply/main.c
   grass-addons/grass7/vector/v.in.ply/v.in.ply.html
Log:
v.in.ply: add attribute import, update manual

Modified: grass-addons/grass7/vector/v.in.ply/header.c
===================================================================
--- grass-addons/grass7/vector/v.in.ply/header.c	2012-01-21 13:51:43 UTC (rev 50350)
+++ grass-addons/grass7/vector/v.in.ply/header.c	2012-01-21 13:53:22 UTC (rev 50351)
@@ -189,6 +189,9 @@
 	    else
 		G_fatal_error(_("Unknown PLY format <%s>!"), tokens[1]);
 	    ply->version = G_store(tokens[2]);
+	    
+	    if (ply->file_type != PLY_ASCII)
+		G_fatal_error(_("Binary PLY format is not yet supported"));
 	}
 	else if (strcmp(tokens[0], "element") == 0)
 	    add_element(ply, tokens, ntokens);

Modified: grass-addons/grass7/vector/v.in.ply/main.c
===================================================================
--- grass-addons/grass7/vector/v.in.ply/main.c	2012-01-21 13:51:43 UTC (rev 50350)
+++ grass-addons/grass7/vector/v.in.ply/main.c	2012-01-21 13:53:22 UTC (rev 50351)
@@ -30,8 +30,8 @@
 {
     struct GModule *module;
     struct Option *old, *new, *x_opt, *y_opt, *z_opt;
-    struct Flag *table_flag, *notopo_flag, *region_flag;
-    char *table;
+    struct Flag *notab_flag, *notopo_flag;
+    char *colname, buf[2000];
     int i, j, type, max_cat;
     int zcoor = WITHOUT_Z, make_table;
     int xprop, yprop, zprop;
@@ -43,6 +43,11 @@
     struct line_pnts *Points;
     struct line_cats *Cats;
 
+    /* Attributes */
+    struct field_info *Fi = NULL;
+    dbDriver *driver = NULL;
+    dbString sql;
+
     G_gisinit(argv[0]);
 
     module = G_define_module();
@@ -85,23 +90,19 @@
     z_opt->label = _("Number of vertex property used as z coordinate");
     z_opt->description = _("First vertex property is 1. If 0, z coordinate is not used");
 
-    table_flag = G_define_flag();
-    table_flag->key = 't';
-    table_flag->description = _("Do not create attribute table");
+    notab_flag = G_define_flag();
+    notab_flag->key = 't';
+    notab_flag->description = _("Do not create attribute table");
 
     notopo_flag = G_define_flag();
     notopo_flag->key = 'b';
     notopo_flag->description = _("Do not build topology");
 
-    region_flag = G_define_flag();
-    region_flag->key = 'r';
-    region_flag->description =
-	_("Only import points falling within current region (points mode)");
-    region_flag->guisection = _("Points");
-
     if (G_parser(argc, argv))
 	exit(EXIT_FAILURE);
 
+    make_table = (!notab_flag->answer); 
+
     /* coords */
     xprop = atoi(x_opt->answer);
     yprop = atoi(y_opt->answer);
@@ -140,12 +141,12 @@
     read_ply_header(&ply);
     
     for (i = 0; i < ply.n_elements; i++) {
-	G_debug(0, "element name: _%s_", ply.element[i]->name);
-	G_debug(0, "element type: %d", ply.element[i]->type);
+	G_debug(1, "element name: %s", ply.element[i]->name);
+	G_debug(1, "element type: %d", ply.element[i]->type);
 
 	for (j = 0; j < ply.element[i]->n_properties; j++) {
-	    G_debug(0, "poperty name: _%s_", ply.element[i]->property[j]->name);
-	    G_debug(0, "poperty type: %d", ply.element[i]->property[j]->type);
+	    G_debug(1, "poperty name: %s", ply.element[i]->property[j]->name);
+	    G_debug(1, "poperty type: %d", ply.element[i]->property[j]->type);
 	}
     }
     
@@ -176,6 +177,71 @@
     /* table for vertices only
      * otherwise we would need to put faces and edges into separate layers */
 
+    /* Add DB link */
+    if (make_table) {
+	db_init_string(&sql);
+
+	Fi = Vect_default_field_info(&Map, 1, NULL, GV_MTABLE);
+
+	Vect_map_add_dblink(&Map, 1, NULL, Fi->table,
+			    GV_KEY_COLUMN, Fi->database, Fi->driver);
+
+	/* Create table */
+	sprintf(buf, "create table %s (%s integer", Fi->table,
+		GV_KEY_COLUMN);
+	db_set_string(&sql, buf);
+
+	for (j = 0; j < ply.curr_element->n_properties; j++) {
+	    if (j == ply.x || j == ply.y || j == ply.z)
+		continue;
+
+	    type = ply.curr_element->property[j]->type;
+	    colname = G_store(ply.curr_element->property[j]->name);
+
+	    G_str_to_sql(colname);
+
+	    if (type == PLY_UCHAR || type == PLY_CHAR ||
+		type == PLY_USHORT || type == PLY_SHORT ||
+		type == PLY_UINT || type == PLY_INT)
+		sprintf(buf, ", %s integer", colname);
+	    else if (type == PLY_FLOAT || type == PLY_DOUBLE)
+		sprintf(buf, ", %s double precision", colname);
+
+	    G_free(colname);
+	    db_append_string(&sql, buf);
+	}
+	db_append_string(&sql, ")");
+	G_debug(3, db_get_string(&sql));
+
+	driver =
+	    db_start_driver_open_database(Fi->driver,
+					  Vect_subst_var(Fi->database,
+							 &Map));
+	if (driver == NULL) {
+	    G_fatal_error(_("Unable open database <%s> by driver <%s>"),
+			  Vect_subst_var(Fi->database, &Map), Fi->driver);
+	}
+
+	if (db_execute_immediate(driver, &sql) != DB_OK) {
+	    db_close_database(driver);
+	    db_shutdown_driver(driver);
+	    G_fatal_error(_("Unable to create table: '%s'"),
+			  db_get_string(&sql));
+	}
+
+	if (db_create_index2(driver, Fi->table, GV_KEY_COLUMN) != DB_OK)
+	    G_warning(_("Unable to create index for table <%s>, key <%s>"),
+		      Fi->table, GV_KEY_COLUMN);
+
+	if (db_grant_on_table
+	    (driver, Fi->table, DB_PRIV_SELECT,
+	     DB_GROUP | DB_PUBLIC) != DB_OK)
+	    G_fatal_error(_("Unable to grant privileges on table <%s>"),
+			  Fi->table);
+
+	db_begin_transaction(driver);
+    }
+
     /* alloc memory for vertex data */
     data = (struct prop_data *)G_realloc(data,
            sizeof(struct prop_data) * ply.curr_element->n_properties);
@@ -195,10 +261,18 @@
 	Vect_reset_cats(Cats);
 	Vect_cat_set(Cats, 1, i);
 	
+
+	/* Attributes */
+	if (make_table) {
+	    sprintf(buf, "insert into %s values ( %d", Fi->table, i);
+	    db_set_string(&sql, buf);
+	}
+
 	/* x, y, z coord */
 	for (j = 0; j < ply.curr_element->n_properties; j++) {
+	    type = ply.curr_element->property[j]->type;
+
 	    if (j == ply.x || j == ply.y || j == ply.z) {
-		type = ply.curr_element->property[j]->type;
 		coord = 0.0;
 
 		if (type == PLY_UCHAR)
@@ -220,17 +294,43 @@
 		    y = coord;
 		else if (j == ply.z)
 		    z = coord;
-		
-		
 	    }
+	    else if (make_table) {
+		/* other property, write to table */
+		if (type == PLY_UCHAR || type == PLY_CHAR ||
+		    type == PLY_USHORT || type == PLY_SHORT ||
+		    type == PLY_UINT || type == PLY_INT)
+		    sprintf(buf, ", %d", data[j].int_val);
+		else if (type == PLY_FLOAT || type == PLY_DOUBLE)
+		    sprintf(buf, ", %f", data[j].dbl_val);
+
+		db_append_string(&sql, buf);
+	    }
 	}
 	Vect_append_point(Points, x, y, z);
 	Vect_write_line(&Map, GV_POINT, Points, Cats);
 
+	if (make_table) {
+	    db_append_string(&sql, " )");
+	    G_debug(3, db_get_string(&sql));
+
+	    if (db_execute_immediate(driver, &sql) != DB_OK) {
+		db_close_database(driver);
+		db_shutdown_driver(driver);
+		G_fatal_error(_("Cannot insert new row: %s"),
+			      db_get_string(&sql));
+	    }
+	}
+
 	max_cat = i;
     }
     G_percent(1, 1, 1);
     G_free(data);
+
+    if (make_table) {
+	db_commit_transaction(driver);
+	db_close_database_shutdown_driver(driver);
+    }
     
     /* other elements */
     ply.curr_element = NULL;

Modified: grass-addons/grass7/vector/v.in.ply/v.in.ply.html
===================================================================
--- grass-addons/grass7/vector/v.in.ply/v.in.ply.html	2012-01-21 13:51:43 UTC (rev 50350)
+++ grass-addons/grass7/vector/v.in.ply/v.in.ply.html	2012-01-21 13:53:22 UTC (rev 50351)
@@ -1,286 +1,22 @@
 <h2>DESCRIPTION</h2>
 
-<em>v.in.ascii</em> converts a vector map
-in <a href="vectorascii.html">GRASS ASCII vector format</a> to a
-vector map in binary format. The module may import two formats:
-<ul>
-<li><b>standard</b> contains all data types, each coordinate on one row</li>
-<li><b>point</b> (default) reads only points, each point defined on
-  one row. Values are separated by a user-definable delimiter. If
-  the <b>columns</b> option is not defined, default names are used. It
-  is possible to specify the column order for the x,y,z coordinates
-  and category values.</li>
-</ul>
+<em>v.in.ply</em> imports a vector map in PLY vector format. A PLY 
+file always holds a number of vertices which are imported as points. PLY 
+vertices can have a number of properties in addition to their 
+coordinates. These properties are stored in an attribute table. For 
+larger PLY files with many vertices (> 1000) it is highly recommended 
+to not use dbf as database driver, but sqlite, PostgreSQL or MySQL, 
+because the dbf driver is rather slow and can consume a lot of memory. 
+The database driver can be set with <em>db.connect</em>.
 
-<p><em><a href="v.out.ascii.html">v.out.ascii</a></em> performs the
-function of <em>v.in.ascii</em> in reverse; i.e., it converts vector
-maps in binary format to GRASS ASCII vector format. These two companion programs
-are useful both for importing and exporting vector maps between GRASS
-and other software, and for transferring data between machines.
-
-<h2>NOTES</h2>
- 
-The input is read from the file specified by the <b>input</b> option or
-from standard input.
-
-<p>The field separator may be a character, the word '<tt>tab</tt>'
-(or '<tt>\t</tt>') for tab, '<tt>space</tt>' (or '&nbsp;') for a blank,
-or '<tt>comma</tt>' (or ',') for a comma.
-
-<p>An attribute table is only created if it is needed, i.e. when at
-least one attribute column is present in the input file besides
-geometry columns. The attribute column will be auto-scanned for type, but
-may be explicitly declared along with the geometry columns using the
-<b>columns</b> parameter.
-
-<p>Use the <b>-z</b> flag to convert ASCII data into a 3D vector map.
-
-<p>In special cases of data import, such as the import of large LIDAR
-datasets (millions of data points), it may be necessary to disable
-topology support (vector level 1) due to memory constraints.  This is
-done with the <b>-b</b> flag. As only very few vector modules support
-points data processing at vector level 1, usually topology is required
-(vector level 2). Therefore it is recommened that the user first try
-to import the data without creating a database (the <b>-t</b> flag) or
-within a subregion (the <b>-r</b> flag) before resorting the to
-disabling of topology.
-
-<p>If old version is requested, the <b>output</b> files
-from <em><a href="v.out.ascii.html">v.out.ascii</a></em> is placed in
-the <tt>$LOCATION/$MAPSET/dig_ascii/</tt>
-and <tt>$LOCATION/$MAPSET/dig_att</tt> directory.
-
-<h3>Import of files without category column</h3>
-
-If the input file does not contain a category column, there is the
-possibility to auto-generate these IDs (categories). To automatically
-add an additional column named 'cat', the <b>cat</b> parameter must be
-set to the virtual column number 0 (<tt>cat=0</tt>). This is the
-default action if the <b>cat</b> parameter is not set.
-
-<h3>Importing from a spreadsheet</h3>
-
-Data may be imported from many spreadsheet programs by saving the
-spreadsheet as a comma separated variable (.csv) text file, and then
-using the <b>fs=','</b> or <b>fs=comma</b> option
-with <em>v.in.ascii</em> in <b>points</b> mode.  If the input file
-contains any header lines, such as column headings, the
-<b>skip</b> parameter should be used. These skipped header lines will
-be written to the map's history file for later reference (read with
-<tt>v.info&nbsp;-h</tt>). The skip option only works in <b>points</b> mode.
-
-<p>Any line starting with the hash character ('<tt>#</tt>') will be treated as
-a comment and skipped completely if located in the main data file. If located
-in the header, as defined by the <b>skip</b> parameter, it will be treated as
-a header line and written to the history file.
-
-<h3>Import of sexagesimal degree (degree, minutes, seconds, DMS)</h3>
-
-The import of DMS formatted degrees is supported (in this case no sign
-but N/S, E/W characters are used to indicate the hemispheres).  While
-the positions are internally translated into decimal degrees during
-the import, the original DMS values are maintained in the attribute
-table. This requires both the latitude and the longitude columns to be
-defined as <tt>varchar()</tt>, not as numbers.  A warning will be
-issued which can be ignored. See <a href="vectorascii.html">GRASS
-ASCII vector format specification</a> for details.
-
-<h3>Importing only selected columns</h3>
-Although <em>v.in.ascii</em> doesn't have an option to specify which columns
-should be imported, you can use a shell filter to achieve the same effect,
-e.g.:
-
-<div class="code"><pre>
-# Print out the column number for each field, supposing the file has a header
-head -1 input_file | tr '&lt;the_field_separator_character&gt;' '\n' | cat -n
-# From the listing, select the columns you want and feed them to v.in.ascii
-# do not use the input= option
-cut -d&lt;the_field_separator_character&gt; -f&lt;comma-separated_list_of_columns&gt; input_file | v.in.ascii &lt;your_options&gt;
-</pre></div>
-
-
-<h2>EXAMPLES</h2>
-
-<h3>Example 1a) - standard format mode</h3>
-Sample ASCII polygon vector map for 'standard' format mode. 
-The two areas will be assigned categories 20 and 21. 
-<p><div class="code"><pre>
-echo "ORGANIZATION: GRASS Development Team
-DIGIT DATE:   1/9/2005
-DIGIT NAME:   -
-MAP NAME:     test
-MAP DATE:     2005
-MAP SCALE:    10000
-OTHER INFO:   Test polygons
-ZONE:  0
-MAP THRESH:   0.500000
-VERTI:
-B  6
- 5958812.48844435 3400828.84221011
- 5958957.29887089 3400877.11235229
- 5959021.65906046 3400930.7458436
- 5959048.47580612 3400973.65263665
- 5959069.92920264 3401032.64947709
- 5958812.48844435 3400828.84221011
-C  1 1
- 5958952.42189184 3400918.23126419
- 1 20
-B  4
- 5959010.9323622 3401338.36037757
- 5959096.7459483 3401370.54047235
- 5959091.38259917 3401450.99070932
- 5959010.9323622 3401338.36037757
-C  1 1
- 5959063.08352122 3401386.98533277
- 1 21" | v.in.ascii format=standard output=test_polygons
-</pre></div>
-
-<h3>Example 1b) - standard format mode</h3>
-
-Sample ASCII 3D line vector map for 'standard' format mode with simplified input
-(note the space field separator).
-Note the <b>-z</b> flag indicating 3D vector input, and the <b>-n</b> flag
-indicating no vector header should be expected from the input file.
-
-<div class="code"><pre>
-echo "L 5 1
-591336 4927369 1224
-594317 4925341 1292
-599356 4925162 1469
-602396 4926653 1235
-607524 4925431 1216
-1 321 " | v.in.ascii -zn out=line3d format=standard
-</pre></div>
-
-This can be used to create a vector line of a GPS track: the GPS points have
-to be stored into a file with a preceding 'L' and the number of points (per line).
-
-<h3>Example 2 - point format mode</h3>
-
-Generate a 2D points vector map 'coords.txt' as ASCII file:
-<div class="code"><pre>
-1664619|5103481
-1664473|5095782
-1664273|5101919
-1663427|5105234
-1663709|5102614
-</pre></div>
-
-<p>Import into GRASS:
-<div class="code"><pre>
-v.in.ascii input=coords.txt output=mymap
-</pre></div>
-As the <b>cat</b> option is set to 0 by default, an extra column 'cat'
-containing the category numbers will be auto-generated.
-
-<h3>Example 3 - point format mode</h3>
-
-Generate a 2D points vector map 'points.dat' as ASCII file:
-<div class="code"><pre>
-1|1664619|5103481|studna
-2|1664473|5095782|kadibudka
-3|1664273|5101919|hruska
-4|1663427|5105234|mysi dira
-5|1663709|5102614|mineralni pramen
-</pre></div>
-
-<p>Import into GRASS:
-<div class="code"><pre>
-cat points.dat | v.in.ascii out=mypoints x=2 y=3 cat=1 \
-    columns='cat int, x double precision, y double precision, label varchar(20)'
-</pre></div>
-
-<p>The module is reading from standard input, using the default '|' (pipe) delimiter.
-
-<h3>Example 4 - point format mode</h3>
-
-Generating a 3D points vector map from DBMS (idcol must be an integer column):<br>
-<div class="code"><pre>
-echo "select east,north,elev,idcol from mytable" | db.select -c | v.in.ascii -z out=mymap
-</pre></div>
-
-The module is reading from standard input, using the default '|' (pipe) delimiter.
-<br>
-The import works for 2D maps as well (no elev column and no '-z' flag).
-
-
-<h3>Example 5 - point format mode</h3>
-
-Generate a 3D points vector map 'points3d.dat' with attributes as ASCII file:
-<div class="code"><pre>
-593493.1|4914730.2|123.1|studna|well
-591950.2|4923000.5|222.3|kadibudka|closet
-589860.5|4922000.0|232.3|hruska|pear
-590400.5|4922820.8|143.2|mysi dira|mouse hole
-593549.3|4925500.7|442.6|mineralni pramen|mineral spring
-600375.7|4925235.6|342.2|kozi stezka|goat path
-</pre></div>
-<p>Import into GRASS:
-<div class="code"><pre>
-#As the 'cat' option is set to 0 by default, an extra column 'cat'
-#containing the IDs will be auto-generated (no need to define that):
-cat points3d.dat | v.in.ascii -z z=3 cat=0 out=mypoints3D \
-    columns='x double precision, y double precision, z double precision, \
-    label_cz varchar(20), label_en varchar(20)'
-v.info -c mypoints3D
-v.info mypoints3D
-</pre></div>
-
-
-<h3>Example 6 - point format mode</h3>
-
-Generate points file by clicking onto the map:
-<div class="code"><pre>
-#For LatLong locations:
-d.where -d -l | awk '{printf "%f|%f|point\n", $1, $2}' | v.in.ascii out=points \
-    columns='x double precision, y double precision, label varchar(20)'
-
-#For other projections:
-d.where | awk '{printf "%f|%f|point\n", $1, $2}' | v.in.ascii out=points \
-    columns='x double precision, y double precision, label varchar(20)'
-</pre></div>
-
-The 'point' string (or some similar entry) is required to generate a database table.
-When simply piping the coordinates (and optionally height) without additional column(s) 
-into <em>v.in.ascii</em>, only the vector map geometry will be generated.
-
-<h3>Example 7 - point format mode</h3>
-
-Convert ground control points into vector points:
-<div class="code"><pre>
-cat $MAPSET/group/$GROUP/POINTS | v.in.ascii out=$GROUP_gcp fs=space skip=3 \
-    col='x double precision, y double precision, x_target double precision, \
-    y_target double precision, ok int'
-</pre></div>
-
 <h2>REFERENCES</h2>
 
-<a href="sql.html">SQL command notes</a> for creating databases
+<a href="http://paulbourke.net/dataformats/ply/">http://paulbourke.net/dataformats/ply/</a>
 <br>
-<a href="vectorascii.html">GRASS ASCII vector format</a> specification
+<a href="http://www.cc.gatech.edu/projects/large_models/ply.html">http://www.cc.gatech.edu/projects/large_models/ply.html</a>
 
-<h2>SEE ALSO</h2>
-
-<em>
-<a href="db.execute.html">db.execute</a>,
-<a href="r.in.ascii.html">r.in.ascii</a>,
-<a href="r.in.xyz.html">r.in.xyz</a>,
-<a href="v.build.html">v.build</a>,
-<a href="v.build.polylines.html">v.build.polylines</a>,
-<a href="v.centroids.html">v.centroids</a>,
-<a href="v.clean.html">v.clean</a>,
-<a href="v.db.connect.html">v.db.connect</a>,
-<a href="v.info.html">v.info</a>,
-<a href="v.out.ascii.html">v.out.ascii</a>,
-</em>
-
 <h2>AUTHORS</h2>
 
-Michael Higgins,
-U.S.Army Construction Engineering 
-Research Laboratory<br>
-James Westervelt, U.S.Army Construction Engineering 
-Research Laboratory<br>
-Radim Blazek, ITC-Irst, Trento, Italy
+Markus Metz
 
 <p><i>Last changed: $Date$</i>



More information about the grass-commit mailing list