Skip to content

Commit

Permalink
Merge pull request #12 from brownag/gpkg-view
Browse files Browse the repository at this point in the history
Add spatial view support
  • Loading branch information
brownag authored Dec 7, 2023
2 parents 1184a0e + 82465eb commit 8646ba8
Show file tree
Hide file tree
Showing 5 changed files with 129 additions and 0 deletions.
1 change: 1 addition & 0 deletions NAMESPACE
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ export(gpkg_connect)
export(gpkg_contents)
export(gpkg_create_contents)
export(gpkg_create_dummy_features)
export(gpkg_create_spatial_view)
export(gpkg_delete_contents)
export(gpkg_disconnect)
export(gpkg_execute)
Expand Down
4 changes: 4 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# gpkg 0.0.8

- Added `gpkg_create_spatial_view()` for creating spatial views, which dynamic layers that are accessible as if they were typical static geometry layers (for #6).

# gpkg 0.0.7

- Added `gpkg_bbox()` as an application of `gpkg_ogr_query()`
Expand Down
41 changes: 41 additions & 0 deletions R/gpkg-view.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
#' Create a Spatial View
#'
#' @param g a `geopackage`
#' @param viewname _character_. Name of view.
#' @param viewquery _character_. Query for view contents.
#' @param geom_column _character_. Column name of view geometry. Default: `"geom"`
#' @param geometry_type_name _character_. View geometry type. Default: `"GEOMETRY"`
#' @param spatialite_computed _logical_. Register definition of `geom_column` as
#' the result of a Spatialite spatial function via
#' `"gdal_spatialite_computed_geom_column"` extension.
#' Default: `FALSE`
#' @param data_type _character_. View data type. Default `"features"`
#' @param srs_id _integer_. Spatial Reference System ID. Default: `4326` (WGS84)
#' @param z _integer_. Default: `0`
#' @param m _integer_. Default: `0`
#'
#' @return _integer_. Returns `1` if a new record in `gpkg_geometry_columns` is successfully made.
#' @export
#'
gpkg_create_spatial_view <- function(g,
viewname,
viewquery,
geom_column = "geom",
geometry_type_name = "GEOMETRY",
spatialite_computed = FALSE,
data_type = "features",
srs_id = 4326,
z = 0,
m = 0) {
gpkg_execute(g, sprintf("CREATE VIEW %s AS %s", viewname, viewquery))
gpkg_execute(g, sprintf("INSERT INTO gpkg_contents (table_name, identifier, data_type, srs_id)
VALUES ('%s', '%s', '%s', %s)",
viewname, viewname, data_type, srs_id))
gpkg_execute(g, sprintf("INSERT INTO gpkg_geometry_columns (table_name, column_name, geometry_type_name, srs_id, z, m)
VALUES ('%s', '%s', '%s', %s, %s, %s)",
viewname, geom_column, geometry_type_name, srs_id, z, m))
if (spatialite_computed)
gpkg_execute(g, sprintf("INSERT INTO gpkg_extensions (table_name, column_name, extension_name, definition, scope)
VALUES ('%s', '%s', 'gdal_spatialite_computed_geom_column', 'https://gdal.org/drivers/vector/gpkg_spatialite_computed_geom_column.html', 'read-write');",
viewname, geom_column))
}
49 changes: 49 additions & 0 deletions man/gpkg_create_spatial_view.Rd

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

34 changes: 34 additions & 0 deletions misc/gpkg-view-voronoi.R
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
library(gpkg)
library(terra)

gpkg_tmp <- tempfile(fileext = ".gpkg")

if (file.exists(gpkg_tmp))
file.remove(gpkg_tmp)

v <- vect(system.file("ex", "lux.shp", package = "terra"))

gpkg_write(list(lux = v), destfile = gpkg_tmp, append = TRUE)

g <- geopackage(gpkg_tmp, connect = TRUE)

gpkg_create_spatial_view(g, "my_vor", "SELECT lux.fid AS OGC_FID,
lux.fid AS fid,
ST_VoronojDiagram(geom) AS geom2
FROM lux WHERE ID_2 <= 3",
geom_column = "geom2",
geometry_type_name = "MULTIPOLYGON",
spatialite_computed = TRUE)
# NB: terra::vect() sensitive to geom type
gpkg_contents(g)

plot(gpkg_vect(g, "my_vor"))
gpkg_vect(g, "lux") |>
subset(ID_2 <= 3, NSE = TRUE) |>
as.lines() |>
plot(col = "BLUE", lwd = 2, add = TRUE)

# compare to:
plot(sf::st_read(g$dsn, layer = "my_vor"))
plot(svc(g$dsn, layer = "my_vor")[1])
plot(query(vect(g$dsn, layer = "my_vor", proxy = TRUE)))

0 comments on commit 8646ba8

Please sign in to comment.