dav*_*ooh 7 postgresql postgis postgresql-9.3
我已经阅读了关于这个主题的几个问题+答案,但我不明白哪种是找到具有一定半径的“圆”内的所有点的常用方法(如果有的话......),以给定点为中心。
我特别发现了两种似乎最有说服力的方法:
select id, point
from my_table
where st_Distance(point, st_PointFromText('POINT(-116.768347 33.911404)', 4326)) < 10000;
Run Code Online (Sandbox Code Playgroud)
和:
select id, point
from my_table
where st_Within(point, st_Buffer(st_PointFromText('POINT(-116.768347 33.911404)', 4326), 10000));
Run Code Online (Sandbox Code Playgroud)
查询数据库最有效的方法是什么?还有其他选择可以考虑吗?
创建缓冲区来查找点是绝对不允许的,因为 (1) 创建表示缓冲区的几何体的开销,以及 (2) 多边形内的点计算比简单的距离计算效率低得多。
显然,您正在使用(经度、纬度)数据,因此您应该将其转换为适当的笛卡尔坐标系,该坐标系与您的距离 10,000 具有相同的测量单位。如果该距离以米为单位,那么您还可以将表中的点投射到geography(长,纬度)坐标并直接计算。由于您只想识别指定距离内的点,因此您可以使用该ST_DWithin()函数在球体上进行计算以提高速度(在纬度非常高或距离非常长时不要这样做):
SELECT id, point
FROM my_table
WHERE ST_DWithin(point::geography,
ST_GeogFromText('POINT(-116.768347 33.911404)'),
10000, false);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7127 次 |
| 最近记录: |