如何获取一定半径范围内的地点

3
我有一个活动数据库,每个活动都可以在3天内举行,每天包含一个邮政编码。
因此,数据库看起来像这样(+很多其他字段)。
在另一个数据库中,我有地理位置信息(邮政编码、纬度、经度)。
现在用户可以输入他们的邮政编码和半径,距离该点半径内的所有活动将显示出来。
问题:
1-完成这项任务的最佳方法是什么?
解决方案:
创建所有可能邮政编码的视图,并将其与Geo表连接以获取其Lat/Lng
当用户搜索邮政编码时,获取Lat/Lng并执行数学运算以获得靠近该点的所有邮政编码。
但是,从性能的角度来看,我认为这不是一个好的方式,因为我需要在3000多个活动上应用查询。
找到的计算距离的代码:
找到MySQL中附近的位置(Haversine公式)
SELECT id, ( 3959 * acos( cos( radians(37) ) * cos( radians( lat ) ) * cos( radians( lng ) - radians(-122) ) + sin( radians(37) ) * sin( radians( lat ) ) ) ) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;
你们觉得呢?

1
这是一个类似的问题:https://dev59.com/dU_Ta4cB1Zd3GeqPAGAx#3349899 - NullUserException
2个回答

0

在性能方面我错了,查询在计算3000多个活动的距离时只花费了不到0.5秒。


0
你需要使用GIS来实现这个功能(并使用空间索引),但是MySQL无法胜任- MySQL的GIS功能只能处理矩形。PostgreSQL可以进行GIS操作。
最简单的方法是使用数学表达式。最好使用一些投影坐标(纬度和经度是球体坐标)。将整个数据库转换为此投影坐标系统,然后仅使用简单表达式(无需使用三角函数):
(activity_x - postal_code_x)^2 + (activity_y - postal_code_y)^2 < distance^2
请注意,地球是一个球体,这意味着这仅适用于较短的距离(例如<1000公里)。但无论如何,我认为您不需要精确的圆形......

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接