Удалить слой из GeoPackage - PullRequest
       104

Удалить слой из GeoPackage

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

Я пытаюсь удалить векторный слой из файла GeoPackage с помощью пакета sf. Под «удалить» я имею в виду навсегда удалить НЕ перезаписать или обновить. Мне известна опция delete_layer, но, насколько я понимаю, эта функция предназначена только для удаления слоя перед его заменой слоем с тем же именем.

К сожалению, я написал слой с именем, не использующим стандартное кодирование в GeoPackage, которое эффективно делает весь gpkg-файл нечитаемым в QGIS. Поэтому я пытаюсь найти решение, чтобы удалить его через R.

1 Ответ

2 голосов
/ 14 января 2020

Геопакет также является базой данных 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, но, кажется, ничто не сломается с этими обновлениями.

...