Analisi GIS per trovare geometrie duplicate


9

Ho un grande file di forma che contiene tutti gli edifici e le case della città in cui lavoro (circa 90.000 elementi). I dati degli edifici / case vengono salvati dagli ingegneri topografi della città e, a causa delle cattive pratiche e dell'accesso di diversi geometri a tali dati, molti edifici / case sono stati salvati due volte e visualizzati nella mappa come duplicati.

Alcuni di essi sono esattamente duplicati (appaiono uno sopra l'altro) mentre altri sono duplicati con uno spazio tra i due oggetti (come se un oggetto fosse all'interno dell'altro - vedi la schermata allegata).

inserisci qui la descrizione dell'immagine

Voglio pulire quei dati in modo da avere solo gli edifici / case corretti in città, quindi la mia domanda è:

C'è qualche analisi GIS o espressione SQL che posso eseguire per trovare tutte le funzionalità duplicate (sia quelle esatte che quelle che si trovano all'interno di altre)? Ho sia ArcGIS che QGIS, quindi sono aperto a tutti i tuoi suggerimenti.


Puoi provare a esplorare lo strumento Elimina identico . Tuttavia, richiede un livello di licenza aziendale. È possibile rivedere alcune altre opzioni disponibili nell'articolo tecnico 36031. ArcGIS fornisce un modo per identificare o rimuovere funzionalità con geometrie duplicate la soluzione migliore è l' estensione del revisore dei dati . nessuno di questi strumenti risolverà le tue geometrie divise
MDHald,

inoltre, dovrai considerare che i componenti tabulari non verranno confrontati nello strumento di eliminazione identico. So che non è una risposta, ma spero che aiuti nella risoluzione dei problemi.
MDHald,

I dati sono in un database? Quale tipo?
Russell all'ISC il

Un'opzione potrebbe essere l'utilizzo dello strumento Intersect (come descritto in questa risposta ) in ArcMap, che genererebbe qualsiasi posizione di sovrapposizione. Ciò richiederebbe manualmente il controllo e la decisione del poligono da eliminare, ma nel caso di duplicati non esatti penso che dovresti farlo comunque.
Erica,

4
L'uso del termine "duplicato" è un po 'fuorviante in questa domanda. Nel caso di copie esatte, identiche, in pila, quindi sì, sono (o potrebbero essere - gli attributi possono variare) duplicati e come altri hanno suggerito che lo strumento Elimina o Trova identico potrebbe essere utile se si dispone di quel livello di licenza. Ma se sono compensati, o hanno una forma diversa, non sono realmente duplicati di per sé. Se si dispone di una licenza avanzata, prenderei in esame una topologia di geodatabase, eseguendo il controllo Non sovrapporre. Senza Advanced, forse lo stesso può essere fatto con QGIS e un plugin come suggerisce la risposta di Luigi.
Chris W,

Risposte:


4

in QGIS, il plug-in Topology Checker può risolvere il problema in modo propizio


3
Sono d'accordo che una topologia sia probabilmente la migliore soluzione singola al problema della pulizia dei dati. Tuttavia, potresti voler espandere un po 'la tua risposta fornendo un link al plug-in e una breve descrizione di cosa sia o faccia la topologia e di quale controllo eseguiresti. Temo che la tua risposta come digitata sarà probabilmente contrassegnata come di bassa qualità.
Chris W,

ok: una descrizione del plugin è qui: docs.qgis.org/2.2/en/docs/user_manual/plugins/… e "non devono sovrapporsi" possono affrontare il problema. Una guida video del plug-in è qui: youtube.com/watch?v=huhkTZkoKC8 .
Luigi Pirelli,

6

Vorrei usare gli itertools di Python e un SearchCursor per un modo molto efficiente di trovare le relazioni spaziali che stai cercando. È possibile incorporare i metodi di geometria overlaps , containse equalper ottenere le proprietà della geometria.

  1. Inizia creando una funzione per organizzare meglio il flusso di lavoro e per la ripetibilità

    def findOverlaps(x):

  2. Apri un cursore di ricerca per scorrere la geometria delle singole funzioni

    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:

  3. usare itertools.combinations()per restituire sottosequenze di elementi dall'iterabile inputcur

    for feature1,feature2 in itertools.combinations(cur, 2):

  4. Accedere alle proprietà della geometria con i seguenti metodi: equals(), overlaps(), e contains(). Questi sono impostati in una sequenza logica: puoi modificarlo per raggiungere i tuoi obiettivi specifici, se necessario.

        if feature1[1].equals(feature2[1]):
            print "{} equals {}".format(feature1[0],feature2[0])
        if feature1[1].overlaps(feature2[1]):
            print "{} overlaps {}".format(feature1[0],feature2[0])
        if feature1[1].contains(feature2[1]):
            print "{} contains {}".format(feature1[0],feature2[0])
    
  5. Eseguirlo...

