PostgreSQL中用毕达哥拉斯定理计算距离后按邻近度排序的实现
解决方法
直接将WHERE子句中的距离平方计算表达式放到ORDER BY子句中,就能实现按邻近度排序,具体有两种实用写法:
写法1:高效排序(复用平方计算)
由于距离平方的大小顺序和实际距离的顺序完全一致,直接用平方值排序可以避免平方根计算的开销,性能更优:
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.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - myPointLng*111139))^2) ASC;
写法2:返回实际距离并排序
如果需要在结果中直观看到每个点到目标点的具体距离,可以计算出实际距离(开平方),再按该字段排序:
SELECT *, sqrt((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - myPointLng*111139))^2) AS distance_metres FROM point l WHERE ((abs(l.lat*111139 - myPointLat*111139)^2) + (abs(l.lng*111139 - myPointLng*111139))^2) <= metres^2 ORDER BY distance_metres ASC;
补充说明
两种写法默认都是按距离从近到远排序,若需要从远到近,把ASC改成DESC即可。
内容的提问来源于stack exchange,提问作者Varox
相关产品推荐
相关产品推荐

