从GeoPackage删除图层

问题描述 投票:0回答:1

我正在尝试使用sf包从GeoPackage文件中删除矢量图层。 “删除”是指永久删除而不覆盖或更新。我知道delete_layer选项,但据我了解,此功能仅可在用相同名称的图层替换之前删除图层。

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

r gis qgis sf geopackage
1个回答
1
投票

地理包也是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可以愉快地正确读取其余两层。我认为可以在R中通过将Spatialite模块扩展与SQLite模块一起加载,或者手动删除元数据表gpkg_geometry_columns甚至gpkg_ogr_contents中的行来解决此问题,但是对于那些未更新的东西,似乎没有什么很难解决的。

© www.soinside.com 2019 - 2024. All rights reserved.