我有一个活动数据库,每个活动都可以举行3天,每天都有一个邮政编码。
所以数据库看起来是这样的(+很多其他字段)
在另一个数据库中,我有一个地理位置信息(邮政编码,纬度,经度)
现在用户可以在那里输入邮政编码和半径,并在该半径内显示活动。
问题:
1-实现这一目标的最佳方法是什么?
考虑解决方案
查看活动中所有可能的邮政编码,并将其加入到Geo表中以获取其Lat/Lng
然后,当用户搜索一个邮政编码时,得到Lat/Lng,并通过数学公式得到该点附近的所有邮政编码。
但我不认为从性能的角度来看这是一个好方法,因为我将不得不对3000多个活动应用查询
找到距离代码
使用MySQL查找附近的位置(Haversine公式)
选择id,(3959*acos(cos(radians(37))*cos(radians(lat))*cos(radians(lng)-radians(-122))+sin(radians(37))*sin(radians(lat)))作为距离
从标记
距离按距离顺序限制0,20;
你们觉得呢?
最佳答案
你需要一个地理信息系统来完成这项工作(并使用空间索引),但是mysql不能做到这一点——mysql的地理信息系统功能只能处理矩形。PostreSQL支持地理信息系统。
最简单的就是数学表达式。最好能使用一些投影坐标(纬度和经度是球面坐标)。在这个投影坐标系中转换整个数据库,而不仅仅是使用简单的表达式(不需要使用三角函数):
(活动x-邮政编码x)^2+(活动y-
邮政编码^2<距离^2
请注意,地球是一个球体,这意味着这只适用于较小的距离(比如
关于php - 如何获得一定半径的地方,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7041279/