88find_origin <- function (
99 network ,
1010 id ,
11+ src ,
1112 type = c(" id" , " comid" , " hl_uri" , " poi_id" , " nldi_feature" , " xy" )
1213) {
1314
1415 hydroseq <- NULL
1516 type <- match.arg(type )
1617 query <- structure(id , class = type )
1718
18- origin <- try(find_origin_query(query , network ))
19+ origin <- try(find_origin_query(query , network , src ))
1920
2021 if (inherits(origin , " try-error" )) {
2122 stop(origin , call. = FALSE )
@@ -40,15 +41,16 @@ find_origin <- function(
4041# ' S3 dispatch on query identifier type
4142# ' @param id A queryable identifier, see `find_origin`.
4243# ' @param network A `dplyr`-compatible object.
44+ # ' @param src gpkg layer
4345# ' @returns `network` after applying a [dplyr::filter] expression.
4446# ' @keywords internal
45- find_origin_query <- function (id , network ) {
47+ find_origin_query <- function (id , network , src ) {
4648 UseMethod(" find_origin_query" )
4749}
4850
4951# ' @method find_origin_query default
5052# ' @keywords internal
51- find_origin_query.default <- function (id , network ) {
53+ find_origin_query.default <- function (id , network , src ) {
5254 stop(paste(
5355 " identifier of class" ,
5456 paste0(" `" , class(id ), " `" , collapse = " /" ),
@@ -58,36 +60,36 @@ find_origin_query.default <- function(id, network) {
5860
5961# ' @method find_origin_query id
6062# ' @keywords internal
61- find_origin_query.id <- function (id , network ) {
63+ find_origin_query.id <- function (id , network , src ) {
6264 id <- unclass(id )
6365 dplyr :: filter(network , id == !! id )
6466}
6567
6668# ' @method find_origin_query comid
6769# ' @keywords internal
68- find_origin_query.comid <- function (comid , network ) {
70+ find_origin_query.comid <- function (comid , network , src ) {
6971 hf_id <- NULL
7072 comid <- unclass(comid )
7173 dplyr :: filter(network , hf_id == !! comid )
7274}
7375
7476# ' @method find_origin_query hl_uri
7577# ' @keywords internal
76- find_origin_query.hl_uri <- function (hl_uri , network ) {
78+ find_origin_query.hl_uri <- function (hl_uri , network , src ) {
7779 hl_uri <- unclass(hl_uri )
7880 dplyr :: filter(network , hl_uri == !! hl_uri )
7981}
8082
8183# ' @method find_origin_query poi_id
8284# ' @keywords internal
83- find_origin_query.poi_id <- function (poi_id , network ) {
85+ find_origin_query.poi_id <- function (poi_id , network , src ) {
8486 poi_id <- unclass(poi_id )
8587 dplyr :: filter(network , poi_id == !! poi_id )
8688}
8789
8890# ' @method find_origin_query nldi_feature
8991# ' @keywords internal
90- find_origin_query.nldi_feature <- function (nldi_feature , network ) {
92+ find_origin_query.nldi_feature <- function (nldi_feature , network , src ) {
9193 .Class <- " comid"
9294
9395 nldi_feature <- structure(
@@ -100,12 +102,28 @@ find_origin_query.nldi_feature <- function(nldi_feature, network) {
100102
101103# ' @method find_origin_query xy
102104# ' @keywords internal
103- find_origin_query.xy <- function (xy , network ) {
104- .Class <- " comid"
105+ find_origin_query.xy <- function (xy , network , src ) {
106+ .Class <- " id"
107+
108+ if (grepl(" https" , src )){
109+ src = paste0(" /vsicurl/" , src )
110+ } else if (grepl(" s3" , src )){
111+ src = paste0(" /vsis3/" , src )
112+ } else {
113+ src = src
114+ }
115+
116+ bb <- sf :: st_point(xy ) | >
117+ sf :: st_sfc(crs = 4326 ) | >
118+ sf :: st_as_sf() | >
119+ sf :: st_transform(5070 ) | >
120+ sf :: st_geometry() | >
121+ sf :: st_as_text()
105122
106123 xy <- structure(
107- nhdplusTools :: discover_nhdplus_id(point = sf :: st_sfc(sf :: st_point(xy ), crs = 4326 )),
108- class = " comid"
124+ sf :: read_sf(src , " divides" , wkt_filter = bb ) | >
125+ dplyr :: pull(id ),
126+ class = " id"
109127 )
110128
111129 NextMethod()
0 commit comments