Identificazione di poligoni "lunghi e stretti" con PostGIS


10

Ho una serie di poligoni che rappresentano grandi aree, dicono i quartieri della città. Voglio identificare le grandi aree sovrapposte tra loro.

Ma c'è un problema: a volte questi poligoni si sovrappongono lungo i loro perimetri (perché sono stati disegnati con poca precisione). Questo genererà sovrapposizioni lunghe e strette che non mi interessano.

Ma altre volte ci saranno grandi sovrapposizioni di robusti poligoni, il che significa grandi aree in cui il poligono di un quartiere si sovrappone a un altro. Voglio selezionare solo questi.

Vedi l'immagine sotto delle sole sovrapposizioni. Immagina di voler selezionare solo il poligono blu nell'angolo in basso a sinistra.

sovrapposizione

Potrei guardare le aree, ma a volte quelle strette sono così lunghe che finiscono per avere aree grandi come il poligono blu. Ho provato a fare un rapporto area / perimetro, ma questo ha anche prodotto risultati contrastanti.

Ho anche provato a usarlo ST_MinimumClearance, ma a volte le grandi aree avranno una parte stretta attaccata ad essa, o due vertici molto vicini.

Qualche idea di altri approcci?


Alla fine, ciò che ha funzionato meglio per me è stato usare un buffer negativo, come suggerito da @Cyril e @FGreg di seguito.

Ho usato qualcosa del tipo:

ST_Area(ST_Buffer(geom, -10)) as neg_buffer_area

Nel mio caso, le unità erano metri, quindi un buffer negativo di 10 m.

Per i poligoni stretti, quest'area ha restituito zero (inoltre, la geometria sarebbe vuota). Quindi ho usato questa colonna per filtrare i poligoni stretti.


4
Certamente il rapporto area / perimetro potrebbe essere usato per questo.
Vince il

È difficile dire dove siano i poligoni distinti dall'immagine, ma fare qualcosa del genere gis.stackexchange.com/a/265233/64838 potrebbe funzionare? Calcola il riquadro di delimitazione ruotato minimo, quindi scarta quelli con larghezza o altezza ridotte.
FGreg

Potresti anche provare a usare un buffer negativo come descritto qui: Come posso identificare poligoni veramente sottili nel mio file di forma?
FGreg

Risposte:


5

Proverei a creare un buffer negativo, se mangia poligoni sottili, quindi va bene, se non mangia il poligono, allora è mio ... :-)

eseguire questo script, avendo precedentemente impostato 2/3 della larghezza dei poligoni lineari ...

create table name_table as
SELECT ST_Buffer(
(ST_Dump(
(ST_Union(
ST_Buffer(
(geom),-0.0001))))).geom,
0.0001)) as geom from source_table

OS: -) ...


alla fine il tuo suggerimento è ciò che ha funzionato meglio per me. Ho finito usando qualcosa del genere ST_Area(ST_Buffer(geom, -10)), nel mio caso i -10 erano -10 metri. Se qualcosa restituisse 0 da quell'espressione, allora potrei filtrarlo.
bplmp,

9

Invece di area / perimetro, è meglio usare l'area divisa per il quadrato del perimetro (o il suo inverso).

Questo è anche chiamato "indice di forma". Il quadrato del perimetro diviso per l'area ha un valore minimo di 4 * Pi () (nel caso di un disco, che è la geometria 2D più compatta), quindi può essere normalizzato da 4 * Pi () per un facile interpretazione (valori normalizzati vicini a 1 significano quindi che hai oggetti molto compatti e che i quadrati hanno un valore di circa 1,27).

EDIT: una soglia sull'area sarebbe utile per rimuovere i manufatti molto piccoli, che potrebbero essere compatti. Quindi l'indice di forma mostrerebbe un migliore contrasto. EDIT: oltre a questa risposta, l'uso di ST_Snap potrebbe aiutarti a risolvere il problema prima che si verifichi.


Grazie! Ma non sono sicuro di come ST_Snap possa essere d'aiuto in questo caso ... Se ho capito bene, stai suggerendo qualcosa del genere (o.overlap_perimeter^2 / o.overlap_area) / (4 * Pi()) as overlap_ratio? Questo sta ottenendo risultati peggiori per me rispetto alla sola area / perimetro.
bplmp,

Ora usando o.overlap_perimeter / (4 * sqrt(o.overlap_area)) as overlap_ratiosecondo questo documento, ma risultati ancora peggiori (anche se è difficile quantificare ciò che intendo peggio) isprs-ann-photogramm-remote-sens-spatial-inf-sci.net/I-7/135/… , pagina 183.
bplmp,

