r-spatial/sf

`st_read` reads compressed GPKG (>= GDAL 3.7) - should this be advertised?

rsbivand opened this issue · 4 comments

@Nowosad I've been looking at reading compressed vector files, such as this:
GB_election_2024_sim.gpkg.zip

In terra:

> xx <- terra::vect("GB_election_2024_sim.gpkg.zip")
> xx
 class       : SpatVector 
 geometry    : polygons 
 dimensions  : 632, 19  (geometries, attributes)
 extent      : 5512.998, 655970.4, 5342.9, 1220287  (xmin, xmax, ymin, ymax)
 source      : GB_election_2024_sim.gpkg.zip (GB_election_2024_sim)
 coord. ref. : OSGB36 / British National Grid (EPSG:27700) 
 names       :     Constituency            Name Area_Code Area_Description
 type        :            <chr>           <chr>     <chr>            <chr>
 values      : Aberafan Maesteg Aberafan Maest~       WMC  Westminster Co~
                 Aberdeen North Aberdeen North~       WMC  Westminster Co~
                 Aberdeen South Aberdeen South~       WMC  Westminster Co~
       File_Name Feature_Serial_Number Collection_Serial_Number
           <chr>                 <int>                    <int>
 ABERAFAN_MAEST~                     1                        1
 ABERDEEN_NORTH~                   472                      472
 ABERDEEN_SOUTH~                   473                      473
 Global_Polygon_ID Admin_Unit_ID Census_Code (and 9 more)
             <int>         <int>       <chr>             
            146759        187003   W07000081             
            147374        187618   S14000060             
            147375        187619   S14000061        

In sf:

> sim <- st_read("GB_election_2024_sim.gpkg.zip")
Reading layer `GB_election_2024_sim' from data source 
  `/home/rsb/topics/packages/github-r-spatial/LICD/GB_election_2024_sim.gpkg.zip' 
  using driver `GPKG'
Simple feature collection with 632 features and 19 fields
Geometry type: MULTIPOLYGON
Dimension:     XY
Bounding box:  xmin: 5512.998 ymin: 5342.9 xmax: 655970.4 ymax: 1220287
Projected CRS: OSGB36 / British National Grid
> all.equal(st_geometry(sim), st_geometry(st_cast(st_as_sf(xx), "MULTIPOLYGON")))
[1] TRUE
> all.equal(st_drop_geometry(sim), st_drop_geometry(st_as_sf(xx)))
[1] TRUE

Could we compress the GPKG in spData see Nowosad/spData#62 ? Or are too many using GDAL < 3.7 ? This actually also works from GDAL >= 3.1 for ESRI Shapefiles too.

@rsbivand GDAL 3.7 was just released less than 1.5 years ago. Thus, my feeling is that it is too early to expect the majority of the users to have it...

OK, it does save a lot (~50%) on installed size. CRAN Windows and macOS are OK, current Fedora also, Ubuntu GH actions OK, CRAN Fedora devel checks not OK, because Fedora is still 36, so GDAL 3.4. CRAN macOS checks not OK 3.5 on both architectures. I'll see how to move CRAN forward, at least for feasible check platforms, with the benefit of smaller installed sizes for vector files.

GDAL37 <- as.numeric_version(unname(sf_extSoftVersion()["GDAL"])) >= "3.7.0"
file <- "aa.gpkg.zip"
zipfile <- system.file(file, package="aaa")
if (GDAL37) {
    out <- st_read(zipfile)
} else {
    td <- tempdir()
    bn <- sub(".zip", "", basename(file))
    target <- unzip(zipfile, files=bn, exdir=td)
    out <- st_read(target)
}

Reading zipped geopackage is supported by GDAL since forever. GDAL 3.7 just brings a bit of syntaxic sugar on opening (and direct creation of a .gpkg.zip). For all versions, you can open "/vsizip/GB_election_2024_sim.gpkg.zip/GB_election_2024_sim.gpkg" . Cf logic at https://github.com/OSGeo/gdal/blob/d09bdd06b5b0753b0ae743f531a672259eb9dae5/ogr/ogrsf_frmts/gpkg/ogrgeopackagedriver.cpp#L63 and https://github.com/OSGeo/gdal/blob/d09bdd06b5b0753b0ae743f531a672259eb9dae5/ogr/ogrsf_frmts/gpkg/ogrgeopackagedatasource.cpp#L1438