[GRASS-SVN] r68110 - grass/trunk/vector/v.select

svn_grass at osgeo.org svn_grass at osgeo.org
Tue Mar 22 13:20:16 PDT 2016


Author: mmetz
Date: 2016-03-22 13:20:16 -0700 (Tue, 22 Mar 2016)
New Revision: 68110

Modified:
   grass/trunk/vector/v.select/main.c
   grass/trunk/vector/v.select/overlap.c
   grass/trunk/vector/v.select/proto.h
   grass/trunk/vector/v.select/select.c
   grass/trunk/vector/v.select/write.c
Log:
v.select: fix reverse selection of areas

Modified: grass/trunk/vector/v.select/main.c
===================================================================
--- grass/trunk/vector/v.select/main.c	2016-03-22 18:33:32 UTC (rev 68109)
+++ grass/trunk/vector/v.select/main.c	2016-03-22 20:20:16 UTC (rev 68110)
@@ -33,6 +33,7 @@
     int itype[2], ifield[2];
 
     int *ALines; /* List of lines: 0 do not output, 1 - write to output */
+    int *AAreas; /* List of areas: 0 do not output, 1 - write area boundaries to output */
     int **cats, *ncats, *fields, nfields;
     
     struct GModule *module;
@@ -112,6 +113,9 @@
 
     /* Alloc space for input lines array */
     ALines = (int *)G_calloc(Vect_get_num_lines(&(In[0])) + 1, sizeof(int));
+    AAreas = NULL;
+    if (flag.reverse->answer)
+	AAreas = (int *)G_calloc(Vect_get_num_areas(&(In[0])) + 1, sizeof(int));
 
     /* Read field info */
     IFi = Vect_get_field(&(In[0]), ifield[0]);
@@ -133,13 +137,13 @@
                  &(In[1]), itype[1], ifield[1],
                  flag.cat->answer ? 1 : 0, operator,
                  parm.relate->answer,
-                 ALines, nskipped);
+                 ALines, AAreas, nskipped);
 #else
     select_lines(&(In[0]), itype[0], ifield[0],
                  &(In[1]), itype[1], ifield[1],
                  flag.cat->answer ? 1 : 0, operator,
                  NULL,
-                 ALines, nskipped);
+                 ALines, AAreas, nskipped);
 #endif
     
 #ifdef HAVE_GEOS
@@ -159,7 +163,7 @@
 	Vect_copy_map_dblinks(&(In[0]), &Out, TRUE);
     }
     
-    write_lines(&(In[0]), IFi, ALines,
+    write_lines(&(In[0]), IFi, ALines, AAreas,
 		&Out, flag.table->answer ? 1 : 0, flag.reverse->answer ? 1 : 0,
 		nfields, fields, ncats, cats);
 

Modified: grass/trunk/vector/v.select/overlap.c
===================================================================
--- grass/trunk/vector/v.select/overlap.c	2016-03-22 18:33:32 UTC (rev 68109)
+++ grass/trunk/vector/v.select/overlap.c	2016-03-22 20:20:16 UTC (rev 68110)
@@ -6,7 +6,7 @@
 #include "proto.h"
 
 /* Add all elements of area A to the list */
-void add_aarea(struct Map_info *In, int aarea, int *ALines)
+void add_aarea(struct Map_info *In, int aarea, int *ALines, int *AAreas)
 {
     int i, j, aline, naisles, aisle, acentroid;
     static struct ilist *BoundList = NULL;
@@ -34,6 +34,8 @@
 	    ALines[aline] = 1;
 	}
     }
+    if (AAreas)
+	AAreas[aarea] = 1;
 }
 
 /* Returns 1 if line1 from Map1 overlaps area2 from Map2,

Modified: grass/trunk/vector/v.select/proto.h
===================================================================
--- grass/trunk/vector/v.select/proto.h	2016-03-22 18:33:32 UTC (rev 68109)
+++ grass/trunk/vector/v.select/proto.h	2016-03-22 20:20:16 UTC (rev 68110)
@@ -38,14 +38,14 @@
 /* select.c */
 void select_lines(struct Map_info *, int, int,
                   struct Map_info *, int, int,
-                  int, int, const char *, int *, int*);
+                  int, int, const char *, int *, int*, int*);
 
 /* overlap.c */
