3

我正在尝试使用sf包从 GeoPackage 文件中删除矢量图层。“删除”是指永久删除而不是覆盖或更新。我知道该delete_layer选项,但据我了解,这仅用于删除图层,然后再将其替换为同名图层。

不幸的是,我已经使用非标准编码为 GeoPackage 编写了一个名称层,这实际上使整个 gpkg 文件在 QGIS 中不可读。因此,我正在尝试找到通过 R 将其删除的解决方案。

4

1 回答 1

6

地理包也是一个 SQLite 数据库,因此您可以使用RSQLite数据库函数来删除表。

设置测试:

> d1 = st_as_sf(data.frame(x=runif(10),y=runif(10),z=1:10), coords=c("x","y"))
> d2 = st_as_sf(data.frame(x=runif(10),y=runif(10),z=1:10), coords=c("x","y"))
> d3 = st_as_sf(data.frame(x=runif(10),y=runif(10),z=1:10), coords=c("x","y"))

将这些写入 GPKG:

> st_write(d1,"deletes.gpkg","d1")
Writing layer `d1' to data source `deletes.gpkg' using driver `GPKG'
features:       10
fields:         1
geometry type:  Point
> st_write(d2,"deletes.gpkg","d2",quiet=TRUE)
> st_write(d3,"deletes.gpkg","d3",quiet=TRUE)

现在要删除,使用RSQLite包(来自 CRAN),创建数据库连接:

library(RSQLite)
db = SQLite()
con = dbConnect(db,"./deletes.gpkg")

并删除表格:

dbRemoveTable(con, "d2")

有一个小问题 - 这会删除表,但不会删除 GPKG 用来说明此包是空间表的元数据。因此,您使用 GDAL 工具会收到这样的警告:

$ ogrinfo -so -al deletes.gpkg 
ERROR 1: Table or view 'd2' does not exist
Warning 1: unable to read table definition for 'd2'

不过,QGIS 很高兴地正确读取了剩余的两层。我认为这可以通过在 SQLite 模块旁边加载 Spatialite 模块扩展,或者手动删除元数据表中的行来在 R 中解决gpkg_geometry_columns,也许gpkg_ogr_contents但似乎没有什么会因为那些没有更新的东西而变得困难。

于 2020-01-14T16:58:21.433 回答