进阶 postgis.net 2026-10-09 21:31:24 · 6 阅读

第2章 用 ST_DWithin 进行半径查询

使用 ST_DWithin 进行半径查询

对于“查找距离某事物 X 范围内的其他事物”或“找出周围 X 范围内没有任何事物”这类查询,请使用 ST_DWithin 进行过滤。不要使用 ST_Distance,也不要将 ST_Intersects 与 ST_Buffer 结合使用。

为什么?

- ST_DWithin 可以 utilizes spatial index(若可用),而 ST_Distance 不能。 - ST_DWithin 比使用 ST_Buffer 更精确,因为 ST_Buffer 只是对真实缓冲区轮廓的近似。它通常也更快。

注意,ST_DWithin 同时支持 geometry 和 geography 类型。

示例

我们使用 geography 类型展示示例。geometry 类型的查询类似,但距离必须使用空间参考单位。

查找 1609 米(约 1 英里)范围内的物体

``` SELECT roads.road_name, pois.poi_name FROM roads INNER JOIN pois ON ST_DWithin(roads.geog, pois.geog, 1609); ```

查找 1 英里内没有任何兴趣点的道路

我们利用 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; ```

评论 (0)