Jak zatrzymać writeOGR od skracania nazw pól podczas korzystania ze sterownika „ESRI Shapefile”


18

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.


Czy którakolwiek z nazw pól w pliku kształtu ma> 10 znaków? Wygląda mi na błąd w powiązaniach R.
geographika,

1
Cześć, właśnie ponownie uruchomiłem skrypt i teraz nie jest on skrótem. Nie jestem jednak pewien, co się zmieniło, aby to spowodować ...
JPD

Odpowiedzi:


9

Nie możesz, to kwestia kształtu pliku. Zobacz http://gdal.org/drv_shapefile.html w „Opcjach tworzenia”


więc to nie jest problem writeOGR? Czy to rzeczywiście kwestia formatu?
Tomas

1
Poprawny. Długości nazw kolumn dbf są ograniczone. Inny format, na przykład sqlite / spatialite, nie obcinałby nazw (w sqlite istnieją bardzo duże ograniczenia, ale wiele rzędów wielkości powyżej 10).

3
Cóż, istnieje różnica między zwykłym skrótem nazw kolumn przy pisaniu do dbf a tym, co tam robi writeOGR! writeOGR kaleczy nawet nazwy pól krótsze niż 10. Moje przykłady: Moja nazwa kolumny R „ora_nachweis_id” staje się „or_nch_”, podczas gdy writeSpatilaPolygon używa zwykłego skrótu -> „ora_nachwe”. Nawet moja zmienna „LblColor” (8 znaków!) Staje się „LblColr”.
Bernd V.

Czy istnieją podobne nazwy kolumn w strukturze danych / bazy danych? Nie mogłem replikować z użyciem ogr2ogr i bazy danych sqlite o tych nazwach. Jeśli możesz podać próbkę, mógłbym spojrzeć dalej, a może wiązania R powodują problemy.

1
Link nie działa, ale mam też pliki kształtów o nazwach pól znacznie dłuższych niż 10 znaków; dlaczego jest to możliwe, jeśli jest to problem z plikiem kształtu?
Matt

7

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

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

możesz spróbować

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

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óż?


Zastąpiony przez geopackage?
jsta

3

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:

  • w miejscu, w którym SpatialWhthingDataFrame jest gotowy do zapisania w Shape, wykonaj kopię
  • names(copy@data) <- c('new', 'short', 'names', 'you', 'pickd', 'yrslf')
  • names(copy@data) <- strtrim(names(copy@data), 10) tak dla pewności
  • writeOGR(copy, dsn, layer, driver = 'ESRI Shapefile') ale jeszcze go nie uruchamiaj
  • zapisz skrypt, wyczyść obszar roboczy zawierający ukryte obiekty, uruchom ponownie R, uruchom ponownie cały skrypt.

writeOGR () używa base :: abbreviate - oto test z kopią linii 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"  

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 ().


Hej dzięki. Nie chciałem stracić mojego pliku PRJ, więc czytanie tej odpowiedzi pomogło. Uczyniłem WSZYSTKIE moje nazwy pól o długości 10 lub mniej znaków przed wywołaniem writeOGR i żadne z nich nie zostało skrócone do 7.
Nova

-1

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.

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")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.