[Gfoss] Verifica topologica con PostGIS

Buongiorno e buona domenica a tutti. Sto cercando di effettuare un clip tra
due vettori poligonali in PostGIS. Ho usato questa sintassi:

/SELECT
ST_Intersection(a1.geometry, a2.geometry) as geometry,
a2.class_new as cuas_code,
a2.label as cuas_descr
FROM ambito as a1, cuas09_select as a2
WHERE ST_Intersects(a1.geometry, a2.geometry);/

E mi è stato restituito questo messaggio:

/ERROR: ERRORE: Error performing intersection: TopologyException: Input geom
1 is invalid: Ring Self-intersection at or near point 459149.46875 4514388.5
at 459149.46875 4514388.5

SQL state: XX000/

Mi è chiaro che devo fare una verifica topologica del vettore a2, a1 è un
rettangolo, ma non ricordo quale è la sintassi da usare per verificare se
nel vettore ci sono gap e overlay.

Qualcuno lo sa?

Ricordo che per validare le geometrie si usa ST_IsValid e ST_MakeValid ma ho
il vuoto per gap e overlay...

Cercando in giro ho applicato questo:

/select ogc_fid, ST_IsValidReason(geometry) from cuas09_select where not
ST_IsValid(geometry);/

Mi ha restituito un elenco di coordinate "problematiche" (es. Ring
Self-intersection[459149.46875 4514388.5]) che ho convertito in tabella,
esportato in csv e reimportato in QGIS come punti. Ho notato però che
nemmeno se vado oltre al 200:1 si notano buchi...

-----
Ingegnere, consulente GIS e ciclista urbano
--
Sent from: http://gfoss-geographic-free-and-open-source-software-italian-mailing.3056002.n2.nabble.com/

ciao Massimiliano,
perché parli di "buchi"'?

postgis ti sta dicendo che sul layer "cuas09_select" trova delle
self-intersection, affettuosamente chiamate farfalline, nodini sugli spigoli
.
se sono tante e tutte veramente molto "piccole" potresti provare ad
effettuare una semplificazione con ST_Snaptogrid.
altrimenti in questi casi anche ST_MakeValid funziona bene.

saluti,
francesco

Il giorno 4 febbraio 2018 08:51, Massimiliano Moraca <
massimilianomoraca@gmail.com> ha scritto:

/ERROR: ERRORE: Error performing intersection: TopologyException: Input
geom
1 is invalid: Ring Self-intersection at or near point 459149.46875
4514388.5
at 459149.46875 4514388.5

...

Mi ha restituito un elenco di coordinate "problematiche" (es. Ring
Self-intersection[459149.46875 4514388.5]) che ho convertito in tabella,
esportato in csv e reimportato in QGIS come punti. Ho notato però che
nemmeno se vado oltre al 200:1 si notano buchi...

Grazie mille Francesco, mi ha confuso la dicitura Ring Self-intersection.
Ho fatto come hai detto ed effettivamente ho risolto.

Resta però la curiosità di quale è la giusta sintassi per individuare gap e
overlay. Tu lo sai?

Il giorno 4 febbraio 2018 12:08, francesco marucci <
francesco.marucci@gmail.com> ha scritto:

ciao Massimiliano,
perché parli di "buchi"'?

postgis ti sta dicendo che sul layer "cuas09_select" trova delle
self-intersection, affettuosamente chiamate farfalline, nodini sugli
spigoli
.
se sono tante e tutte veramente molto "piccole" potresti provare ad
effettuare una semplificazione con ST_Snaptogrid.
altrimenti in questi casi anche ST_MakeValid funziona bene.

saluti,
francesco

Il giorno 4 febbraio 2018 08:51, Massimiliano Moraca <
massimilianomoraca@gmail.com> ha scritto:

>
>
> /ERROR: ERRORE: Error performing intersection: TopologyException: Input
> geom
> 1 is invalid: Ring Self-intersection at or near point 459149.46875
> 4514388.5
> at 459149.46875 4514388.5
>
> ...
>
> Mi ha restituito un elenco di coordinate "problematiche" (es. Ring
> Self-intersection[459149.46875 4514388.5]) che ho convertito in tabella,
> esportato in csv e reimportato in QGIS come punti. Ho notato però che
> nemmeno se vado oltre al 200:1 si notano buchi...
>
>
>
_______________________________________________
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni
dell'Associazione GFOSS.it.
796 iscritti al 28/12/2017

ciao,
immagino che la tua esigenza si quella di trovare eventuali overlay tra
poligoni appartenenti allo stesso layer, giusto?
in questo caso questo potrebbe aiutarti (un intersect con se stesso):

select g1.gid, g2.gid,
from cuas09_select g1
left join cuas09_select g2 on st_intersects(g1.geom,g2.geom)
where g1.gid <> g2.gid and st_area(st_intersection(g1.geom,g2.geom))>0.0001

(riduci o amplia quel 0.0001 a seconda della precisione del tuo layer)

per quanto riguarda quelli che tu chiami "gap", immagino che intendi quei
"buchi" tra un poligono e l'altro che non ti rendono il tuo layer a
copertura continua, giusto?

facendo questa query e salvandola in una vista geometrica:

select row_number() over() as gid, (gaps.geom).geom
from (
select ST_Dump(ST_Difference(
   (select ST_Setsrid(ST_Extent(geom),4326)::geometry geom from
cuas09_select),
   (select ST_Union(geom) from cuas09_select)
)) as geom) as gaps;

