3 votos

Actualización de los registros de GeoPackage con R

Me gustaría actualizar los registros de un GeoPackage que contiene información vectorial en R. Lo he intentado:

library(sf)
library(RSQLite)

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

# Write Geo Package
gpkg <- "nc.gpkg"
st_write(nc, gpkg)

# Create connection
con <- dbConnect(SQLite(), dbname = gpkg)

# Update record
res <- dbSendQuery(con, "UPDATE nc SET NAME = 'My new name' WHERE CNTY_ID == 1828")

Lo que me da el siguiente error:

Error: no such function: ST_IsEmpty

Un poco de investigación revela que ST_IsEmpty es una de varias funciones SQL que se requieren para actualizar un GeoPackage. ¿Cómo puedo incluirlos? ¿O existen otros métodos para realizar esta operación?

2voto

Jay Bazuzi Puntos 194

Has abierto un SQLite que es la base de datos "vainilla" de SQLite sin las funciones espaciales que se implementan en las "extensiones cargables" de SQLite. Si sabes dónde está el spatialite módulo de extensión es que puedes cargarlo.

En mi sistema, está en /usr/lib/x86_64-linux-gnu/mod_spatialite.so Por lo tanto, puedo hacerlo:

> res <- dbSendQuery(con, "select load_extension('/usr/lib/x86_64-linux-gnu/mod_spatialite.so');")

para cargar las extensiones, y luego su actualización se completa:

> res <- dbSendQuery(con, "UPDATE nc SET NAME = 'My new name' WHERE CNTY_ID == 1828")
Warning message:
Closing open result set, pending rows 
> 

con una advertencia que por el momento voy a ignorar.

Podría ser más sencillo reescribir todo el objeto espacial en el GeoPackage utilizando st_write en lugar de actualizar las filas - no sé si hay una gran ganancia de eficiencia en las actualizaciones de las filas... sería interesante hacer benchmarks...

No estoy seguro de cómo encontrar de forma fiable la ubicación del módulo de extensión de spatialite en todos los sistemas operativos, o cómo hacerlo de forma programada si quieres escribir un script reutilizable.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X