Suite

Transférer un nom de champ d'un fichier texte vers un nouveau nom de champ dans la classe d'entités ?


Je travaille sur un script qui implique des incidents d'incendie. Je prends mes valeurs à partir d'un fichier texte délimité par des virgules. La première ligne du fichier texte contient les noms des champs (Latitude,Longitude,Confiance). Mon objectif est de créer une nouvelle classe d'entités qui prendra le dernier nom de champ de mon fichier texte (par exemple, Confidence) et l'utilisera comme nom de champ dans ma nouvelle classe d'entités. J'ai réussi à faire en sorte qu'arcgis lise le dernier nom de champ de mon fichier texte afin qu'une nouvelle classe d'entités soit créée avec les noms de champs : "ID, SHAPE, Confidence", cependant, ma classe d'entités est vide - mes boucles for semblent arrêter après avoir lu la première ligne. Je crois que j'ai les bons composants, je ne sais tout simplement pas dans quel ordre les mettre. La partie qui m'embrouille le plus est, je commence à lire le fichier texte dans une boucle for (ce qui je pense est assez normal) et mon instinct est de diviser ce fichier texte et, en utilisant l'indexation, de pointer sur le dernier nom de champ "Confiance" à l'aide d'une variable. Une fois que je fais cela, je ne sais pas comment faire en sorte que mon curseur d'insertion et mon outil Ajouter un champ (qui sont en dehors de la boucle for) reconnaissent cette variable qui pointe vers "Confiance". Aucune suggestion?

Ci-dessous mon code :

import arcpy work=r"C:UsersCaraDocumentsWildlandFires.mdb" arcpy.env.workspace=work arcpy.env.overwriteOutput=True iFile= r"C:UsersCaraDocumentsNorthAmericaWildfires_2007275.txt" avec open(iFile, 'r') comme f: lstFires = f.readlines() #nouveau nom de classe d'entités newFC= fireIncidents fc=newFC #utilisateur entrée seuil de confiance minimum confidenceThreshold=99 minThresh=int(confidenceThreshold) lstFires = f.readlines () #Créer une nouvelle classe d'entités arcpy.CreateFeatureclass_management(work, fc, "POINT", "", "", "", "", "", "", "", "") #Parcourir le fichier ligne par ligne et remplissez de nouvelles lignes dans la classe d'entités #Create Insert Cursor à utiliser pour insérer de nouvelles lignes dans la classe d'entités fields = ["[email protected]", fieldName] cur = arcpy.da.InsertCursor (fc, fields) #add field arcpy.AddField_management(fc , fieldName , "SHORT") print "champs créés" cntr = 0 #variable de compteur utilisée pour afficher la progression du script pour fire dans lstFires : si 'Latitude' in fire : #read line, use split function fn = fire.split( ",") nom de domaine = fn[2] continue lstValues ​​= fire.split(",")#divise les valeurs en valeurs séparées if int(lstValues[2]) > minThresh : # si la valeur de confiance est supérieure à la valeur de confiance définie par l'utilisateur, continue avec le code # créer un objet point qui contiendra les coordonnées x,y du feu pnt = arcpy.CreateObject("Point") # extraire des valeurs individuelles à l'aide de l'indexation de liste latitude = float(lstValues[0]) longitude = float(lstValues[1]) confid = int(lstValues[2]) print "Je peux extraire des valeurs" cntr=cntr + 1 #assigner les propriétés x, y de l'objet Point aux valeurs long et lat pnt.X = longitude pnt.Y = latitude #Créer une nouvelle ligne pour l'entité class #assigne un nouvel objet Point au champ "SHAPE" et une valeur de confiance au champ "CONFIDENCEVALUE" row = [pnt, confid] print "row's OK" #Insert new row to feature class cur.insertRow(row) print "Record # " + str(cntr) + " écrit dans la classe d'entités" #libérer le verrouillage du curseur sur la classe d'entités del cur

Êtes-vous sûr que vos valeurs de confiance sont stockées sous forme d'entiers et non de flottants ?

Cette ligne de ton code :

if int(lstValues[2]) > minThresh :

renverra toujours False si les valeurs de confiance stockées dans votre fichier texte sont stockées sous forme de nombres compris entre 0,0 et 1,0, ce qui correspond généralement à la manière dont les valeurs de confiance sont rapportées. Essayez de remplacer cette ligne par cette ligne pour voir si cela vous aide.

if float(lstValues[2]) > minThresh :

De plus, complètement hors sujet, vous souhaiterez peut-être modifier votre syntaxe pour lire le fichier texte comme suit :

avec open(iFile, 'r') comme f: lstFires = f.readlines()

Cette syntaxe est plus propre et vous n'avez pas à vous soucier de fermer le fichier explicitement, cela se fait automatiquement.


Il s'avère qu'il y avait un " " caché à la fin de la ligne de mon fichier texte, j'ai donc dû supprimer mon nom de champ "confiance". Une fois que j'ai fait ça, tout a bien fonctionné !

Voici un extrait du code comprenant la modification que j'ai apportée au cas où quelqu'un d'autre rencontrerait ce problème :

pour le feu dans lstFires : si 'Latitude' dans le feu : #lire la ligne, utilisez la fonction split fn = fire.split(",") fName = fn[2].rstrip()#strip pour se débarrasser de 


Voir la vidéo: Kielisuihkutus kotona - Puola - Eläinten äänet (Octobre 2021).