Cómo evitar que writeOGR abrevie los nombres de campo al usar el controlador "ESRI Shapefile"

18

Actualmente estoy usando el siguiente script para agregar algunos datos de atributos de una tabla a muchos archivos de forma 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")
}

Recibo las siguientes advertencias al final:

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

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

Cualquier ayuda muy apreciada.

JPD
fuente
¿Alguno de los nombres de campo en el archivo de forma> 10 caracteres? Me parece un error en los enlaces R.
geographika
1
Hola, acabo de volver a ejecutar el script y ahora no se abrevia. Sin embargo, no estoy seguro de qué ha cambiado para causar esto ...
JPD

Respuestas:

9

No puedes, es un problema de shapefile. Ver http://gdal.org/drv_shapefile.html en 'Opciones de creación'


fuente
entonces no es un problema de writeOGR? ¿Es realmente cuestión del formato?
Tomás
1
Correcto. Las longitudes de nombre de columna dbf son limitadas. Otro formato, por ejemplo, sqlite / spatialite no truncaría los nombres (existen límites muy grandes en sqlite, pero muchos órdenes de magnitud superiores a 10).
3
¡Bueno, hay una diferencia entre la abreviatura normal de los nombres de columna al escribir en dbf y lo que writeOGR está haciendo allí! writeOGR está paralizando incluso los nombres de campo más cortos que 10. Mis ejemplos: Mi nombre de columna R "ora_nachweis_id" se convierte en "or_nch_" mientras writeSpatilaPolygon hace la abreviatura normal -> "ora_nachwe". Incluso mi variable "LblColor" (¡8 caracteres!) Se convierte en "LblColr".
Bernd V.
¿Hay nombres de columna similares en la estructura db / data? No pude replicar con ogr2ogr y un sqlite db con esos nombres. Si puede proporcionar una muestra, podría buscar más, o tal vez los enlaces R están causando problemas.
1
Link está muerto, pero también, tengo shapefiles con nombres de campo mucho más largos que 10 caracteres; ¿Por qué es esto posible si se trata de un problema de shapefile?
Matt
7

Su 'ENGL_NAME' no debe abreviarse en absoluto (menos de 10 caracteres), pero parece que writeOGR tiene su propia voluntad.

En lugar de

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

podrías intentar

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 parece no tener un parámetro para el destino, encontré esta solución cambiando el directorio de trabajo de un lado a otro.

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

Esperando los momentos en que + * # -! (/ El formato ESRI Shapefile finalmente está muerto y reemplazado por ... ¿bien?

Bernd V.
fuente
¿Reemplazado por geopaquete?
jsta
3

He tenido problemas similares trabajando en RStudio. Según el consejo en varios comentarios y respuestas anteriores, mi solución de tierra quemada es:

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

writeOGR () usa base :: abreviatura - 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 se abrevia dos veces (posiblemente sin sentido, no puedo entender cómo desencadenaría ese sub-bucle), y si incluso un nombre de columna> 10 acortará cualquier nombre de columna con> 7 caracteres. No puedo entender por qué uno tiene que borrar el espacio de trabajo y reiniciar si writeOGR se ha ejecutado en el mismo objeto antes, pero tal vez 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 abreviate ().

obrl_soil
fuente
Hey gracias. No quería perder mi archivo PRJ, por lo que leer esta respuesta me ayudó. Hice TODOS mis nombres de campo 10 o menos caracteres antes de llamar a writeOGR y ninguno se abrevió a 7.
Nova
-1

Como ya se mencionó, los archivos de forma tienen un límite de caracteres de nombre de campo de 10 caracteres. writeOGR cumple con este requisito al cambiar los encabezados de campo usando un 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 campo de formas extrañas e impredecibles, y puede acortar los nombres de campo de esta manera que ya cumplen con el requisito 10.

Aquí está mi trabajo. Usar strtrim () y establecer la longitud de los caracteres en 10 truncará los nombres de los campos en 10 caracteres de manera más predecible que la automatización de writeOGR.

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

Lo aplico 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")
JMT2080AD
fuente