SQLPresto:如何在纬度/经度的X英里半径内提取位置

问题描述

我有一堆自己的经度和纬度的商店。我正在尝试提取每个点2英里半径内的数据。例如。每家商店2英里范围内有多少家商店。最好的方法是什么?

我知道将纬度/经度四舍五入到十分之一(18.4,-66.2)可以给我5英里半径,但是如何获得更细的颗粒。我不确定以英里数为单位四舍五入到第100位(18.4,-66.21),但半径似乎太小。

日期存储为:

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

解决方法

您想要的是空间连接: 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年底左右对其进行了优化,并且在此之前将以纯交叉连接的方式运行-这太慢了。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...