Conteggio dei poligoni sovrapposti da un Shapefile usando ArcGIS Desktop?


10

Ho uno shapefile con 16.400 poligoni. Ogni poligono mostra l'espansione di una specie di uccelli per tutto il mondo.

inserisci qui la descrizione dell'immagine

Ora devo contare i poligoni sovrapposti. L'ho provato con l'unione e lo scioglimento (conta l'unione), ma l'unione non funziona per così tanti poligoni.

Poi ho provato a tagliare i continenti, ma anche questo non funziona a causa dell'enorme numero di poligoni. Inoltre ho provato questo metodo , anche senza successo.

Quindi ti sto chiedendo che esiste un modo per contare poligoni sovrapposti se 16400 poligoni sono in un file di forma?

Sto lavorando con 10.0 e posso lavorare con 10.2. Anche una soluzione ArcPy è meravigliosa.

Al momento sto pensando di creare una rete da pesca e iterare sopra le file dello shp con i poligoni 16400 e scrivere 1 su un campo valore di una cella a rete se il poligono si trova in questa cella e quindi prendere la riga successiva (poligono) e se questo è anche nel conteggio delle celle a rete +1.

Ma non so se questa è una buona soluzione e come realizzarla. Oppure devo imparare R per usare questo approccio.

Il risultato: dovrebbe essere una forma in cui si hanno nuovi poligoni tra quelli sovrapposti e un campo in cui vengono conteggiate le sovrapposizioni.

Quindi alla fine dovrebbe esserci uno shapefile in cui puoi vedere quante specie di uccelli si trovano nello stesso posto.


il tuo problema è un problema a causa delle dimensioni del set di dati. Le risposte (e il link che proponi) sono corretti ma avrai problemi di memoria. Forse potresti prima provare a integrare i tuoi dati con poche centinaia di metri (in base alla precisione prevista) per evitare la creazione di miliardi di poligoni a nastro). Assicurati di lavorare su una copia perché modificherà i tuoi dati.
Radouxju,

1
Dividi il nostro file di forma in file di forma regionali, quindi esegui l'analisi sui file di forma regionali, quindi dissolvili per ottenere nuovamente il file completo.
til_b,

Ho provato a ritagliare questa forma con un solo paese ma ho restituito l'errore 999999.
Nora,

1
Hai esaminato lo strumento Dadi per ridurre la complessità dei tuoi poligoni? Inoltre, se stai riscontrando un errore 999999 solo provando a ritagliare i tuoi dati, hai provato lo strumento di controllo della geometria per vedere se genera qualche intuizione?
Hornbydd,

2
Ho effettuato un controllo parziale della geometria sui dati e ci sono molte autointersezioni. Vorrei suggerire 1. Garantire il massimo utilizzo della RAM e file di paging di grandi dimensioni 2. Geometria di riparazione 3. Se necessario, semplificare i poligoni 3. Sottoinsieme dei dati a 1/3 o 1/4 (o qualsiasi cosa sia necessaria) 4. Eseguire il flusso di lavoro Union-Dissolve-Rasterize come in questa risposta 5. Somma i raster.
Cotton.Rockwood,

Risposte:


9

Consiglierei di utilizzare lo strumento Conta sovrapposizione funzionalità (analisi) .

Genera funzioni sovrapposte planarizzate dalle funzioni di input. Il conteggio delle funzioni sovrapposte viene scritto nelle funzioni di output.

inserisci qui la descrizione dell'immagine


Ho anche provato questo, e non funziona per il mio shp (troppo grande). grazie per aver risposto
Nora,

1
@Aaron il link è morto. Ora c'è questa implementazione in Pro: pro.arcgis.com/en/pro-app/tool-reference/analysis/…
Albert

1
Grazie @Albert, il post è stato aggiornato in base ai tuoi consigli.
Aaron

5

Utilizzando token geometrici arcpici, potresti provare qualcosa del genere:

inserisci qui la descrizione dell'immagine

import os
import arcpy

arcpy.env.workspace = r"" #path to workspace
arcpy.env.overwriteOutput = 1

polygon_fc = r"" #path to polygon fc

base = [row for row in arcpy.da.SearchCursor(polygon_fc,["OID@","SHAPE@"])]
compare = base

overlaps_stats = {}

for b in base:
    for c in compare:
        if b[1].overlaps(c[1]):
            #print "{0} overlaps {1}".format(b[0],c[0])
            if overlap_stats.has_key(b[0]):
                overlap_stats[b[0]].append(c[0])
            else:
                overlap_stats[b[0]] = [c[0]]

for key,value in overlap_stats.iteritems():
    print "Polygon {0}:  Overlaps: {1}.".format(key,len(value))

Per i dati di esempio sopra riportati, il codice restituirà i seguenti conteggi di sovrapposizione: inserisci qui la descrizione dell'immagine