enter code herefindOverlaps (fc)


import itertools, arcpy

fc = r'C:\path\to\your\fc'

def findOverlaps(x):
    with arcpy.da.SearchCursor(x, ['OID@', 'SHAPE@']) as cur:
        for feature1,feature2 in itertools.combinations(cur, 2):
            if feature1[1].equals(feature2[1]):
                print "{} equals {}".format(feature1[0],feature2[0])
            if feature1[1].overlaps(feature2[1]):
                print "{} overlaps {}".format(feature1[0],feature2[0])
            if feature1[1].contains(feature2[1]):
                print "{} contains {}".format(feature1[0],feature2[0])

findOverlaps(fc)

inserisci qui la descrizione dell'immagine

Lo screenshot mostra una varietà di funzionalità che sono sovrapposte, sovrapposte e identiche e uniche.

inserisci qui la descrizione dell'immagine


2

Ho un'idea di cosa potrebbe funzionare per te. Si baserà su alcuni presupposti, ma aiuterebbe a restringere l'elenco delle possibili caratteristiche identiche. Questo non sarebbe un processo automatizzato, ma richiederebbe di esaminare manualmente i duplicati. Sulla base dei commenti, sembra che gli strumenti automatizzati non confrontino gli attributi, quindi questo ti aiuterebbe a non eliminare accidentalmente le funzionalità.

Utilizzando ArcMap

(1) Crea una copia del tuo file di forma in caso di problemi.

(2) Aggiungi una colonna al tuo file di forma in doppio.

(3) Calcola l'area per ogni funzione usando il formato più descrittivo (più preciso) che puoi. Qualcosa in cui l'arrotondamento potrebbe non essere un problema.

(4) Esegui un riepilogo (riepilogo) su quella colonna. Assicurati di selezionare un identificatore univoco nel riepilogo e contrassegna sia il primo che l'ultimo.

(5) Nella tabella di output, cerca quei record in cui il campo di conteggio è maggiore di 1.

(6a) Controllare manualmente le funzionalità e ripetere il processo fino a quando non ci sono più duplicati.

(6b) Potresti semplicemente creare un elenco di quegli ID univoci ed eliminare le funzionalità tramite arcpy, ma hai la possibilità di avere due funzionalità non identiche con la stessa area.

Un'altra tecnica che utilizza ArcPy

Mentre stavo costruendo la risposta di cui sopra, ho pensato alla possibilità che in qualche modo i molteplici autori di questi dati possano aver effettivamente utilizzato gli stessi identificatori univoci per funzioni duplicate. In tal caso, potresti essere in grado di trovare duplicati attraverso il looping in arcpy.

Il modo in cui penserei di farlo usando ArcPy potrebbe essere tassare sul tuo sistema e richiedere un po 'di tempo.

(1) Crea una copia del tuo file di forma (nel caso di nuovo)

(2) Aggiungi una nuova colonna per indicare i duplicati. Qualcosa che prende come 'y' o 'n' o 0 o 1 o qualunque cosa funzioni.

(3) Crea un elenco in Python per memorizzare l'identificatore univoco.

(4) Esegui un cursore di aggiornamento ( arcpy.UpdateCursor('LAYERNAME')). Per ogni record, controlla l'elenco per vedere se contiene quell'identificatore e segna la colonna per i duplicati, se è presente.

myList = []
rows = arcpy.UpdateCursor("layername")
for row in rows:
  if str(row.UniqueIdentifier) in myList:
    #value duplicated
    row.DuplicateColumnName = "y"
  else:
    #not there, add it
    myList.append(row.UniqueIdentifier)
  rows.updateRow(row)

(5) Quindi puoi confrontare o fare quello che vuoi con quelle colonne contrassegnate.

Probabilmente ci sono modi migliori per fare questi confronti, ma quelli sono due che credo dovrebbero funzionare o almeno iniziare.

modificare

