Como parar o writeOGR de abreviar Field Names ao usar o driver “ESRI Shapefile”


18

Atualmente, estou usando o script a seguir para adicionar alguns dados de atributo de uma tabela a vários shapefiles individuais:

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

Recebo o (s) seguinte (s) aviso (s) no final:

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

Ao visualizar a tabela de atributos dos shapefiles após esse processo, o nome do campo foi reduzido para 'ENGL_', mas quero que ele permaneça como 'ENGL_NAME'. Existe uma maneira de desativar essa abreviação?

Qualquer ajuda muito apreciada.


Há algum dos nomes de campo no shapefile> 10 caracteres? Parece um bug nas ligações R para mim.
Geografika

1
Olá, acabei de executar novamente o script e agora não é abreviado. Não sei ao certo o que mudou para causar isso ... #
222

Respostas:


9

Você não pode, é uma questão de shapefile. Veja http://gdal.org/drv_shapefile.html em 'Opções de criação'


então não é uma questão de writeOGR? É realmente questão do formato?
Tomas

1
Corrigir. os comprimentos do nome da coluna dbf são limitados. Outro formato, por exemplo, sqlite / spatialite não truncaria os nomes (existem limites muito grandes no sqlite, mas muitas ordens de magnitude acima de 10).

3
Bem, há uma diferença entre a abreviação normal de nomes de colunas ao escrever no dbf e o que o writeOGR está fazendo lá! O writeOGR está paralisando nomes de campos pares menores que 10. Meus exemplos: Meu nome da coluna R "ora_nachweis_id" se torna "or_nch_" enquanto writeSpatilaPolygon faz a abreviação normal -> "ora_nachwe". Até minha variável "LblColor" (8 caracteres!) Se torna "LblColr".
Bernd V.

Existem nomes de colunas semelhantes na estrutura db / data? Não consegui replicar com ogr2ogr e um sqlite db com esses nomes. Se você pode fornecer uma amostra, eu poderia procurar mais, ou talvez as ligações R estejam causando problemas.

1
O link está inoperante, mas também tenho shapefiles com nomes de campo com mais de 10 caracteres; por que isso é possível se for um problema de shapefile?
Matt

7

Seu 'ENGL_NAME' não deve ser abreviado (menos de 10 caracteres), mas o writeOGR tem vontade própria, ao que parece.

Ao invés de

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

você pode tentar

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 não ter um parâmetro para o destino, eu encontrei essa solução alternativa alternando o diretório de trabalho.

O outro problema é que ele não produz um arquivo .prj, mas é um problema menor, comparado aos nomes de campos destruídos.

Aguardando os horários em que + * # -! (/ Formato ESRI Shapefile finalmente está morto e substituído por ... bem?


Substituído pelo geopacote?
precisa saber é o seguinte

3

Eu tenho tido problemas semelhantes trabalhando no RStudio. De acordo com os conselhos de vários comentários e respostas acima, minha solução de terra arrasada é:

  • no ponto em que o SpatialWhateverDataFrame estiver pronto para ser gravado no Shape, faça uma cópia
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) só pra ter certeza
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') mas não execute ainda
  • salve o script, limpe a área de trabalho, incluindo objetos ocultos, reinicie R, execute novamente o script inteiro.

O writeOGR () usa base :: abreviar - aqui está um teste com uma cópia das linhas 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"  

Você pode ver que as chamadas realmente abreviam duas vezes (possivelmente sem sentido, não consigo descobrir como você acionaria esse sub-loop) e, se pelo menos um nome de coluna> 10, encurtará qualquer nome de coluna com> 7 caracteres. Não consigo entender por que é necessário limpar o espaço de trabalho e reiniciar se o writeOGR já tiver sido executado no mesmo objeto antes, mas talvez isso tenha algo a ver com fld_names ser um vetor de caractere nomeado. Poderia funcionar melhor se as.character () estivesse contornado abreviado ().


Ei, obrigado. Eu não queria perder meu arquivo do PRJ, então a leitura desta resposta ajudou. Eu fiz todos os meus nomes de campos 10 ou menos caracteres antes de chamar writeOGR e nenhum foi abreviado para 7.
Nova

-1

Como já mencionado, os shapefiles possuem um limite de 10 caracteres para o nome do campo. O writeOGR atende a esse requisito alterando os cabeçalhos dos campos usando um algoritmo que prioriza quais caracteres remover quando houver um nome de campo que exceda o limite. Não sei ao certo como funciona, mas parece reduzir nomes de campos de maneiras estranhas e imprevisíveis e pode diminuir nomes de campos dessa maneira que já atendiam aos 10 requisitos.

Aqui está o meu trabalho. O uso de strtrim () e a definição do tamanho dos caracteres para 10 truncarão os nomes dos campos para 10 caracteres mais previsivelmente do que a automação do writeOGR.

Um problema que você pode ter é se você tiver nomes de campo idênticos para os 10 primeiros caracteres, mas raramente tenho esse problema.

Aplico isso toda vez que exporto um shapefile, apenas por precauçã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")
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.