【问题标题】:Sort by proximity after getting distance using pythagoras - postgresql使用毕达哥拉斯获得距离后按接近度排序 - postgresql
【发布时间】: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


【解决方案1】:

如果你想避免重复表达式,你可以在子查询中添加一个计算列,然后对子查询进行过滤。

select Column1, Column2, Column3 from 
(
  select *,
       (
          (abs(l.lat*111139 - myPointLat*111139)^2) + 
          (abs(l.lng*111139 - (myPointLng*111139))^2)
       ) as proximity
  from point l
)
where proximity <= metres^2
order by proximity

Column1、Column2、Column3 是您感兴趣的原始 point 表中的列。

就性能而言,最好只是重复表达式,因为那样 Postgres 肯定可以首先进行过滤,这意味着它必须使用可能更小的数据集,这会更快:

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)
         )

【讨论】:

  • 您好,感谢您的快速回复!您知道计算列是否适用于 PostgreSQL 15 吗? DBeaver 告诉我列接近度不存在:(
  • 是的,抱歉我没有检查 where 条款。我已经更新了我的答案。
【解决方案2】:

查看另一个问题How to re-use result for SELECT, WHERE and ORDER BY clauses?,因为我认为它会对你有很大帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多