Schreiben mehrerer Ebenen in GeoPackage mit writeOGR () in R?

11

Ich versuche, mehrere Ebenen in R in dasselbe GeoPackage zu schreiben, erhalte jedoch eine Fehlermeldung Creation of output file failed. Ich habe versucht, mit RGDAL nach einer Dokumentation zum Lesen und Schreiben in .gpkg-Dateien zu suchen, z. B. um herauszufinden, ob writeOGR()tatsächlich mehrere Ebenen unterstützt werden, mit wenig Erfolg. Ist das überhaupt möglich, wenn ja, wie geht das? Minimales Arbeitsbeispiel:

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)

Es gibt anscheinend einen ogr2ogr Shell-Befehl , der den Trick ausführt (hat tip mdsumner ), den ich in eine R-Funktion einschließen kann. Es wäre jedoch ordentlich, wenn writeOGR () und / oder st_write () im sfPaket dies integriert hätten. Ich denke, es hängt von GDALs ab layer_options, aber es scheint keine Option vom Typ Anhängen für GPKG in GDAL zu geben .


Ich könnte eine einfache Wrapper-Funktion für st_write()aber native Unterstützung schreiben sfoder rgdalwäre besser.

eivindhammers
quelle
Nicht möglich afaik. Versuchen Sie es mit sf, das ich auch gerne erkunden werde - es ist einfacher zu reparieren als rgdal für eine Sache
mdsumner
1
@mdsumner st_write () in sf ergibt das gleiche Ergebnis. Ich denke, das Fehlen einer Append-Option in den Layer-Erstellungsoptionen von GDAL ist die Ursache des Problems sowohl für writeOGR () als auch für st_write ().
Eivindhammers

Antworten:

9

Sie können dies mit dem appendFlag auf tun 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
quelle