如何获得一定半径的地方

时间:2011-08-12 14:07:51

标签: php mysql performance geocoding distance

我有一个活动数据库,每个活动可以在3天内举行,每天都包含一个邮政编码。

所以数据库看起来像那样(+很多其他字段)

enter image description here

在另一个数据库中,我有一个地理位置信息(邮政编码,纬度,长)

enter image description here

现在,用户可以输入邮政编码和半径,并显示该半径内的活动。

问题:

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;

你们有什么想法?

2 个答案:

答案 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+活动的距离。