我有一个活动数据库,每个活动可以在3天内举行,每天都包含一个邮政编码。
所以数据库看起来像那样(+很多其他字段)
在另一个数据库中,我有一个地理位置信息(邮政编码,纬度,长)
现在,用户可以输入邮政编码和半径,并显示该半径内的活动。
问题:
1 - 实现这一目标的最佳方法是什么?
解决方案
查看活动中所有可能的邮政编码,并将其加入Geo表以获取他们的Lat / Lng
然后当用户搜索邮政编码时,获取Lat / Lng并使用数学公式来获取该点附近的所有邮政编码。
但我不认为在表现方面这是一个好方法,因为我将不得不在3000多个活动上应用查询
找到距离代码
使用MySQL(Haversine Formula)查找附近的位置
SELECT id,(3959 * acos(cos(radians(37))* cos(弧度(lat))* cos(弧度(lng) - 弧度(-122))+ sin(弧度(37))* sin (弧度(纬度))))AS距离 FROM标记 距离< 25 按距离排序LIMIT 0,20;
你们有什么想法?
答案 0 :(得分:0)
你需要一个GIS来做(并使用空间索引),但是mysql不具备它 - mysql GIS功能只能处理矩形。 PostreSQL能够实现GIS。
最简单的就是数学表达式。如果你可以使用一些投影坐标(lat&amp; lon是球体坐标),那将是最好的。在这个预计的协调系统中转换整个数据库,而不仅仅使用简单的表达式(不需要使用三角函数):
(activity_x - postal_code_x)^ 2 +(activity_y - postal_code_y)^ 2&lt;距离^ 2
请注意,地球是一个球体,这意味着它只适用于较小的距离(比如<1000 km)。但无论如何,我认为你不需要精确的圈子......
答案 1 :(得分:0)
我在性能方面错了,查询花了不到0.5秒来计算3000+活动的距离。