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.
Antworten:
Sie können nicht, es ist ein Shapefile-Problem. Siehe http://gdal.org/drv_shapefile.html unter "Erstellungsoptionen"
quelle
writeOGR
? Liegt es tatsächlich am Format?Dein 'ENGL_NAME' sollte überhaupt nicht abgekürzt werden (weniger als 10 Zeichen), aber writeOGR hat anscheinend seinen eigenen Willen.
Anstatt von
du könntest es versuchen
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?
quelle
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:
names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
names(copy@data) <- strtrim(names(copy@data), 10)
Nur um sicher zu gehenwriteOGR(copy, dsn, layer, driver = 'ESRI Shapefile')
aber noch nicht ausführenwriteOGR () verwendet base :: abbreviate - hier ist ein Test mit einer Kopie der Zeilen 158-164:
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.
quelle
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.
quelle