เขียนหลายเลเยอร์ไปยัง GeoPackage โดยใช้ writeOGR () ใน R?


11

ฉันพยายามเขียนหลายเลเยอร์ไปยัง GeoPackage เดียวกันใน R แต่ฉันได้รับข้อผิดพลาดCreation of output file failed. ฉันพยายามค้นหาเอกสารการอ่านและเขียนไปยังไฟล์. gpkg ด้วย RGDAL เช่นเพื่อค้นหาว่าwriteOGR()รองรับหลายเลเยอร์จริงหรือไม่ เป็นไปได้ไหมถ้าเป็นเช่นนั้นจะทำอย่างไร? ตัวอย่างการทำงานที่น้อยที่สุด:

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)

เห็นได้ชัดว่ามีogr2ogr คำสั่งเชลล์ที่ทำเคล็ดลับ (หมวกเคล็ดลับmdsumner ) ซึ่งฉันสามารถห่อในฟังก์ชั่น R แต่มันจะเรียบร้อยถ้า writeOGR () และ / หรือ st_write () ในsfแพคเกจนี้ได้สร้างขึ้นใน. ฉันคิดว่ามันขึ้นอยู่กับ GDAL ของlayer_optionsแต่มีไม่ได้ดูเหมือนจะเป็นตัวเลือกที่ผนวกชนิดสำหรับ GPKG ในGDAL


ฉันสามารถเขียนฟังก์ชั่น wrapper อย่างง่าย ๆ ได้st_write()แต่รองรับพื้นเมืองsfหรือrgdalจะดีกว่า


เป็นไปไม่ได้ afaik ลองกับเอสเอฟซึ่งฉันยินดีที่จะสำรวจเช่นกัน - ง่ายต่อการแก้ไขมากกว่า rgdal สำหรับสิ่งหนึ่ง
mdsumner

1
@mdsumner st_write () ใน sf ให้ผลลัพธ์เดียวกัน ฉันคิดว่าการขาดตัวเลือกผนวกในตัวเลือกการสร้างเลเยอร์ของ GDAL นั้นเป็นสาเหตุของปัญหาสำหรับทั้ง writeOGR () และ st_write ()
eivindhammers

คำตอบ:


10

คุณสามารถทำได้โดยใช้appendแฟลกบน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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.