Suite

Création d'enregistrements dans le fichier de formes de sortie à l'aide de Python


J'ai une liste (sortie d'une boucle précédente) contenant des attributs d'un fichier de formes d'entrée. Ce qui me bloque, c'est d'entrer ces attributs dans un nouveau fichier de formes.

J'ai tracé les données de point en utilisantw.point(x, y)et a également créé les champs pertinentsw.champ()à partir des champs du fichier de formes d'entrée.

Là où je suis bloqué, c'est avec la copie des enregistrements, ce qui me donne une erreur liée au drapeau de suppression.

AttributeError : l'objet 'tuple' n'a pas d'attribut 'startswith'

Je colle une partie du code avec mes requêtes.

from datetime import datetime import osgeo.ogr, osgeo.ogr from osgeo import ogr from osgeo import gdal import shapefile import os sf = shapefile.Reader("-- Input File Location --") # Lecture des champs Shapefile = sf.fields # Lecture des champs attributaires records = sf.records() # Lecture des enregistrements des entités shapRecs = sf.shapeRecords() # Lecture simultanée de la géométrie et des enregistrements w = shapefile.Writer(shapefile.POINT) w.autoBalance = 1 result1 = [] résultat2 = [] # ??? L'erreur est-elle due au fait que nous ne pouvons pas rechercher une liste dans une liste ??? print '** Appeler la fonction pt(p) où p est l'indice de nœud… **' # Inviter l'utilisateur à # appeler la fonction avec # le nombre requis de nœuds def pt(p): for i in range(len(shapRecs) ): u = shapRecs[i].shape.points[p-1] # Donne les coordonnées XY des # points interrogés v = shapRecs[i].record[0:] # Génération des attributs result1.append(u) result2 .append(v) w.point(u[0], u[1]) # Crée des points à partir des coordonnées à chaque exécution de la boucle w.autoBalance = 1 # -- Ajout des champs w.field(fields[0]) # Ajout du premier champ, AVEC indicateur de suppression (???) pour i dans la plage (1, len(fields)): # La boucle commence à partir du deuxième champ (???) w.field(fields[i]) w.autoBalance = 1 # LE CODE MONTRE L'ERREUR INDIQUÉE CI-DESSUS DE L'instruction w.record() # -- Ajout des enregistrements pour i dans range(len(result2)): w.record(*result2[i]) w.autoBalance = 1 w .save('-- Emplacement du fichier de sortie --')

Je ne comprends pas votre script. Pourquoi utiliser PyShp (shapefile), si vous utilisez osgeo.ogr ? Vous pouvez faire la même chose avec ogr uniquement (meilleur moyen de dupliquer une couche en utilisant ogr en python ? ).

Si vous souhaitez importer ogr et gdal depuis osgeo, la formulation

importer osgeo.ogr, osgeo.ogr depuis osgeo importer ogr depuis osgeo importer gdal

est une redondance (vous importez deux fois ogr et gdal)

Pareil poursf.record()etsf.shapeRecords():

sf = shapefile.Reader("strati") records = sf.records() # Lecture des enregistrements des fonctionnalités pour rec dans records : print rec [30, 130, 'incl'] [55, 145, 'incl'] [ 40, 155, 'y compris']

et

shapRecs = sf.shapeRecords() pour rec dans shapRecs : print rec.record [30, 130, 'incl'] [55, 145, 'incl'] [40, 155, 'incl']

Si vous ne voulez que la géométrie :

pour rec dans sf.iterShapes() : x,y = rec.points[0] print x,y 272070.600041, 155389.3879200000 271066.03214800003, 154475.63137700001 273481.498868, 153923.49298800001

et

pour rec dans shapRecs : x,y = rec.shape.points[0]

Si vous voulez juste copier le shapefile :

w = shapefile.Writer(shapefile.POINT) sf = shapefile.Reader("strati") w.fields = list(sf.fields) pour rec dans sf.records(): w.records.append(rec) w._shapes .extend(sf.shapes()) w.save("dupliquer")

Si vous souhaitez ajouter un champ, regardez Ajouter un champ à un fichier de formes existant

Si vous voulez des listes, le moyen le plus simple est :

sf = shapefile.Reader("votrefichier.shp") formes = sf.shapes() # -> liste de toutes les géométries champs = sf.fields[1:] #-> définition des champs dans une liste (sans le drapeau de suppression) field_names = = [field[0] for field in fields] #-> liste des noms de champs attribute = sf.records() #-> liste avec tous les attributs


Voir la vidéo: Archivos binarios: agregar, consultar y modificar registros struct en un archivo (Octobre 2021).