2013-10-08 87 views
-1

我有一個充滿緯度/經度的地方的MySQL表。另一方面,我有一個客戶端的javascript/html5頁面,它將座標發送到服務器。根據空間座標獲取最近的位置

使用客戶端的座標,我希望能夠找到最近的位置。實現這一目標的最簡單方法是什麼?

類似SELECT * FROM places AS p WHERE p.latitude NEAR '49.8330001' AND p.longitude NEAR '-119.45600';會很好。

我在這裏遇到了幾個問題,但他們沒有給我一個正確的答案。我閱讀了關於MySQL的空間擴展和其他一些SQL查詢可能會實現的技巧,但沒有一件看起來真的很「直截了當」,所以我認爲可以通過一些更具標準化的方式來做到這一點,我可以查看一些例子。

任何人都有這些經驗?

+0

如何準確應該「近」是產生的?準系統最簡單的方法是從數據庫位置中減去當前位置並按照最小的差異進行排序,例如, 'select abs(latitude - $ lat)AS lat,abs(longitude - $ lon)AS $ log ...按照lat desc,lon desc'類型的順序排列。沒有涉及花哨的數學,只是一些減法。 –

回答

1

以下PHP代碼使用MySQL和PDO查找距離您最近的地點座標。

它創建了一個JSON座標數組。

// Prepare statements 
$stmt = $dbh->prepare("SELECT name, lat, lng, 
      (3959 * acos(cos(radians(?)) * cos(radians(lat)) 
      * cos(radians(lng) - radians(?)) + sin(radians(?)) 
      * sin(radians(lat)))) AS distance FROM table HAVING distance < ? 
      ORDER BY distance ASC LIMIT 0 , 20"); 
// Assign parameters 
$stmt->bindParam(1,$center_lat); 
$stmt->bindParam(2,$center_lng); 
$stmt->bindParam(3,$center_lat); 
$stmt->bindParam(4,$radius); 
//Execute query 
$stmt->setFetchMode(PDO::FETCH_ASSOC); 
$stmt->execute(); 
$rows = array(); 
while($row = $stmt->fetch()) { 
$rows[] = $row; 
} 
echo json_encode($rows); 
exit; 

Maps標記使用此查詢

-1

爲什麼不計算數據庫中數據庫中的點與每個座標之間的距離?然後,你在這個數組中選擇min。

-1

你爲什麼不乾脆創建一個容忍像5%的座標,然後做一個

$latplus5percent = $lat + .5*$lat; 
$latminus5percent = $lat - .5*$lat; 
WHERE p.latitude BETWEEN $latplus5percent AND $latminus5percent 

[編輯:格式]

0

可以使用quadkey。這是一個基於空間填充曲線的空間索引。你可以下載我的php類hilbert曲線@ phpclasses.org。