Verifica topologica con PostGIS

classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|

Verifica topologica con PostGIS

Massimiliano Moraca
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/
_______________________________________________
[hidden email]
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
Consulente GIS, Formatore, Blogger e Ciclista Urbano email: info@massimilianomoraca.it cell: 333 5949583 (lun-ven, 9.00-18.00) website: massimilianomoraca.it
Reply | Threaded
Open this post in threaded view
|

Re: Verifica topologica con PostGIS

francesco marucci-2
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 <
[hidden email]> 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...
>
>
>
_______________________________________________
[hidden email]
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
Reply | Threaded
Open this post in threaded view
|

Re: Verifica topologica con PostGIS

Massimiliano Moraca
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 <
[hidden email]> 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 <
> [hidden email]> 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...
> >
> >
> >
> _______________________________________________
> [hidden email]
> 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
_______________________________________________
[hidden email]
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
Consulente GIS, Formatore, Blogger e Ciclista Urbano email: info@massimilianomoraca.it cell: 333 5949583 (lun-ven, 9.00-18.00) website: massimilianomoraca.it
Reply | Threaded
Open this post in threaded view
|

Re: Verifica topologica con PostGIS

francesco marucci-2
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 <
[hidden email]> 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 <
> [hidden email]> 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 <
>> [hidden email]> 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...
>> >
>> >
>> >
>> _______________________________________________
>> [hidden email]
>> 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
>
>
>
_______________________________________________
[hidden email]
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
Reply | Threaded
Open this post in threaded view
|

Re: Verifica topologica con PostGIS

Massimiliano Moraca
Era proprio questo che cercavo, grazie e buona domenica :)

Il giorno 4 febbraio 2018 13:26, francesco marucci <
[hidden email]> 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 <
> [hidden email]> 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 <
>> [hidden email]> 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 <
>>> [hidden email]> 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...
>>> >
>>> >
>>> >
>>> _______________________________________________
>>> [hidden email]
>>> 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
>>
>>
>>
>
_______________________________________________
[hidden email]
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
Consulente GIS, Formatore, Blogger e Ciclista Urbano email: info@massimilianomoraca.it cell: 333 5949583 (lun-ven, 9.00-18.00) website: massimilianomoraca.it