Construct a SQL Query Using Spatial Predicates
Source:R/ngr_dbqs_filter_predicate.R
ngr_dbqs_filter_predicate.RdThis function generates a SQL query to filter and join tables based on spatial predicates. Should work on any SQL database that supports spatial functions.
Usage
ngr_dbqs_filter_predicate(
target_tbl,
mask_tbl,
target_col_return = "*",
mask_col_return = NULL,
mask_col_filter = NULL,
mask_col_filter_values = NULL,
mask_col_filter_values_negate = FALSE,
function_spatial = "ST_Intersects",
quote_tbl = FALSE,
...
)Arguments
- target_tbl
character The name of the target table. Required.
- mask_tbl
character The name of the mask table. Required.
- target_col_return
character Columns to return from the target table. Default is '*', meaning all columns.
- mask_col_return
character Columns to return from the mask table. Default is
NULL, meaning no columns are returned.- mask_col_filter
character The column from the mask table used for filtering. Default is
NULL.- mask_col_filter_values
character Values to filter the mask column by. Default is
NULL.- mask_col_filter_values_negate
logical Whether to negate the filter condition for the mask column. Default is
FALSE.- function_spatial
character The spatial function to use for filtering, e.g., "ST_Intersects". Default is "ST_Intersects". Valid options are:
ST_IntersectsST_ContainsST_WithinST_OverlapsST_CrossesST_Touches
For more details on spatial functions, see PostGIS Query Functions.
- quote_tbl
logical Whether to quote table names to handle special characters. Default is
FALSE. Allows quoting to be adjusted so can be used in geopackage when table names have periods in them. Usesngr_dbqs_tbl_quote()to quote table names.- ...
Additional arguments passed to
ngr::ngr_fdb_tbl_quote()ifquote_tblisTRUE.
Value
character A SQL query string.
Details
To enable geopackage support:
Install spatialite-tools on cmd line with
brew install spatialite-toolsFind your installation on cmd line with
find /opt/homebrew -name mod_spatialite.dylibThen Connect to GeoPackage in R with
con <- DBI::dbConnect(RSQLite::SQLite(), path_to_gpkg)Load SpatiaLite
dbExecute(con, "SELECT load_extension('/opt/homebrew/lib/mod_spatialite.dylib');")Run queries with
DBI::dbGetQuery(con, query = ngr_dbqs_filter_predicate(blah, blah, blah, quote_tbl = TRUE))
Examples
ngr_dbqs_filter_predicate(
target_tbl = "target_table",
mask_tbl = "mask_table",
target_col_return = c("col1", "col2"),
mask_col_return = c("filter_col"),
mask_col_filter = "filter_col",
mask_col_filter_values = c("value1", "value2"),
function_spatial = "ST_Intersects"
)
#> SELECT target.col1, target.col2, mask.filter_col FROM target_table AS target JOIN mask_table AS mask ON ST_Intersects(target.geom, mask.geom) AND mask.filter_col IN ('value1', 'value2');