首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从GeoPackage中删除层

从GeoPackage中删除层
EN

Stack Overflow用户
提问于 2020-01-13 19:23:26
回答 1查看 2.2K关注 0票数 3

我正在尝试使用GeoPackage包从sf文件中删除一个向量层。我所说的“删除”是指永久删除,而不是覆盖或更新。我知道delete_layer选项,但据我所知,这只是在用同名的层替换层之前删除一个层的函数。

不幸的是,我用非标准编码编写了一个名为GeoPackage的层,这实际上使整个gpkg文件在QGIS中不可读。因此,我试图找到一个解决办法,通过R.

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-14 16:58:21

地质公园也是一个SQLite数据库,所以您可以使用RSQLite数据库函数删除表。

建立一个测试:

代码语言:javascript
复制
> 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:

代码语言:javascript
复制
> 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),创建一个数据库连接:

代码语言:javascript
复制
library(RSQLite)
db = SQLite()
con = dbConnect(db,"./deletes.gpkg")

并移除桌子:

代码语言:javascript
复制
dbRemoveTable(con, "d2")

有一个小问题--这会移除表,但不会删除GPKG用来注意这个包是一个空间表的元数据。因此,使用GDAL工具可以得到这样的警告:

代码语言:javascript
复制
$ 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_columnsgpkg_ogr_contents )来实现,但是没有什么东西会因为那些没有更新的东西而中断。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59722900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档