Major cleanup and more consistent use of internal SQLiteConnection usage to ensure open connections don’t get garbage collected
Added gpkg_disconnect() convenience methods for
tbl_SQLiteConnection and
src_SQLiteConnection
Added gpkg_connection() a user-level function for
accessing or creating SQLiteConnections given a geopackage
object or a path to GeoPackage file
Added [ and [[ methods for
accessing/replacing tables in a geopackage object
Replaced vapour functionality for driver detection
with gdalraster equivalents
Added gpkg() alias for
geopackage()
Added gpkg_create_geometry_columns(),
gpkg_geometry_columns() and
gpkg_add_geometry_columns()
Added gpkg_sf() convenience method for creating an
sf object from tables. Defaults to a sf
tbl_df, use as_tibble=FALSE for
data.frame.
Now using new gpkg_create_spatial_ref_sys() function
internally to ensure GeoPackages have the minimum required
tables
gpkg_collect() and
gpkg_table(collect=TRUE) gain support for selecting a
subset of columns of interest
Deprecate gpkg_create_dummy_features() function name
and replace with gpkg_create_empty_features()
Deprecate gpkg_contents(template=) argument, provide
new arguments for each data element (SRS ID and bounding box)
Implemented GDAL driver detection for file paths via {vapour} for #15
Implemented functions for creating
gpkg_spatial_ref_sys table and adding or removing spatial
reference system records:
gpkg_create_spatial_ref_sys(),
gpkg_add_spatial_ref_sys()
gpkg_delete_spatial_ref_sys(),
gpkg_list_srs()Implemented basic gpkg_validate() routine (will be
expanded)
gpkg_contents and
gpkg_spatial_ref_sys existgpkg_contentsAdded gpkg_create_spatial_view() for creating
spatial views, which are dynamic layers accessible as if they were
typical static geometry layers (for #6).
gpkg_write() now properly writing attributes from a
data.frame source (which is not nested in a list) when
table_name argument is
gpkg_tables() better handling for
terra::vect() failures with non-spatial table function
fallback.
gpkg_write() now can handle SpatVectorProxy
input by querying it. Note this will not work for data that will not fit
in memory. May try to implement an ogr2ogr-like interface for this in
the future (#15).
gpkg_bbox() as an application of
gpkg_ogr_query()geopackage() internal connection object has been
moved to an internal environment
(<geopackage>$env$con rather than
<geopackage>$con)
gpkg_connect() allows for in-place modification of
an existing object for the purposes of creating an internal
SQLiteConnection
Improvement to gpkg_add_contents() and
gpkg_update_contents(): more intelligent choice of data
type when heterogeneous (non-attribute) data are in database but not
registered. Fix for broken tests on Windows/GDAL 3.5.2.
Fixed bug in gpkg_tables() when multiple attribute
tables were present.
Added gpkg_ogr_query() (and ogr
argument to gpkg_query()) to support querying OGR data
sources using a ‘terra’ SpatVectorProxy back end. This allows
for use of GeoPackage-specific SQL functions and the OGR/SQLite
dialects: https://gdal.org/en/stable/user/sql_sqlite_dialect.html
and https://gdal.org/en/stable/user/ogr_sql_dialect.html;
requires latest ‘terra’ (1.7-33+)
Added gpkg_rast() (analog of
gpkg_vect() for terra::rast()) for lazy
manipulation of gridded data in a GeoPackage
Added gpkg_create_dummy_features() which is a
workaround for use of gpkg_vect() on a GeoPackage with only
attribute data. This creates innocuous entries in
gpkg_geometry_columns and an empty table to “trick” GDAL
into reading arbitrary data sources.
Added gpkg_list_contents() and
gpkg_ogr_contents(); the former returns only table names
registered in gpkg_contents table, which are optionally
intersected with tables defined in gpkg_ogr_contents when
ogr=TRUE.
Fixed bug in .gpkg_gdaloptions_add() that could
cause addition of options with no value set
Added gpkg_vect(): a
terra::vect()-based analog of gpkg_table() for
lazy manipulation of vector and attribute data in a GeoPackage
gpkg_update_table() defaults to
wherecol=NULL which allows updating rows with no SQL
WHERE clause specified
Refactoring table accessor methods (https://github.com/brownag/gpkg/issues/2)
Renamed lazy.frame() ->
gpkg_table_pragma()
Renamed dplyr.frame() ->
gpkg_table()
gpkg_table() gains collect argument
(toggles materializing data.frame v.s. ‘dbplyr’ approach).
collect requires only ‘RSQLite’ not ‘dbplyr’.
gpkg_tables() gains pragma argument to
toggle use of gpkg_table_pragma() over
gpkg_table(). It also supports collect
argument.
gpkg_update_table() is now exported; this method
is/was used internally for updating the NoData entry for existing layers
via gpkg_tile_set_data_null()
Updated definitions of lazy.frame() and
dplyr.frame() and related docs
Updated gpkg_write() for raster, vector, and
attribute data
General cleanup and refactored approach for splitting input data sources between attributes, vector, and tiled grid coverage.
New approach still contains hard-coded logic related to the allowed object types and file data sources (that will be generalized in the future)
RASTER_TABLE name is now properly injected into GDAL
options from named list input (when not otherwise specified)
Bug fix in geopackage(<list>) related to
appending v.s. overwriting raster data
gpkg_update_contents(): Handle gpkgext_
and sqlite_sequence as standard GPKG table prefixes
Added {dbplyr} backend option to return tibble
object via geopackage object internal
SQLiteConnection
Changed formatting of PRAGMA table_info child
data.frame in lazy.frame() result