Rilevare la forma del poligono ramificato?


13

Ho un livello vettoriale con milioni di poligoni che coprono continuamente. Devo classificarli in base alla loro forma. Sto già utilizzando diversi indici di forma dell'ecologia del paesaggio come la compattezza ( 4piA / P ^ 2 ), la larghezza media ( 2A / P ), il numero della forma ( P / sqrt (A) ), ho visto anche questa risposta al calcolo di rotondità / compattezza di poligono?

Il mio problema è che tutte queste metriche utilizzano solo un rapporto tra area e perimetro. Anche l' indice della dimensione frattale utilizza solo l'area e il perimetro ( 2ln (0,25P) / ln (A) ). Ma come posso distinguere due poligoni con la stessa area e perimetro ma forma assolutamente diversa? Come questo poligono ramificato A:

poligono ramificato vs striscia curva

che ho provato a disegnare con la stessa area e perimetro della striscia curva B. Tutti i miei indici noti saranno gli stessi per loro. Ma per me è molto importante differenziare strisce semplici (comprese quelle curve come la luna nuova) da forme ramificate complesse.

Mostro intenzionalmente il poligono B come una striscia curva e non una striscia diritta perché sono a conoscenza dell'indice del Circumcircle correlato che rileva forme allungate diritte, ma i miei poligoni possono avere anche gli stessi circoli. Anche se costruisco lo scafo convesso e calcolo un rapporto tra aree Apolygon / Aconvex , qui potrebbe essere molto simile.

Quindi, come posso distinguere automaticamente il poligono ramificato A dal poligono B nei dati vettoriali ? (La loro conversione in raster richiederebbe dimensioni di cella estremamente ridotte, un set di dati enorme e una mancanza di memoria, quindi non è possibile). Esistono altri indici di forma che includono altri parametri? Idealmente, il metodo distinguerebbe non solo i poligoni chiaramente ramificati ma anche C e D:

inserisci qui la descrizione dell'immagine

