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

第23章 PostGIS中基于半径查找对象的高效方法

如何在另一个对象的一定半径范围内查找所有对象?

实现半径查询有多种方法,但关键在于高效检索。PostGIS 提供了专门针对此类查询的函数 ST_DWithin():

SELECT * FROM mytable WHERE ST_DWithin(geom, 'POINT(1000 1000)', 100.0)

“DWithin” 意为“距离之内”。你当然也可以用 ST_Distance() 来构造同样的查询,但执行速度会慢得多,因为这类查询无法利用空间索引。

另一种思路是组合使用 ST_Intersects() 和 ST_Buffer(),写法如下:

SELECT * FROM mytable WHERE ST_Intersects(ST_Buffer(geom, 100.0), 'POINT(1000 1000)')

这种做法同样可行,结果与其他方案一致,但往往更慢,因为 ST_Buffer() 这类构造型函数开销很大。不过在某些特定场景下——例如一方是一个复杂字面量做缓冲,另一方只是一个简单的点集——缓冲法反而可能比 ST_DWithin() 更快。

评论 (0)