[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 ' ') 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 -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 '<the_field_separator_character>' '\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<the_field_separator_character> -f<comma-separated_list_of_columns> input_file | v.in.ascii <your_options>
-</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