2010-06-11 41 views
7

我需要映射GPS定位的功能,這樣的x/y值:變換經緯度爲米

getXYpos(GeoPoint relativeNullPoint, GeoPoint p){ 
    deltaLatitude=p.latitude-relativeNullPoint.latitude; 
    deltaLongitude=p.longitude-relativeNullPoint.longitude; 
    ... 
    resultX=latitude (or west to east) distance in meters from p to relativeNullPoint 
    resultY=longitude (or south to north) distance in meters from p to relativeNullPoint 
} 

我已經看到了「兩個geoPoints的距離」一些實現,但他們都只是計算空氣在線距離。 我認爲deltaLongitude可以直接轉換爲米,但deltaLatitude取決於經度。有誰知道如何解決這個問題?

回答

13

首先,我覺得你有你的latitudelongitude逆轉。經度測量X,緯度測量Y.

緯度很容易變成南北距離。我們知道360度是圍繞地球的一個完整的圓圈,並且是that distance is 40008000 meters。只要你不需要考慮由於地球不是完全球形的誤差,公式就是deltaLatitude * 40008000/360

如您懷疑的那樣,棘手的部分是將經度轉換爲X.由於它取決於緯度,因此您需要決定要使用的緯度 - 您可以選擇原點的緯度,目的地的緯度或其中任意點。赤道周圍(緯度0)爲40075160米。給定緯度的圓的圓周將與餘弦成正比,因此公式將爲deltaLongitude * 40075160 * cos(latitude)/360

編輯:您的評論表明你有一些經度公式的麻煩;您可能在撥打cos時使用了度數而不是弧度,這是一個常見的菜鳥錯誤。爲了確保沒有歧義,這裏使用Python編寫代碼。

def asRadians(degrees): 
    return degrees * pi/180 

def getXYpos(relativeNullPoint, p): 
    """ Calculates X and Y distances in meters. 
    """ 
    deltaLatitude = p.latitude - relativeNullPoint.latitude 
    deltaLongitude = p.longitude - relativeNullPoint.longitude 
    latitudeCircumference = 40075160 * cos(asRadians(relativeNullPoint.latitude)) 
    resultX = deltaLongitude * latitudeCircumference/360 
    resultY = deltaLatitude * 40008000/360 
    return resultX, resultY 

我選擇使用relativeNullPoint緯度進行X計算。這樣做的好處是,如果您使用相同的經度轉換多個點,則它們將具有相同的X;南北線將是垂直的。

再次編輯:我應該指出這是一個非常簡單的公式,你應該知道它的侷限性。顯然,地球並不平坦,因此任何將其映射到XY座標的嘗試都會涉及一些妥協。當您轉換的面積足夠小以考慮平面時,以及上述南北線的輕微曲率和非平行性可以忽略的情況下,上述公式I最適合。有一個完整的科學來繪製投影圖;如果你想看到一些可能性,一個好地方開始將是Wikipedia。這個具體的投影被稱爲the Equirectangular projection,並增加了一些縮放比例。

+0

好的我試過了,緯度的計算非常精確:)但經緯儀的測量值始終是測試緯度的1.3倍。我認爲將這個因子除以這個因子不是一個好主意,因爲它可能會因不同的緯度而有所不同,也許地球繞行必須相對於當前的緯度進行計算? – 2010-06-12 10:31:18

+0

@Sponge,檢查更新。 – 2010-06-12 19:48:52

+0

非常感謝!偉大的工作:) – 2010-06-13 11:02:16

1

上有jstott.me.uk爲PHPJavaJavascript其做到這一點,例如圖書館

var lld1 = new LatLng(40.718119, -73.995667); // New York 
document.write("New York Lat/Long: " + lld1.toString() + "<br />"); 
var lld2 = new LatLng(51.499981, -0.125313); // London 
document.write("London Lat/Long: " + lld2.toString() + "<br />"); 
var d = lld1.distance(lld2); 
document.write("Surface Distance between New York and London: " + d + "km");