Sélection d'un polygone ArcSDE par point dans ArcGIS Desktop à l'aide d'ArcPy?

15

Je continue de penser que je dois manquer quelque chose, mais il ne semble pas y avoir d'outil dans ArcGIS 10 pour sélectionner des entités (en particulier des polygones) à partir d'une couche à un endroit (X, Y) via ArcPy. Les paramètres d'un tel outil seraient simplement un nom de couche et un emplacement XY.

Pour le moment, je contourne cela en créant une classe de points contenant le point et en effectuant un SelectLayerByLocation dessus. Cependant, lorsque la classe d'entités surfaciques est dans Oracle (accessible via ArcSDE 9.x) et contient 3,5 millions de polygones, le temps nécessaire pour effectuer la sélection peut être supérieur à 5 minutes quand je pense qu'une seconde ou deux (avec moins de code) seraient plus approprié. La classe d'entités a un index spatial et j'ai essayé d'utiliser arcpy.env.extent (que SelectLayerByLocation semble ignorer) pour restreindre la zone géographique accessible mais les performances restent très médiocres.

Existe-t-il un moyen plus rapide de le faire à l'aide d'ArcGIS Desktop 10 et d'ArcPy?

PolyGeo
la source
Il y a maintenant une solution à cela sur forums.arcgis.com/threads/… et je modifierai ces informations ici plus tard dans la journée - merci beaucoup à Jason Scheirer et Chris Snyder
PolyGeo
2
Tout comme une note à ce sujet, vous pouvez trouver les environnements honorés par un outil au bas de la page de référence de l'outil. SelectByLocation n'honore que l'espace de travail actuel et le système de coordonnées en sortie. help.arcgis.com/en/arcgisdesktop/10.0/help/index.html#//…
blord-castillo

Réponses:

9

Une autre approche consiste à utiliser l'outil de jointure spatiale. Utilisez le point comme couche d'entités en entrée comme ci-dessus et la couche de polygones comme entités d'identité.
Contrairement à SelectLayerByLocation, SpatialJoin fait honneur à l'environnement de mesure.

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 peut sembler contre-intuitif, mais comme vous n'avez qu'une seule fonction de jointure, la fonction principale de cette option est de désactiver les règles d'agrégation et de fusion. KEEP_COMMON s'assurera que votre sortie est limitée uniquement au polygone qui coupe votre point. Les Fieldmappings limiteront les attributs de sortie à la forme et aux attributs de la couche de polygones uniquement; la valeur par défaut inclurait également les attributs de la couche de points.

Le reste des valeurs par défaut fonctionnera correctement, vous pouvez donc laisser de côté les arguments restants.

blord-castillo
la source
Merci beaucoup pour ce code qui contenait quelques techniques que je n'avais pas essayées. J'avais déjà essayé SpatialJoin (pour que l'environnement de géotraitement soit respecté), mais ce test, ainsi qu'un test de votre technique tout à l'heure, me laissaient toujours un temps de réponse de 4 à 5 minutes, contre 10 à 12 secondes pour le chemin. Chris Snyder m'a conduit à.
PolyGeo
Avez-vous également essayé la technique de Chris Snyder avec SpatialJoin? Je pense que la raison principale pour laquelle la technique du tampon est si rapide est qu'elle utilise une copie en mémoire de la classe des polygones. Je pense que la sélection par emplacement devrait être plus rapide que la jointure spatiale, mais je ne suis pas sûr.
blord-castillo
J'ai fini par ne pas utiliser le bit in_memory. C'était déjà tellement accéléré que je l'ai gardé en réserve. Je pense que l'élément clé était de définir l'étendue pour obtenir le ou les polygones (à partir de 3,5 millions), dont j'avais besoin pour vérifier les X, Y, rapidement copiés dans une géodatabase fichier locale. Donc, faire cette partie avant le SpatialJoin entraînerait, je pense, une amélioration des performances identique / similaire.
PolyGeo
1

Je viens de réaliser quelque chose ...

Si vous l'utilisez pour implémenter un service de géotraitement, vous pouvez également implémenter un service d'entités avec votre couche de polygones à la place et utiliser l'opération de requête sur le service d'entités.

Vous pouvez utiliser un emplacement XY simple avec l'opération de requête du service d'entités, ainsi que contrôler les attributs de sortie, y compris la forme.

Vous pouvez avoir des restrictions sur la quantité d'expositions de la classe d'entités surfaciques, mais si vous la rendez déjà accessible au service de géotraitement, vous devriez également pouvoir créer un service d'entités.

blord-castillo
la source
C'est une pensée utile pour répondre à d'autres exigences mais, dans ce cas, l'application client est très simple et hors de mon contrôle, je ne peux donc fournir qu'un service de géotraitement.
PolyGeo
J'ai pensé qu'il pourrait y avoir une restriction à l'utilisation d'autre chose qu'un service de géotraitement :) Ironiquement, je pense qu'un service d'entités est une voie beaucoup plus simple à mettre en œuvre et à maintenir. Cela peut également expliquer pourquoi la fonctionnalité souhaitée n'est pas disponible; vous pouvez déjà le faire à chaque niveau d'application. Assurez-vous d'envoyer une demande à ESRI pour l'implémenter comme outil dans la prochaine version.
blord-castillo
1

Cette réponse provient des anciens forums de discussion ArcGIS .

Merci Jason Scheirer pour un code plus concis:

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

Et surtout à Chris Snyder pour un conseil de performance:

Un travail plus rapide peut consister à tamponner un peu votre point, puis à utiliser l'étendue de tampon comme étendue d'analyse pour créer une copie in_memory (outil CopyFeatures) de vos données SDE, puis effectuer une SelectByLocation sur l'ensemble de données in_memory plus petit et local. De cette façon, vous faites en sorte que l'outil SelectByLocation respecte l'environnement d'étendue d'analyse, ce qu'il ne ferait pas normalement. BTW: toutes les fonctionnalités qui chevauchent l'étendue de l'analyse seront copiées avec l'outil CopyFeatures. Je souhaite vraiment que l'outil SelectByLocation et les méthodes des curseurs respectent l'étendue de l'analyse ...

PolyGeo
la source