2012-12-19 21 views
2

基本上,我發送GET請求到php文件,用戶lat和long值(分別爲$userLat, $userLong)。
在我的數據庫,我有一個表 '位置' 具有以下欄目:如何根據用戶座標和半徑從表中檢索數據

  • LOCATION_NAME
  • 緯度
  • LNG
  • 半徑(以米爲單位)

所以,我想查詢哪裏我比較用戶的座標和所有位置座標,並查看位置和用戶之間的距離是否爲< =該loc的半徑通貨膨脹。如果是,請返回該位置的名稱。


查詢會是這樣的(僞代碼):

SELECT LOCATION_NAME FROM位置WHERE distanceBetween(($ userLat,$ userLong)AND(緯度,經度))< =半徑

+2

在http://de.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL很好的描述 –

+0

http://stackoverflow.com/questions/1896213/determine-if-一個座標是在另一半徑 –

回答

2

我使用與@ socca1157回答相同的查詢,但我認爲我可以在查詢開始時提供一個常量3959的小解釋。

我的例子也得到用戶的地址的緯度和經度

$address = urlencode($_GET['user-address']); 

$earth_radius = 3959; 
$search_radius = 100; 

$ch = curl_init('https://maps.google.com/maps/api/geocode/json?address='.$address.'&sensor=false'); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
$geocode = curl_exec($ch); 
curl_close($ch); 

$output = json_decode($geocode); 

$lat = $output->results[0]->geometry->location->lat; 
$lng = $output->results[0]->geometry->location->lng; 


$sql = "SELECT *, ($earth_radius * acos(cos(radians($lat)) * cos(radians(latitude)) * cos(radians(longitude) - radians($lng)) + sin(radians($lat)) * sin(radians(latitude)))) AS distance FROM table WHERE isActive = 1 HAVING distance < $search_radius ORDER BY distance LIMIT 5"; 
$result = mysql_query($sql); 

因此,舉例來說,如果你想在公里而非英里進行搜索,你會使用公里的地球半徑,這是6,371公里。

+0

非常感謝你!就我測試它而言,它是完美的。謝謝 –

+0

沒問題,很高興工作! – martincarlin87

2

你要找的查詢是:

SELECT id, (3959 * acos(cos(radians(37)) * cos(radians(lat)) * cos(radians(lng) - radians(-122)) + sin(radians(37)) * sin(radians(lat)))) AS distance FROM markers HAVING distance < 25 ORDER BY distance LIMIT 0 , 20;

這摘自Google Map's article