Suite

Obtenez des valeurs de champ uniques dans l'outil de script Python

Obtenez des valeurs de champ uniques dans l'outil de script Python


Utilisation d'ArcGIS 10.2.2 et Python. J'ai un script qui compte actuellement le nombre de points (représentant des crimes) dans chaque zone de code postal et écrit cette valeur dans une nouvelle colonne du FC qui contient les limites du code postal.

Fondamentalement, l'utilisateur entre un point FC (crimes) et un polygone FC (limites zip), et l'outil écrit le nombre de délits dans chaque limite de code postal dans un nouveau champ dans le polygone FC de limites zip.

Ce que je voudrais faire, c'est améliorer ce code en permettant à l'utilisateur de choisir les catégories (qui sont contenues dans un champ séparé dans le point de crimes FC) de crimes qui sont comptés pour chaque limite de code postal. Par exemple, plutôt que de simplement compter tous les crimes, j'aimerais que l'utilisateur puisse sélectionner, disons, les agressions aggravées et le grand vol (deux des nombreuses valeurs contenues dans le champ Catégorie de Crimes FC) et que l'outil ne compte que ceux points.

# Importer le package de site ArcPy # Définir les paramètres d'environnement : emplacement de l'espace de travail import arcpy, sys # Définir l'emplacement des fermes et des classes d'entités de la sous-division de recensement crimes = arcpy.GetParameterAsText(0) zip_parcels = arcpy.GetParameterAsText(1) ) new_field = arcpy.GetParameterAsText(3) new_field_alias = arcpy.GetParameterAsText(4) # Vérifiez si le champ nommé new_field existe dans la classe d'entités 'zip_parcels' #. S'il existe, supprimez-le. if arcpy.ListFields(zip_parcels, new_field): sys.exit(arcpy.AddError("Error: Field Déjà Existe")) # Créez un nouveau champ 'NumOfFarms' dans la classe d'entités 'zip_parcels' arcpy.AddField_management(zip_parcels, new_field 'Long',",",", new_field_alias) # Créer des couches d'entités temporaires crimes_lyr = arcpy.MakeFeatureLayer_management(crimes,'crimes_lyr') zip_parcels_lyr = arcpy.MakeFeatureLayer_management(zip_parcels,'zip_parcels_lyr') # Créer un curseur de mise à jour pour accéder et mettre à jour la couche temporaire d'entités de subdivision de recensement. Pour chaque sous-division (ou # ligne), le champ NumOfFarms sera mis à jour champs = ['ZIPCODE',new_field] avec arcpy.da.UpdateCursor(zip_parcels_lyr,fields) comme cur : pour la ligne dans cur: # Crée une requête pour sélectionner une sous-division de recensement qui dictera quelles fermes # sont sélectionnées zip_parcels = row[0] where = '"ZIPCODE" = '{}".format(zip_parcels) arcpy.SelectLayerByAttribute_management(zip_parcels_lyr, 'NEW_SELECTION',où) # Sélectionnez les fermes qui se croisent (ou sont dans ) la sous-division de recensement sélectionnée # et comptez combien sont sélectionnés arcpy.SelectLayerByLocation_management(crimes_lyr,'WITHIN',zip_parcels_lyr) number_of_crimes = int(arcpy.GetCount_management(crimes_lyr).getOutput(0)) # Remplir le champ NumOfFarms avec le nombre compté des fermes sélectionnées, qui # met également à jour le champ dans la ligne de classe d'entités csd[1] = number_of_crimes cur.updateRow(row)

Veuillez excuser certains commentaires - il est parfois dit fermes et subdivisions de recensement parce que je l'ai utilisé pour un projet différent et que je l'ai lentement modifié.

Là où j'ai besoin d'aide, c'est comment générer une liste de contrôle à plusieurs valeurs dans l'interface graphique de l'outil de script (lorsque vous double-cliquez sur le script dans la barre latérale ArcCatalog) qui répertorie toutes les valeurs uniques dans le champ Catégorie du point de crime FC. Les cases à cocher (valeurs de champ) que l'utilisateur sélectionne dicteront les crimes qui seront comptés.

De plus, je voudrais ajouter que j'ai essayé la solution répertoriée ici : http://blogs.esri.com/esri/arcgis/2012/07/16/generating-a-multivalue-choice-list/

Cette solution fait planter Arc à chaque fois et je pense qu'il doit y avoir un moyen plus simple d'accomplir cette tâche.


Voir la vidéo: Set Transform Limits Maya Python Script Demo, Not a tutorial on scripting