Comment empêcher writeOGR d'abréger les noms de champs lors de l'utilisation du pilote «ESRI Shapefile»

18

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.

JPD
la source
Y a-t-il des noms de champs dans le fichier de formes> 10 caractères? On dirait un bug dans les liaisons R pour moi.
geographika
1
Salut, je viens de relancer le script et maintenant il n'est pas abrégé. Je ne sais pas ce qui a changé pour causer cela ...
JPD

Réponses:

9

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
il ne s'agit donc pas de writeOGR? Est-ce réellement un problème de format?
Tomas
1
Correct. Les longueurs de nom de colonne dbf sont limitées. Un autre format, par exemple sqlite / spatialite, ne tronquerait pas les noms (il existe de très grandes limites dans sqlite, mais de nombreux ordres de grandeur supérieurs à 10).
3
Eh bien, il y a une différence entre l'abréviation normale des noms de colonnes lors de l'écriture dans dbf et ce que writeOGR y fait! writeOGR est paralysant même les noms de champs inférieurs à 10. Mes exemples: mon nom de colonne R "ora_nachweis_id" devient "or_nch_" tandis que writeSpatilaPolygon fait l'abréviation normale -> "ora_nachwe". Même ma variable "LblColor" (8 caractères!) Devient "LblColr".
Bernd V.
Existe-t-il des noms de colonnes similaires dans la structure db / data? Je n'ai pas pu répliquer avec ogr2ogr et une base de données sqlite avec ces noms. Si vous pouvez fournir un exemple, je pourrais regarder plus loin, ou peut-être que les liaisons R causent des problèmes.
1
Le lien est mort, mais j'ai aussi des fichiers de formes avec des noms de champs beaucoup plus longs que 10 caractères; pourquoi est-ce possible si c'est un problème de fichier de formes?
Matt
7

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

writeOGR(shp, "PolygonsV2", speciesname, driver="ESRI Shapefile")

tu pourrais essayer

library(maptools)
currdir <- getwd() #store your current working directory
setwd(paste(currdir,"PolygonsV2",sep="/")) #switch to your desired folder

writeSpatialShape(shp, speciesname) # write shapefile

setwd(currdir) #switch back to parent folder

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?

Bernd V.
la source
Remplacé par un géopackage?
jsta
3

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:

  • au point où le SpatialWwhatDataFrame est prêt à être écrit dans Shape, faites une copie
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) juste pour être sûr
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') mais ne l'exécute pas encore
  • enregistrez le script, videz l'espace de travail, y compris les objets cachés, redémarrez R, réexécutez le script en entier.

writeOGR () utilise base :: abbreviate - voici un test avec une copie des lignes 158-164:

fld_names <- c('short', 'longlonglong', 'middle_1')
if (any(nchar(fld_names) > 10)) {
    fld_names <- abbreviate(fld_names, minlength = 7)
    warning("Field names abbreviated for ESRI Shapefile driver")
    if (any(nchar(fld_names) > 10)) 
      fld_names <- abbreviate(fld_names, minlength = 5)
  }

> fld_names
       short longlonglong     middle_1 
     "short"    "lnglngl"    "middl_1" 
> names(fld_names)
[1] "short"        "longlonglong" "middle_1"  

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 ().

obrl_soil
la source
Hey, merci. Je ne voulais pas perdre mon fichier PRJ, alors lire cette réponse m'a aidé. J'ai créé TOUS mes noms de champ de 10 caractères ou moins avant d'appeler writeOGR et aucun n'a été abrégé en 7.
Nova
-1

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ù.

library(sp)
library(rgdal)

table <- data.frame(X_Coordinates = runif(10)*1000, 
                    Y_Coordinates = runif(10)*1000, 
                    LongFieldNameForData = runif(10))

p <- SpatialPointsDataFrame(SpatialPoints(table), data = table)

names(p) <- strtrim(names(points),10)

writeOGR(p, "OutputDirectory", "Points", "ESRI Shapefile")
JMT2080AD
la source