按纬度和经度查找子公司(地理位置)

时间:2013-08-02 09:34:39

标签: php sql geolocation

我正在寻找一个快速MySQL查询,从简单的表中返回最近的位置

表:locations

id |    city    |   latitude   |  longitude
-----------------------------------------------
1  |   Berlin   |   52.524268  |   13.406290
-----------------------------------------------
2  |   London   |   51.508129  |  -0.1280050    
-----------------------------------------------
3  |   Hamburg  |   53.551084  |   9.9936817
-----------------------------------------------

客户的坐标( + ):

$intLat = '52.370215700000000000'; // lat Amsterdam
$intLon = '4.895167899999933000';  // lon Amsterdam

大多数提供的示例@ SO都基于距离计算

即使使用Birmingham的坐标,它也会返回id=1(柏林)。 查询应返回伦敦,因为它比柏林更近。不应该?

SELECT *, ( 3959 * acos( cos( radians($intLat) ) 
                  * cos( radians( latitude ) ) 
                  * cos( radians( longitude ) 
                  - radians($intLon) ) + sin(radians($intLat) ) 
                  * sin( radians( latitude ) ) ) ) AS distance 
FROM locations 
HAVING distance < 10 
   AND id IN(1,2,3) 
LIMIT 1;

1 个答案:

答案 0 :(得分:2)

问题在于您选择半径为10的所有位置。

然后从该结果集中随机选择1个结果LIMIT 1

您需要按距离排序,以便最近的位置位于顶部 像这样:

SELECT *, ( 3959 * acos( cos( radians($intLat) ) 
            * cos( radians( latitude ) ) 
            * cos( radians( longitude ) 
            - radians($intLon) ) + sin(radians($intLat) ) 
            * sin( radians( latitude ) ) ) ) AS distance 

FROM locations 
HAVING distance < 10 
   AND id IN(1,2,3)
ORDER BY distance ASC  <<-- add this line
LIMIT 1;