J'ai un script Python qui ajoute un champ d'attribut à un Shapefile s'il n'existe pas. C'est facile à faire avec ArcGIS (graphiquement ou via Python), mais je recherche quelque chose qui ne dépend pas d'ArcGIS.
J'ai essayé cela sans succès avec OGR, car mon Shapefile contient des fonctionnalités .
J'ai regardé pyshp , mais de même, il n'y a aucun moyen de modifier le schéma après sa création. Je n'ai pas essayé avec le fichier de formes (pour Python) , mais je ne vois pas cette fonctionnalité annoncée. Je ne vois pas non plus comment cela peut être fait en bricolant le fichier DBF via dbfpy .
Quelqu'un a-t-il une idée?
Réponses:
vous devriez jeter un coup d'œil à ces questions car il a déjà été répondu: Comment ajouter des attributs de fonctionnalité personnalisés à Shapefile en utilisant Python?
/programming/4215658/adding-custom-feature-attributes-to-esri-shapefile-with-python
Si vous voulez comme résultat, un seul fichier de formes, supprimez simplement vos fichiers d'entrée à la fin de votre script.
la source
Voici une solution. Mieux vaut tard que jamais:
http://geospatialpython.com/2013/04/add-field-to-existing-shapefile.html?m=1
la source
Grâce à un format plutôt cérébral appelé DBF, l'ajout de champs aux fichiers de formes avec les données d'attribut existantes n'est pas possible sans réécriture ou ajout de remplissage au DBF. Je ne connais pas de solution toute faite, mais ce que je ferais serait d'écrire un script pour créer un nouveau fichier de formes basé sur un existant et d'ajouter le ou les champs supplémentaires au nouveau fichier de formes. Copiez ensuite les données de géométrie / attribut de l'ancien vers le nouveau fichier de formes. Et comme dernière étape, supprimez l'ancien fichier de formes et renommez le nouveau. Tout cela est assez facilement accompli en utilisant des liaisons python OGR.
Alternativement, vous pouvez utiliser dbfpy pour faire ce qui précède avec juste le fichier DBF. L'ordre des étapes reste le même:
Vous n'avez pas besoin de modifier le fichier de formes (.shp) lui-même ni aucun des autres fichiers, car ils ne font pas référence aux informations d'attribut contenues dans le DBF. Vous devez cependant conserver l'ordre des enregistrements exactement le même dans l'ancien et le nouveau DBF.
la source
DBFpy devrait fonctionner pour cela. Avez-vous vu un exemple sur cette page:
http://dbfpy.sourceforge.net/
Assurez-vous que le fichier de formes n'est pas en cours de modification par une autre application, y compris ArcGIS, car cela peut entraîner des problèmes via le verrouillage.
la source
from dbfpy import dbf; db = dbf.Dbf('my.dbf'); db.addField(("FOO", "C", 15))
J'ai trouvé une solution en utilisant OGR et grâce à l'aide d'une question précédente . Voici un exemple complet:
Mon problème était que j'utilisais
layer_defn.AddFieldDefn(new_field)
plutôt quelayer.CreateField(new_field)
. Un grand merci à l'aide et désolé de ne pas avoir vérifié l'autre question similaire.la source