2
Grazie per questo, non avevo mai sentito parlare dell '"indice di forma". Ho sempre pensato che usare un rettangolo di delimitazione minimo fosse il modo migliore per rispondere a questo tipo di domande. Ho trovato questo, repository.asu.edu/attachments/111230/content/… , che è interessante.
John Powell,

@JohnPowell intersting paper, grazie. Vedo che ciò che conosco come indice di forma è chiamato indice di circolarità nel documento. Il mio problema con i rettangoli di delimitazione minimi è che non funziona con oggetti molto concavi (ad esempio a forma di U)
radouxju

@bplmp ST_Snap ti aiuterebbe a spezzare i vertici di "quasi" poligoni adiacenti in modo che non si sovrappongano più. Non c'è scala sulle tue figure, ma il tuo manufatto assomiglia a linee, quindi immagino che tu possa usare un valore di tolleranza il theat è sufficiente per evitare artefatti ma non influenza i grandi poligoni.
Radouxju,

5

Un'opzione sarebbe quella di usare il rapporto tra l'area del poligono e la linea più lunga che può essere disegnata usando le sue estremità. Identificazione di poligoni lunghi e stretti.

select * from polygons where ST_Length(ST_LongestLine(geom, geom)) < ST_Area(geom) * 4

Funziona abbastanza bene per i poligoni del nastro. È possibile regolare il rapporto (ciò con cui si moltiplica l'area) in base alle proprie esigenze e alla proiezione.


1

Sembra che questo potrebbe corrispondere al tuo caso d'uso: elimina i poligoni selezionati

Combina poligoni selezionati del livello di input con determinati poligoni adiacenti cancellando il loro confine comune. Il poligono adiacente può essere quello con l'area più grande o più piccola o quello che condivide il confine comune più grande con il poligono da eliminare.

L'eliminazione viene normalmente utilizzata per eliminare i poligoni del nastro, ovvero piccoli poligoni che sono il risultato di processi di intersezione poligonale in cui i confini degli input sono simili ma non identici.

Sembra che tu voglia provare l'opzione "Il più grande confine comune".


Ora mi rendo conto che stavi chiedendo soluzioni postgis e non soluzioni qgis. Mi scuso, non credo che il postgis abbia una funzione equivalente, ma lo lascerò per i posteri.
FGreg

0

Questo mi sembra un caso d'uso perfetto per l' estensione della topologia PostGIS . Il parametro di tolleranza della topologia determinerà fino a che punto si consente ai vertici di agganciarsi ad altri poligoni esistenti, per far fronte alla bassa precisione dei dati di origine e per pulirli.

In breve, la strategia è:

1. Abilitare l'estensione della topologia

CREATE EXTENSION postgis_topology;

2. Creare una nuova topologia vuota

SELECT topology.CreateTopology('neighborhoods_topo', 4326, 1e-7);

Il terzo parametro è la tolleranza, nelle unità del CRS; scegli saggiamente. Idealmente, vuoi un CRS in cui l'unità è metri. Se l'unità CRS non è misuratrice, come nel caso di WGS 84 aka 4326, utilizzare ST_Transformper riproiettare i poligoni.

3. Aggiungi una colonna TopoGeometry alla tabella poligoni

SELECT topology.AddTopoGeometryColumn('neighborhoods_topo', 'public', 'neighborhoods', 'topogeom', 'POLYGON');

Questo restituisce un nuovo layer_id. Salvalo, sarà necessario in seguito. Sarà a strati 1se inizi da zero e incrementato ad ogni nuova chiamata.

4. Aggiungi tutti i poligoni nella topologia

UPDATE public.neighborhoods
SET topogeom = topology.toTopoGeom(geom, 'neighborhoods_topo', 1, 1e-7);

Questo può richiedere diverse ore per un set di dati di grandi dimensioni, sii paziente. 1è il layer_id restituito in precedenza.

5. Trova i volti che compaiono in diversi quartieri

Trova tutte le facce della topologia presenti in 2 o più topogeometrie. Lascerò la domanda come un esercizio. Il più semplice è probabilmente con la GetTopoGeomElementsfunzione, quindi raggruppa per ID viso e guarda quelli con un conteggio di 2 o più. In alternativa, è possibile creare una nuova tabella con la geometria pulita dalla colonna topogeom, semplicemente lanciarla sulla geometria standard topogeom::geometrye ripetere ciò che già si possiede ora, ma ora con un set di dati pulito senza sovrapposizione del nastro.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.