2014-01-30 118 views
2

我正在開發一個位置跟蹤應用程序,我正試圖找出我的朋友在我當前位置1000 mtr範圍內的位置。做這個的最好方式是什麼?如何查找距某點X距離的經度和緯度?

我能想到的一種方法是計算我的位置和所有朋友的位置之間的距離,看它是否小於1000 mtr。但是這需要更多的時間去瀏覽數據庫中的每個條目並計算每個條目,其中大部分可能來自非常遠的地方。

我也在想別的東西。我想要在一個圓形區域內的位置。如果我能得到包圍圓的正方形的座標,我可以將我的結果集過濾爲只在該平方中的座標(在一定程度的經度和緯度之間),然後我可以計算出每個條目的距離。我該怎麼做呢? 如何獲得最大的經緯度?也將我的SQL查詢中就像分鐘<(each.location.degree)<最大

讓我知道是否有任何更好的選擇。我不擔心極端的準確性,但性能。我使用WP8,所以座標格式爲緯度:47.626,長度:-121.989

回答

2

是的,最好是從一個矩形開始。 最小/最大緯度和經度周圍的座標mylat,與距離Dist(單位:公里)mylon可以如下計算:

set lon1 = mylon-dist/abs(cos(radians(mylat)) * 111); 
set lon2 = mylon+dist/abs(cos(radians(mylat)) * 111); 
set lat1 = mylat-(dist/111); 
set lat2 = mylat+(dist/111); 

該矩形內的所有點的精確距離可由下式計算

6367 * 2 * ASIN(SQRT(POWER(SIN((origin.latitude -destination.latitude) * pi()/180/2), 2) + COS(origin.latitude * pi()/180) * COS(destination.latitude * pi()/180) * POWER(SIN((origin.longitude -destination.longitude) * pi()/180/2), 2))) as distance 
+1

你能分享一些資源,在那裏我能理解這個公式背後的邏輯是什麼? –

+1

http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/解釋了相當簡單的mysql邏輯。對於公式,請訪問http://en.wikipedia.org/wiki/Haversine_formula –

+0

僅供參考,對於多種語言,如果dist小於111並且是int,則必須將dist分爲111.0,而不是你的dist作爲float來確保輸出是浮動的,否則,dist/111可能會以0(int)形式出現。 – lmc

0

其實你的文章引發了幾個問題。

  1. 如何計算兩個GPS位置之間的距離。
  2. 如何在選擇基於二維數據(例如位置)時從數據庫高效地檢索數據選擇。

一個好的解決方案可能同時解決這兩個問題:一個空間數據庫。如果您有一個支持2-dim位置的數據庫(通常稱爲地理數據),那麼該數據庫將允許您查詢兩個位置之間的距離,並根據該位置提供選擇。我曾與ORACLE空間數據合作過,但現在大多數數據庫系統都應該支持空間數據。

有關替代(不太精確)方法的幾點提示: LAT/LON格式的GPS位置很難處理。如果你不想確定到世界另一端的其他位置的距離,但是在一個小半徑範圍內,你可以將位置轉換成一個簡單的二維格式(提示map projection)。 然後,您的數據庫可以存儲這些X/Y座標,並執行簡單的查詢,如「讓位於x/y位置的方塊中的所有位置」,就像您暗示的那樣。

我希望有幫助。

0

正如您已經猜到的那樣,您將獲得更多性能來計算您的位置周圍的矩形並檢測其內部的所有對象,而不是更復雜的半徑搜索。

看一看段落「目標點一定距離,並從起始點並註明」此頁上: http://www.movable-type.co.uk/scripts/latlong.html

相關問題