【发布时间】:2022-11-17 23:45:38
【问题描述】:
我正在使用 postgresql 来计算不同点是否在特定范围内(使用毕达哥拉斯计算)。
问题是我想获得按接近度而不是随机排序的结果。
这是我的查询:
select * from point l where ((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - (myPointLng*111139))^2)) <= metres^2;
我想使用查询的这一部分对其进行排序:
((绝对值(l.lat111139 - myPointLat111139)^2) + (绝对值(l.lng111139 - (myPointLng111139))^2))
我怎样才能做到这一点?
非常感谢!
【问题讨论】:
-
不会添加一个简单的工作订单吗?
select * from point l where ((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - (myPointLng*111139))^2)) <= metres^2 order by ((abs(l.lat111139 - myPointLat111139)^2) + (abs(l.lng111139 - (myPointLng111139))^2)) -
@user3738870 我想避免再次计算相同的距离:S
-
除非你住在赤道上,否则这个等式会返回垃圾,因为经度的地面长度(以米为单位)随纬度而变化(仅在两极附近下降到几厘米......)。要么使用真正的 haversine 公式,要么更简单地使用 PostGIS 来为您处理距离测量。
-
@JGH 你是对的,刚刚找到了 PostgreSQL 的公式!我去试试,谢谢。你知道只使用公式而不是 postgis 对性能是否更好吗?
-
PostGIS 具有空间索引,这些索引对于距离排序和选择性非常有效(您不需要计算每个距离以仅保留最近的距离。PostGIS 将首先应用 2m 的“正方形”,然后仅计算点的精确距离在这个广场内)。如果您需要使用坐标完成更多任务,那么 PostGIS 无疑是赢家。如果它是唯一的,那么,这取决于你......
标签: java spring postgresql geolocation proximity