是否可以直接重命名R中的重排层,而不需要1)在层中读取,2)用新的名称将其复制回同一数据库,以及3)删除原始层?
PseudoCode
library(sf)
geopackage = "example.gpkg"
lyrs = st_layers(geopackage)
lyrs
# Driver: GPKG
# Available layers:
# layer_name geometry_type features fields
# 1 Layer1_old Multi Polygon 1 1
# 2 Layer2_old Multi Polygon 1 1
# 3 Layer3_old Multi Polygon 1 1
### I'm looking for something like so I can cycle through
st_rename(geopackage, layer = lyrs[1], new.name = "Layer1_new")发布于 2022-07-19 21:04:09
这是个有趣的问题。据我所知,在{sf}和朋友中没有通用函数来重命名层。
但是-这里很有趣!- Geopackage文件很特殊。同时,
这意味着我们可以用SQL工具集(ALTER,我在看您!)来破解它。
因此,考虑一下这段代码,它构建在众所周知的、非常受人喜爱的北卡罗来纳州的shapefile上,该文件随{sf}一起提供。
它所做的是在nc层上运行alter (请注意,此上下文中的"nc“是由用于创建地质包的R对象的名称驱动的;在您的用例中,名称将已经给出)。
在运行alter之后(以及更改了layer对象的名称),需要对gpkg_contents和gpkg_geometry_columns对象进行小范围的清理,以反映所执行的更新。同样熟悉的SQL内容。
library(sf)
library(DBI)
library(RSQLite)
# the one & only NC shapefile...
nc <- st_read(system.file("shape/nc.shp", package="sf"))
# ...saved as a geopackage
st_write(nc, "nc.gpkg")
# check layers name
st_layers("nc.gpkg")
# Driver: GPKG
# Available layers:
# layer_name geometry_type features fields crs_name
# 1 nc Multi Polygon 100 14 NAD27
# connect to nc.gpkg as to a sqlite database
con <- dbConnect(RSQLite::SQLite(), "nc.gpkg")
result <- dbSendQuery(con, "ALTER TABLE nc RENAME to CN;")
dbClearResult(result) # you don't really care about the results, but they need to be "handled"
# align other features / see http://www.geopackage.org/spec120/#features
result <- dbSendQuery(con, "update gpkg_contents set table_name = 'CN' where table_name = 'nc';")
dbClearResult(result)
result <- dbSendQuery(con, "update gpkg_geometry_columns set table_name = 'CN' where table_name = 'nc';")
dbClearResult(result)
# our work is done... let's not keep the connection hanging
dbDisconnect(con)
# read the newly created CN layer
shape <- st_read("nc.gpkg",
layer = "CN")
# check results / does it look as the nc.shp we all know & love?
plot(st_geometry(shape))

https://stackoverflow.com/questions/73042625
复制相似问题