我正在尝试使用GeoPackage包从sf文件中删除一个向量层。我所说的“删除”是指永久删除,而不是覆盖或更新。我知道delete_layer选项,但据我所知,这只是在用同名的层替换层之前删除一个层的函数。
不幸的是,我用非标准编码编写了一个名为GeoPackage的层,这实际上使整个gpkg文件在QGIS中不可读。因此,我试图找到一个解决办法,通过R.
发布于 2020-01-14 16:58:21
地质公园也是一个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中可以通过在SQLite模块的同时加载Spatialite模块扩展,或者手动删除元数据表中的行( gpkg_geometry_columns和gpkg_ogr_contents )来实现,但是没有什么东西会因为那些没有更新的东西而中断。
https://stackoverflow.com/questions/59722900
复制相似问题