2012-06-05 98 views
4

我有一個存儲位置的基於django的web應用程序。在給定座標的一定範圍內查找項目

我有一個android移動應用程序,它從web應用程序中提取位置並將位置保存到web應用程序。位置返回給我,我加載在我的應用程序中的地圖疊加。

我想發送我當前的座標並返回一定範圍內的位置列表。例如,我發送我的位置並在2公里範圍內獲取項目。 (與Google Places API的工作方式類似,只是搜索我的數據)。

這可能是最好的發送位置座標,並在我的Python Django應用程序中執行所有這些邏輯,然後返回正確位置的列表,並只顯示我的地圖上的地方。

我不知道從哪裏開始做這件事。 如何根據給定座標集在特定半徑(km)內過濾掉我的存儲位置?

+0

發佈你的模型,需要了解你的表結構是怎樣的。 –

+1

1)選擇您當前位置附近的所有位置(例如,在相同的經緯度線內)。 2)使用每個選定座標的距離計算,並消除>期望範圍(2km)的距離。如果您忘記距離是'sqrt(dx ** 2 + dy ** 2)' –

回答

11

Haversine Equation是你的問題的答案。然而,它是有點難所以這裏解密我爲你提供一個簡單的解釋:

簡單地說:

這裏的樣品/ SQL語句的例子,將尋找最近的20個地點是半徑內的25英里到37,-122座標。它根據該行的緯度/經度和目標緯度/經度(由以下公式中的lat/lng給出)計算距離,然後僅請求距離值小於25的行,命令整個查詢按距離計算,並將其限制爲20個結果。要以公里而不是英里搜索,請用6371替換3959.

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; 

您可以將sql轉換爲您想要的任何內容。我的意思是這個原則是一樣的。

+1

謝謝。 (SELECT(6371 * acos(cos(弧度(45))* cos(弧度(緯度))* cos(弧度(經度) - 弧度(10))+ sin(弧度( 45))* sin(弧度(緯度))))AS距離spots_spot)sub GROUP BY子距離 HAVING sub.distance <2',這裏是一個python類[Haversine](http://www.platoscave達網絡/博客/ 2009 /辛/ 5 /計算距離緯度 - 經度-蟒/) – darren

1

最簡單的方法是計算到每個位置的距離並選擇一定距離內的點。如果您希望更快地進行搜索,則可以使用更復雜的數據結構來組織您的位置(例如kd-tree)。

1

GeoDjango集成了Postgres的優秀PostGIS附加功能,爲您免費提供所有這些距離查詢。

如果您將LatLong存儲在以Postgres類型存儲的模型中,則可以運行一個簡單的ORM查詢來獲取距當前LatLong一定距離內的所有位置。

GeoDjango功能非常強大,有很多選項,如果您只需要從列表中找到位於給定距離內的位置,則可以使用簡單的數學運算:distance = sqrt(dx^2 + dy^2)

0

我目前在android應用程序上使用這個功能,我碰到過這個,希望對你有幫助。 我起初是要過濾出服務器的JSON結果,然後我意識到這一點,並意識到Mysql比我最初看到的要複雜得多。

https://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

註釋上面不是爲我工作,但他們都在金錢與半正矢公式去。它在服務器端完成大部分工作要高效得多,因此手機不會因信息而無法用於任何事情。這就像烘烤一個完整的10英寸蛋糕,只切出一個八分之一的剩餘部分,爲什麼不烤一個半徑爲2英寸的小蛋糕?可能看起來它不像是一個很大的不同,但像任何一個好的程序一樣,只有在你需要的時候才能得到你需要的東西。

使用實時工作版本對您自己的代碼運行小測試,請使用以下鏈接。 http://sqlfiddle.com/#!2/abba1/2

希望本貼幫助。