如何在AWS Athena中查询指定坐标5公里范围内的所有门店
Athena查询指定坐标5公里范围内门店的方法
Athena基于Trino/Presto引擎,内置地理空间计算函数,直接调用内置函数即可实现距离筛选,不需要手动编写复杂的球面距离计算公式。
- 核心使用
ST_Distance函数计算两点间的地表真实距离,返回值单位为米,5公里对应的筛选阈值为5000。 - 所有地理点构造必须遵循「经度在前、纬度在后」的规则,和日常口语里说的“经纬度”顺序相反,不要写反否则会定位到错误位置。
你附的参考坐标截图如下:
对应经纬度为经度72.8777、纬度19.0760,下面的SQL示例基于该坐标编写,更换目标坐标时直接替换对应数值即可。
不同表结构对应的SQL写法
场景1:location字段本身是GEOMETRY点类型
如果建表时已经把location定义为地理空间点类型,直接运行以下SQL即可:
SELECT name FROM stores WHERE ST_Distance( ST_Point(72.8777, 19.0760), -- 此处依次传入目标点的经度、纬度 location ) <= 5000;
场景2:location字段存储WKT格式字符串
如果location是字符串类型、存的是标准WKT格式的点数据(例如内容为POINT(72.87 19.07)),需要先转成几何类型再计算:
SELECT name FROM stores WHERE ST_Distance( ST_Point(72.8777, 19.0760), -- 替换为你的目标坐标 ST_GeomFromText(location) ) <= 5000;
场景3:经纬度拆成独立字段存储
如果你的表里没有统一的location字段,是把经度、纬度存在两个独立数值字段(比如字段名是lng、lat),直接在SQL里构造点即可:
SELECT name FROM stores WHERE ST_Distance( ST_Point(72.8777, 19.0760), -- 替换为你的目标坐标 ST_Point(lng, lat) ) <= 5000;
注意事项
- 所有坐标必须统一使用WGS84坐标系(即普通GPS设备输出的原始经纬度),如果使用国内地图平台偏移后的火星坐标、百度坐标,计算结果会存在几百米到数公里的误差。
- 如果需要调整搜索半径,直接修改WHERE子句里的阈值即可,比如搜10公里范围就把5000改成10000。
内容的提问来源于stack exchange,提问作者Rahul Diggi
相关产品推荐
相关产品推荐

