进阶 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() 更快。