Skip to content

Commit

Permalink
fix usage of vector cats in constraint (#262)
Browse files Browse the repository at this point in the history
fix usage of Vect_cats_in_constraint()
  • Loading branch information
metzm committed Jan 5, 2020
1 parent 20b2d91 commit df6b90d
Show file tree
Hide file tree
Showing 6 changed files with 100 additions and 10 deletions.
5 changes: 5 additions & 0 deletions lib/vector/Vlib/cats.c
Expand Up @@ -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 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,
struct cat_list *list)
{
Expand Down
20 changes: 18 additions & 2 deletions vector/v.buffer/main.c
Expand Up @@ -527,9 +527,17 @@ int main(int argc, char *argv[])

Vect_reset_cats(CCats);
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]);
}
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) {
Expand Down Expand Up @@ -630,9 +638,17 @@ int main(int argc, char *argv[])

Vect_reset_cats(CCats);
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]);
}
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) {
Expand Down
25 changes: 22 additions & 3 deletions vector/v.decimate/main.c
Expand Up @@ -421,7 +421,7 @@ int main(int argc, char **argv)
/* TODO: allow zrange to be used without region */
if (use_zrange && !point_in_region_3d(&comp_region, x, y, z))
continue;
if (allowed_cats &&
if (layer > 0 && allowed_cats &&
!Vect_cats_in_constraint(cats, layer, allowed_cats))
continue;

Expand All @@ -436,9 +436,28 @@ int main(int argc, char **argv)
* - some points miss category (not handled)
* Here we assume that only one cat has meaning for grid decimation.
* 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 */
if (do_grid_decimation)
Expand Down
23 changes: 20 additions & 3 deletions vector/v.out.lidar/main.c
Expand Up @@ -744,7 +744,7 @@ int main(int argc, char **argv)
/* TODO: use region only when actually needed */
if (region_flag->answer && !point_in_region_2d(&comp_region, x, y))
continue;
if (allowed_cats &&
if (layer > 0 && allowed_cats &&
!Vect_cats_in_constraint(cats, layer, allowed_cats))
continue;

Expand All @@ -755,9 +755,26 @@ int main(int argc, char **argv)
* - some points miss category (not handled)
* 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.
*
* 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);
}
Expand Down
25 changes: 23 additions & 2 deletions vector/v.random/main.c
Expand Up @@ -192,6 +192,7 @@ int main(int argc, char *argv[])
output = parm.output->answer;
n = strtoul(parm.nsites->answer, NULL, 10);

seed = 0;
if(parm.seed->answer)
seed = atoi(parm.seed->answer);

Expand Down Expand Up @@ -234,6 +235,11 @@ int main(int argc, char *argv[])
/* Do we need to write random values into attribute table? */
usefloat = -1;
notable = !(parm.zcol->answer || (parm.input -> answer && field > 0));
driver = NULL;
driver_input = NULL;
Fi = NULL;
Fi_input = NULL;
ncols = 0;
if (!notable) {
Fi = Vect_default_field_info(&Out, 1, NULL, GV_1TABLE);
driver =
Expand Down Expand Up @@ -471,8 +477,23 @@ int main(int argc, char *argv[])
if (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) {
double x, y, z;
Expand Down
12 changes: 12 additions & 0 deletions vector/v.vect.stats/main.c
Expand Up @@ -483,6 +483,9 @@ int main(int argc, char *argv[])
for (i = 0; i < ACats->n_cats; i++) {

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].count = 0;
Area_cat[nacats].nvalues = 0;
Expand Down Expand Up @@ -581,6 +584,10 @@ int main(int argc, char *argv[])
tmp_cat = -1;
for (j = 0; j < PCats->n_cats; j++) {
if (PCats->field[j] == point_field) {
if (pcat_list && !Vect_cat_in_cat_list(PCats->cat[j], pcat_list)) {
continue;
}

if (tmp_cat >= 0)
G_debug(3,
"More cats found in point layer (point=%d)",
Expand Down Expand Up @@ -623,6 +630,11 @@ int main(int argc, char *argv[])
search_ai.area_cat = -1;
for (j = 0; j < ACats->n_cats; j++) {
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)
G_debug(3,
"More cats found in area layer (area=%d)",
Expand Down

0 comments on commit df6b90d

Please sign in to comment.