(devi cambiare l'srs del layer)

riesci ad avere dei poligoni interni che ti aiutano a trovare i gap
"interni" (oltre a quelli esterni che invece hanno senso di esistere).

facci sapere.

saluti,
francesco

Il giorno 4 febbraio 2018 12:14, Massimiliano Moraca <
massimilianomoraca@gmail.com> ha scritto:

Grazie mille Francesco, mi ha confuso la dicitura Ring
Self-intersection. Ho fatto come hai detto ed effettivamente ho risolto.

Resta però la curiosità di quale è la giusta sintassi per individuare gap
e overlay. Tu lo sai?

Il giorno 4 febbraio 2018 12:08, francesco marucci <
francesco.marucci@gmail.com> ha scritto:

ciao Massimiliano,
perché parli di "buchi"'?

postgis ti sta dicendo che sul layer "cuas09_select" trova delle
self-intersection, affettuosamente chiamate farfalline, nodini sugli
spigoli
.
se sono tante e tutte veramente molto "piccole" potresti provare ad
effettuare una semplificazione con ST_Snaptogrid.
altrimenti in questi casi anche ST_MakeValid funziona bene.

saluti,
francesco

Il giorno 4 febbraio 2018 08:51, Massimiliano Moraca <
massimilianomoraca@gmail.com> ha scritto:

>
>
> /ERROR: ERRORE: Error performing intersection: TopologyException: Input
> geom
> 1 is invalid: Ring Self-intersection at or near point 459149.46875
> 4514388.5
> at 459149.46875 4514388.5
>
> ...
>
> Mi ha restituito un elenco di coordinate "problematiche" (es. Ring
> Self-intersection[459149.46875 4514388.5]) che ho convertito in tabella,
> esportato in csv e reimportato in QGIS come punti. Ho notato però che
> nemmeno se vado oltre al 200:1 si notano buchi...
>
>
>
_______________________________________________
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni
dell'Associazione GFOSS.it.
796 iscritti al 28/12/2017

Era proprio questo che cercavo, grazie e buona domenica :slight_smile:

Il giorno 4 febbraio 2018 13:26, francesco marucci <
francesco.marucci@gmail.com> ha scritto:

ciao,
immagino che la tua esigenza si quella di trovare eventuali overlay tra
poligoni appartenenti allo stesso layer, giusto?
in questo caso questo potrebbe aiutarti (un intersect con se stesso):

select g1.gid, g2.gid,
from cuas09_select g1
left join cuas09_select g2 on st_intersects(g1.geom,g2.geom)
where g1.gid <> g2.gid and st_area(st_intersection(g1.
geom,g2.geom))>0.0001

(riduci o amplia quel 0.0001 a seconda della precisione del tuo layer)

per quanto riguarda quelli che tu chiami "gap", immagino che intendi quei
"buchi" tra un poligono e l'altro che non ti rendono il tuo layer a
copertura continua, giusto?

facendo questa query e salvandola in una vista geometrica:

select row_number() over() as gid, (gaps.geom).geom
from (
select ST_Dump(ST_Difference(
   (select ST_Setsrid(ST_Extent(geom),4326)::geometry geom from
cuas09_select),
   (select ST_Union(geom) from cuas09_select)
)) as geom) as gaps;

(devi cambiare l'srs del layer)

riesci ad avere dei poligoni interni che ti aiutano a trovare i gap
"interni" (oltre a quelli esterni che invece hanno senso di esistere).

facci sapere.

saluti,
francesco

Il giorno 4 febbraio 2018 12:14, Massimiliano Moraca <
massimilianomoraca@gmail.com> ha scritto:

Grazie mille Francesco, mi ha confuso la dicitura Ring
Self-intersection. Ho fatto come hai detto ed effettivamente ho risolto.

Resta però la curiosità di quale è la giusta sintassi per individuare gap
e overlay. Tu lo sai?

Il giorno 4 febbraio 2018 12:08, francesco marucci <
francesco.marucci@gmail.com> ha scritto:

ciao Massimiliano,
perché parli di "buchi"'?

postgis ti sta dicendo che sul layer "cuas09_select" trova delle
self-intersection, affettuosamente chiamate farfalline, nodini sugli
spigoli
.
se sono tante e tutte veramente molto "piccole" potresti provare ad
effettuare una semplificazione con ST_Snaptogrid.
altrimenti in questi casi anche ST_MakeValid funziona bene.

saluti,
francesco

Il giorno 4 febbraio 2018 08:51, Massimiliano Moraca <
massimilianomoraca@gmail.com> ha scritto:

>
>
> /ERROR: ERRORE: Error performing intersection: TopologyException: Input
> geom
> 1 is invalid: Ring Self-intersection at or near point 459149.46875
> 4514388.5
> at 459149.46875 4514388.5
>
> ...
>
> Mi ha restituito un elenco di coordinate "problematiche" (es. Ring
> Self-intersection[459149.46875 4514388.5]) che ho convertito in
tabella,
> esportato in csv e reimportato in QGIS come punti. Ho notato però che
> nemmeno se vado oltre al 200:1 si notano buchi...
>
>
>
_______________________________________________
Gfoss@lists.gfoss.it
http://lists.gfoss.it/cgi-bin/mailman/listinfo/gfoss
Questa e' una lista di discussione pubblica aperta a tutti.
I messaggi di questa lista non hanno relazione diretta con le posizioni
dell'Associazione GFOSS.it.
796 iscritti al 28/12/2017