Suite

Itérer Intersect_analysis sur un fichier de formes de polygones à l'aide d'ArcPy?


J'utilise ArcGIS 10.3.1 for Desktop et j'ai deux fichiers de formes :

  1. Un ensemble de données de flux (ligne vectorielle)
  2. Un résille de polygones

Je veux savoir, pour chaque polygone de ce filet de pêche, quelle est la longueur totale des cours d'eau à l'intérieur de ce polygone. Jusqu'à présent, j'ai essayé d'itérer l'outil intersect_analysis sur la table de quadrillage, en additionnant les longueurs de la sortie et en l'écrivant dans le champ pertinent, mais chaque itération effectue l'intersection sur l'ensemble de la grille, et non sur le polygone sélectionné dans cette grille.

Code:

import arcpy #définir des variables d'environnement arcpy.env.workspace = "C:UsersAlexDocumentsSoilMoisture" arcpy.env.overwriteOutput = 1 #définir les variables pour toutes les classes d'entités et champs nécessaires streams = "pathto/str_split_lamb.shp " ## shapefile du réseau de cours d'eau divisé aux sommets, dans la projection Lambert, avec le champ de valeur de longueur pré-calculé rainGrid = "pathto/net_test.shp" ## polygones pour les cellules de pluie, avec le champ "DRN_LENGTH" vide curseur = arcpy.UpdateCursor( rainGrid) ## itérera sur chaque ligne de la fonction de grille de précipitations pour la ligne du curseur : intStreams = arcpy.Intersect_analysis([streams,rainGrid],"output.shp","ALL","","LINE") ## intStreams devient tous les segments de flux à l'intérieur du polygone strCursor = arcpy.SearchCursor(intStreams) ## itérer sur les flux à l'intersection totalLen = 0 pour rowmore dans strCursor: totalLen += rowmore.length ## sommer toutes les valeurs de longueur en une variable print totalLen # c'est juste ici pour vérifier ce qui se passe sur la ligne.DRN_LENGTH = totalLen ## ajoute de la valeur à fi champ curseur.updateRow(row) print "Terminé !"

Des idées?


Vous devez d'abord sélectionner un seul polygone à chaque itération ; alors l'outil d'intersection ne considérera que ce polygone. Vous pouvez sélectionner par attribut (http://pro.arcgis.com/en/pro-app/tool-reference/data-management/select-layer-by-attribute.htm), en utilisant des FID uniques.


Vous ne devez effectuer aucune itération des sélections SQL, car cela est très lent et totalement inutile. Au lieu de cela, intersectez toutes les lignes par tous les polygones, puis utilisez un curseur de recherche sur les résultats d'intersection pour créer un dictionnaire avec le polygone FID comme clé de dictionnaire avec des valeurs qui contiennent les sommes des longueurs de ligne. Enfin, utilisez un curseur de mise à jour pour écrire dans chaque polygone après avoir recherché la clé du dictionnaire FID du polygone. Une fois l'intersection terminée, le processus réel de récapitulation des données d'intersection pour la grille complète et d'écriture des longueurs dans l'ensemble de données cible se terminera en quelques secondes pour 10 000 enregistrements.

Voir mon blog sur la manipulation de données de charge turbo avec des curseurs et des dictionnaires Python. En particulier, consultez la section "Utiliser un dictionnaire Python construit à l'aide d'un curseur de recherche pour remplacer une table de sortie de statistiques récapitulatives" à la fin du blog.


En s'appuyant sur la réponse de @Paulo Raposo, si le script est exécuté en dehors de la fenêtre Python dans ArcMap et que la couche n'est pas dans la carte actuelle, vous devrez utiliser la méthode Make Feature Layer avant d'effectuer la sélection d'entités à l'aide de Select Layer by Attribute.


Voir la vidéo: 4 - Select by Location - ArcMap Scripting with Python and Arcpy (Octobre 2021).