[GRASS-SVN] r63532 - in grass/branches/releasebranch_7_0: . vector/v.proj
svn_grass at osgeo.org
svn_grass at osgeo.org
Sat Dec 13 15:40:06 PST 2014
Author: neteler
Date: 2014-12-13 15:40:06 -0800 (Sat, 13 Dec 2014)
New Revision: 63532
Modified:
grass/branches/releasebranch_7_0/
grass/branches/releasebranch_7_0/vector/v.proj/main.c
Log:
v.proj: add line densification (trunk, r63307)
Property changes on: grass/branches/releasebranch_7_0
___________________________________________________________________
Modified: svn:mergeinfo
- /grass/trunk:60817,61096,61141,61994,62105,62179-62180,62182,62403,62422,62424,62437,62466,62469,62487,62491,62494,62501,62506,62508-62509,62515,62518-62519,62521,62526,62533,62539,62541,62555,62562,62566,62570,62573,62575,62585,62588,62597,62603,62606,62608-62609,62614,62618,62628,62632,62638,62642,62648-62649,62652,62654-62657,62666,62691,62705,62709,62723,62730,62739,62741,62743,62746,62750,62752,62757,62762,62785,62798,62800-62801,62803,62805,62812,62822,62824,62831,62838,62847,62850,62856,62879,62881,62886,62904,62907-62908,62910,62912,62914,62916,62918,62920,62925,62932-62933,62935,62940,62942,62944-62946,62949,62955-62956,62958,62960,62962,62964,62966-62968,62970,62973,62975,62977,62981,62983,62985,62987,62989,62991,62993,62995,62997,62999-63000,63003,63005,63007,63009,63011,63013,63015,63017,63020,63022,63024,63026,63028-63031,63033,63035,63037,63040,63043-63044,63047,63049,63051,63053,63055,63057,63060,63062-63064,63066,63068,63070-63071,63074,63076,63079,63081,
63083,63085,63087,63089,63091,63093,63095,63098,63100,63102,63105,63107,63109,63111,63113-63114,63116,63119,63121,63123,63125,63130,63132-63133,63135,63137,63140,63143,63145,63147,63149,63151,63153-63154,63157,63160,63165,63170,63173,63175,63187,63192-63193,63196,63199-63200,63202,63209,63216,63220-63221,63224,63227,63240,63246,63250,63255,63259,63261,63276,63279,63281,63283,63287,63290,63292,63302,63315,63319,63330,63332,63339,63342,63345,63362,63367,63391,63393,63408-63409,63416-63417,63425,63427,63429,63431,63433,63451,63453,63457,63459,63473,63482,63497,63505,63508,63510,63515,63524,63526
+ /grass/trunk:60817,61096,61141,61994,62105,62179-62180,62182,62403,62422,62424,62437,62466,62469,62487,62491,62494,62501,62506,62508-62509,62515,62518-62519,62521,62526,62533,62539,62541,62555,62562,62566,62570,62573,62575,62585,62588,62597,62603,62606,62608-62609,62614,62618,62628,62632,62638,62642,62648-62649,62652,62654-62657,62666,62691,62705,62709,62723,62730,62739,62741,62743,62746,62750,62752,62757,62762,62785,62798,62800-62801,62803,62805,62812,62822,62824,62831,62838,62847,62850,62856,62879,62881,62886,62904,62907-62908,62910,62912,62914,62916,62918,62920,62925,62932-62933,62935,62940,62942,62944-62946,62949,62955-62956,62958,62960,62962,62964,62966-62968,62970,62973,62975,62977,62981,62983,62985,62987,62989,62991,62993,62995,62997,62999-63000,63003,63005,63007,63009,63011,63013,63015,63017,63020,63022,63024,63026,63028-63031,63033,63035,63037,63040,63043-63044,63047,63049,63051,63053,63055,63057,63060,63062-63064,63066,63068,63070-63071,63074,63076,63079,63081,
63083,63085,63087,63089,63091,63093,63095,63098,63100,63102,63105,63107,63109,63111,63113-63114,63116,63119,63121,63123,63125,63130,63132-63133,63135,63137,63140,63143,63145,63147,63149,63151,63153-63154,63157,63160,63165,63170,63173,63175,63187,63192-63193,63196,63199-63200,63202,63209,63216,63220-63221,63224,63227,63240,63246,63250,63255,63259,63261,63276,63279,63281,63283,63287,63290,63292,63302,63307,63315,63319,63330,63332,63339,63342,63345,63362,63367,63391,63393,63408-63409,63416-63417,63425,63427,63429,63431,63433,63451,63453,63457,63459,63473,63482,63497,63505,63508,63510,63515,63524,63526
Modified: grass/branches/releasebranch_7_0/vector/v.proj/main.c
===================================================================
--- grass/branches/releasebranch_7_0/vector/v.proj/main.c 2014-12-13 21:17:16 UTC (rev 63531)
+++ grass/branches/releasebranch_7_0/vector/v.proj/main.c 2014-12-13 23:40:06 UTC (rev 63532)
@@ -44,15 +44,16 @@
const char *gbase;
char date[40], mon[4];
struct GModule *module;
- struct Option *omapopt, *mapopt, *isetopt, *ilocopt, *ibaseopt;
+ struct Option *omapopt, *mapopt, *isetopt, *ilocopt, *ibaseopt, *smax;
struct Key_Value *in_proj_keys, *in_unit_keys;
struct Key_Value *out_proj_keys, *out_unit_keys;
- struct line_pnts *Points;
+ struct line_pnts *Points, *Points2;
struct line_cats *Cats;
struct Map_info Map;
struct Map_info Out_Map;
struct bound_box src_box, tgt_box;
int nowrap = 0, recommend_nowrap = 0;
+ double lmax;
struct
{
struct Flag *list; /* list files in source location */
@@ -99,6 +100,15 @@
ibaseopt->key_desc = "path";
ibaseopt->guisection = _("Source");
+ smax = G_define_option();
+ smax->key = "smax";
+ smax->type = TYPE_DOUBLE;
+ smax->required = NO;
+ smax->answer = "10000";
+ smax->label = _("Maximum segment length in meters in output vector map");
+ smax->description = _("Increases accuracy of reprojected shapes, disable with smax=0");
+ smax->guisection = _("Target");
+
omapopt = G_define_standard_option(G_OPT_V_OUTPUT);
omapopt->required = NO;
omapopt->description = _("Name for output vector map (default: input)");
@@ -157,9 +167,15 @@
if (!ibaseopt->answer && strcmp(iloc_name, G_location()) == 0)
G_fatal_error(_("Input and output locations can not be the same"));
+ lmax = atof(smax->answer);
+ if (lmax < 0)
+ lmax = 0;
+
Out_proj = G_projection();
if (Out_proj == PROJECTION_LL && flag.wrap->answer)
nowrap = 1;
+
+ G_begin_distance_calculations();
/* Change the location here and then come back */
@@ -258,6 +274,7 @@
/* Initialize the Point / Cat structure */
Points = Vect_new_line_struct();
+ Points2 = Vect_new_line_struct();
Cats = Vect_new_cats_struct();
/* test if latlon wrapping to -180,180 should be disabled */
@@ -380,6 +397,10 @@
sprintf(date, "%s %d %d", mon, day, yr);
Vect_set_date(&Out_Map, date);
+ /* line densification works only with vector topology */
+ if (Map.format != GV_FORMAT_NATIVE)
+ lmax = 0;
+
/* Cycle through all lines */
Vect_rewind(&Map);
i = 0;
@@ -395,14 +416,84 @@
G_fatal_error(_("Reading input vector map"));
if (type == -2)
break;
- if (pj_do_transform(Points->n_points, Points->x, Points->y,
- flag.transformz->answer ? Points->z : NULL,
- &info_in, &info_out) < 0) {
- G_fatal_error(_("Unable to re-project vector map <%s> from <%s>"),
- Vect_get_full_name(&Map), ilocopt->answer);
+
+ Vect_line_prune(Points);
+ if (lmax > 0 && (type & GV_LINES) && Points->n_points > 1) {
+ double x1, y1, z1, x2, y2, z2;
+ double dx, dy, dz;
+ double l;
+ int i, n;
+
+ Vect_reset_line(Points2);
+ for (i = 0; i < Points->n_points - 1; i++) {
+ x1 = Points->x[i];
+ y1 = Points->y[i];
+ z1 = Points->z[i];
+ n = i + 1;
+ x2 = Points->x[n];
+ y2 = Points->y[n];
+ z2 = Points->z[n];
+
+ dx = x2 - x1;
+ dy = y2 - y1;
+ dz = z2 - z1;
+
+ if (pj_do_transform(1, &x1, &y1,
+ flag.transformz->answer ? &z1 : NULL,
+ &info_in, &info_out) < 0) {
+ G_fatal_error(_("Unable to re-project vector map <%s> from <%s>"),
+ Vect_get_full_name(&Map), ilocopt->answer);
+ }
+
+ if (pj_do_transform(1, &x2, &y2,
+ flag.transformz->answer ? &z2 : NULL,
+ &info_in, &info_out) < 0) {
+ G_fatal_error(_("Unable to re-project vector map <%s> from <%s>"),
+ Vect_get_full_name(&Map), ilocopt->answer);
+ }
+
+ Vect_append_point(Points2, x1, y1, z1);
+
+ l = G_distance(x1, y1, x2, y2);
+
+ if (l > lmax) {
+ int j;
+ double x, y, z;
+
+ x1 = Points->x[i];
+ y1 = Points->y[i];
+ z1 = Points->z[i];
+
+ n = ceil(l / lmax);
+
+ for (j = 1; j < n; j++) {
+ x = x1 + dx * j / n;
+ y = y1 + dy * j / n;
+ z = z1 + dz * j / n;
+
+ if (pj_do_transform(1, &x, &y,
+ flag.transformz->answer ? &z : NULL,
+ &info_in, &info_out) < 0) {
+ G_fatal_error(_("Unable to re-project vector map <%s> from <%s>"),
+ Vect_get_full_name(&Map), ilocopt->answer);
+ }
+ Vect_append_point(Points2, x, y, z);
+ }
+ }
+ }
+ Vect_append_point(Points2, x2, y2, z2);
+ Vect_write_line(&Out_Map, type, Points2, Cats); /* write line */
}
+ else {
+ if (pj_do_transform(Points->n_points, Points->x, Points->y,
+ flag.transformz->answer ? Points->z : NULL,
+ &info_in, &info_out) < 0) {
+ G_fatal_error(_("Unable to re-project vector map <%s> from <%s>"),
+ Vect_get_full_name(&Map), ilocopt->answer);
+ }
- Vect_write_line(&Out_Map, type, Points, Cats); /* write line */
+ Vect_write_line(&Out_Map, type, Points, Cats); /* write line */
+ }
} /* end lines section */
G_progress(1, 1);
More information about the grass-commit
mailing list