소스 검색

fix usage of vector cats in constraint (#262)

fix usage of Vect_cats_in_constraint()
Markus Metz 5 년 전
부모
커밋
8833d093e7
6개의 변경된 파일100개의 추가작업 그리고 10개의 파일을 삭제
  1. 5 0
      lib/vector/Vlib/cats.c
  2. 18 2
      vector/v.buffer/main.c
  3. 22 3
      vector/v.decimate/main.c
  4. 20 3
      vector/v.out.lidar/main.c
  5. 23 2
      vector/v.random/main.c
  6. 12 0
      vector/v.vect.stats/main.c

+ 5 - 0
lib/vector/Vlib/cats.c

@@ -659,6 +659,11 @@ struct cat_list *Vect_cats_set_constraint(struct Map_info *Map, int layer,
    \return 0 no match, categories are outside constraints
    \return 0 no match, categories are outside constraints
    \return 1 match, categories are inside constraints
    \return 1 match, categories are inside constraints
  */
  */
+/* TODO:
+ * for GRASS 8, change return type:
+ * return a list of all category numbers that match the constraints
+ * return NULL if no category number matches the constraints
+ */
 int Vect_cats_in_constraint(struct line_cats *Cats, int layer,
 int Vect_cats_in_constraint(struct line_cats *Cats, int layer,
 			      struct cat_list *list)
 			      struct cat_list *list)
 {
 {

+ 18 - 2
vector/v.buffer/main.c

@@ -527,9 +527,17 @@ int main(int argc, char *argv[])
 
 
 	    Vect_reset_cats(CCats);
 	    Vect_reset_cats(CCats);
 	    for (i = 0; i < Cats->n_cats; i++) {
 	    for (i = 0; i < Cats->n_cats; i++) {
-		if (field < 0 || Cats->field[i] == field) {
+		if (field < 0) {
 		    Vect_cat_set(CCats, Cats->field[i], Cats->cat[i]);
 		    Vect_cat_set(CCats, Cats->field[i], Cats->cat[i]);
 		}
 		}
+		else if (field > 0 && Cats->field[i] == field) {
+		    if (!cat_list) {
+			Vect_cat_set(CCats, Cats->field[i], Cats->cat[i]);
+		    }
+		    else if (Vect_cat_in_cat_list(Cats->cat[i], cat_list)) {
+			Vect_cat_set(CCats, Cats->field[i], Cats->cat[i]);
+		    }
+		}
 	    }
 	    }
 
 
 	    if (bufcol_opt->answer) {
 	    if (bufcol_opt->answer) {
@@ -630,9 +638,17 @@ int main(int argc, char *argv[])
 
 
 	    Vect_reset_cats(CCats);
 	    Vect_reset_cats(CCats);
 	    for (i = 0; i < Cats->n_cats; i++) {
 	    for (i = 0; i < Cats->n_cats; i++) {
-		if (field < 0 || Cats->field[i] == field) {
+		if (field < 0) {
 		    Vect_cat_set(CCats, Cats->field[i], Cats->cat[i]);
 		    Vect_cat_set(CCats, Cats->field[i], Cats->cat[i]);
 		}
 		}
+		else if (field > 0 && Cats->field[i] == field) {
+		    if (!cat_list) {
+			Vect_cat_set(CCats, Cats->field[i], Cats->cat[i]);
+		    }
+		    else if (Vect_cat_in_cat_list(Cats->cat[i], cat_list)) {
+			Vect_cat_set(CCats, Cats->field[i], Cats->cat[i]);
+		    }
+		}
 	    }
 	    }
 
 
 	    if (bufcol_opt->answer) {
 	    if (bufcol_opt->answer) {

+ 22 - 3
vector/v.decimate/main.c

@@ -421,7 +421,7 @@ int main(int argc, char **argv)
         /* TODO: allow zrange to be used without region */
         /* TODO: allow zrange to be used without region */
         if (use_zrange && !point_in_region_3d(&comp_region, x, y, z))
         if (use_zrange && !point_in_region_3d(&comp_region, x, y, z))
             continue;
             continue;
-        if (allowed_cats &&
+        if (layer > 0 && allowed_cats &&
             !Vect_cats_in_constraint(cats, layer, allowed_cats))
             !Vect_cats_in_constraint(cats, layer, allowed_cats))
             continue;
             continue;
 
 
@@ -436,9 +436,28 @@ int main(int argc, char **argv)
          * - some points miss category (not handled)
          * - some points miss category (not handled)
          * Here we assume that only one cat has meaning for grid decimation.
          * Here we assume that only one cat has meaning for grid decimation.
          * If no layer available, cat contains junk and shouldn't be used.
          * If no layer available, cat contains junk and shouldn't be used.
+	 * 
+	 * TODO done
          */
          */
-        if (layer > 0)
-            Vect_cat_get(cats, layer, &cat);
+	cat = -1;
+        if (layer > 0) {
+	    if (allowed_cats) {
+		int i;
+
+		for (i = 0; i < cats->n_cats; i++) {
+		    if (cats->field[i] == layer &&
+			Vect_cat_in_cat_list(cats->cat[i], allowed_cats)) {
+			cat = cats->cat[i];
+			break;
+		    }
+		}
+		return 0;
+	    }
+	    else
+		Vect_cat_get(cats, layer, &cat);
+	    if (cat < 0)
+		continue;
+	}
 
 
         /* using callback when using grid, direct call otherwise */
         /* using callback when using grid, direct call otherwise */
         if (do_grid_decimation)
         if (do_grid_decimation)

+ 20 - 3
vector/v.out.lidar/main.c

@@ -744,7 +744,7 @@ int main(int argc, char **argv)
         /* TODO: use region only when actually needed */
         /* TODO: use region only when actually needed */
         if (region_flag->answer && !point_in_region_2d(&comp_region, x, y))
         if (region_flag->answer && !point_in_region_2d(&comp_region, x, y))
             continue;
             continue;
-        if (allowed_cats &&
+        if (layer > 0 && allowed_cats &&
             !Vect_cats_in_constraint(cats, layer, allowed_cats))
             !Vect_cats_in_constraint(cats, layer, allowed_cats))
             continue;
             continue;
 
 
@@ -755,9 +755,26 @@ int main(int argc, char **argv)
          * - some points miss category (not handled)
          * - some points miss category (not handled)
          * Here we assume that there is only one set of attributes for one point.
          * Here we assume that there is only one set of attributes for one point.
          * If no layer available, cat contains junk and shouldn't be used.
          * If no layer available, cat contains junk and shouldn't be used.
+	 * 
+	 * TODO: done
          */
          */
-        if (layer > 0)
-            Vect_cat_get(cats, layer, &cat);
+	cat = -1;
+        if (layer > 0) {
+	    if (allowed_cats) {
+		int i;
+
+		for (i = 0; i < cats->n_cats; i++) {
+		    if (cats->field[i] == layer &&
+			Vect_cat_in_cat_list(cats->cat[i], allowed_cats)) {
+			cat = cats->cat[i];
+			break;
+		    }
+		}
+	    }
+	    else {
+		Vect_cat_get(cats, layer, &cat);
+	    }
+	}
 
 
         write_point(&write_context, cat, x, y, z, cats);
         write_point(&write_context, cat, x, y, z, cats);
     }
     }

+ 23 - 2
vector/v.random/main.c

@@ -192,6 +192,7 @@ int main(int argc, char *argv[])
     output = parm.output->answer;
     output = parm.output->answer;
     n = strtoul(parm.nsites->answer, NULL, 10);
     n = strtoul(parm.nsites->answer, NULL, 10);
 
 
+    seed = 0;
     if(parm.seed->answer)
     if(parm.seed->answer)
         seed = atoi(parm.seed->answer);
         seed = atoi(parm.seed->answer);
 
 
@@ -234,6 +235,11 @@ int main(int argc, char *argv[])
     /* Do we need to write random values into attribute table? */
     /* Do we need to write random values into attribute table? */
     usefloat = -1;
     usefloat = -1;
     notable = !(parm.zcol->answer || (parm.input -> answer && field > 0));
     notable = !(parm.zcol->answer || (parm.input -> answer && field > 0));
+    driver = NULL;
+    driver_input = NULL;
+    Fi = NULL;
+    Fi_input = NULL;
+    ncols = 0;
     if (!notable) {
     if (!notable) {
 	Fi = Vect_default_field_info(&Out, 1, NULL, GV_1TABLE);
 	Fi = Vect_default_field_info(&Out, 1, NULL, GV_1TABLE);
 	driver =
 	driver =
@@ -471,8 +477,23 @@ int main(int argc, char *argv[])
 	    if (bbox.N > box.N)
 	    if (bbox.N > box.N)
 		bbox.N = box.N;
 		bbox.N = box.N;
 
 
-            if (field > 0)
-                Vect_cat_get(Cats, field, &cat_area);
+	    cat_area = -1;
+            if (field > 0) {
+		if (cat_list) {
+		    for (i = 0; i < Cats->n_cats; i++) {
+			if (Cats->field[i] == field &&
+			    Vect_cat_in_cat_list(Cats->cat[i], cat_list)) {
+			    cat_area = Cats->cat[i];
+			    break;
+			}
+		    }
+		}
+		else {
+		    Vect_cat_get(Cats, field, &cat_area);
+		}
+		if (cat_area < 0)
+		    continue;
+	    }
 
 
 	    for (i = 0; i < n; ++i) {
 	    for (i = 0; i < n; ++i) {
 		double x, y, z;
 		double x, y, z;

+ 12 - 0
vector/v.vect.stats/main.c

@@ -483,6 +483,9 @@ int main(int argc, char *argv[])
 	for (i = 0; i < ACats->n_cats; i++) {
 	for (i = 0; i < ACats->n_cats; i++) {
 
 
 	    if (ACats->field[i] == area_field) {
 	    if (ACats->field[i] == area_field) {
+		if (acat_list && !Vect_cat_in_cat_list(ACats->cat[i], acat_list)) {
+		    continue;
+		}
 		Area_cat[nacats].area_cat = ACats->cat[i];
 		Area_cat[nacats].area_cat = ACats->cat[i];
 		Area_cat[nacats].count = 0;
 		Area_cat[nacats].count = 0;
 		Area_cat[nacats].nvalues = 0;
 		Area_cat[nacats].nvalues = 0;
@@ -581,6 +584,10 @@ int main(int argc, char *argv[])
 		    tmp_cat = -1;
 		    tmp_cat = -1;
 		    for (j = 0; j < PCats->n_cats; j++) {
 		    for (j = 0; j < PCats->n_cats; j++) {
 			if (PCats->field[j] == point_field) {
 			if (PCats->field[j] == point_field) {
+			    if (pcat_list && !Vect_cat_in_cat_list(PCats->cat[j], pcat_list)) {
+				continue;
+			    }
+
 			    if (tmp_cat >= 0)
 			    if (tmp_cat >= 0)
 				G_debug(3,
 				G_debug(3,
 					"More cats found in point layer (point=%d)",
 					"More cats found in point layer (point=%d)",
@@ -623,6 +630,11 @@ int main(int argc, char *argv[])
 		search_ai.area_cat = -1;
 		search_ai.area_cat = -1;
 		for (j = 0; j < ACats->n_cats; j++) {
 		for (j = 0; j < ACats->n_cats; j++) {
 		    if (ACats->field[j] == area_field) {
 		    if (ACats->field[j] == area_field) {
+			if (acat_list && !Vect_cat_in_cat_list(ACats->cat[j], acat_list)) {
+			    continue;
+			}
+
+
 			if (search_ai.area_cat >= 0)
 			if (search_ai.area_cat >= 0)
 			    G_debug(3,
 			    G_debug(3,
 				    "More cats found in area layer (area=%d)",
 				    "More cats found in area layer (area=%d)",