Come impedire a writeOGR di abbreviare i nomi dei campi quando si utilizza il driver "ESRI Shapefile"


18

Attualmente sto usando il seguente script per aggiungere alcuni dati di attributo da una tabella a molti singoli shapefile:

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

Alla fine ricevo i seguenti avvisi:

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

Quando si visualizza la tabella degli attributi dei file di forma dopo questo processo, il nome del campo è stato abbreviato in "ENGL_", ma voglio che rimanga come "ENGL_NAME". C'è un modo per disattivare questa abbreviazione?

Qualsiasi aiuto molto apprezzato.


Ci sono nomi di campo nel file di forma> 10 caratteri? A me sembra un bug negli attacchi R.
geographika,

1
Ciao, ho appena rieseguito la sceneggiatura e ora non è abbreviato. Non sono sicuro di cosa sia cambiato per causare questo ...
JPD

Risposte:


9

Non puoi, è un problema di forma. Vedi http://gdal.org/drv_shapefile.html in "Opzioni di creazione"


quindi non è un problema di writeOGR? In realtà è questione del formato?
Tomas,

1
Corretta. Le lunghezze dei nomi delle colonne dbf sono limitate. Un altro formato, ad esempio sqlite / spatialite non troncerebbe i nomi (ci sono limiti molto grandi in sqlite, ma molti ordini di grandezza superiori a 10).

3
Bene, c'è una differenza tra la normale abbreviazione dei nomi delle colonne quando si scrive su dbf e cosa sta facendo writeOGR! writeOGR sta paralizzando anche i nomi dei campi inferiori a 10. I miei esempi: Il mio nome di colonna R "ora_nachweis_id" diventa "or_nch_" mentre writeSpatilaPolygon fa la normale abbreviazione -> "ora_nachwe". Anche la mia variabile "LblColor" (8 caratteri!) Diventa "LblColr".
Bernd V.

Esistono nomi di colonna simili nella struttura di db / data? Non potevo replicare con ogr2ogr e un sqlite db con quei nomi. Se riesci a fornire un campione, potrei guardare oltre, o forse i collegamenti R stanno causando problemi.

1
Il link è morto, ma ho anche shapefile con nomi di campo molto più lunghi di 10 caratteri; perché è possibile se si tratta di un problema di forma?
Matt

7

Il tuo "ENGL_NAME" non dovrebbe essere abbreviato affatto (meno di 10 caratteri), ma writeOGR ha una sua volontà, a quanto pare.

Invece di

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

potresti provare

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

Dato che writeSpatialShape sembra non avere un parametro per la destinazione, ho trovato questa soluzione alternativa cambiando la directory di lavoro avanti e indietro.

L'altro problema è che non produce un file .prj, ma è un problema minore rispetto ai nomi dei campi distrutti.

Aspettando i tempi in cui + * # -! (Il formato Shapefile / ESRI è finalmente morto e sostituito da ... beh?


Sostituito dal geopackage?
jsta,

3

Ho avuto problemi simili lavorando in RStudio. Per i consigli in vari commenti e risposte sopra, la mia soluzione di terra bruciata è:

  • nel punto in cui SpatialWhateverDataFrame è pronto per essere scritto su Shape, crearne una copia
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) giusto per essere sicuro
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') ma non eseguirlo ancora
  • salva lo script, cancella l'area di lavoro inclusi gli oggetti nascosti, riavvia R, esegui nuovamente l'intero script.

writeOGR () usa base :: abbreviate - ecco un test con una copia delle righe 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"  

Puoi vedere che in realtà chiama abbreviazione due volte (forse inutilmente, non riesco a capire come avresti innescato quel sotto-ciclo) e se anche un nome di colonna> 10, accorcerà qualsiasi nome di colonna con> 7 caratteri. Non riesco a capire perché si debba cancellare l'area di lavoro e riavviare se writeOGR è già stato eseguito sullo stesso oggetto in precedenza, ma forse ha a che fare con fld_names essendo un vettore di caratteri con nome. Potrebbe funzionare meglio se as.character () fosse racchiuso tra abbreviate ().


Ehi, grazie. Non volevo perdere il mio file PRJ, quindi leggere questa risposta mi ha aiutato. Ho fatto TUTTI i nomi dei miei campi 10 o meno caratteri prima di chiamare writeOGR e nessuno è stato abbreviato in 7.
Nova,

-1

Come già accennato, gli shapefile hanno un limite di caratteri del nome campo di 10 caratteri. writeOGR soddisfa questo requisito modificando le intestazioni dei campi utilizzando alcuni algoritmi che danno la priorità ai caratteri da rimuovere quando esiste un nome campo che supera il limite. Non sono sicuro di come funzioni, ma sembra accorciare i nomi dei campi in modi strani e imprevedibili e può accorciare i nomi dei campi in questo modo che hanno già soddisfatto i 10 requisiti.

Ecco il mio lavoro in giro. L'uso di strtrim () e l'impostazione della lunghezza del carattere su 10 tronca i nomi dei campi su 10 caratteri in modo più prevedibile dell'automazione di writeOGR.

Un problema che potresti avere è se hai nomi di campo identici per i primi 10 caratteri, ma raramente ho questo problema.

Lo applico ogni volta che esporto un file di forma, per ogni evenienza.

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")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.