Cómo evitar que writeOGR abrevie los nombres de campo cuando se usa el controlador “ESRI Shapefile”

14

Actualmente estoy usando el siguiente script para agregar algunos datos de atributos de una tabla a muchos shapefiles individuales:

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")
}

Al final aparece la (s) siguiente (s) advertencia (s):

1: In writeOGR(shp, "PolygonsV2", speciesname, driver = "ESRI Shapefile") :
Field names abbreviated for ESRI Shapefile driver

Al ver la tabla de atributos de los shapefiles después de este proceso, el nombre del campo se ha reducido a 'ENGL_', pero quiero que permanezca como 'ENGL_NAME'. ¿Hay alguna forma de desactivar esta abreviatura?

Cualquier ayuda muy apreciada.

    
pregunta JPD 02.08.2012 - 13:12

4 respuestas

5

No puedes, es un problema de shapefile. Consulte enlace en 'Opciones de creación'

    
respondido por el user10353 05.10.2012 - 23:14
7

Su 'ENGL_NAME' no debería abreviarse en absoluto (menos de 10 caracteres), pero el writeOGR tiene su propia voluntad, al parecer.

En lugar de

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

puedes intentarlo

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

Como writeSpatialShape no parece tener un parámetro para el destino, encontré esta solución alterna cambiando el directorio de trabajo de un lado a otro.

El otro problema es que no produce un archivo .prj, pero es un problema menor, en comparación con los nombres de campo destruidos.

Esperando los tiempos en que + * # -! (el formato del archivo de forma ESRI finalmente está muerto y reemplazado por ... ¿bien?

    
respondido por el Bernd V. 04.12.2014 - 20:35
1

He estado teniendo problemas similares al trabajar en RStudio. Por el consejo en varios comentarios y respuestas anteriores, mi solución de tierra quemada es:

  • en el punto donde SpatialWhateverDataFrame está listo para escribirse en Shape, haga una copia
  • names([email protected]) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names([email protected]) <- strtrim(names([email protected]), 10) solo para estar seguro
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') pero no lo ejecutes todavía
  • guarde la secuencia de comandos, borre el espacio de trabajo, incluidos los objetos ocultos, reinicie R, vuelva a ejecutar la secuencia de comandos completa.

writeOGR () utiliza base :: abbreviate - Aquí hay una prueba con una copia de las líneas 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"  

Puede ver que en realidad las llamadas se abrevian dos veces (posiblemente sin sentido, no puedo averiguar cómo activaría ese sub-ciclo), y si incluso un nombre de columna > 10 entonces acortará cualquier nombre de columna con > 7 personajes. No puedo entender por qué uno tiene que limpiar el espacio de trabajo y reiniciar si writeOGR se ha ejecutado en el mismo objeto anteriormente, pero quizás tenga algo que ver con que fld_names sea un vector de caracteres con nombre. Podría funcionar mejor si as.character () se envolvió alrededor de abbreviate ().

    
respondido por el obrl_soil 28.09.2016 - 05:32
-1

Como ya se mencionó, los shapefiles tienen un límite de caracteres de nombre de campo de 10 caracteres. writeOGR cumple con este requisito cambiando los encabezados de los campos utilizando algún algoritmo que prioriza qué caracteres eliminar cuando hay un nombre de campo que excede el límite. No estoy seguro de cómo funciona, pero parece acortar los nombres de los campos de forma extraña e impredecible, y puede acortar los nombres de los campos de esta manera que ya cumplen con el requisito 10.

Aquí está mi trabajo alrededor. El uso de strtrim () y la configuración de la longitud del carácter en 10 truncarán los nombres de los campos en 10 caracteres de manera más predecible que la automatización de writeOGR.

Un problema que podría tener es si tiene nombres de campo que sean idénticos para los primeros 10 caracteres, pero rara vez tengo este problema.

Aplico esto cada vez que exporto un shapefile, por si acaso.

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")
    
respondido por el JMT2080AD 24.11.2015 - 19:45

Lea otras preguntas en las etiquetas