Selezionare il poligono ArcSDE per punto in ArcGIS Desktop usando ArcPy?


15

Continuo a pensare che mi manchi qualcosa, ma in ArcGIS 10 non sembra esserci uno strumento per selezionare le caratteristiche (in particolare i poligoni) da un livello in un punto (X, Y) tramite ArcPy. I parametri per tale strumento sarebbero solo un nome di livello e una posizione XY.

Al momento ho risolto il problema creando una featureclass punto contenente il punto ed eseguendo un SelectLayerByLocation su di esso. Tuttavia, quando la classe di funzionalità poligono è in Oracle (accessibile tramite ArcSDE 9.x) e contiene 3,5 milioni di poligoni, il tempo impiegato per effettuare la selezione può essere superiore a 5 minuti quando penso che un secondo o due (con meno codice) sarebbero più appropriato. La classe di caratteristiche ha un indice spaziale e ho provato ad usare arcpy.env.extent (che SelectLayerByLocation sembra ignorare) per limitare l'area geografica a cui si accede ma le prestazioni rimangono molto scarse.

Esiste un modo più rapido per farlo utilizzando ArcGIS Desktop 10 e ArcPy?


Ora c'è una soluzione a questo su forums.arcgis.com/threads/… e modificherò queste informazioni qui più tardi oggi - molte grazie a Jason Scheirer e Chris Snyder
PolyGeo

2
Proprio come una nota a questo, puoi trovare gli ambienti onorati da uno strumento nella parte inferiore della pagina di riferimento dello strumento. SelectByLocation onora solo l'area di lavoro corrente e il sistema di coordinate di output. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

Risposte:


9

Un altro approccio a questo sarebbe usare lo strumento Join spaziale. Usa il punto come livello di input come sopra e il livello poligono come elementi di identità.
A differenza di SelectLayerByLocation, SpatialJoin non rispetta l'ambiente di estensione.

targetlayer = layername
joinlayer=arcpy.PointGeometry(arcpy.Point(x, y))
fieldmappings = arcpy.FieldMappings()
fieldmappings.addTable(targetlayer)
arcpy.SpatialJoin_analysis(targetlayer, joinlayer, outputlayer, "JOIN_ONE_TO_MANY", "KEEP_COMMON", fieldmappings)

JOIN_ONE_TO_MANY potrebbe sembrare controintuitivo, ma poiché hai solo una funzione di join, la funzione principale di questa opzione è di disattivare le regole di aggregazione e unione. KEEP_COMMON farà in modo che il tuo output sia limitato solo al poligono che interseca il tuo punto. Fieldmappings limiterà gli attributi di output solo alla forma e agli attributi del layer poligonale; il valore predefinito includerebbe anche gli attributi del layer punto.

Il resto delle impostazioni predefinite funzionerà bene, quindi puoi lasciare fuori gli argomenti rimanenti.


Mille grazie per questo codice che conteneva un paio di tecniche che non avevo provato. In precedenza avevo provato SpatialJoin (in modo da poter rispettare l'ambiente di geoprocessing) ma quel test, così come un test della tua tecnica in questo momento, mi ha comunque lasciato con tempi di risposta di 4-5 minuti rispetto ai 10-12 secondi del cammino. Chris Snyder mi ha portato a.
PolyGeo

Hai provato la tecnica di Chris Snyder anche con SpatialJoin? Penso che il motivo principale per cui la tecnica del buffer è così veloce sia che utilizza una copia in memoria della classe poligonale. Penso che la selezione per posizione dovrebbe essere più veloce del join spaziale, ma non sono sicuro.
blord-castillo,

Finì per non usare il bit in_memory. Era già accelerato così tanto che l'ho tenuto in riserva. Penso che la cosa chiave sia stata stabilire l'estensione per ottenere uno / pochi poligoni (da 3,5 milioni), che dovevo controllare X, Y contro, rapidamente copiati in un geodatabase di file locale. Quindi, facendo quella parte prima di SpatialJoin, penso che porterebbe allo stesso / simile miglioramento delle prestazioni.
PolyGeo

1

Ho appena realizzato qualcosa ...

Se lo stai utilizzando per implementare un servizio di geoprocessing, puoi anche implementare un servizio funzionalità con il tuo livello poligonale e utilizzare l'operazione Query sul servizio funzionalità.

È possibile utilizzare una semplice posizione XY con l'operazione di query del servizio funzionalità, nonché controllare gli attributi di output inclusa la forma.

Potresti avere restrizioni su quanto puoi esporre la classe di funzionalità poligono, ma se la stai già rendendo accessibile al servizio di geoprocessing, dovresti essere in grado di costruire anche un servizio di funzionalità.


Questo è un pensiero utile per soddisfare altri requisiti ma, in questo caso, l'applicazione client è molto semplice e fuori dal mio controllo, quindi sono in grado di fornire solo un servizio di geoprocessing.
PolyGeo

Ho pensato che ci potesse essere una restrizione sull'uso di qualcosa di diverso da un servizio di geoprocessing :) Ironia della sorte, penso che un servizio di funzionalità sia un percorso molto più semplice da implementare e mantenere. Questo potrebbe anche spiegare perché la funzionalità desiderata non è disponibile; puoi già farlo in ogni livello di applicazione. Assicurati di inviare una richiesta a ESRI per implementarlo come strumento nella prossima versione.
blord-castillo,

1

Questa risposta è arrivata dai vecchi forum di discussione ArcGIS .

Grazie Jason Scheirer per qualche codice più conciso:

SelectLayerByLocation(in_layer=arcpy.PointGeometry(arcpy.Point(x, y)), select_features="mylayer") 

E soprattutto a Chris Snyder per un consiglio prestazionale:

Una soluzione più rapida potrebbe essere quella di bufferizzare un po 'il punto e quindi utilizzare l'estensione del buffer come estensione dell'analisi per creare una copia in_memory (strumento CopyFeatures) dei dati SDE, quindi eseguire un SelectByLocation sul set di dati in_memory più piccolo e locale. In questo modo stai facendo in modo che lo strumento SelectByLocation onori l'ambiente dell'estensione dell'analisi, cosa che normalmente non farebbe. A proposito: tutte le funzionalità che si sovrappongono all'estensione dell'analisi verranno copiate con lo strumento CopyFeatures. Vorrei che lo strumento SelectByLocation ei metodi cursori onorassero l'estensione dell'analisi ...

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.