Opened 5 years ago

Last modified 4 years ago

#3694 new defect

WHERE statement in v.generalize do not work

Reported by: BastienFR Owned by: grass-dev@…
Priority: normal Milestone: 7.8.3
Component: Default Version: 7.4.1
Keywords: v.generalize Cc:
CPU: x86-64 Platform: MSWindows

Description

The WHERE statement from v.generalize do not seem to work anymore.

A good description of the problem was done at:

https://gis.stackexchange.com/questions/301858/cannot-manage-to-get-the-where-statement-to-work-in-v-generalize

Another example:

The attached shape was produced in R with:

library(sf)
library(dplyr)

# preparing the shapefile
nc <- st_read(system.file("gpkg/nc.gpkg", package="sf"), quiet = TRUE) %>% 
  mutate(CNTY = as.numeric(CNTY_<median(CNTY_))) %>% 
  select(CNTY) %>% 
  st_transform(st_crs(2264)) %>% 
  st_write("d:/temp/NC_test.shp")

Using QGIS to call v.generalize (the same problem happens in grass directly, however I prefer working directly in QGIS):

C:\OSGEO4~1\bin>v.generalize input=vector_5beaccc5750337 type="line,boundary,area" where="CNTY<1" method="douglas" threshold=15000 look_ahead=7 reduction=50 slide=0.5 angle_thresh=3 degree_thresh=0 closeness_thresh=0 betweeness_thresh=0 alpha=1 beta=1 iterations=1 -l output=outputdc6669bcd1974052b171ef4c11d51846 error=errordc6669bcd1974052b171ef4c11d51846 --overwrite

I get generalization over all the territory and not just limited to the polygons where CNTY<1

(see image attached)

Attachments (5)

Capture.PNG (113.3 KB ) - added by BastienFR 5 years ago.
result_image
NC_test.dbf (2.5 KB ) - added by BastienFR 5 years ago.
NC_test.dbf
NC_test.prj (498 bytes ) - added by BastienFR 5 years ago.
prj
NC_test.shp (45.1 KB ) - added by BastienFR 5 years ago.
shp
NC_test.shx (900 bytes ) - added by BastienFR 5 years ago.
shx

Download all attachments as: .zip

Change History (10)

by BastienFR, 5 years ago

Attachment: Capture.PNG added

result_image

by BastienFR, 5 years ago

Attachment: NC_test.dbf added

NC_test.dbf

by BastienFR, 5 years ago

Attachment: NC_test.prj added

prj

by BastienFR, 5 years ago

Attachment: NC_test.shp added

shp

by BastienFR, 5 years ago

Attachment: NC_test.shx added

shx

in reply to:  description ; comment:1 by mmetz, 5 years ago

Replying to BastienFR:

The WHERE statement from v.generalize do not seem to work anymore.

Looking at the manual G7:v.generalize:

layer=string

Layer number or name ('-1' for all layers)

A single vector map can be connected to multiple database tables. This number determines which table to use. When used with direct OGR access this is the layer name.

Default: -1

By default all layers are processed, in which case the cats and where options are ignored because they require a single layer to be selected.

Results are as expected when using v.generalize layer=1 where="CNTY<1" ....

Note that a boundary is generalized as soon as any of the areas it belongs to fulfils the where condition. In a topological vector model as in GRASS, the modification of a single boundary results in the modification of two areas.

in reply to:  1 comment:2 by mmetz, 5 years ago

Replying to mmetz:

Replying to BastienFR:

The WHERE statement from v.generalize do not seem to work anymore.

Looking at the manual G7:v.generalize:

layer=string

Layer number or name ('-1' for all layers)

A single vector map can be connected to multiple database tables. This number determines which table to use. When used with direct OGR access this is the layer name.

Default: -1

By default all layers are processed, in which case the cats and where options are ignored because they require a single layer to be selected.

FWIW, I have added a warning in trunk r73673 if the cats and where options are ignored.

The QGIS interface description for v.generalize needs to be fixed to use layer=1.

comment:3 by BastienFR, 5 years ago

Thanks for your answer. I did try with the good option layer=1 directly in GRASS and it worked as expected. I'll update my question on StackExchange to give the answer (or if you want to do it, I'll accept your answer).

However, note that your tutorial do not state that properly (https://grasswiki.osgeo.org/wiki/V.generalize_tutorial#Gereneral_Parameters). There is no layer option in the call given. v.generalize -c input=roads output=roads_douglas_reduction2 method=douglas_reduction threshold=0 reduction=50 type=line where="cat<3"

The fact the the QGIS v.generalize tool do not allow to set the layer option even if allowing setting the WHERE statement, how or where should we document the problem so it's fix there?

in reply to:  3 comment:4 by mmetz, 5 years ago

Replying to BastienFR:

Thanks for your answer. I did try with the good option layer=1 directly in GRASS and it worked as expected. I'll update my question on StackExchange to give the answer (or if you want to do it, I'll accept your answer).

You can update your question to give the answer, maybe with a link to the manual and the (by now updated) tutorial ;-)

However, note that your tutorial do not state that properly (https://grasswiki.osgeo.org/wiki/V.generalize_tutorial#Gereneral_Parameters). There is no layer option in the call given.

v.generalize -c input=roads output=roads_douglas_reduction2 method=douglas_reduction threshold=0 reduction=50 type=line where="cat<3"

Thanks for pointing this out, now fixed.

The tutorial has been written for the initial version of v.generalize where the default answer for the layer option was 1. The default has been changed from 1 to -1 (all layers) in r39888 (9 years ago).

The fact the the QGIS v.generalize tool do not allow to set the layer option even if allowing setting the WHERE statement, how or where should we document the problem so it's fix there?

The QGIS interface description for v.generalize needs to have layer=1 hard-coded (not a user-option).

comment:5 by neteler, 4 years ago

Milestone: 7.8.3
Note: See TracTickets for help on using tickets.