2012-06-26 130 views
5

我有问题试图通过SQL语句向用户返回最近的位置。为了测试我使用的是完全相同的坐标,这里是我有:测量两个纬度/经度点之间的距离

SQL:

SELECT `companies`.`customerName` , 
    (3959 * 
     ACOS(
      COS(
       RADIANS(37.367485) * COS(RADIANS(`locations`.`gps_lat`)) * 
       COS(
        RADIANS(`locations`.`gps_lng`) - RADIANS(-77.399994) + 
        SIN(RADIANS(37.367485)) * SIN(RADIANS(`locations`.`gps_lat`)) 
       ) 
      ) 
     ) 
    ) 
AS `distance` 
FROM `locations` 
JOIN `companies` ON `locations`.`co_id` 
HAVING `distance` > 25 
ORDER BY distance 
LIMIT 0 , 10 

结果:

| customerName | distance   | 
| SOME COMPANY | 1914.41747964854 | 


locations表值:

gps_lat | gps_lng 
37.367485 | -77.399994 


我使用的示例从Google,我查了公式几次,我似乎无法拿出我哪里错了。任何帮助表示赞赏。


编辑:
由于人们似乎对我有些困惑知道我在做什么:

>被取代,以产生一个结果,1914明显大于25

此应用程序将用户坐标从Android应用程序传递到我们的Web服务器。纬度和经度将从$_GET值拉出并从公司在我们的网页服务器MYSQL数据库交叉引用。

上面的语法只是我检查MySQL工作台我的SQL语句。显然,我正在寻找一个零值结果。

+3

如果你想在最近的地方,为什么你限制它“距离> 25“?我做了 –

+0

,返回零结果。注意它给我的距离高于 – jnthnjns

+2

根据您使用的RDBMS,可能会有相当简单(和更快)的方式来执行此操作。例如:[MySQL](http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html),[SQL Server](http://msdn.microsoft.com/en-us/ library/bb933876%28v = sql.105%29.aspx),[PostgreSQL](http://postgis.refractions.net/)。 –

回答

5

我觉得我已经从谷歌的例子改变成“采用的yooper历险记”中提供的公式来解决这个问题。使用他/她的版本Haversine Formula
注:上面的谷歌的例子是使用半正弦波为好。

SQL:

SELECT `companies`.`customerName` , 
(2 * (3959 * ATAN2(
      SQRT(
      POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat`))/2), 2) + 
      COS(RADIANS(`locations`.`gps_lat`)) * 
      COS(RADIANS(37.367485)) * 
      POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng`))/2), 2) 
     ), 
      SQRT(1-(
      POWER(SIN((RADIANS(37.367485 - `locations`.`gps_lat`))/2), 2) + 
      COS(RADIANS(`locations`.`gps_lat`)) * 
      COS(RADIANS(37.367485)) * 
      POWER(SIN((RADIANS(-77.399994 - `locations`.`gps_lng`))/2), 2) 
     )) 
     ) 
    )) 
AS 'distance' 
FROM `locations` 
JOIN `companies` ON `locations`.`co_id` 
HAVING distance < 25 
ORDER BY distance 
LIMIT 0 , 10 



对于那些好奇我的申请,最终PHP:

获得价值:?lat=37.367485&lng=-77.399994

$earth_radius_miles = 3959; // Earth radius in miles 
$earth_radius_kilometers = 6371; // Earth radius in kilometers 
$result_radius = 10000; // Maximum distance in either miles or kilometers 

$get_lat = $_GET["lat"]; 
$get_lng = $_GET["lng"]; 

$dbSelect = mysql_query("SELECT `companies`.`customerName`, 
(2 * (".$earth_radius_miles." * ATAN2(
      SQRT(
      POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat`))/2), 2) + 
      COS(RADIANS(`locations`.`gps_lat`)) * 
      COS(RADIANS(".$get_lat.")) * 
      POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng`))/2), 2) 
     ), 
      SQRT(1-(
      POWER(SIN((RADIANS(".$get_lat." - `locations`.`gps_lat`))/2), 2) + 
      COS(RADIANS(`locations`.`gps_lat`)) * 
      COS(RADIANS(".$get_lat.")) * 
      POWER(SIN((RADIANS(".$get_lng." - `locations`.`gps_lng`))/2), 2) 
     )) 
     ) 
    )) 
AS 'distance' 
FROM `locations` 
JOIN `companies` ON `locations`.`co_id` 
HAVING distance < ".$result_radius." 
ORDER BY distance 
LIMIT 0 , 10") 
or die(mysql_error()); 

结果:

[{"customerName":"SOME COMPANY","distance":"0"}] 

我已经测试了这些结果与其他坐标,似乎是完美的工作。没有测试过两点之间的距离,但我的应用程序并不要求我这样做。

+1

无法验证,但用于演示文稿的值为+1 – Smandoli

1

阿肖克,你可以用下面的公式计算两个cordinates之间的距离:

enter image description here

其中

R = radius of the earth (6,371 km) 
Δlat = |lat2- lat1| 
Δlong = |long2- long1| 
相关问题