Newer
Older
needs_layer <- function(db, layer) {
if(file.exists(db)) {
layers <- st_layers(db)
if(layer %in% layers$name)
return(FALSE)
}
TRUE
}
layer_exists <- function(db, layer) {
if(file.exists(db)) {
layers <- st_layers(db)
if(layer %in% layers$name)
return(TRUE)
}
FALSE
}

Bock, Andy
committed
# Subset NHD RDS by hydrologic region
VPU_Subset <- function(nhdPath, VPU){

Bock, Andy
committed
# Read in COMIDs of outlets
RegOutlets <- jsonlite::read_json(file.path("cache", "RegOutlets.json"))
print (paste0("subsetting for VPU ", VPU))

Bock, Andy
committed
if (!VPU %in% names(RegOutlets)){
# For regions that terminate to the NHDPlus domain
# 1,2,3,4,8,9,12,15,17,18
# Read in NHDPlusV2 flowline simple features and filter by vector processing unit (VPU)
nhd <- readRDS(nhdPath) %>%
filter(grepl(paste0("^", VPU, ".*"), .data$VPUID)) %>% filter(FTYPE != "Coastline")

Bock, Andy
committed
keep <- prepare_nhdplus(nhd, 0, 0, 0, FALSE)

Bock, Andy
committed
nhd <- filter(nhd, COMID %in% keep$COMID)

Bock, Andy
committed
# Subset VPUs that are single outlet
outlet <- RegOutlets[VPU]
#print (outlet)
nhd <- readRDS(nhdPath)

Bock, Andy
committed
#nhd_US <- get_UT(nhd, outlet)
nhd <- nhd %>% filter(COMID %in% unlist(get_UT(nhd, outlet)))
keep <- prepare_nhdplus(nhd, 0, 0, 0, FALSE)

Bock, Andy
committed
nhd <- filter(nhd, COMID %in% keep$COMID, VPUID == VPU)

Bock, Andy
committed
} else if (VPU == "10L"){
# Subset by flowlines in Region 10
nhd <- readRDS(nhdPath) %>%

Bock, Andy
committed
filter(grepl(paste0("^",substr(VPU,1,2),".*"), .data$VPUID)) # take out this VPUID
# R10U upstream
nhd_US_10U <- nhd %>% filter(COMID %in% unlist(get_UT(nhd, RegOutlets["10U"])))
# R10L upstream
nhd_US_10L <- nhd %>% filter(COMID %in% unlist(get_UT(nhd, RegOutlets["10L"])))
nhd_10L <- nhd_US_10L %>% filter(!COMID %in% nhd_US_10U$COMID)
keep <- prepare_nhdplus(nhd_10L, 0, 0, 0, FALSE)

Bock, Andy
committed
nhd <- filter(nhd, COMID %in% keep$COMID)
} else {
outlets <- unlist(RegOutlets[VPU])
nhd <- readRDS(nhdPath)

Bock, Andy
committed
#outlets <- c(14320629, 941140164, 15334434)
for (out in outlets){
#print (out)
nhd_US <- get_UT(nhd, out)
keep <- prepare_nhdplus(nhd %>% filter(COMID %in% unlist(nhd_US)), 0, 0, 0, FALSE)

Bock, Andy
committed
#print (dim(keep))
ifelse( exists("final") , final <- rbind(final, keep), final <- keep)
}
nhd <- nhd %>% filter(COMID %in% final$COMID)
}
return (nhd)
return_NonDendirtic <- function(VPU, nhd, nhdPath){
# Returns non-dendritic flowlines for assignment of coastal/non-dendritic catchments/flowlines
nhdAll <- readRDS(nhdPath) %>%
filter(grepl(paste0("^",VPU,".*"), .data$VPUID))
nhd_ND <- nhdAll %>% filter(!COMID %in% nhd$COMID) %>% filter(TerminalFl == 1)
return(nhd_ND)
}

Bock, Andy
committed
Merge_hydReg <- function(feat){
out_gpkg <-"cache/GF_CONUS.gpkg"
if(needs_layer(out_gpkg, feat)) {
feat_01 <- read_sf("cache/GF_01.gpkg", paste0(feat,"_01"))
feat_02 <- read_sf("cache/GF_02.gpkg", paste0(feat,"_02"))
feat_03 <- read_sf("cache/GF_03.gpkg", paste0(feat,"_03"))
feat_04 <- read_sf("cache/GF_04.gpkg", paste0(feat,"_04"))
feat_05 <- read_sf("cache/GF_05.gpkg", paste0(feat,"_05"))
feat_06 <- read_sf("cache/GF_06.gpkg", paste0(feat,"_06"))
feat_07 <- read_sf("cache/GF_07.gpkg", paste0(feat,"_07"))
feat_08 <- read_sf("cache/GF_08.gpkg", paste0(feat,"_08"))
feat_09 <- read_sf("cache/GF_09.gpkg", paste0(feat,"_09"))
feat_10U <- read_sf("cache/GF_10U.gpkg", paste0(feat,"_10U"))
feat_10L <- read_sf("cache/GF_10L.gpkg", paste0(feat,"_10L"))
feat_11 <- read_sf("cache/GF_11.gpkg", paste0(feat,"_11"))
feat_12 <- read_sf("cache/GF_12.gpkg", paste0(feat,"_12"))
feat_13 <- read_sf("cache/GF_13.gpkg", paste0(feat,"_13"))
feat_14 <- read_sf("cache/GF_14.gpkg", paste0(feat,"_14"))
feat_15 <- read_sf("cache/GF_15.gpkg", paste0(feat,"_15"))
feat_16 <- read_sf("cache/GF_16.gpkg", paste0(feat,"_16"))
feat_17 <- read_sf("cache/GF_17.gpkg", paste0(feat,"_17"))
feat_18 <- read_sf("cache/GF_18.gpkg", paste0(feat,"_18"))

Bock, Andy
committed
allfeat <- list(feat_01, feat_02, feat_03, feat_04, feat_05, feat_06, feat_07, feat_08, feat_09,
feat_10L, feat_10U, feat_11, feat_12, feat_13, feat_14, feat_15, feat_16, feat_17,
feat_18)

Bock, Andy
committed
all_sf<-do.call(rbind, allfeat)
write_sf(all_sf, out_gpkg, feat)
}
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
data_paths <- jsonlite::read_json(file.path("cache", "data_paths.json"))
# Layers
out_gpkg <- paste0("cache/GF_", hydReg, ".gpkg")
gagesIII_pois <- read_sf(out_gpkg, paste0("GagesIII_", hydReg)) # GAGESIII POIs
TE_pois <- read_sf(out_gpkg,paste0("TE_", hydReg)) # Thermoelectric POIs
NID_pois <- read_sf(out_gpkg,paste0("NID_", hydReg)) # NID POIs
nsegment_raw <- read_sf(out_gpkg,paste0("nsegment_raw_", hydReg)) # Minimally-sufficient network attributed with POI_ID
nsegment <- read_sf(out_gpkg,paste0("Nsegment_", hydReg)) # Minimally-sufficient network dissolved by POI_ID
WBs <- read_sf(out_gpkg,paste0("WB_", hydReg))
WBout_POIs <- read_sf(out_gpkg,paste0("WBout_", hydReg))
WBin_POIs <- read_sf(out_gpkg,paste0("WBin_", hydReg))
#*************************************************************************
# Attribute gagesIII POIs with adjusted measure and drainage area information
gagesIII <- read_sf(data_paths$gagesiii_points_path, "GagesIII_gages") %>%
filter(grepl(paste0("^", hydReg, ".*"), .data$NHDPlusReg))
# Load GAGESIII POIs from gpkg at cache dir
gagesIIIPOIs <- gagesIII_pois %>% st_drop_geometry(.) %>% select(Type_GagesIII, COMID) %>%
inner_join(gagesIII, by = "COMID") %>% select(Type_GagesIII, COMID, COMID_meas)
# Derive segment measure attributes
nsegment_gages <- st_drop_geometry(nsegment_raw) %>% left_join(gagesIIIPOIs, by = "COMID") %>%
select(Hydroseq, Type_GagesIII, COMID_meas, LENGTHKM, POI_ID, TotDASqKM) %>%
mutate(COMID_meas = 1 - replace_na(COMID_meas/100,0), Seg_meas = COMID_meas * LENGTHKM) %>% group_by(POI_ID) %>%
summarize(HS = min(Hydroseq), Length = sum(LENGTHKM), Percent = sum(Seg_meas)/sum(LENGTHKM),
TotDASqKM = max(TotDASqKM), Type_GagesIII = first(na.omit(Type_GagesIII))) %>% filter(!is.na(Type_GagesIII))
# Calcualte estimated proporational drainage area
gagesIIIPOI_DA <- gagesIIIPOIs %>% left_join(nsegment_raw, by = "COMID") %>%
select(Type_GagesIII, COMID, COMID_meas, AreaSqKM, TotDASqKM) %>%
mutate(Inc_DA = (1-(COMID_meas / 100)) * AreaSqKM) %>%
mutate(Total_DA = TotDASqKM - (AreaSqKM - Inc_DA))
# PUt everything together
gagesIII_stats <- gagesIIIPOI_DA %>% inner_join(nsegment_gages, by = "Type_GagesIII") %>%
select(Type_GagesIII, COMID, Length, Percent, TotDASqKM.y) %>%
rename(Seg_Length = Length, Seg_Measure = Percent, Adj_NHD_DA = TotDASqKM.y) %>%
mutate(VPU = hydReg)
# Compile data into GagesIII folder
if (file.exists("data/GAGESIII_gages/gagesIII_MDA.rds")){
# open file and bind to it
curRDS_gages <- readRDS("data/GAGESIII_gages/gagesIII_MDA.rds") #%>% filter(VPU != hydReg) %>%
bind_rows(gagesIII_stats)
saveRDS(curRDS_gages, "data/GAGESIII_gages/gagesIII_MDA.rds")
} else {
saveRDS(gagesIII_stats, "data/GAGESIII_gages/gagesIII_MDA.rds")
}
#************************************************************************
#************************************************************************
# Read in TE shapefile
TE_fac <- st_read(file.path(data_paths$TE_points_path, "/2015_TE_Model_Estimates_lat.long_COMIDs.shp")) %>%
filter(COMID %in% TE_pois$COMID)
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
# Cast TE as points and project to USGS albers
TE_fac_alb <- TE_fac %>% st_cast('POINT') %>% st_transform(., 6703)
# Subset segs based on TE and project to USGS albs
TE_seg_pnts <- nsegment %>% filter(POI_ID %in% TE_fac_alb$COMID) %>% st_transform(., 6703) %>% group_by(POI_ID) %>%
st_line_merge(.) %>% st_cast("POINT")
#for (POI_ID in TE_fac_alb$COMID){
TE_fac_alb$TE_measure <- unlist(lapply(1:nrow(TE_fac_alb), function(x){
COM <- TE_fac_alb$COMID[x]
fac <- TE_fac_alb %>% filter(COMID == COM)
seg <- TE_seg_pnts %>% filter(POI_ID == COM)
# Get index of nearest vertex on segment and rebuild two line IDs, then get length of each
nearVert <- st_nearest_feature(fac, seg)
# Pull out the line upstream and downstream of snapping point
Upline <- seg[1:nearVert,] %>% summarise(geom = st_combine(geom)) %>% st_cast("LINESTRING") %>% st_length(.)
Downline <- seg[nearVert:nrow(seg),] %>% summarise(geom = st_combine(geom)) %>% st_cast("LINESTRING") %>% st_length(.)
# Return the measure
return (Upline / (Upline + Downline))
}))
# Derive proportional total (probably need proporational incremental ratio too)
TE_data <- st_drop_geometry(TE_fac_alb) %>%
left_join(st_drop_geometry(nsegment_raw) %>% select(COMID, AreaSqKM, TotDASqKM), by = "COMID") %>%
mutate(Inc_DA = TE_measure * AreaSqKM, Total_DA = TotDASqKM - (AreaSqKM - Inc_DA)) %>%
select(EIA_PLANT_, LATITUDE, LONGITUDE, COMID, TE_measure, Inc_DA, Total_DA)
TE_data_upstream <- TE_data %>%
left_join(st_drop_geometry(nsegment) %>% select(POI_ID, To_POI_ID), by = c("COMID" = "To_POI_ID")) %>%
group_by(COMID) %>% mutate(Upstream_POIs = paste0(unique(POI_ID), collapse = " "))
TE_data_final <- TE_data_upstream %>%
left_join(st_drop_geometry(nsegment) %>% select(POI_ID, To_POI_ID), by = c("COMID" = "POI_ID")) %>%
group_by(COMID) %>% mutate(Upstream_POIs = paste0(unique(POI_ID), collapse = " ")) %>%
rename(Downstream_POI = To_POI_ID) %>% select(-POI_ID) %>% distinct() %>% mutate(VPU = hydReg)
if (file.exists("data/TE_points/TE_adj.rds")){
# open file and bind to it
curRDS_TE <- readRDS("data/TE_points/TE_adj.rds") %>% filter(VPU != hydReg) %>%
bind_rows(TE_data_final)
saveRDS(curRDS_TE, "data/TE_points/TE_adj.rds")
} else {
saveRDS(TE_data_final, "data/TE_points/TE_adj.rds")
}
#************************************************************************
#************************************************************************
# Read in NID shapefile
NID_fac <- read.csv(file.path(data_paths$NID_points_path,"/NID_attributes_20170612.txt"), stringsAsFactors = F) %>%
filter(FlowLcomid %in% NID_pois$COMID)
NID_snap_alb <- readRDS(file.path(data_paths$NID_points_path,"/NAWQA_NID_snap.rds")) %>%
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
filter(Source_FeatureID %in% NID_fac$Source_FeatureID) %>% st_transform(., 6703) %>%
inner_join(NID_fac, by = "Source_FeatureID")
# Subset segs based on TE and project to USGS albs
NID_seg_pnts <- nsegment %>% filter(POI_ID %in% unique(NID_fac$FlowLcomid)) %>% st_transform(., 6703) %>% group_by(POI_ID) %>%
st_line_merge(.) %>% st_cast("POINT")
#options(warn = -1)
NID_snap_alb$NID_measure <- unlist(lapply(1:nrow(NID_snap_alb), function(x){
fac <- NID_snap_alb[x,]
COM <- fac$FlowLcomid
seg <- NID_seg_pnts %>% filter(POI_ID == COM)
# Get index of nearest vertex on segment and rebuild two line IDs, then get length of each
nearVert <- st_nearest_feature(fac, seg)
# Pull out the line upstream and downstream of snapping point
Upline <- seg[1:nearVert,] %>% summarise(geom = st_combine(geom)) %>% st_cast("LINESTRING") %>% st_length(.)
Downline <- seg[nearVert:nrow(seg),] %>% summarise(geom = st_combine(geom)) %>% st_cast("LINESTRING") %>% st_length(.)
# Return the measure
return (Upline / (Upline + Downline))
}))
#options(warn = oldw)
# Derive proportional total (probably need proporational incremental ratio too)
NID_data <- st_drop_geometry(NID_snap_alb) %>%
left_join(st_drop_geometry(nsegment_raw) %>% select(COMID, AreaSqKM, TotDASqKM), by = c("FlowLcomid" = "COMID")) %>%
mutate(Inc_DA = NID_measure * AreaSqKM, Total_DA = TotDASqKM - (AreaSqKM - Inc_DA)) %>%
select(Source_FeatureID, VPU.x, Outlet, FlowLcomid, WBAreaSQKM, NIDSASQKM, NLCDSASQKM, MAX_SA, MultiMain, Catchcomid, FalconeDate,
YEAR_COMPLETED, MAX_DISCHARGE, NID_STORAGE, NID_measure, Inc_DA, Total_DA)
NID_data_upstream <- NID_data %>%
left_join(st_drop_geometry(nsegment) %>% select(POI_ID, To_POI_ID), by = c("FlowLcomid" = "To_POI_ID")) %>%
group_by(FlowLcomid) %>% mutate(Upstream_POIs = paste0(unique(POI_ID), collapse = " "))
NID_data_final <- NID_data_upstream %>%
left_join(st_drop_geometry(nsegment) %>% select(POI_ID, To_POI_ID), by = c("FlowLcomid" = "POI_ID")) %>%
group_by(FlowLcomid) %>% mutate(Upstream_POIs = paste0(unique(POI_ID), collapse = " ")) %>%
rename(Downstream_POI = To_POI_ID) %>% select(-POI_ID) %>% distinct() %>% mutate(VPU = hydReg)
if (file.exists("data/NID_points/NID_adj.rds")){
# open file and bind to it
curRDS_NID <- readRDS("data/NID_points/NID_adj.rds") #%>% filter(VPU != hydReg) %>%
bind_rows(NID_data_final)
saveRDS(curRDS_NID, "data/NID_points/NID_adj.rds")
} else {
saveRDS(NID_data_final, "data/NID_points/NID_adj.rds")
}
}