[GRASS-SVN] r43624 - grass/branches/releasebranch_6_4/vector/v.to.db
svn_grass at osgeo.org
svn_grass at osgeo.org
Wed Sep 22 14:32:27 EDT 2010
Author: neteler
Date: 2010-09-22 18:32:27 +0000 (Wed, 22 Sep 2010)
New Revision: 43624
Modified:
grass/branches/releasebranch_6_4/vector/v.to.db/description.html
grass/branches/releasebranch_6_4/vector/v.to.db/global.h
grass/branches/releasebranch_6_4/vector/v.to.db/lines.c
grass/branches/releasebranch_6_4/vector/v.to.db/parse.c
grass/branches/releasebranch_6_4/vector/v.to.db/report.c
grass/branches/releasebranch_6_4/vector/v.to.db/units.c
grass/branches/releasebranch_6_4/vector/v.to.db/update.c
Log:
backport: line azimuth support
Modified: grass/branches/releasebranch_6_4/vector/v.to.db/description.html
===================================================================
--- grass/branches/releasebranch_6_4/vector/v.to.db/description.html 2010-09-22 16:23:02 UTC (rev 43623)
+++ grass/branches/releasebranch_6_4/vector/v.to.db/description.html 2010-09-22 18:32:27 UTC (rev 43624)
@@ -4,7 +4,8 @@
table, or prints them (or the SQL queries used to obtain them) in a
form of a human-readable report. For uploaded/printed category values
'-1' is used for 'no category' and 'null'/'-' if category cannot be
-found or multiple categories were found.
+found or multiple categories were found. For line azimuths '-1' is used
+for closed lines (start equals end).
<H2>NOTES</H2>
The units <em>miles</em>, <em>feet</em>, <em>meters</em> and
@@ -20,20 +21,27 @@
When using <em>option=coor</em> on a vector area map,
only coordinates of centroids with unique category will be reported.
<p>
+Line azimuth is calculated as angle from the North direction to the line endnode
+direction at the line statnode. By default it's reported in decimal degrees (0-360, CW) but
+it also may be repored in radians with <em>unit=radians</em>. Azimuth value
+<b>-1</b> is used to report closed line with it's startnode and endnode being in
+same place. Azimuth values make sense only if every vector line has only one
+entry in database (unique CAT value).
+<p>
If the module is apparently slow <em>and</em> the map attributes are
stored in an external DBMS such as PostgreSQL, it is highly recommended
to create an index on the key (category) column.
<p>
Uploading the vector map attributes to a database requires a table attached to
a given input vector <em>layer</em>. The <b>print only</b> (<b>-p</b>) mode
-doesn't require a table. Use <em><a href=db.execute.html>db.execute</a></em>
-or <em><a href=v.db.addtable.html>v.db.addtable</a></em> to create a table if
+doesn't require a table. Use <em><a href="db.execute.html">db.execute</a></em>
+or <em><a href="v.db.addtable.html">v.db.addtable</a></em> to create a table if
needed.
<p>
Updating the table has to be done column-wise. The <em>column</em> must be
present in the table, except when using the <b>print only</b> (<b>-p</b>)
-mode. Use <em><a href=db.execute.html>db.execute</a></em> or
-<em><a href=v.db.addcol.html>v.db.addcol</a></em> to add new columns if
+mode. Use <em><a href="db.execute.html">db.execute</a></em> or
+<em><a href="v.db.addcol.html">v.db.addcol</a></em> to add new columns if
needed.
<H2>EXAMPLES</H2>
Modified: grass/branches/releasebranch_6_4/vector/v.to.db/global.h
===================================================================
--- grass/branches/releasebranch_6_4/vector/v.to.db/global.h 2010-09-22 16:23:02 UTC (rev 43623)
+++ grass/branches/releasebranch_6_4/vector/v.to.db/global.h 2010-09-22 18:32:27 UTC (rev 43624)
@@ -73,12 +73,16 @@
#define O_SINUOUS 14 /* sinuousity of a line (length / <distance between end points>) */
+#define O_AZIMUTH 15 /* line azimuth */
+
#define U_ACRES 1
#define U_HECTARES 2
#define U_KILOMETERS 3
#define U_METERS 4
#define U_MILES 5
#define U_FEET 6
+#define U_RADIANS 7
+#define U_DEGREES 8
/* areas.c */
int read_areas(struct Map_info *);
Modified: grass/branches/releasebranch_6_4/vector/v.to.db/lines.c
===================================================================
--- grass/branches/releasebranch_6_4/vector/v.to.db/lines.c 2010-09-22 16:23:02 UTC (rev 43623)
+++ grass/branches/releasebranch_6_4/vector/v.to.db/lines.c 2010-09-22 18:32:27 UTC (rev 43624)
@@ -62,7 +62,7 @@
register int line_num;
struct line_pnts *Points, *EndPoints;
struct line_cats *Cats, *LCats, *RCats;
- double len, slope, dist;
+ double len, slope, dist, dx, dy, azimuth;
/* Initialize the Point struct */
Points = Vect_new_line_struct();
@@ -192,6 +192,18 @@
EndPoints = Vect_new_line_struct();
Values[idx].d1 = len / dist;
}
+ else if (options.option == O_AZIMUTH && (type & GV_LINES)) {
+ /* Calculate azimuth between line start and end points in degrees */
+ dx = (Points->x[Points->n_points - 1] - Points->x[0]);
+ dy = (Points->y[Points->n_points - 1] - Points->y[0]);
+ /* If line is closed... */
+ if (dx == 0.0 && dy == 0.0) azimuth = -1;
+ else {
+ azimuth = atan2(dx,dy);
+ if (azimuth < 0) azimuth = azimuth + 2*M_PI;
+ }
+ Values[idx].d1 = azimuth;
+ }
found = 1;
}
Modified: grass/branches/releasebranch_6_4/vector/v.to.db/parse.c
===================================================================
--- grass/branches/releasebranch_6_4/vector/v.to.db/parse.c 2010-09-22 16:23:02 UTC (rev 43623)
+++ grass/branches/releasebranch_6_4/vector/v.to.db/parse.c 2010-09-22 18:32:27 UTC (rev 43624)
@@ -52,7 +52,7 @@
parms.option->required = YES;
parms.option->multiple = NO;
parms.option->options =
- "cat,area,compact,fd,perimeter,length,count,coor,start,end,sides,query,slope,sinuous";
+ "cat,area,compact,fd,perimeter,length,count,coor,start,end,sides,query,slope,sinuous,azimuth";
parms.option->description = _("Value to upload");
parms.option->descriptions =
"cat;insert new row for each category if doesn't exist yet;"
@@ -72,7 +72,8 @@
"query;result of a database query for all records of the geometry"
"(or geometries) from table specified by 'qlayer' option;"
"slope;slope steepness of vector line or boundary;"
- "sinuous;line sinuousity, calculated as line length / distance between end points;";
+ "sinuous;line sinuousity, calculated as line length / distance between end points;"
+ "azimuth;line azimuth, calculated as angle between North direction and endnode direction at startnode";
parms.units = G_define_option();
parms.units->key = "units";
@@ -80,10 +81,10 @@
parms.units->required = NO;
parms.units->multiple = NO;
parms.units->options =
- "mi,miles,f,feet,me,meters,k,kilometers,a,acres,h,hectares";
+ "mi,miles,f,feet,me,meters,k,kilometers,a,acres,h,hectares,r,radians,d,degrees";
parms.units->label = _("Units");
parms.units->description =
- _("mi(les),f(eet),me(ters),k(ilometers),a(cres),h(ectares)");
+ _("mi(les),f(eet),me(ters),k(ilometers),a(cres),h(ectares),r(adians),d(egrees)");
parms.col = G_define_standard_option(G_OPT_COLUMNS);
@@ -144,7 +145,7 @@
}
if (!options.print) {
- if (options.option == O_AREA || options.option == O_LENGTH || options.option == O_COUNT || options.option == O_QUERY || options.option == O_COMPACT || options.option == O_FD || options.option == O_PERIMETER || options.option == O_SLOPE || options.option == O_SINUOUS) { /* one column required */
+ if (options.option == O_AREA || options.option == O_LENGTH || options.option == O_COUNT || options.option == O_QUERY || options.option == O_COMPACT || options.option == O_FD || options.option == O_PERIMETER || options.option == O_SLOPE || options.option == O_SINUOUS || options.option == O_AZIMUTH) { /* one column required */
if (ncols != 1) {
G_fatal_error(_("This option requires one column"));
}
@@ -171,6 +172,9 @@
if (options.option == O_SINUOUS && !(options.type | GV_LINES))
G_fatal_error(_("The 'sinuous' option makes sense only for lines"));
+
+ if (options.option == O_AZIMUTH && !(options.type | GV_LINES))
+ G_fatal_error(_("The 'azimuth' option makes sense only for lines"));
return 0;
@@ -192,6 +196,10 @@
x = U_ACRES;
else if (match(s, "hectares", 1))
x = U_HECTARES;
+ else if (match(s, "radians", 1))
+ x = U_RADIANS;
+ else if (match(s, "degrees", 1))
+ x = U_DEGREES;
return x;
}
@@ -228,6 +236,8 @@
x = O_SLOPE;
else if (strcmp(s, "sinuous") == 0)
x = O_SINUOUS;
+ else if (strcmp(s, "azimuth") == 0)
+ x = O_AZIMUTH;
return x;
}
Modified: grass/branches/releasebranch_6_4/vector/v.to.db/report.c
===================================================================
--- grass/branches/releasebranch_6_4/vector/v.to.db/report.c 2010-09-22 16:23:02 UTC (rev 43623)
+++ grass/branches/releasebranch_6_4/vector/v.to.db/report.c 2010-09-22 18:32:27 UTC (rev 43624)
@@ -164,6 +164,12 @@
}
}
break;
+ case O_AZIMUTH:
+ if (G_verbose() > G_verbose_min())
+ fprintf(stdout, "cat|azimuth\n");
+ for (i = 0; i < vstat.rcat; i++)
+ fprintf(stdout, "%d|%.15g\n", Values[i].cat, Values[i].d1);
+ break;
}
return 0;
Modified: grass/branches/releasebranch_6_4/vector/v.to.db/units.c
===================================================================
--- grass/branches/releasebranch_6_4/vector/v.to.db/units.c 2010-09-22 16:23:02 UTC (rev 43623)
+++ grass/branches/releasebranch_6_4/vector/v.to.db/units.c 2010-09-22 18:32:27 UTC (rev 43624)
@@ -3,7 +3,7 @@
int conv_units()
{
- int i;
+ int i, rad = 0;
double f = 1.0, sq_f = 1.0;
switch (options.units) {
@@ -34,6 +34,12 @@
f = 3.28083989501312; /* 1 / (0.0254 * 12) */
sq_f = 10.7639104167097; /* 1 / (0.0254 * 12)^2 */
break;
+ case U_RADIANS:
+ rad = 1;
+ break;
+ case U_DEGREES:
+ rad = 0;
+ break;
}
switch (options.option) {
@@ -46,6 +52,14 @@
for (i = 0; i < vstat.rcat; i++)
Values[i].d1 *= sq_f;
break;
+ case O_AZIMUTH:
+ if (rad == 0) {
+ for (i = 0; i < vstat.rcat; i++) {
+ if (Values[i].d1 > 0)
+ Values[i].d1 = Values[i].d1*(180/M_PI);
+ }
+ }
+ break;
}
Modified: grass/branches/releasebranch_6_4/vector/v.to.db/update.c
===================================================================
--- grass/branches/releasebranch_6_4/vector/v.to.db/update.c 2010-09-22 16:23:02 UTC (rev 43623)
+++ grass/branches/releasebranch_6_4/vector/v.to.db/update.c 2010-09-22 18:32:27 UTC (rev 43624)
@@ -67,6 +67,7 @@
case O_PERIMETER:
case O_SLOPE:
case O_SINUOUS:
+ case O_AZIMUTH:
sprintf(buf1, "update %s set %s =", Fi->table, options.col[0]);
break;
case O_COOR:
@@ -102,6 +103,7 @@
case O_PERIMETER:
case O_SLOPE:
case O_SINUOUS:
+ case O_AZIMUTH:
sprintf(buf2, "%s %f where %s = %d", buf1, Values[i].d1, Fi->key,
Values[i].cat);
break;
More information about the grass-commit
mailing list