ArcPy a-t-il une fonction de recherche spatiale pour la géométrie?

10

Mon problème: en utilisant ArcPy, je veux parcourir les tampons et sélectionner geometry_features à l'intérieur de chaque tampon et faire quelque chose (mettre à jour) uniquement les objets trouvés dans ce tampon spécifique. Le code ci-dessous explique ce que je veux faire (plus ou moins):

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)

Cependant: cela ne fonctionnera pas car SelectLayerByLocation_management () n'accepte pas une géométrie, "forme" comme argument mais attend un nom de classe_ d'entité (nom de couche). Existe-t-il une méthode arcpy qui peut faire une recherche en utilisant un prédicat spatial. Je n'ai pas pu trouver comment procéder à partir du manuel ESRI.

user8175
la source

Réponses:

13

Je suis convaincu que quelque chose comme cela peut être fait car nous utilisons le code ci-dessous dans l'un de nos cours de formation. S'il semble ne pas fonctionner, je soupçonne que vous n'avez pas défini l'objet de couche en utilisant une couche dans la table des matières d'ArcMap ou en utilisant MakeFeatureLayer en dehors d'ArcMap.

Ou, plus probablement, je pense que c'est le "connections =" ​​à côté de SelectLayerByLocation qui vous donne votre problème parce que vous le définissez sur un objet Result et n'en extrayez rien avant de le renvoyer.

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
la source
2

Cela peut être fait, mais pour autant que je sache, uniquement en utilisant des couches d'entités avec arcpy. Essentiellement, vous allez créer une clause where et la mettre à jour avec l'OID (ou tout autre champ d'identification unique) et parcourir la SelectLayerByLocation.

Consultez ce tutoriel du programme du maître PSU - il couvre à peu près exactement ce que vous recherchez si je ne me trompe pas.

Aucune référence à la géométrie n'est nécessaire; la requête spatiale utilise la géométrie en fonction du type de requête que vous définissez (c'est-à-dire qu'elle contient complètement, partage une bordure, etc.). Si vous devez référencer la géométrie de ces points, une fois qu'ils sont déterminés comme étant dans le tampon, ajoutez-les (OID) à une liste python et travaillez avec l'ensemble de données d'origine à l'aide d'une clause where.

Roy
la source
J'ai trouvé la solution au problème. J'ai dû donner un feature_layer comme premier argument au lieu de la chaîne se référant au class_layer.
user8175
1

J'ai trouvé la solution au problème. J'ai dû fournir un feature_layer comme premier argument au lieu d'une chaîne faisant référence au class_layer. "

    # 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
la source
3
Je suis presque sûr que la réponse de PolyGeo a couvert cela. Vous devez faire attention à noter la distinction entre une classe d'entités et une couche d'entités .
blah238