J'utilise actuellement le script suivant pour ajouter des données d'attribut d'une table à de nombreux fichiers de formes individuels:
library(rgdal)
specieslist <- read.csv("SpeciesList1.txt", header=F)
attdata <- read.table("TestAtt.csv", sep = ",", header=T)
for (n in 1:dim(specieslist)[1])
{
speciesname <- specieslist[n,1]
shp <- readOGR("Mesoamerica_modified_polygons", speciesname)
shp$ENGL_NAME<-attdata[n,2]
writeOGR(shp, "PolygonsV2", speciesname, driver="ESRI Shapefile")
}
Je reçois les avertissements suivants à la fin:
1: In writeOGR(shp, "PolygonsV2", speciesname, driver = "ESRI Shapefile") :
Field names abbreviated for ESRI Shapefile driver
Lors de l'affichage de la table d'attributs des fichiers de formes après ce processus, le nom du champ a été raccourci en 'ENGL_', mais je veux qu'il reste en tant que 'ENGL_NAME'. Existe-t-il un moyen de désactiver cette abréviation?
Toute aide très appréciée.
Réponses:
Vous ne pouvez pas, c'est un problème de fichier de formes. Voir http://gdal.org/drv_shapefile.html sous «Options de création»
la source
writeOGR
? Est-ce réellement un problème de format?Votre 'ENGL_NAME' ne devrait pas du tout être abrégé (moins de 10 caractères), mais writeOGR a sa propre volonté, semble-t-il.
Au lieu de
tu pourrais essayer
Comme writeSpatialShape ne semble pas avoir de paramètre pour la destination, j'ai trouvé cette solution de contournement en basculant le répertoire de travail d'avant en arrière.
L'autre problème est qu'il ne produit pas de fichier .prj, mais c'est un problème mineur par rapport aux noms de champs détruits.
En attendant les moments où + * # -! (/ Le format de fichier ESRI est finalement mort et remplacé par ... eh bien?
la source
J'ai eu des problèmes similaires en travaillant dans RStudio. Selon les conseils dans les divers commentaires et réponses ci-dessus, ma solution en terre brûlée est:
names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
names(copy@data) <- strtrim(names(copy@data), 10)
juste pour être sûrwriteOGR(copy, dsn, layer, driver = 'ESRI Shapefile')
mais ne l'exécute pas encorewriteOGR () utilise base :: abbreviate - voici un test avec une copie des lignes 158-164:
Vous pouvez voir qu'il appelle en fait abrégé deux fois (peut-être inutilement, je ne peux pas comprendre comment vous déclencheriez cette sous-boucle), et si même un nom de colonne> 10, alors il raccourcira tout nom de colonne avec> 7 caractères. Je ne peux pas comprendre pourquoi on doit effacer l'espace de travail et redémarrer si writeOGR a été exécuté sur le même objet auparavant, mais peut-être que cela a quelque chose à voir avec fld_names étant un vecteur de caractères nommé. Cela pourrait mieux fonctionner si as.character () était enroulé autour d'abbreviate ().
la source
Comme déjà mentionné, les fichiers de formes ont une limite de caractères de nom de champ de 10 caractères. writeOGR répond à cette exigence en changeant les en-têtes de champ à l'aide d'un algorithme qui priorise les caractères à supprimer lorsqu'un nom de champ dépasse la limite. Je ne sais pas comment cela fonctionne, mais cela semble raccourcir les noms de champ de manière étrange et imprévisible, et peut raccourcir les noms de champ de cette manière qui répondaient déjà à l'exigence 10.
Voici mon travail. L'utilisation de strtrim () et la définition de la longueur des caractères à 10 tronqueront les noms de champ à 10 caractères de manière plus prévisible que l'automatisation de writeOGR.
Un problème que vous pourriez avoir est si vous avez des noms de champs identiques pour les 10 premiers caractères, mais j'ai rarement ce problème.
Je l'applique à chaque fois que j'exporte un fichier de formes, au cas où.
la source