From 07ab0d4184311cdbbdd3b5da2d39ecfc03480dfd Mon Sep 17 00:00:00 2001 From: David Blodgett <dblodgett@usgs.gov> Date: Tue, 16 Aug 2022 14:25:50 -0500 Subject: [PATCH] fixes #87 fixes #92 --- workspace/01_NHD_prep.Rmd | 4 +- workspace/05_hyRefactor_flines.Rmd | 8 ++-- workspace/06-1_hyRefactor_cats.Rmd | 10 ++--- workspace/07-1_merge.Rmd | 27 ++++++++++-- workspace/R/utils.R | 68 ++++++++++++++++++++++++++++++ 5 files changed, 103 insertions(+), 14 deletions(-) diff --git a/workspace/01_NHD_prep.Rmd b/workspace/01_NHD_prep.Rmd index d21e195..b48bcc6 100644 --- a/workspace/01_NHD_prep.Rmd +++ b/workspace/01_NHD_prep.Rmd @@ -44,7 +44,7 @@ fline <- sf::st_cast(fline, "LINESTRING") catchment <- sf::read_sf(file.path(data_paths$nhdplus_dir, "reference_catchments.gpkg")) -catchment <- sf::st_transform(catchment, 5070) +catchment <- sf::st_transform(catchment, crs) # we can remove truely degenerate COMIDs # for 0 upstream area and no catchment area @@ -97,7 +97,7 @@ for(VPU in vpu_codes) { reachcode, frommeas, tomeas, pathlength, arbolatesu, ftype, fcode, vpuid, rpuid, wbareacomi) - write_sf(nhd, nav_gpkg, nhd_flowline) + write_sf(sf::st_transform(nhd, crs), nav_gpkg, nhd_flowline) write_sf(cat_network, nav_gpkg, nhd_network) cats_rpu <- full_cat_table %>% diff --git a/workspace/05_hyRefactor_flines.Rmd b/workspace/05_hyRefactor_flines.Rmd index 3e80585..d262403 100644 --- a/workspace/05_hyRefactor_flines.Rmd +++ b/workspace/05_hyRefactor_flines.Rmd @@ -118,8 +118,8 @@ if(needs_layer(out_refac_gpkg, refactored_layer)) { exclude_cats = c(outlets$COMID, avoid$COMID, POI_downstream$COMID), warn = TRUE) - write_sf(read_sf(tf), out_refac_gpkg, refactored_layer) - write_sf(read_sf(tr), out_refac_gpkg, reconciled_layer) + write_sf(st_transform(read_sf(tf), crs), out_refac_gpkg, refactored_layer) + write_sf(st_transform(read_sf(tr), crs), out_refac_gpkg, reconciled_layer) unlink(list(tf, tr)) rm(tf, tr) @@ -128,7 +128,8 @@ if(needs_layer(out_refac_gpkg, refactored_layer)) { ```{r lookup} # create lookup for ref flowlines to use in the non-dendritic steps -refactor_lookup <- dplyr::select(st_drop_geometry(read_sf(out_refac_gpkg, reconciled_layer)), ID, member_COMID) %>% +refactor_lookup <- st_drop_geometry(read_sf(out_refac_gpkg, reconciled_layer)) %>% + dplyr::select(ID, member_COMID) %>% dplyr::mutate(member_COMID = strsplit(member_COMID, ",")) %>% tidyr::unnest(cols = member_COMID) %>% dplyr::mutate(NHDPlusV2_COMID = as.integer(member_COMID)) %>% # note as.integer truncates @@ -139,7 +140,6 @@ if(is.character(refactor_lookup$reconciled_ID)) refactor_lookup$reconciled_ID <- lookup_table <- tibble::tibble(NHDPlusV2_COMID = unique(as.integer(refactor_lookup$member_COMID))) %>% dplyr::left_join(refactor_lookup, by = "NHDPlusV2_COMID") - readr::write_csv(lookup_table, lookup_table_file) write_sf(lookup_table, out_refac_gpkg, lookup_table_refactor) ``` diff --git a/workspace/06-1_hyRefactor_cats.Rmd b/workspace/06-1_hyRefactor_cats.Rmd index d55bde2..4fb8fc5 100644 --- a/workspace/06-1_hyRefactor_cats.Rmd +++ b/workspace/06-1_hyRefactor_cats.Rmd @@ -35,16 +35,16 @@ if(needs_layer(out_refac_gpkg, divide_layer)) { fac <- data_paths$fac[[rpu_string]] fdr_temp <- terra::rast(fdr) - crs <- terra::crs(fdr_temp) + raster_crs <- terra::crs(fdr_temp) # reconciled have no ID applied in refactoring flowlines - reconciled <- st_transform(read_sf(out_refac_gpkg, reconciled_layer), crs) + reconciled <- st_transform(read_sf(out_refac_gpkg, reconciled_layer), raster_crs) # refactored has the original COMIDs and other attributes - refactored <- st_transform(read_sf(out_refac_gpkg, refactored_layer), crs) %>% + refactored <- st_transform(read_sf(out_refac_gpkg, refactored_layer), raster_crs) %>% distinct(.keep_all = T) - cats <- st_transform(read_sf(out_refac_gpkg, nhd_catchment), crs) + cats <- st_transform(read_sf(out_refac_gpkg, nhd_catchment), raster_crs) divides <- reconcile_catchment_divides(catchment = cats, fline_ref = refactored, @@ -59,7 +59,7 @@ if(needs_layer(out_refac_gpkg, divide_layer)) { if(exists("divides")) unlink(cache_split) - write_sf(divides, out_refac_gpkg, divide_layer) + write_sf(sf::st_transform(divides, crs), out_refac_gpkg, divide_layer) } sf::st_layers(out_refac_gpkg) diff --git a/workspace/07-1_merge.Rmd b/workspace/07-1_merge.Rmd index f9f4cb6..ac6c51b 100644 --- a/workspace/07-1_merge.Rmd +++ b/workspace/07-1_merge.Rmd @@ -62,12 +62,33 @@ if(needs_layer(gf_gpkg, agg_cats_layer)) { sf::write_sf(merged_layers[[mapped_outlets_layer]], gf_gpkg, mapped_outlets_layer) + merged_layers[[agg_cats_layer]] <- merged_layers[[agg_cats_layer]] %>% + mutate(areasqkm = as.numeric(units::set_units(sf::st_area(.), "km^2"))) + sf::write_sf(merged_layers[[agg_cats_layer]], gf_gpkg, agg_cats_layer) - - sf::write_sf(merged_layers[[agg_fline_layer]], gf_gpkg, agg_fline_layer) + + merged_layers[[agg_fline_layer]] <- merged_layers[[agg_fline_layer]] %>% + mutate(lengthkm = as.numeric(units::set_units(sf::st_length(.), "km"))) %>% + left_join(select(sf::st_drop_geometry(merged_layers[[agg_cats_layer]]), ID, areasqkm), by = "ID") + + sf::write_sf(merged_layers[[agg_fline_layer]], gf_gpkg, agg_fline_layer) - sf::write_sf(merged_layers[[lookup_table_refactor]], + sf::write_sf(merged_layers[[lookup_table_refactor]], gf_gpkg, lookup_table_refactor) + st_drop_geometry(merged_layers[[reconciled_layer]]) %>% + select(id = ID, toID = toID, lengthkm = LENGTHKM, levelpathid = LevelPathID) %>% + left_join(select(st_drop_geometry(merged_layers[[divide_layer]]), + id = ID, areasqkm), by = "id") %>% + relocate(id, toID, lengthkm, areasqkm, levelpathid) %>% + write_sf(rfc_gpkg, catchment_network_table) + + st_drop_geometry(merged_layers[[agg_fline_layer]]) %>% + select(id = ID, toid = toID, lengthkm, areasqkm) %>% + left_join(distinct(select(merged_layers[[lookup_table_refactor]], + id = aggregated_flowpath_ID, + levelpathid = LevelPathID))) %>% + sf::write_sf(gf_gpkg, catchment_network_table) + } ``` diff --git a/workspace/R/utils.R b/workspace/R/utils.R index 84561ad..1d2cbfc 100644 --- a/workspace/R/utils.R +++ b/workspace/R/utils.R @@ -466,6 +466,7 @@ merge_refactor <- function(rpus, rpu_vpu_out, out } +# FIXME: THESE FUNCTIONS SHOULD COME FROM hyFab #' Extract nexus locations for Reference POIs #' @param gpkg a reference hydrofabric gpkg #' @param type the type of desired POIs @@ -505,3 +506,70 @@ nexus_from_poi = function(mapped_POIs, nexus_locations } + +#' Generate Lookup table for Aggregated Nextwork +#' @param gpkg to the aggregated network. The look up table will be added here as a layer called "lookup_table" +#' @param flowpath_name the name of the flowpath layer in gpkg +#' @param refactored_fabric the gpkg for the corresponding VPU reference fabric +#' @return data.frame +#' @export +#' @importFrom sf read_sf st_drop_geometry write_sf +#' @importFrom dplyr mutate select full_join left_join +#' @importFrom tidyr unnest + +generate_lookup_table = function(nl, + mapped_POIs) { + + # THIS IS THE CODE ABOVE!!!! + nexus_locations = nexus_from_poi(mapped_POIs, verbose = FALSE) + + lu = nl$lookup_table %>% + select(reconciled_ID, NHDPlusV2_COMID) + + names(nl$flowpaths) <- tolower(names(nl$flowpaths)) + + nl$flowpaths <- rename(nl$flowpaths, member_COMID = set) + + lu2 = nl$flowpaths %>% + st_drop_geometry() %>% + select( + aggregated_ID = id, + toID = toid, + member_COMID = member_comid, + divide_ID = id, + POI_ID = poi_id, + mainstem_id = levelpathid + ) %>% + mutate(member_COMID = strsplit(member_COMID, ","), + POI_ID = as.integer(POI_ID)) %>% + unnest(col = 'member_COMID') %>% + mutate(NHDPlusV2_COMID_part = sapply( strsplit(member_COMID, "[.]"), + FUN = function(x){ x[2] }), + NHDPlusV2_COMID_part = ifelse(is.na(NHDPlusV2_COMID_part), 1L, + as.integer(NHDPlusV2_COMID_part)), + NHDPlusV2_COMID = sapply( strsplit(member_COMID, "[.]"), + FUN = function(x){ as.numeric(x[1]) }) + ) %>% + full_join(lu, + by = "NHDPlusV2_COMID") + + + group_by(aggregated_ID) %>% + arrange(hydroseq) %>% + mutate(POI_ID = c(POI_ID[1], rep(NA, n()-1))) %>% + ungroup() %>% + select(-hydroseq, - member_COMID) %>% + left_join(select(nexus_locations, POI_ID = poi_id, value, type), + by = "POI_ID") %>% + select(NHDPlusV2_COMID, NHDPlusV2_COMID_part, + reconciled_ID, + aggregated_ID, toID, mainstem = mainstem_id, + POI_ID, POI_TYPE = type, POI_VALUE = value) + + + write_sf(lu2, gpkg, "lookup_table") + + return(gpkg) + +} + -- GitLab