Удалить слой из GeoPackage
Я пытаюсь удалить векторный слой из файла GeoPackage с помощью sf
пакет. Под "удалением" я подразумеваю окончательное удаление, а НЕ перезапись или обновление. Я знаю оdelete_layer
вариант, но, насколько я понимаю, это только функции для удаления слоя перед заменой его слоем с тем же именем.
К сожалению, я написал слой с именем, используя нестандартную кодировку для GeoPackage, что фактически делает нечитаемым весь gpkg-файл в QGIS. Следовательно, я пытаюсь найти решение, чтобы удалить его через R.
1 ответ
Геопакет также является базой данных SQLite, поэтому вы можете использовать RSQLite
функции базы данных для удаления таблиц.
Настроить тест:
> 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:
> 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), создайте соединение с базой данных:
library(RSQLite)
db = SQLite()
con = dbConnect(db,"./deletes.gpkg")
и удалите таблицу:
dbRemoveTable(con, "d2")
Есть одна крошечная проблема - это удаляет таблицу, но не удаляет метаданные, которые GPKG использует, чтобы отметить, что этот пакет является пространственной таблицей. Следовательно, с инструментами GDAL вы получаете подобные предупреждения:
$ 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, загрузив расширения модуля Spatialite вместе с модулями SQLite или вручную удалив строки в таблицах метаданных.gpkg_geometry_columns
и возможно gpkg_ogr_contents
но, кажется, ничего не ломается, когда эти вещи не обновляются.