Sulla base del commento di elrobis , è possibile utilizzare il rettangolo di delimitazione minimo per ridurre ulteriormente la possibilità di rimuovere funzioni errate.

Utilizzando ArcMap, è possibile eseguire lo strumento Geometria limite minima in Gestione dati. Dopo aver verificato le opzioni, penso che usare l' opzione CONVEX_HULL sarebbe probabilmente la cosa migliore.

Se si confrontano i campi MBG_APodX / Y1 , MBG_APod_X / Y2 con MBG_Orientation per i duplicati, si dovrebbe essere in grado di avere una buona idea delle funzionalità duplicate. Suggerirei di utilizzare il metodo di riepilogo che ho descritto sopra per confrontare. Scegli uno dei vertici (coordinate) dal rettangolo di delimitazione per trovare duplicati. Potresti ottenere alcune 'corrispondenze' accidentali, ma una volta aggiunti gli altri vertici più l'orientamento, sarebbe una scommessa abbastanza sicura che le caratteristiche dei risultati siano duplicate.

Anche se non l'ho usato e non sono del tutto sicuro dei risultati di questo strumento, potresti trovare più facile esaminare il file di forma risultante se hai utilizzato lo strumento Statistiche riassuntive in ArcMap. Sembra che tu possa riassumere più colonne in quel modo invece della mia opzione a colonna singola.

Non penso che ci sarebbe un modo completamente automatizzato di farlo senza avere la preoccupazione di eliminare una funzione non duplicata. Questi metodi dovrebbero aiutare a limitare il numero di funzionalità che dovresti rivedere manualmente però.


Presumo che fossero poligoni. Se sono linee, puoi usare la lunghezza. I punti sono più facili con le coordinate X / Y.
Branco,

2
Ho pensato anche alle "caratteristiche della stessa area", ma mi sembra probabile che le impronte digitali possano avere abbastanza degli stessi tipi di forme per creare corrispondenze non intenzionali. Penso che migliorerebbe le probabilità di perfezionare ulteriormente le cose con un'intersezione MBR delle caratteristiche. Cioè, se hanno la stessa area (e potrebbero essere la stessa funzione) E i loro MBR si intersecano, allora forse è probabile che siano due generazioni della stessa funzione. Ha senso?
elrobis,

2

Puoi farlo in SQL usando un self join spaziale. Non dichiari quale dialetto SQL stai usando, quindi questo esempio usa Postgres / Postgis, ma potrebbe essere facilmente adattato a Oracle o SQL Server. Supponendo una tabella chiamata edifici, con la geometria memorizzata in una colonna chiamata geom:

SELECT a.id, b.id from buildings a, buildings b WHERE 
  ST_INTERSECTS(a.geom, b.geom) AND a.id < b.id;

Questo troverà le intersezioni. Se si desidera l'uguaglianza totale, sostituire ST_Intersects con ST_Equals. Oppure, basta combinare i due:

SELECT a.id, b.id from buildings a, buildings b WHERE 
   (ST_INTERSECTS(a.geom, b.geom) OR ST_EQUALS(a.geom, b.geom)) 
   AND a.id < b.id;

Nota, a.id <b.id significa che prendi in considerazione solo metà dei casi nel self join, il che lo rende a) più veloce eb) ti dà un elenco che puoi usare per eliminare metà dei poligoni sovrapposti senza eliminarli tutti . Chiaramente, questo è ancora un algoritmo O (n²), ma in pratica sarà molto più veloce se si dispone di un indice spaziale, che è davvero un requisito totale per qualsiasi set di dati non banale.

Potrebbe essere necessario massaggiarlo un po 'per adattarsi a una definizione di sovrapposizione: non si desidera eliminare le case vicine che sono state esaminate male.


Se manca un attributo univoco nel file di forma, è possibile utilizzare a.rowidinvece di a.id. rowidè una parola chiave in SQLite che ti darà l'ID interno del set di dati.
LuWi

1

Il plug-in Controllo topologia è un ottimo strumento se utilizzato correttamente. Devi ancora avere una conoscenza fondamentale dei tuoi dati E devi effettuare le 'correzioni' manualmente. Il plugin metterà in evidenza ciò che pensa siano errori. Spetta a te quindi esaminare ciascuno di essi e prendere la decisione appropriata per te e i tuoi dati. Con 90.000 articoli nel tuo livello, potresti essere a casa entro Natale!

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.