Suite

Cause de KeyError dans la boîte à outils Python d'ArcPy ?

Cause de KeyError dans la boîte à outils Python d'ArcPy ?


Cette question découle de l'exécution d'une analyse de distance de point à l'aide d'une licence de niveau de base d'ArcGIS for Desktop ?.

J'ai essentiellement copié et collé la réponse de PolyGeo et l'ai formatée dans une boîte à outils python contenant des paramètres d'entrée. J'ai essayé de l'exécuter avec deux classes d'entités qui sont des points. Il crée la table mais ne la remplit pas en raison d'une erreur. Vous trouverez ci-dessous le code de la boîte à outils. En dessous se trouve le message d'erreur qui est renvoyé.

import arcpy import math"Ne changez pas le nom de cette classe. Cela casserait la boîte à outils."class Toolbox(object): def __init__(self):"Définir les propriétés de la boîte à outils (l'anme de la boîte à outils est le nom de fichier .pyt)."self .label = "Toolbox" self.alias = "" # Liste des classes d'outils associées à cette toolbox self.tools = [Tool] class Tool(object): def __init__(self):"Définir l'outil (le nom de l'outil est la classe name)."self.label = "Tool" self.description = "" self.canRunInBackground = False def getParameterInfo(self):"parameter definitions for GUI"ptFC1 = arcpy.Parameter( displayName="Input 1st Point FC", name ="ptFC1", datatype="DEFeatureClass", parameterType="Required", direction="Input") ptFC2 = arcpy.Parameter( displayName="Input 2nd Point FC", name="ptFC2", datatype="DEFeatureClass", parameterType="Required", direction="Input") outGDB = arcpy.Parameter( displayName="Sortie où va la table", name="outGDB", datatype="DEWorkspace", parameterType="Required", direction="Input ") params = [ptFC1, ptFC2, out GDB] return params def isLicensed(self):"Définir si l'outil est autorisé à s'exécuter."return True def updateParameters(self, parameters):"Modifier les valeurs et les propriétés des paramètres avant que la validation interne ne soit effectuée. Cette méthode est appelée chaque fois qu'un paramètre a été modifié."return def updateMessages(self, parameters):"Modifier les messages créés par validation interne pour chaque paramètre d'outil. Cette méthode est appelée après validation interne."return def execute(self, parameters, messages):"Le code source de l'outil."ptFC1 = parameters[0].valueAsText ptFC2 = parameters[1].valueAsText outGDB = parameters[2 ].valueAsText # Définir les variables pour les classes d'entités ponctuelles en entrée et la table de sortie outTableName = "outTable" outTable = outGDB + "/" + outTableName arcpy.env.overwriteOutput = True # Créer une table de sortie vide arcpy.CreateTable_management(outGDB,outTableName) arcpy. AddField_management(outTable,"INPUT_FID","LONG") arcpy.AddField_management(outTable,"NEAR_FID","LONG") arcpy.AddField_management(outTable,"DISTANCE","DOUBLE") # Créer et remplir deux dictionnaires avec X et Y coordonnées pour chaque # OBJECTID dans la deuxième classe d'entités à l'aide d'un SearchCursor ptFC2XCoordDict = {} ptFC2YCoordDict = {} avec arcpy.da.SearchCursor(ptFC2,["OBJECTID","[email protected]"]) comme curseur : pour la ligne du curseur : ptFC2XCoordDict [row[0]] = row[1][0] ptFC2YCoordDict[row[0]] = row[1][1] # Ouvrir un InsertCursor prêt à ha cinq lignes écrites pour chaque paire d'OBJECTIDs iCursor = arcpy.da.InsertCursor(outTable,["INPUT_FID","NEAR_FID","DISTANCE"]) # Utilisez un SearchCursor pour lire les lignes (et les coordonnées X,Y) du premier # classe d'entités avec arcpy.da.SearchCursor(ptFC1,["OBJECTID","[email protected]"]) comme curseur : pour la ligne dans le curseur : x1 = ligne[1][0] y1 = ligne[1][1] for i in range(len(ptFC2XCoordDict)): x2 = ptFC2XCoordDict[i+1] y2 = ptFC2YCoordDict[i+1] # Préparer et insérer la ligne InsertCursor iRow = [row[0],i+1,math.sqrt( (x2-x1)*(x2-x1) + (y2-y1)*(y2-y1))] iCursor.insertRow(iRow) del iCursor return

Voici l'erreur qui s'affiche.

La ligne 123 est la suivante : x2 = ptFC2XCoordDict[i+1]


Ce bit semble avoir été incorrectement copié :

avec arcpy.da.SearchCursor(ptFC2,["OBJECTID","[email protected]"]) comme curseur : pour la ligne dans le curseur : ptFC2XCoordDict[row[0]] = row[1][0] ptFC2YCoordDict[row[0] ] = ligne[1][2]

Ça devrait être:

avec arcpy.da.SearchCursor(ptFC2,["OBJECTID","[email protected]"]) comme curseur : pour la ligne dans le curseur : ptFC2XCoordDict[row[0]] = row[1][0] ptFC2YCoordDict[row[0] ] = ligne[1][1]

Sur la dernière de ces quatre lignes, vous essayiez de définir le dictionnaire ptFC2YCoordDict en utilisant un tiers inexistant ([2]) fait partie du tuple de coordonnées X,Y auquel [email protected] vous donne accès.


Voir la vidéo: Fixing KeyError Exceptions in Python