使用 ST_DWithin 进行半径查询
对于涉及查找“距离其他事物 X 距离的事物”或“距离 X 距离内没有任何事物的”查询,使用 ST_DWithin 进行筛选。不要将 ST_Distance 或 ST_Intersects 与 ST_Buffer 一起使用。
为什么?
ST_DWithin
使用空间索引(如果可用)。ST_Distance
不使用ST_DWithin
比使用ST_Buffer
更准确,后者只是真实缓冲区轮廓的近似值。它也几乎总是更快。
请注意,ST_DWithin
同时支持 geometry
和 geography
类型。
我们展示使用 geography
的示例。使用 geometry
的查询类似,但距离必须以空间参考单位表示。
SELECT roads.road_name, pois.poi_name
FROM roads INNER JOIN pois
ON ST_DWithin(roads.geog, pois.geog, 1609);
我们利用了这样一个事实:当未找到匹配项时,LEFT JOIN 会在左表中返回 NULL。
SELECT roads.road_name, pois.poi_name
FROM roads LEFT JOIN pois
ON ST_DWithin(roads.geog, pois.geog, 1609)
WHERE pois.gid IS NULL;