Suite

Méthode arcpy efficace des points dans le polygone

Méthode arcpy efficace des points dans le polygone


Issu de Mapinfo et de Manifold, je suis souvent frustré par l'ensemble d'outils SQL d'ArcGIS. Dans ces deux anciens programmes, il est trivial d'écrire une requête demandant, par exemple, combien de points se trouvent dans chaque polygone. Cela peut être filtré en utilisant des clauses where, par ex. tous les points de type a à l'intérieur de chaque polygone puis tous les points de type b à l'intérieur de chaque polygone. Étant donné que le résultat de la requête est une table en mémoire, il est rapide et utilise très peu d'espace disque.

En revanche, Spatial Join dans ArcGIS semble assez lent, peut-être à cause des E/S disque, utilise plus d'espace disque que nécessaire, et je trouve personnellement cela encombrant.

Je sais qu'il existe des alternatives, Hawths Tools par exemple, mais j'essayais de faire quelque chose en arcpy. Ma première pensée a été de parcourir chaque géométrie à la fois dans l'ensemble de polygones et dans l'ensemble de points et de tester si le point était contenu dans le polygone. Cela permettrait alors de calculer toutes sortes de choses. J'ai écrit un test qui vient de parcourir tous les points d'un polygone :

import arcpy arcpy.env.workspace = r"path	oworkspace" print "Start" geom = arcpy.Point(530000,180000) cursor = arcpy.SearchCursor("FCName") pour rowid dans le curseur : poly = rowid.Shape if poly.contains(geom): print rowid.OBJECTID

Cependant, cela prend quelques secondes pour chaque polygone, donc avec une taille de jeu de données de 4 000 polygones, je ne pense pas que cela fonctionnera particulièrement rapidement.

Est-ce que n'importe qui a des idées pour rendre ceci plus efficace, ou une fonction qui me manque ?


L'utilisation de l'outil Intersection fonctionnerait-elle pour vous ? Chaque point de la classe d'entités résultante aurait également les attributs du polygone dans lequel il est contenu, et vous pouvez écrire un script qui parcourt ces points et calcule les statistiques dont vous avez besoin pour chaque ID de polygone (min, max, moyenne, somme, compter, etc.).


Pouvez-vous appeler l'outil de jointure spatiale à partir de votre script arcpy ? Peut-être écrire une méthode wrapper pour gérer où va la sortie et gérer sa suppression par la suite. Ce sera probablement plus rapide que de parcourir les fonctionnalités directement dans arcpy.

Sinon, je crains que arcpy ne soit lent. Vous pouvez utiliser ctypes pour appeler une dll qui effectue la fonction point dans un polygone pour vous, mais c'est beaucoup plus de travail d'implémentation, et vous avez toujours la charge de lire les fonctionnalités en premier lieu.


Je suis comme toi. Je dois utiliser ArcPy et dans l'environnement actuel dans lequel je travaille, l'utilisation de SpatialJoin ou d'autres outils ArcGIS est fastidieuse.

En raison d'autres contraintes, je ne peux pas utiliser cette bibliothèque. Jetez un œil à Shapely que vous pouvez télécharger en utilisant easy_install, je crois.

Il propose une gamme de méthodes rapides pour exécuter les fonctions les plus courantes et les plus élémentaires. Associez cela à shplib et vous aurez une alternative rapide et légère.


Il s'agit d'un ancien article, il n'était donc pas disponible à l'époque, mais le module d'accès aux données (v10.1) est très rapide et l'utilisation de ces objets et de la géométrie vous permet d'effectuer ce type de requête plus rapidement que la boîte à outils standard. Il est basé sur les tableaux NUMPY, c'est pourquoi il est si puissant et rapide.

http://resources.arcgis.com/en/help/main/10.1/index.html#/SearchCursor/018w00000011000000/ http://resources.arcgis.com/en/help/main/10.1/index.html#/ /018z000000070000000