La mia unica idea è quella di costruire lo scafo convesso quindi cancellare il poligono dallo scafo convesso e contare il numero di (grandi) pezzi che lascia (cancellando il poligono per poligono e non l'intero strato). Ciò potrebbe mostrare la complessità del confine.

Accolgo con favore soluzioni / algoritmi matematici, che successivamente implementerei in Python.


1
Non hai bisogno di molto Python. Provare ! forma!. convexHull (). symmetricDifference (! shape!) Nel calcolatore di campo. Prova prima su una copia di un sottoinsieme di piccole dimensioni. Vedere la guida della geometria arcpica per la sintassi corretta.
FelixIP,

Questa potrebbe essere una grande domanda, ma al momento stai ponendo più domande non vincolando se stai chiedendo di QGIS o ArcGIS Desktop e quindi anche lanciando Python. Una volta che hai specificato con precisione cosa hai provato, è più facile per i potenziali soccorritori aiutare con dove sei bloccato. Suggerisco di concentrarlo su QGIS per evitare di trovare la tua prima risposta.
PolyGeo

1
Ho dati nel geodatabase di Esri perché uno shapefile superava già i 2 GB. Potrei fare qualcosa al riguardo se ci fosse una soluzione funzionante in QGIS o da qualche parte. Ma non sto chiedendo all'interno di un software specifico. Sto chiedendo una metrica, un metodo su come rilevare matematicamente una forma con bordo complesso (ramificato). 1 domanda Anche l'articolo scientifico con una formula sarebbe ok, penserò come implementarlo da solo.
Nadya,

1
Il mio primo pensiero fu lo stesso del tuo, guardando le differenze tra il numero e la dimensione dei poligoni rimasti dopo aver sottratto l'originale dal suo scafo convesso (o concavo) (vedi anche forme alfa).
user2856

1
Se solo lo scheletro fosse abbastanza veloce da calcolare, userei per calcolare 4A / PL, area, perimetro, lunghezza tra i nodi più scheletrici dello scheletro per compattezza. Lo stesso vale per il più grande cerchio inscritto.
FelixIP,

Risposte:


11

Potresti dare un'occhiata al seguente metodo: scheletro i tuoi poligoni e piuttosto lavorare sulle funzionalità del tipo di linea relative al poligono originale con un ID poligono di origine univoco. Immagino che ci siano alcune ipotesi da fare (ad esempio, quando considerare una polilinea come una vera linea centrale: lunghezza minima affinché una polilinea sia ammissibile allo stato della linea centrale). Quando il numero della linea centrale è maggiore di 1 per un singolo poligono sorgente, viene ramificato.

Un poligono ramificato, se ripulito fino a una linea centrale, avrà linee multiple mentre un poligono dritto potrebbe avere solo una grande linea al centro (la stessa interpretazione umana in effetti).

Esempio :

  • quando si disegna una lettera Y, si utilizzano almeno 2 tratti continui (= 2 polilinee), quindi è ramificato perché il numero minimo di tratti è> 1.
  • quando si disegna una lettera L, si utilizza almeno 1 tratto continuo. Non è ramificato.

Altri esempi di questa logica:

  • Quando disegni un tratto A: 2 = è ​​ramificato
  • Quando colpisci un B: 3 colpi = è ramificato
  • quando si disegna un tratto C: 1 = non è ramificato
  • eccetera

Non ho provato nulla, sto solo provando la logica, ma penso che potrebbe funzionare.

Vedi: Skeletonize vettori in QGIS / Python o http://postgis.net/docs/ST_StraightSkeleton.html

O

Esempio

Fonte: Estrazione della linea centrale di un poligono complesso in PostGIS / Python

MODIFICA: per i casi C e D, è necessario disporre già di forme B filtrate (non ramificate).

  • Assicurarsi che un ID univoco colleghi la linea centrale e il poligono di origine.
  • Trasforma i tuoi poligoni in polilinee
  • Densificare la polilinea della linea centrale e la polilinea del bordo con punti regolari (non troppo per evitare problemi di memoria in seguito, ma abbastanza per "catturare" i bit irregolari.
  • Crea una matrice di distanza tra i punti della linea centrale e i punti della linea di confine
  • Mantieni nelle righe della matrice solo quelle in cui ID_centerline = ID_borderline
  • Creare statistiche per avere un valore di deviazione standard
  • Impostare un valore associato per indicare per valori SD elevati che si tratta di un contorno non regolare e creare l'indicatore richiesto, per ciascun ID univoco
  • Ripristina l'indicatore al poligono originale unendo il campo sulla base dell'ID univoco.

Grazie per l'idea, cercherò di creare linee d'
asse

Solo, il problema per distinguere i miei poligoni C e D rimarrà
nadya,

Potresti aver bisogno di metodi diversi per casi diversi e dividere il lavoro. Una volta che hai poligoni non ramificati (B), puoi affinare B per provare a trovare C e D. Il problema è che non vedo quale logica usi per distinguere C da D. probabilmente dovrai esprimerlo chiaramente con criteri.
gisnside,

1
La differenza tra C e D sembra essere quella in C, i lati del poligono sono approssimativamente ad una distanza uniforme dalla linea centrale, mentre in D i lati sono una distanza non uniforme dalla linea centrale.
csk,

1
@csk Lo vedo. Immagino che tradurlo in codice sarebbe calcolare le statistiche sulla distanza tra la linea centrale e la linea di confine. Densificando la polilinea del bordo con più punti e convertendo questo bordo in punti + facendo una distanza dal lavoro equivalente sulla linea centrale si darebbero statistiche su questo comportamento. Se la deviazione standard è alta, probabilmente la forma sarà irregolare. Difficile vedere come farlo su migliaia di poligoni ... bella sfida lì
gisnside
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.