GitHub - lynker-spatial/hfutils: Hydrofabric Utilities

License: GPL (>= 3) LifeCycle Dependencies Website

hfutils provides the base utilities needed for hydrofabric creation and manipulation.

Installation

You can install the development version of hfutils from GitHub with:

# install.packages("remotes")
remotes::install_github("lynker-spatial/hfutils")
library(hfutils)
library(dplyr)

Basic Use

I/O

Basic connection: Dataset

gpkg <- '/Users/mikejohnson/hydrofabric/v3.0/reference_fabric.gpkg'
hfutils::as_ogr(gpkg)
#> [1] "divides"        "flowpaths"      "hydrolocations" "pois"          
#> [5] "events"         "network"
#> <OGRSQLConnection>
#>  DSN: /Users/mikejohnson/hydrofabric/v3.0/reference_fabric.gpkg...
#> tables: divides, flowpaths, hydrolocations, pois, events, network

Basic connection: Layer

hfutils::as_ogr(gpkg, "divides") 
#> # Source:   table<"divides"> [?? x 6]
#> # Database: OGRSQLConnection
#>    divide_id vpuid areasqkm has_flowpath flowpath_id                        geom
#>        <dbl> <chr>    <dbl> <lgl>              <dbl>          <MULTIPOLYGON [m]>
#>  1 931090014 01     8.61    TRUE           931090014 (((2068815 2313015, 206890…
#>  2 931080009 01     0.158   TRUE           931080009 (((1933035 2277735, 193315…
#>  3 931080008 01     0.296   TRUE           931080008 (((1933035 2277735, 193300…
#>  4 931080007 01     1.99    TRUE           931080007 (((1932855 2277345, 193285…
#>  5 931080006 01     2.33    TRUE           931080006 (((1931025 2278695, 193102…
#>  6 931070173 01     1.21    TRUE           931070173 (((1967025 2413755, 196702…
#>  7 931070172 01     7.72    TRUE           931070172 (((1966455 2412855, 196651…
#>  8 931060011 01     1.78    TRUE           931060011 (((2021925 2487855, 202204…
#>  9 931060010 01     1.85    TRUE           931060010 (((2021925 2487855, 202174…
#> 10 931060009 01     0.00765 TRUE           931060009 (((1990665 2513595, 199057…
#> # ℹ more rows

Lazy Eval

hfutils::as_ogr(gpkg, "divides") |> 
  select(divide_id, areasqkm) 
#> # Source:   SQL [?? x 2]
#> # Database: OGRSQLConnection
#>    divide_id areasqkm
#>        <dbl>    <dbl>
#>  1 931090014  8.61   
#>  2 931080009  0.158  
#>  3 931080008  0.296  
#>  4 931080007  1.99   
#>  5 931080006  2.33   
#>  6 931070173  1.21   
#>  7 931070172  7.72   
#>  8 931060011  1.78   
#>  9 931060010  1.85   
#> 10 931060009  0.00765
#> # ℹ more rows

sf extraction

hfutils::as_ogr(gpkg, "divides")  |> 
  filter(vpuid == "01") |> 
  st_as_sf()
#> Simple feature collection with 67880 features and 5 fields
#> Geometry type: MULTIPOLYGON
#> Dimension:     XY
#> Bounding box:  xmin: 1824825 ymin: 2215935 xmax: 2255715 ymax: 3086925
#> Projected CRS: NAD83 / Conus Albers
#> # A tibble: 67,880 × 6
#>    divide_id vpuid areasqkm has_flowpath flowpath_id                        geom
#>        <dbl> <chr>    <dbl> <lgl>              <dbl>          <MULTIPOLYGON [m]>
#>  1 931090014 01     8.61    TRUE           931090014 (((2068815 2313015, 206890…
#>  2 931080009 01     0.158   TRUE           931080009 (((1933035 2277735, 193315…
#>  3 931080008 01     0.296   TRUE           931080008 (((1933035 2277735, 193300…
#>  4 931080007 01     1.99    TRUE           931080007 (((1932855 2277345, 193285…
#>  5 931080006 01     2.33    TRUE           931080006 (((1931025 2278695, 193102…
#>  6 931070173 01     1.21    TRUE           931070173 (((1967025 2413755, 196702…
#>  7 931070172 01     7.72    TRUE           931070172 (((1966455 2412855, 196651…
#>  8 931060011 01     1.78    TRUE           931060011 (((2021925 2487855, 202204…
#>  9 931060010 01     1.85    TRUE           931060010 (((2021925 2487855, 202174…
#> 10 931060009 01     0.00765 TRUE           931060009 (((1990665 2513595, 199057…
#> # ℹ 67,870 more rows

Remote Access

# hfutils::as_ogr('/vsis3/lynker-spatial/hydrofabric/v2.2/conus/conus_nextgen.gpkg')

Network Properties

## Accumulate Downstream
system.time({
  da <-  hfutils::as_ogr(gpkg, 'flowpaths')  |> 
  filter(vpuid == "01") |> 
  st_as_sf() |> 
  accumulate_downstream(attr = "areasqkm")})
#>    user  system elapsed 
#>   0.911   0.491   1.550

head(da)
#> [1]  15.66720  11.12805   4.44600   6.52365   4.53420 335.51145

## Hydrosequence
system.time({
  hs <-  hfutils::as_ogr(gpkg, 
                         'flowpaths')  |> 
  filter(vpuid == "01") |> 
  st_as_sf() |> 
  get_hydroseq()
})
#>    user  system elapsed 
#>   0.900   0.488   1.398

head(hs)
#> [1]   806 22724 22726 22725 22727 28139

Questions?

Please reach out via an issue or PR if you have comments, concerns, or questions!