Verfügt ArcPy über eine räumliche Suchfunktion für Geometrie?

10

Mein Problem: Mit ArcPy möchte ich Puffer durchlaufen und Geometriefunktionen in jedem Puffer auswählen und nur die in diesem bestimmten Puffer gefundenen Objekte aktualisieren. Der folgende Code erklärt, was ich tun möchte (mehr oder weniger):

def _update_connections_inside_buffers(self):
    buffers = arcpy.SearchCursor(self.__buffer_class_name)
    in_layer = "connections"
    for i_buffer in buffers:
        shape = i_buffer.shape
        # can not use a geometry to do a selection.. very inconvenient!!
        connections = arcpy.SelectLayerByLocation_management(in_layer, "WITHIN", shape) 
        self._update_connections(connections)

Dies funktioniert jedoch nicht, da SelectLayerByLocation_management () keine Geometrie "Form" als Argument akzeptiert, sondern einen Feature-Klassennamen (Layername) erwartet. Gibt es eine arcpy-Methode, die eine Suche mit einem räumlichen Prädikat durchführen kann? Wie das geht, konnte ich im ESRI-Handbuch nicht finden.

user8175
quelle

Antworten:

13

Ich bin zuversichtlich, dass so etwas möglich ist, da wir in einem unserer Schulungskurse den folgenden Code verwenden. Wenn es nicht funktioniert, habe ich den Verdacht, dass Sie das Ebenenobjekt entweder nicht mithilfe eines Layers im Inhaltsverzeichnis von ArcMap oder mithilfe von MakeFeatureLayer außerhalb von ArcMap definiert haben.

Oder eher denke ich, dass es das "connection =" neben SelectLayerByLocation ist, das Ihnen Ihr Problem gibt, weil Sie das auf ein Ergebnisobjekt setzen und nichts daraus extrahieren, bevor Sie es zurückgeben.

import arcpy
schoolsLayer = "Schools"
suburbsLayer = "Suburbs"
# get an update cursor as we will be changing values
rows = arcpy.UpdateCursor(suburbsLayer)
# loop through each suburb in the layer
for row in rows:
    polygon = row.SHAPE
    arcpy.SelectLayerByLocation_management(schoolsLayer,"INTERSECT",polygon)
PolyGeo
quelle
2

Dies ist möglich, aber soweit ich weiß, nur durch die Verwendung von Feature-Layern mit Arcpy möglich. Im Wesentlichen erstellen Sie eine where-Klausel, aktualisieren sie mit der OID (oder einem anderen eindeutig identifizierenden Feld) und durchlaufen die SelectLayerByLocation.

Schauen Sie sich dieses Tutorial aus dem PSU-Master-Programm an - es behandelt ziemlich genau das, wonach Sie suchen, wenn ich mich nicht irre.

Es ist kein Verweis auf die Geometrie erforderlich. Die räumliche Abfrage verwendet die Geometrie basierend auf dem von Ihnen definierten Abfragetyp (dh enthält einen Rand vollständig, teilt ihn gemeinsam usw.). Wenn Sie auf die Geometrie dieser Punkte verweisen müssen, hängen Sie sie (OID) an eine Python-Liste an, sobald sie sich im Puffer befinden, und arbeiten Sie mit dem Originaldatensatz mithilfe einer where-Klausel.

Roy
quelle
Ich habe die Lösung für das Problem gefunden. Ich musste einen feature_layer als erstes Argument angeben, anstatt einen String, der sich auf den class_layer bezieht.
user8175
1

Ich habe die Lösung für das Problem gefunden. Ich musste einen feature_layer als erstes Argument angeben, anstatt einen String, der sich auf den class_layer bezieht. "

    # Make a feature layer from the feature class
    class_layer = arcpy.env.workspace + "." + "connections"
    arcpy.MakeFeatureLayer_management(class_layer, "feature_layer")

    # Do selection using feature_layer 
    arcpy.SelectLayerByLocation_management("feature_layer", "WITHIN", p_polygon)

    # get result
    connections_found_in_polygon = arcpy.SearchCursor("feature_layer")
    self._update_connections(connections_found_in_polygon)
user8175
quelle
3
Ich bin mir ziemlich sicher, dass die Antwort von PolyGeo dies abdeckte. Beachten Sie den Unterschied zwischen einer Feature-Class und einem Feature-Layer .
blah238