Zapisywanie wielu warstw w GeoPackage za pomocą writeOGR () w R?

11

Próbuję napisać wiele warstw do tej samej GeoPackage w badania, ale pojawia się błąd Creation of output file failed. Próbowałem wyszukać dokumentację odczytu i zapisu do plików .gpkg za pomocą RGDAL, np. Aby dowiedzieć się, czy writeOGR()rzeczywiście obsługuje wiele warstw, z niewielkim powodzeniem. Czy to w ogóle możliwe, jeśli tak, jak to zrobić? Minimalny przykład działania:

library(sp)
library(maptools)
library(rgdal)

data(wrld_simpl)

norway <- wrld_simpl[wrld_simpl$NAME == "Norway", ]
sweden <- wrld_simpl[wrld_simpl$NAME == "Sweden", ]

file <- tempfile("scandinavia", fileext = c(".gpkg"))

writeOGR(norway, dsn = file, layer = "norway", driver = "GPKG")
writeOGR(sweden, dsn = file, layer = "sweden", driver = "GPKG")

ogrListLayers(file)

Najwyraźniej istnieje ogr2ogr polecenie powłoki, które wykonuje lewę (hat tip mdsumner ), które mogę zawinąć w funkcję R. Byłoby jednak fajnie, gdyby miały wbudowaną funkcję writeOGR () i / lub st_write () sf. Sądzę, że zależy to od GDAL layer_options, ale nie wydaje się, aby w GDAL istniała opcja typu append dla GPKG .


Mógłbym napisać prostą funkcję otoki dla st_write()wsparcia natywnego w sflub rgdalbyłoby lepiej.

eivindhammers
źródło
Niemożliwe afaik. Spróbuj z sf, który chętnie też zbadam - z jednej strony łatwiej to naprawić niż rgdal
mdsumner
1
@mdsumner st_write () w sf daje ten sam wynik. Myślę, że brak opcji dołączania w opcjach tworzenia warstw GDAL jest źródłem problemu dla writeOGR () i st_write ().
eivindhammers

Odpowiedzi:

10

Możesz to zrobić za pomocą appendflagi na sf::st_write():

library(sf)

nc     <- st_read(system.file("shape/nc.shp", package="sf"))
storms <- st_read(system.file("shape/storms_xyz.shp", package="sf"))

st_write(nc,     "nc.gpkg", "nc")
st_write(storms, "nc.gpkg", "storms", append = TRUE)

st_layers("nc.gpkg")
## Driver: GPKG 
## Available layers:
##   layer_name  geometry_type features fields
## 1         nc  Multi Polygon      100     14
## 2     storms 3D Line String       71      0
jsta
źródło