Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
st_write拒绝覆盖R中地理包中的层_R_Spatial_Sf_Geopackage - Fatal编程技术网

st_write拒绝覆盖R中地理包中的层

st_write拒绝覆盖R中地理包中的层,r,spatial,sf,geopackage,R,Spatial,Sf,Geopackage,使用R中的sf包,我正在读取存储在地理包中的一系列图层,对它们进行过滤,然后将它们重新保存为新的地理包。 当我设置脚本时,我测试了其中一个层,它工作得很好,但是当在层列表上运行相同的代码时,它失败了,因为测试层已经存在。st_write的文档既有append参数,也有overwrite参数,但是设置为replace而不是append(append=FALSE或overwrite=TRUE)会导致它失败并出现错误 st_write.sf(,dsn=gpkg_out,layer=layername,

使用R中的
sf
包,我正在读取存储在地理包中的一系列图层,对它们进行过滤,然后将它们重新保存为新的地理包。
当我设置脚本时,我测试了其中一个层,它工作得很好,但是当在层列表上运行相同的代码时,它失败了,因为测试层已经存在。
st_write
的文档既有append参数,也有overwrite参数,但是设置为replace而不是append(
append=FALSE
overwrite=TRUE
)会导致它失败并出现错误

st_write.sf(,dsn=gpkg_out,layer=layername,覆盖)中出错 =TRUE):无法识别的参数覆盖

st_write.sf(,dsn=gpkg_out,layer=layername,append)中出错= FALSE):无法识别的参数追加

我更新了sf包的副本,但仍然失败,出现了相同的错误。我通过删除文件系统中的文件找到了解决方法,但如果我只是尝试替换一个层,这将是一个问题

有人知道这是一个已知的问题,还是一种使其替换而不是附加层的方法吗

我的代码:

library(sf)
library(tidyverse)

gpkg <- "D:/GIS/Sugar/SugarEC_hydropts.gpkg"  # name of existing geopackage

layers = st_layers(gpkg)$name
layers
# [1] "ec1520"  "ec17200" "ec224"   "ec2500" 
#  "ec271"   "ec4680"  "ec488"   "ec5540"  "ec8140"  "ec9860" 

gpkg_out <- "D:/GIS/Sugar/SugarEC_hydropts_wet.gpkg"

# the following works, but appends to layer if it exists
read_write <-  function (layername) {
      st_read(gpkg, layer = layername ) %>%
      filter(Water_Elev_ft >0) %>%
      st_write(dsn = gpkg_out, layer = layername)  # Appends
#   
#   This following versions fails though:
#     st_write(dsn = gpkg_out, layer = layername, overwrite = TRUE) 
#   or
#     st_write(dsn = gpkg_out, layer = layername, append = FALSE)

      invisible()
}

lapply(layers, read_write)
库(sf)
图书馆(tidyverse)
gpkg%
st#U写入(dsn=gpkg#U输出,层=层名称)#附加
#   
#但以下版本失败:
#st_写入(dsn=gpkg_输出,layer=layername,overwrite=TRUE)
#或
#st_写入(dsn=gpkg_输出,layer=layername,append=FALSE)
无形的
}
lappy(层,读写)

如果数据可能已经存在,您似乎需要使用
delete\u dsn=TRUE
。如果数据不存在,但文件仍将被写入,则会引发警告

nc <-  read_sf(system.file("shape/nc.shp", package="sf"))

Reading layer `nc' from data source `/home/mrhellmann/R/x86_64-pc-linux-gnu-library/3.6/sf/shape/nc.shp' using driver `ESRI Shapefile'
Simple feature collection with 100 features and 14 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -84.32385 ymin: 33.88199 xmax: -75.45698 ymax: 36.58965
epsg (SRID):    4267
proj4string:    +proj=longlat +datum=NAD27 +no_defs


st_write(nc, 'nc_test.shp', 'nc')

Writing layer `nc' to data source `nc_test.shp' using driver `ESRI Shapefile'
Writing 100 features with 14 fields and geometry type Multi Polygon.

## Error here, as it already exists.
st_write(nc, 'nc_test.shp', 'nc')

Dataset nc_test.shp already exists: remove first, use update=TRUE to append,
delete_layer=TRUE to delete layer, or delete_dsn=TRUE to remove the entire data source before writing.
Error in CPL_write_ogr(obj, dsn, layer, driver, as.character(dataset_options),  : 
  Dataset already exists.


# No error when delete_dsn = T
st_write(nc, 'nc_test.shp', 'nc', delete_dsn = T)

Deleting source `nc_test.shp' using driver `ESRI Shapefile'
Writing layer `nc' to data source `nc_test.shp' using driver `ESRI Shapefile'
Writing 100 features with 14 fields and geometry type Multi Polygon.


nc_saved <- read_sf('nc_test.shp')

identical(nc, nc_saved)
#[1] TRUE



nc使用
delete\u layer=TRUE
覆盖/更新地理包或形状文件中的层。

要更新地理包中的单个层,我需要使用
delete\u layer=TRUE
参数。