首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中重力层的重命名

R中重力层的重命名
EN

Stack Overflow用户
提问于 2022-07-19 19:40:18
回答 1查看 131关注 0票数 0

是否可以直接重命名R中的重排层,而不需要1)在层中读取,2)用新的名称将其复制回同一数据库,以及3)删除原始层?

PseudoCode

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-07-19 21:04:09

这是个有趣的问题。据我所知,在{sf}和朋友中没有通用函数来重命名层。

但是-这里很有趣!- Geopackage文件很特殊。同时,

  • 是一个空间数据文件,
  • 是一个常规的SQLite数据库.

这意味着我们可以用SQL工具集(ALTER,我在看您!)来破解它。

因此,考虑一下这段代码,它构建在众所周知的、非常受人喜爱的北卡罗来纳州的shapefile上,该文件随{sf}一起提供。

它所做的是在nc层上运行alter (请注意,此上下文中的"nc“是由用于创建地质包的R对象的名称驱动的;在您的用例中,名称将已经给出)。

在运行alter之后(以及更改了layer对象的名称),需要对gpkg_contents和gpkg_geometry_columns对象进行小范围的清理,以反映所执行的更新。同样熟悉的SQL内容。

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

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

https://stackoverflow.com/questions/73042625

复制
相关文章

相似问题

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