httr2中URL查询.multi参数的使用方法咨询
解决httr2批量查询ArcGIS Feature Server多OBJECTID的问题
正确实现代码
核心是构造符合ArcGIS查询语法的WHERE子句,将多个OBJECTID用括号包裹、逗号分隔,无需误用.multi参数:
library(httr2) library(glue) all_the_ids <- list(objectIds = c(746, 3733, 2271, 2337, 3385, 3610, 2921, 1741, 1883, 885)) snes_url <- "https://services1.arcgis.com/gtRkYQyUQLMTM1uS/arcgis/rest/services/Australian_Species_of_National_Environmental_Significance_Distributions/FeatureServer/0/query" # 生成格式正确的WHERE子句:OBJECTID IN (id1, id2, ...) where_clause <- glue::glue("OBJECTID IN ({paste(all_the_ids$objectIds, collapse = ',')})") full_query_params <- list( where = where_clause, outFields = "*", outSR = 4326, f = "json" ) dat_req <- request(snes_url) |> req_url_query(!!!full_query_params) response <- dat_req |> req_perform() response |> resp_body_json() |> str()
错误写法原因分析
- 第一种错误写法:
glue("OBJECTID IN {all_the_ids$objectIds[1:3]}")会生成OBJECTID IN 746 3733 2271,缺少括号和逗号分隔,不符合SQL查询语法,ArcGIS服务器无法解析。 - 第二种错误写法:
.multi="comma"是用来处理单个查询参数对应多个值的场景(比如将?color=red&color=blue转为?color=red,blue),但这里的需求是在where参数的SQL语句中包含多个ID,并非给OBJECTID参数传多值,属于参数用法误解。
补充说明
- 若待查询的OBJECTID数量过多,需注意ArcGIS Feature Server的查询限制,部分服务器会限制
IN子句的ID数量,超出时可拆分多次查询后合并结果。 - 也可使用
glue_collapse简化字符串构造:where_clause <- glue("OBJECTID IN ({glue_collapse(all_the_ids$objectIds, ',')})")
内容的提问来源于stack exchange,提问作者we need a Mat. Stat.
相关产品推荐
相关产品推荐