-void add_aarea(struct Map_info *, int, int *);
+void add_aarea(struct Map_info *, int, int *, int *);
 int line_overlap_area(struct line_pnts *, struct Map_info *, int);
 
 /* write.c */
-void write_lines(struct Map_info *, struct field_info *, int *,
+void write_lines(struct Map_info *, struct field_info *, int *, int *,
 		 struct Map_info *, int, int,
 		 int, int *, int *, int **);
 #endif /* PROTO_H */

Modified: grass/trunk/vector/v.select/select.c
===================================================================
--- grass/trunk/vector/v.select/select.c	2016-03-22 18:33:32 UTC (rev 68109)
+++ grass/trunk/vector/v.select/select.c	2016-03-22 20:20:16 UTC (rev 68110)
@@ -9,7 +9,7 @@
 void select_lines(struct Map_info *aIn, int atype, int afield,
                   struct Map_info *bIn, int btype, int bfield,
                   int cat_flag, int operator, const char *relate,
-                  int *ALines, int* nskipped)
+                  int *ALines, int *AAreas, int* nskipped)
 {
     int i;
     int nalines, aline, ltype;
@@ -211,7 +211,7 @@
 #ifdef HAVE_GEOS
 			if(line_relate_geos(bIn, AGeom,
 					    bline, operator, relate)) {
-			    add_aarea(aIn, aarea, ALines);
+			    add_aarea(aIn, aarea, ALines, AAreas);
 			    break;
 			}
 #endif
@@ -220,7 +220,7 @@
 			Vect_read_line(bIn, BPoints, NULL, bline);
 
 			if (line_overlap_area(BPoints, aIn, aarea)) {
-			    add_aarea(aIn, aarea, ALines);
+			    add_aarea(aIn, aarea, ALines, AAreas);
 			    continue;
 			}
 		    }
@@ -310,7 +310,7 @@
 			}
 		    }
 		    if (found) {
-			add_aarea(aIn, aarea, ALines);
+			add_aarea(aIn, aarea, ALines, AAreas);
 			break;
 		    }
 		}

Modified: grass/trunk/vector/v.select/write.c
===================================================================
--- grass/trunk/vector/v.select/write.c	2016-03-22 18:33:32 UTC (rev 68109)
+++ grass/trunk/vector/v.select/write.c	2016-03-22 20:20:16 UTC (rev 68110)
@@ -2,6 +2,7 @@
 #include <grass/glocale.h>
 
 void write_lines(struct Map_info *In, struct field_info *IFi, int *ALines,
+                 int *AAreas,
 		 struct Map_info *Out, int table_flag, int reverse_flag,
 		 int nfields, int *fields, int *ncats, int **cats)
 {
@@ -27,11 +28,33 @@
     for (aline = 1; aline <= nalines; aline++) {
 	G_debug(3, "aline = %d ALines[aline] = %d", aline, ALines[aline]);
 	G_percent(aline, nalines, 2);
-	if ((!reverse_flag && !(ALines[aline])) ||
-	    (reverse_flag && ALines[aline]))
+	if ((!reverse_flag && !(ALines[aline])))
 	    continue;
 
 	atype = Vect_read_line(&(In[0]), APoints, ACats, aline);
+
+	if ((reverse_flag && ALines[aline])) {
+	    if (atype == GV_BOUNDARY && AAreas) {
+		int left, right, skipme;
+
+		skipme = 1;
+		Vect_get_line_areas(&(In[0]), aline, &left, &right);
+		if (left < 0)
+		    left = Vect_get_isle_area(&(In[0]), abs(left));
+		if (left > 0 && !AAreas[left])
+		    skipme = 0;
+		if (right < 0)
+		    right = Vect_get_isle_area(&(In[0]), abs(right));
+		if (right > 0 && !AAreas[right])
+		    skipme = 0;
+		if (skipme)
+		    continue;
+	    }
+	    else
+		continue;
+	}
+
+
 	Vect_write_line(Out, atype, APoints, ACats);
 
 	if (!table_flag && (IFi != NULL)) {



More information about the grass-commit mailing list