Auswählen eines ArcSDE-Polygons nach Punkt in ArcGIS Desktop mit ArcPy?

15

Ich denke immer wieder, dass mir etwas fehlen muss, aber in ArcGIS 10 scheint es kein Werkzeug zu geben, um Features (insbesondere Polygone) aus einem Layer an einer Punktposition (X, Y) über ArcPy auszuwählen. Die Parameter für ein solches Werkzeug wären lediglich ein Layername und eine XY-Position.

Zur Umgehung dieses Problems erstelle ich eine Punkt-Feature-Class, die den Punkt enthält, und führe darauf eine SelectLayerByLocation aus. Wenn sich die Polygon-Feature-Class jedoch in Oracle befindet (Zugriff über ArcSDE 9.x) und 3,5 Millionen Polygone enthält, kann die Auswahl mehr als 5 Minuten dauern, wenn ich denke, dass eine oder zwei Sekunden (mit weniger Code) erforderlich sind angemessener. Die Feature-Class hat einen räumlichen Index und ich habe versucht, arcpy.env.extent (das SelectLayerByLocation anscheinend ignoriert) zu verwenden, um den geografischen Bereich einzuschränken, auf den zugegriffen wird, aber die Leistung bleibt sehr schlecht.

Gibt es eine schnellere Möglichkeit, dies mit ArcGIS Desktop 10 und ArcPy zu tun?

PolyGeo
quelle
Es gibt jetzt eine Lösung für dieses Problem unter forums.arcgis.com/threads/… und ich werde diese Informationen später hier bearbeiten. Vielen Dank an Jason Scheirer und Chris Snyder
PolyGeo
2
Nur als Hinweis hierzu finden Sie die von einem Tool berücksichtigten Umgebungen unten auf der Referenzseite des Tools. SelectByLocation berücksichtigt nur den aktuellen Arbeitsbereich und das Ausgabe-Koordinatensystem. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
Blord-Castillo

Antworten:

9

Ein anderer Ansatz hierfür wäre die Verwendung des Werkzeugs "Spatial Join". Verwenden Sie den Punkt wie oben als Eingabe-Feature-Layer und den Polygon-Layer als Identitäts-Features.
Im Gegensatz zu SelectLayerByLocation berücksichtigt SpatialJoin die Extent-Umgebung.

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 scheint möglicherweise nicht intuitiv zu sein. Da Sie jedoch nur über eine Join-Funktion verfügen, besteht die Hauptfunktion dieser Option darin, die Aggregation und die Zusammenführungsregeln zu deaktivieren. KEEP_COMMON stellt sicher, dass Ihre Ausgabe nur auf das Polygon beschränkt ist, das Ihren Punkt schneidet. Die Feldzuordnungen beschränken die Ausgabeattribute nur auf die Form und die Attribute der Polygonebene. Die Standardeinstellung würde auch die Attribute des Punkt-Layers enthalten.

Die restlichen Standardeinstellungen funktionieren einwandfrei, sodass Sie die verbleibenden Argumente weglassen können.

Blord-Castillo
quelle
Vielen Dank für diesen Code, der einige Techniken enthielt, die ich nicht ausprobiert hatte. Ich hatte zuvor SpatialJoin ausprobiert (damit ich die Geoverarbeitungsumgebung einhalten konnte), aber das Testen sowie ein Test Ihrer Technik in diesem Moment ließen mir immer noch 4-5 Minuten Reaktionszeit im Vergleich zu 10-12 Sekunden übrig Chris Snyder führte mich zu.
PolyGeo
Haben Sie auch Chris Snyders Technik mit SpatialJoin ausprobiert? Ich denke, der Hauptgrund, warum die Puffertechnik so schnell ist, ist, dass sie eine Kopie der Polygonklasse im Speicher verwendet. Ich denke, die Auswahl nach Standort sollte schneller sein als die räumliche Verknüpfung, bin mir aber nicht sicher.
Blord-Castillo
Das Bit in_memory wurde nicht verwendet. Es war schon so schnell, dass ich das in Reserve hielt. Ich denke, das Wichtigste war, das Ausmaß festzulegen, in dem das eine / die wenigen Polygone (von 3,5 Millionen), gegen die ich das X, Y überprüfen musste, schnell in eine lokale File-Geodatabase kopiert wurden. Wenn Sie also diesen Teil vor dem SpatialJoin machen, würde dies zu der gleichen / ähnlichen Leistungsverbesserung führen.
PolyGeo
1

Ich habe gerade etwas realisiert...

Wenn Sie damit einen Geoverarbeitungsservice implementieren, können Sie stattdessen auch einen Feature-Service mit Ihrem Polygon-Layer implementieren und die Abfrageoperation für den Feature-Service verwenden.

Sie können eine einfache XY-Position mit der Funktion "Feature-Service-Abfrage" verwenden und die Ausgabeattribute einschließlich der Form steuern.

Möglicherweise haben Sie Einschränkungen hinsichtlich der Größe, mit der Sie die Polygon-Feature-Class verfügbar machen können. Wenn Sie sie jedoch bereits für den Geoverarbeitungs-Service verfügbar machen, sollten Sie auch einen Feature-Service erstellen können.

Blord-Castillo
quelle
Dies ist hilfreich, um andere Anforderungen zu erfüllen. In diesem Fall ist die Clientanwendung jedoch sehr einfach und befindet sich außerhalb meiner Kontrolle. Daher kann ich nur einen Geoverarbeitungsdienst bereitstellen.
PolyGeo
Ich dachte, es könnte eine Einschränkung für die Verwendung eines anderen als eines Geoverarbeitungsdienstes geben :) Ironischerweise halte ich einen Feature-Service für einen viel einfacheren Weg, um ihn zu implementieren und zu warten. Dies erklärt möglicherweise auch, warum die gewünschte Funktionalität nicht verfügbar ist. Sie können es bereits in jeder Anwendungsebene tun. Stellen Sie sicher, dass Sie eine Anfrage an ESRI senden, um es als Tool in der nächsten Version zu implementieren.
Blord-Castillo
1

Diese Antwort stammt aus den alten ArcGIS-Diskussionsforen .

Vielen Dank an Jason Scheirer für etwas präziseren Code:

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

Und besonders an Chris Snyder für einen Leistungstipp:

Eine schnellere Abhilfe könnte darin bestehen, Ihren Punkt ein wenig zu puffern und dann den Pufferumfang als Analyseumfang zu verwenden, um eine In_Memory-Kopie (CopyFeatures-Tool) Ihrer SDE-Daten zu erstellen und dann eine SelectByLocation für das kleinere und lokale In_Memory-Dataset durchzuführen. Auf diese Weise wird mit dem SelectByLocation-Tool die Analyseumfangsumgebung berücksichtigt, was normalerweise nicht der Fall ist. Übrigens: Alle Features, die sich mit dem Analyseumfang überschneiden, werden mit dem CopyFeatures-Tool kopiert. Ich wünschte, das SelectByLocation-Tool und die Cursormethoden würdigten den Analyseumfang ...

PolyGeo
quelle