【问题标题】:SQL (Presto): How to pull locations within X mile radius of lat/lon pontSQL (Presto):如何在 lat/lon pont 的 X 英里半径内提取位置
【发布时间】:2020-12-21 03:02:56
【问题描述】:

我有很多商店都有自己的纬度和经度。我正在尝试提取每个点半径 2 英里内的数据。例如。每家商店 2 英里范围内有多少家商店。解决此问题的最佳方法是什么?

我知道将纬度/经度四舍五入到十分之一(18.4,-66.2)基本上可以给我 5 英里的半径,但我如何才能变得更细化。我不确定以英里为单位进行四舍五入到第 100 位(18.4,-66.21)对我的影响有多大,但半径似乎太小了。

日期存储为:

  • 商店名称(字符串)
  • 纬度(双精度)
  • 经度(双)

【问题讨论】:

  • 我不知道 presto,所以这可能没有帮助,但这是我在 postgres 中的开始方式......为每个商店到商店的组合创建一个表。如果您有 22 家商店,那么您就有 231 种组合。然后此查询将返回每个组合的距离... select loc1, loc2, FN_CALC_DISTANCE(loc1_lat, loc1_lon, loc2_lat, loc2_lon) from temp_location_combos

标签: sql geospatial latitude-longitude presto radius


【解决方案1】:

你想要的是空间连接: https://prestodb.io/blog/2020/05/07/local-spatial-joins

只要两点之间的距离小于 5 英里,只需加入一个表,然后聚合。像这样的:

SELECT 
  a.store_name, 
  (COUNT(*) - 1) AS neighbors    -- subtract 1 for self
FROM stores a JOIN stores b
ON ST_Distance(ST_Point(a.longitude, a.latitude), 
               ST_Point(b.longitude, b.latitude)) < 2 * 1609
GROUP BY a.store_name

确保您有一个相对较新的 Presto 安装,我认为 Presto 在 2018 年底左右对其进行了优化,在此之前它会以纯交叉连接方式运行 - 这太慢了。

【讨论】:

  • 这正是我所需要的。谢了哥们!就我而言,2 * 1609 在做什么?
猜你喜欢
  • 2011-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多