So verhindern Sie, dass writeOGR bei Verwendung des Treibers „ESRI Shapefile“ die Feldnamen abkürzt


16

Ich verwende derzeit das folgende Skript, um einigen einzelnen Shapefiles einige Attributdaten aus einer Tabelle hinzuzufügen:

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

Am Ende erhalte ich folgende Warnung (en):

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

Beim Anzeigen der Attributtabelle der Shapefiles nach diesem Vorgang wurde der Feldname auf 'ENGL_' gekürzt, aber ich möchte, dass er als 'ENGL_NAME' bleibt. Gibt es eine Möglichkeit, diese Abkürzung auszuschalten?

Jede Hilfe sehr geschätzt.


Enthält einer der Feldnamen im Shapefile mehr als 10 Zeichen? Sieht für mich nach einem Fehler in den R-Bindungen aus.
Geographika

1
Hallo zusammen, ich habe das Skript gerade neu gestartet und jetzt ist es kein Kürzel mehr. Ich bin nicht sicher, was sich geändert hat, um dies zu verursachen ...
JPD

Antworten:


7

Sie können nicht, es ist ein Shapefile-Problem. Siehe http://gdal.org/drv_shapefile.html unter "Erstellungsoptionen"


also ist es keine frage von writeOGR? Liegt es tatsächlich am Format?
Tomas

1
Richtig. Die Länge der DBF-Spaltennamen ist begrenzt. Ein anderes Format, zum Beispiel sqlite / spaciousite, würde die Namen nicht abschneiden (es gibt sehr große Grenzen in sqlite, aber viele Größenordnungen über 10).

3
Nun, es gibt einen Unterschied zwischen der normalen Abkürzung von Spaltennamen beim Schreiben in dbf und dem, was writeOGR dort tut! writeOGR lähmt sogar Feldnamen, die kürzer als 10 sind. Meine Beispiele: Mein R-Spaltenname "ora_nachweis_id" wird zu "or_nch_", während writeSpatilaPolygon die normale Abkürzung ausführt -> "ora_nachwe". Sogar meine Variable "LblColor" (8 Zeichen!) Wird "LblColr".
Bernd V.

Gibt es ähnliche Spaltennamen in der Datenbank- / Datenstruktur? Ich konnte nicht mit ogr2ogr und einer SQLite-Datenbank mit diesen Namen replizieren. Wenn Sie eine Probe zur Verfügung stellen können, könnte ich weiter schauen, oder vielleicht verursachen die R-Bindungen Probleme.

1
Link ist tot, aber ich habe auch Shapefiles mit Feldnamen, die länger als 10 Zeichen sind. Warum ist dies möglich, wenn es sich um ein Shapefile-Problem handelt?
Matt

7

Dein 'ENGL_NAME' sollte überhaupt nicht abgekürzt werden (weniger als 10 Zeichen), aber writeOGR hat anscheinend seinen eigenen Willen.

Anstatt von

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

du könntest es versuchen

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

Da writeSpatialShape keinen Parameter für das Ziel zu haben scheint, habe ich diese Problemumgehung gefunden, um das Arbeitsverzeichnis hin und her zu wechseln.

Das andere Problem ist, dass es keine .prj-Datei erzeugt, aber das ist ein kleines Problem im Vergleich zu zerstörten Feldnamen.

Warten auf die Zeiten, in denen das Format + * # -! (/ ESRI Shapefile endlich tot ist und durch ... nun?


Ersetzt durch Geopaket?
jsta

3

Ich hatte ähnliche Probleme bei der Arbeit in RStudio. Gemäß dem Rat in verschiedenen Kommentaren und Antworten oben ist meine Lösung für verbrannte Erde:

  • Erstellen Sie an der Stelle, an der der SpatialWhateverDataFrame in Shape geschrieben werden kann, eine Kopie
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) Nur um sicher zu gehen
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') aber noch nicht ausführen
  • Speichern Sie das Skript, löschen Sie den Arbeitsbereich einschließlich der ausgeblendeten Objekte, starten Sie R neu und führen Sie das gesamte Skript erneut aus.

writeOGR () verwendet base :: abbreviate - hier ist ein Test mit einer Kopie der Zeilen 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"  

Sie können sehen, dass es tatsächlich zweimal abkürzt (möglicherweise sinnlos, ich kann nicht herausfinden, wie Sie diese Unterschleife auslösen würden), und wenn auch nur ein Spaltenname> 10, wird jeder Spaltenname mit> 7 Zeichen gekürzt. Ich kann nicht herausfinden, warum man den Arbeitsbereich löschen und neu starten muss, wenn writeOGR zuvor für dasselbe Objekt ausgeführt wurde, aber vielleicht hat das etwas damit zu tun, dass fld_names ein benannter Zeichenvektor ist. Es könnte besser funktionieren, wenn as.character () in abbreviate () eingeschlossen ist.


Hey danke. Ich wollte meine PRJ-Datei nicht verlieren, daher half es, diese Antwort zu lesen. Ich habe ALLE meine Feldnamen mit 10 oder weniger Zeichen vor dem Aufruf von writeOGR erstellt und keine wurde mit 7 abgekürzt.
Nova

-1

Wie bereits erwähnt, haben Shapefiles ein Feldnamen-Zeichenlimit von 10 Zeichen. writeOGR erfüllt diese Anforderung, indem die Feldüberschriften mithilfe eines Algorithmus geändert werden, der festlegt, welche Zeichen entfernt werden sollen, wenn ein Feldname vorhanden ist, der das Limit überschreitet. Ich bin mir nicht sicher, wie es funktioniert, aber es scheint, dass Feldnamen auf seltsame und unvorhersehbare Weise gekürzt werden und dass Feldnamen auf diese Weise gekürzt werden können, die bereits die 10-Anforderung erfüllen.

Hier ist meine Arbeit. Wenn Sie strtrim () verwenden und die Zeichenlänge auf 10 einstellen, werden die Feldnamen vorhersehbarer auf 10 Zeichen gekürzt als bei der Automatisierung von writeOGR.

Ein Problem, das Sie möglicherweise haben, ist, wenn Sie Feldnamen haben, die für die ersten 10 Zeichen identisch sind, aber ich habe dieses Problem selten.

Ich wende dies jedes Mal an, wenn ich ein Shapefile exportiere, nur für den Fall.

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")
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.