[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