问题描述
我有一堆自己的经度和纬度的商店。我正在尝试提取每个点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年底左右对其进行了优化,并且在此之前将以纯交叉连接的方式运行-这太慢了。