Obecnie używam następującego skryptu, aby dodać niektóre dane atrybutów z tabeli do wielu pojedynczych plików kształtów:
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")
}
Na końcu pojawia się następujące ostrzeżenie:
1: In writeOGR(shp, "PolygonsV2", speciesname, driver = "ESRI Shapefile") :
Field names abbreviated for ESRI Shapefile driver
Podczas przeglądania tabeli atrybutów plików kształtów po tym procesie nazwa pola została skrócona do „ENGL_”, ale chcę, aby pozostała jako „ENGL_NAME”. Czy istnieje sposób na wyłączenie tego skrótu?
Każda pomoc bardzo doceniana.
Odpowiedzi:
Nie możesz, to kwestia kształtu pliku. Zobacz http://gdal.org/drv_shapefile.html w „Opcjach tworzenia”
źródło
writeOGR
? Czy to rzeczywiście kwestia formatu?Twój „ENGL_NAME” nie powinien być w ogóle skracany (mniej niż 10 znaków), ale wydaje się, że writeOGR ma swoją własną wolę.
Zamiast
możesz spróbować
Ponieważ writeSpatialShape wydaje się nie mieć parametru dla miejsca docelowego, znalazłem to obejście przełączające katalog roboczy tam iz powrotem.
Innym problemem jest to, że nie tworzy on pliku .prj, ale jest to niewielki problem w porównaniu do zniszczonych nazw pól.
Oczekiwanie na czasy, kiedy + * # -! (Format pliku ESRI Shapefile jest w końcu martwy i zastąpiony przez ... no cóż?
źródło
Mam podobne problemy z pracą w RStudio. Zgodnie z radą zawartą w różnych komentarzach i odpowiedziach powyżej moje rozwiązanie z wypaloną ziemią to:
names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
names(copy@data) <- strtrim(names(copy@data), 10)
tak dla pewnościwriteOGR(copy, dsn, layer, driver = 'ESRI Shapefile')
ale jeszcze go nie uruchamiajwriteOGR () używa base :: abbreviate - oto test z kopią linii 158-164:
Widać, że faktycznie wywołuje dwa razy skrót (być może bez sensu, nie mogę zrozumieć, w jaki sposób wywołałeś tę pętlę podrzędną), a jeśli nawet jedna nazwa kolumny> 10, skróci dowolną nazwę kolumny> 7 znaków. Nie mogę zrozumieć, dlaczego trzeba wyczyścić obszar roboczy i zrestartować, jeśli writeOGR był wcześniej uruchamiany na tym samym obiekcie, ale może to ma coś wspólnego z tym, że fld_names jest nazwanym wektorem znaków. Może działać lepiej, jeśli as.character () został zawinięty wokół skrótu ().
źródło
Jak już wspomniano, pliki kształtów mają limit znaków w nazwie pola wynoszący 10 znaków. writeOGR spełnia to wymaganie, zmieniając nagłówki pól za pomocą algorytmu, który ustala, jakie znaki należy usunąć, gdy nazwa pola przekracza limit. Nie jestem pewien, jak to działa, ale wydaje się, że skraca nazwy pól w dziwny i nieprzewidywalny sposób i może skracać nazwy pól w ten sposób, który już spełniał wymaganie 10.
Oto moja praca. Użycie strtrim () i ustawienie długości znaku na 10 skróci nazwy pól do 10 znaków bardziej przewidywalnie niż automatyzacja writeOGR.
Jednym z problemów, które możesz mieć, jest to, że masz nazwy pól identyczne dla pierwszych 10 znaków, ale rzadko mam ten problem.
Stosuję to za każdym razem, gdy eksportuję plik kształtu, na wszelki wypadek.
źródło