2012-06-26 171 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| 
相關問題