R语言使用arcpullr包实现ArcGIS按点距离空间查询问题咨询
问题根源
distance和units是get_layer_by_point的独立入参,不应放入sql_where中传递,sql_where仅用于构造属性查询条件,错误的参数传递导致服务端没有执行距离过滤,无法匹配到结果- 可能存在点要素与线要素服务的空间参考(CRS)不匹配的问题,服务端计算距离时会出现偏差
解决方案
方案1:修正arcpullr空间查询调用
直接将距离参数传给get_layer_by_point,同时预先对齐空间参考:
# 先查询线图层的空间参考,转换点要素的CRS保证一致 line_crs <- get_layer_info(line_url)$extent$spatialReference$latestWkid pt_sf_proj <- st_transform(pt_sf, line_crs) # 调用空间查询,直接传距离和单位参数 line_sf2 <- get_layer_by_point( url = line_url, location = pt_sf_proj, distance = 500, units = "feet" )
如果需要同时加属性过滤,可以把属性条件放到where参数中:
line_sf2 <- get_layer_by_point( url = line_url, location = pt_sf_proj, distance = 500, units = "feet", where = "属性字段 = '属性值'" )
方案2:本地计算最近点(更可控)
如果线要素数据量不大,可将目标范围的线要素拉取到本地,用sf包直接计算最近点,无需依赖服务端空间查询接口:
# 拉取线要素(可加where条件缩小拉取范围) line_all <- get_spatial_layer(line_url, where = "1=1") # 可替换为实际属性过滤条件 # 对齐CRS pt_sf_proj <- st_transform(pt_sf, st_crs(line_all)) # 匹配距离最近的线要素 nearest_line <- line_all[st_nearest_feature(pt_sf_proj, line_all), ] # 提取线要素上距离给定点最近的坐标 nearest_point <- st_nearest_points(pt_sf_proj, nearest_line) %>% st_cast("POINT") %>% .[2]
两种方案选择建议:线要素总量大、查询范围广时优先选方案1减少数据传输量;数据量小时选方案2更灵活,不易受服务端接口参数限制。
内容的提问来源于stack exchange,提问作者nniloc
相关产品推荐
相关产品推荐

