2010-07-08 52 views
0

我試圖存儲GPS位置的數據庫,並運行查詢,查找給定半徑內的點以及最近的點。我正在使用mysql並一直在尋找空間擴展。我不確定我是否看到如何實際使用空間擴展來執行我在位置半徑查詢中查找的內容。位置的數據庫程序

因此,這裏是林想爲我的選擇:

  1. 存儲lat和長GPS座標如同db浮動索引變量。當我得到一個點GPS座標和一個範圍,計算最大和最小經緯度和長值來查詢,然後根據這些順序中的距離函數進行排序。

  2. 使用空間擴展。我不太肯定這會起作用。 Distance()函數未實現。使用空間索引需要找到一個邊界框(可行)並調用MBRContains邊界框函數來查找位於該邊界框中的點。但是一個點的邊界爲零,所以MBRContains函數不適用於點。

我不知道是什麼標準的方式來做到這一點(它doesnt看起來像有一個),將不勝感激與決策經驗/想法/幫助任何話。我目前正在使用MySQL 5.13,而且我很確定即使是5.5也沒有距離度量標準。

此外 - 即使2.工作,哪一個會更快?請讓我知道你的想法是什麼,特別是如果你確定/看到了一些快速和大型查找工作!

Mysql的空間索引:http://dev.mysql.com/doc/refman/5.5/en/using-a-spatial-index.html

+0

你不需要經緯度/長搜索的空間,只需要一些基本的三角。 http://code.google.com/intl/zh-CN/apis/maps/articles/phpsqlsearch.html對於解決這個問題非常有幫助。 – tadamson 2010-07-08 02:53:55

+0

這是否會快到足以處理幾百萬? – 2010-07-08 03:35:39

+0

您可以用WHERE MyLon過濾掉大部分點BBoxLonMax和MyLon> BBoxLonMin和MyLat BBoxLatMin 在您記錄極少數記錄後,查看獲取實際距離。 – geographika 2010-07-08 21:38:49

回答

1

像這樣的東西應該工作得到協調和任意點,在這個例子之間的距離「原點」。

SELECT 
place.name, 
place.foo, 
ROUND(SQRT(
    POW((69.1 * ({$origin->lat} - place.lat)), 2) 
+ POW((53.0 * ({$origin->lon} - place.lon)), 2) 
), 1) AS distance 
FROM place 
ORDER BY distance ASC 

希望幫助...

0

如何併攏的GPS座標?如果它們相對接近以至於地球的曲率不成問題,那麼您可以首先嚐試使用線性距離來查詢自己的表現。但是,這確實需要全表掃描,並且如果點沒有充分聚集,可能無法產生準確的結果。在這一點上,你需要移動到邊界框+很大的弧距計算。

+0

的位置將在100英尺 - 10英里 – 2010-07-08 03:36:11