st_write отказывается перезаписывать слои в геопакете в R - PullRequest
1 голос
/ 07 января 2020

Используя пакет sf в R, я читаю серию слоев, хранящихся в геопакете, фильтрую их и затем снова сохраняю как новый геопакет.
Когда я настраивал свой скрипт, я тестировал один из слоев, и он работал нормально, но при запуске того же кода в списке слоев, это не удалось, потому что тестовый слой уже существует. Документация для st_write содержит как аргументы добавления, так и перезаписи, но установка вместо замены (append = FALSE или overwrite = TRUE) приводит к сбою с ошибкой

Ошибка в st_write. sf (., dsn = gpkg_out, layer = layername, overwrite = TRUE): нераспознанный аргумент перезаписан

Ошибка в st_write.sf (., dsn = gpkg_out, layer = layername, append = FALSE): нераспознанный аргумент (и) добавление

Я обновил свою копию пакета sf, но он все еще не удался с той же ошибкой. Я нашел обходной путь, удалив файл в моей файловой системе, но это было бы проблематично c, если бы я просто пытался заменить один слой.

Кто-нибудь знает, является ли это известной проблемой или способом заставить ее заменить, а не добавить слой?

мой код:

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)

1 Ответ

1 голос
/ 07 января 2020

Похоже, вам нужно использовать delete_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


...