Suite

Étiqueter chaque polygone en fonction du nombre de points à l'intérieur à l'aide de Python


J'ai une couche de parcelles et une couche d'arbres, je veux étiqueter chaque parcelle avec le nombre d'arbres qu'elle contient et la somme des DBH. J'ai écrit un script qui calcule cela et cela fonctionne de manière autonome, mais je ne vois pas comment le faire fonctionner avec une expression d'étiquette. Voici le code que j'ai essayé (ArcMap 10.2) :

import arcpy import numpy def FindLabel(): mxd = arcpy.mapping.MapDocument("CURRENT") parcels = arcpy.mapping.ListLayers(mxd, "Parcel*")[0] tree = arcpy.mapping.ListLayers(mxd, " Surveyed Trees*")[0] arcpy.SelectLayerByLocation_management(parcels, "CONTAINS", arbres, "#", "NEW_SELECTION") arcpy.SelectLayerByLocation_management(trees, "WITHIN", parcelles, "#", "NEW_SELECTION") avec arcpy .da.SearchCursor(parcels, ["OBJECTID"]) as cur : pour la ligne dans cur : arcpy.SelectLayerByLocation_management(trees, "WITHIN", parcelles, "#", "NEW_SELECTION") treeCount = int(arcpy.GetCount_management(trees ).getOutput(0)) champ = arcpy.da.TableToNumPyArray(trees, ("DBH"), skip_nulls = True) sum = field["DBH"].sum() message = "Trees = " + str(treeCount) + "
" + "DBH = " + str(somme) renvoie le message

Cela envoie ArcMap dans une longue boucle et semble ensuite renvoyer la dernière valeur calculée pour chaque parcelle, donc tout est étiqueté "1 Tree 7 DBH".

Peut-être que je ne devrais pas utiliser un SearchCursor ?

Solution

Voici le code que j'ai fini par utiliser. C'est toujours gourmand en processeur, mais cela correspond bien à notre flux de travail.

import arcpy def FindLabel ( [Loc_Name] ): mxd = arcpy.mapping.MapDocument("CURRENT") arbres = arcpy.mapping.ListLayers(mxd, "ProgramSurveyGround*")[0] arcpy.MakeTableView_management(trees, "treesTable") parcels = arcpy.mapping.ListLayers(mxd, "ParcelProcessing*")[0] Query = ' "Loc_Name"' + " = '" + [Loc_Name] + "'" treeSelect = arcpy.SelectLayerByAttribute_management("treesTable", "NEW_SELECTION ", Query) treeCount = int(arcpy.GetCount_management("treesTable").getOutput(0)) dbhArray = arcpy.da.TableToNumPyArray("treesTable", ('DBH'), skip_nulls = True) dbhCount = dbhArray['DBH '].sum() myText = "Trees : " + str(treeCount) + "
" + "DBH : " + str(dbhCount) return myText

Trois appels àarcpy.SelectLayerByLocation_managementet un appel àarcpy.da.TableToNumPyArray!

Supposons que vous ayez résolu le bogue dans votre code, mais que l'appel de 4 fonctions de géotraitement coûteuses dans une expression d'étiquette n'est pas un choix rationnel et ne suit pas les meilleures pratiques.

  1. Vous pouvez soit pré-traiter les données et utiliser la jointure spatiale (règle de fusion = nombre)
  2. Créez des classes de relations entre les deux couches et comptez le nombre d'entités associées et affichez-les sous forme d'étiquette. C'est à la fois dynamique et convivial. Cependant, vous devez prendre soin de la suppression et de l'ajout d'entités ponctuelles et associer automatiquement l'entité ponctuelle au polygone lors de différents événements de mise à jour.


Voir la vidéo: Fonction Nombre de diagonales dun polygone en fonction du nombre de côtés Quatrième (Octobre 2021).