Il codice così com'è restituirà i conteggi solo per i poligoni che hanno almeno una sovrapposizione.


@ Nxau: Ok, immagino di aver fatto un errore per spiegare come dovrebbe essere il risultato. Dovrebbe essere una forma in cui hai nuovi poligoni da quelli sovrapposti. Ad esempio, nella tua immagine i cerchi 4 e 5 si sovrappongono. La nuova forma dovrebbe avere tre poligoni. (L'unione non funziona per questa grande forma). L'area di sovrapposizione dovrebbe avere il valore 2 in un campo e il resto dei cerchi 4 e 5 dovrebbe avere il valore 1 in questo campo. Quindi alla fine dovrebbe esserci uno shapefile in cui puoi vedere quante specie di uccelli si trovano nello stesso posto. Grazie per la tua sceneggiatura!
Nora,

5

Un metodo molto semplice è:

  1. Unione shapefile con se stesso;
  2. Converti output multipart in single part ;
  3. Utilizzare lo strumento di unione spaziale per contare le sovrapposizioni (utilizzare l'opzione di corrispondenza ARE_IDENTICAL_TO);
  4. Simbolizza usando il join_countcampo.

inserisci qui la descrizione dell'immagine


1

Immagino tu abbia provato questo metodo: il conteggio e la rasterizzazione dei poligoni si sovrappongono in ArcGIS Desktop?

16.400 poligoni non sono così tanti. Tuttavia, una potenziale soluzione è semplicemente fare un Join spaziale regolare. Nel ArcMap toolbox, > Analysis Tools -> Overlap -> Spatial Join.

Impostare entrambe le funzioni targete joinsullo stesso set di dati e specificare un output. Lascia il resto delle impostazioni.

Dopo qualche istante dovresti recuperare uno shapefile che contiene una colonna "conteggio dei join". Sottrai 1 da questo (come ovviamente ogni caratteristica dovrebbe intersecarsi) e quello dovrebbe essere il numero di "sovrapposizioni" (effettivamente interseca) per ogni poligono.

L'ho appena suonato


Sì, ho già provato l'approccio dal link. Ma usare l'unione è impossibile per questo shp. Provando l'Unità spaziale Ho ottenuto questo indietro: ERRORE 000426: Memoria esaurita.
Nora,

Lo sto eseguendo su una macchina con solo 4 GB di RAM e aveva circa 5 volte più funzioni, quindi sono sorpreso che non funzioni con un numero molto più basso. Potresti avere troppi vertici nei tuoi dati (il mio era di circa 60 MB; quanto è grande il tuo file .shp?). Prova a generalizzarlo.
GIS-Jonathan,

Se solo lo shp è in una fgdb, la fgdb ha 1,73 GB. In una cartella la forma ha 2,00 GB.
Nora,

Ho usato anche questo set di dati e penso che molti dei problemi sorgano perché molti poligoni hanno molte parti. Ciò, unitamente alla risoluzione, rende questo compito molto impegnativo per la memoria.
Cotton.Rockwood,

@ Cotton.Rockwood: E trovi la soluzione in R, giusto? Penso di usare la casella degli strumenti 'Count Polygons Overlapping' con l'input di 500 poligoni (33 selezioni) rispetto al poligono da raster con il valore "join count" e alla fine calcolare raster (ModelBuilder). Ci vuole molto tempo ...
Nora,

1

Ho scaricato e provato lo strumento "Conta poligoni sovrapposti". Potrebbe funzionare, ma richiede molto tempo (probabilmente a causa della dimensione del file, ma il mio input FC aveva solo <5.000 record).

Mentre aspettavo che lo strumento funzionasse, ho aperto un'altra finestra di ArcMap e ci sono voluti solo un paio di passaggi rapidi per ottenere quello che volevo. 1) Join spaziale: utilizza la stessa classe di funzionalità Target e Join e seleziona l'opzione "Unisci da uno a molti". 2) Dissolve: utilizza l'output dell'ultimo passaggio. Utilizza "TARGET_FID" come campo di dissolvenza e per le statistiche puoi SOMMARE il campo "Join_Count" o COUNT il campo "JOIN_FID". 3) Nel file di output dal passaggio 2, utilizzare la calcolatrice di campo sottrai 1 dal campo stats ("SUM_Join_Count" o "COUNT_JOIN_FID") - poiché ogni funzione si interseca da sola.

Suggerisco di usare questo metodo con lo strumento "Conta poligoni sovrapposti". Ho iniziato a eseguire lo strumento COP ~ 5 minuti prima di iniziare questo metodo Join-> Dissolve e mi ha dato il risultato con abbastanza tempo per scriverlo prima ancora che lo strumento "Count Overlapping Polygon" fosse finito.

Spero che sia di aiuto!

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.