2014-01-05 58 views
1

我正在android GoogleMap項目中工作。我有用戶的位置(經度和緯度)Geo。我想在用戶的5公里範圍內計算該地區的座標,以便我可以過濾用戶周圍的數據庫中的地點。有什麼建議麼?計算指定區域的緯度範圍

回答

2

緯度和經度都是度數,所以您需要使用簡單的平坦地球投影。 重要提示:下列公式中的所有緯度/經度值應以弧度表示,而不是度數!因爲你的半徑是5公里,所以使用平坦的地球是足夠的。地平投影是:

var R = 6371; // km 
var x = (lon2-lon1) * Math.cos((lat1+lat2)/2); 
var y = (lat2-lat1); 
var d = Math.sqrt(x*x + y*y) * R; 

現在LAT1/lon1是基準位置,在你的情況下,用戶的位置。 Lat2/lon2將成爲您測試的重點。變量'd'是距離。由於'R'以公里爲單位,因此'd'將以公里爲單位。

如果'd'小於5(即小於5km),則該點在圓內。

參考:http://www.movable-type.co.uk/scripts/latlong.html

-1

可以得到點(在座標)與圓周的:

(X - x_o)^ 2 +(Y - y_o)^ 2 = R^2

在哪裏x_0和y_0是用戶的座標,r是你想考慮的半徑,你的點是x和y。

因爲你要比較圓的座標位置的座標,你可以把X和Y的地點座標,看看這些解決disequation:

(X - x_o )^ 2 +(Y - y_o)^ 2 < = r^2

+0

這是行不通的。經度和緯度以度爲單位,半徑以公里爲單位。 – TreyA

+0

在Google地圖中,座標以雙重格式顯示,如笛卡爾圖形。 R不是公里,只是表示圓的半徑的數字,取決於X和Y的值。 – FdT

+0

座標可能是雙格式,但經度和緯度均以度爲單位。如何將5公里轉換成度? – TreyA

0

第一個答案(TreyA)似乎顯示你的半正矢功能的精簡版。下面是我給予實現Haversine函數的人的JS代碼,並將十進制值轉換爲弧度。

// Convert Degress to Radians 
function Deg2Rad(deg) { 
    return deg * Math.PI/180; 
} 

// Get Distance between two lat/lng points using the Haversine function 
// First published by Roger Sinnott in Sky & Telescope magazine in 1984 (「Virtues of the Haversine」) 
// 
function Haversine(lat1,lon1,lat2,lon2) 
{ 
    var R = 6372.8; // Earth Radius in Kilometers 

    var dLat = Deg2Rad(lat2-lat1); 
    var dLon = Deg2Rad(lon2-lon1); 
    var a = Math.sin(dLat/2) * Math.sin(dLat/2) + 
        Math.cos(Deg2Rad(lat1)) * Math.cos(Deg2Rad(lat2)) * 
        Math.sin(dLon/2) * Math.sin(dLon/2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c; 

    // Return Distance in Kilometers 
    return d; 
} 

下面是對文件的直接下載鏈接: http://www.opengeocode.org/download/haversine/haversine.js

+0

Haversine在5公里範圍內過度殺傷。扁平的地球對於這個問題是一個足夠的近似值。 – TreyA

+0

TreyA顯示的公式是畢達哥拉斯距離。這是一個近似(與Haversine),假設地球沒有彎曲。計算中的誤差率與經度不同。它在赤道上的誤差最小,在北極的誤差最大。 –

+0

我不認爲安德魯的評論是正確的。平面地球方程的精度不受地球位置的影響,而是受參考點距離的影響。您選擇的參考距離越遠,計算準確度就越低。再次,在5公里的距離上,地球曲率在距離計算中並不顯着。 – TreyA