BigQuery中如何高效计算地块多边形到最近LineString的距离
地块到最近电力线高效最近邻查询方案
优化查询语句
你可以直接在ARRAY_AGG聚合逻辑中同步计算并获取最近距离,查询会自动利用空间索引,且每个地块找到最近电力线后即可停止计算,无需遍历所有匹配项:
SELECT a.OBJECTID, ARRAY_AGG( ST_Distance(a.geometry, b.geometry) ORDER BY ST_Distance(a.geometry, b.geometry) LIMIT 1 )[ORDINAL(1)] AS nearest_powerline_distance FROM `kpennell.KYLETEST.parcelpoly` a JOIN `kpennell.KYLETEST.powerlines` b ON ST_DWithin(a.geometry, b.geometry, 1000) GROUP BY a.OBJECTID
扩展用法(同时获取最近电力线ID)
如果需要同步返回最近电力线的唯一标识,可通过聚合结构体实现:
SELECT a.OBJECTID AS parcel_OBJECTID, nearest_powerline.distance AS nearest_powerline_distance, nearest_powerline.powerline_OBJECTID FROM `kpennell.KYLETEST.parcelpoly` a JOIN `kpennell.KYLETEST.powerlines` b ON ST_DWithin(a.geometry, b.geometry, 1000) GROUP BY a.OBJECTID, UNNEST(ARRAY_AGG( STRUCT( ST_Distance(a.geometry, b.geometry) AS distance, b.OBJECTID AS powerline_OBJECTID ) ORDER BY ST_Distance(a.geometry, b.geometry) LIMIT 1 )) AS nearest_powerline
性能优化提示
- 可根据业务需求调整
ST_DWithin的搜索半径,半径越小,参与匹配的电力线越少,查询效率越高 - 如需保留1000米范围内无电力线的地块记录,将
JOIN修改为LEFT JOIN即可,无匹配时距离字段返回NULL,可配合IFNULL设置默认值 - BigQuery会自动为几何类型字段构建空间索引,无需额外手动创建索引
内容的提问来源于stack exchange,提问作者Kyle Pennell
相关产品推荐
相关产品推荐

