2013-07-01 381 views
2

我想將gps座標(經度,緯度)轉換爲ENU(est,north,up)座標。將GPS座標轉換爲ENU座標的功能?

我知道這個問題的理論,但我沒有時間去實現它,所以我問是否存在java代碼來做到這一點!

感謝

+0

ENU座標,需要一個參考點。你有什麼? –

+1

爲什麼這麼多downvotes?這不是一個壞問題... – Kamil

+0

維基百科顯示了一個算法:http://en.wikipedia.org/wiki/East_north_up#ECEF_to.2Ffrom_ENU_coordinates –

回答

3

this出版物有很多關於主題的信息。另外還有一個Matlab代碼 - 這是一個很好的開始。

相關的部分(從「轉換GPS座標(Φλh)到導航座標(ENU)由SP德雷克):

enter image description here

0

你會發現在維基

From ECEF To ENU

公式

在缺少公式編輯器的情況下,答案不能發佈在這裏。

+0

我已經在其他地方說過了,我會在這裏說:雖然這可能在理論上回答這個問題,[這將是更可取的](http://meta.stackexchange.com/q/8259)包括基本部分的答案,並提供參考鏈接。堆棧溢出不歡迎鏈接回答。 –

+0

@JanDvorak這將是可取的,但缺乏公式編輯器,它是沒有意義的。只有鏈接的答案比沒有答案更好,隨時給自己的答案,沒有侵犯版權。 – AlexWien

+0

如何遷移到其他支持公式的網站?適當重新編制,這很適合[Math.se] –

-2

其他的解決辦法是:

public static double[] fatCoordinates(double lat,double lon){ 
    double phi = Math.toRadians(lat); 
    double lambda = Math.toRadians(lon); 
    double e2 = Math.pow(WGS_E,2); 
    double Rn = WGS_A/Math.sqrt(1 - e2 * Math.pow(Math.sin(phi), 2)); 
    double[] XYZ = new double[3]; 
    XYZ[0] = Rn * Math.cos(phi) * Math.cos(lambda); 
    XYZ[1] = Rn * Math.cos(phi) * Math.sin(lambda); 
    XYZ[2] = Rn * (1 - e2) * Math.sin(phi); 

    return XYZ; 


} 

public static final double WGS_A = 6378137.0; 


public static final double WGS_E = 0.0818191908426; 

它取自https://josm.openstreetmap.de/browser/josm/trunk/src/org/openstreetmap/josm/data/projection/Ellipsoid.java?rev=4382

+0

ENU的參考latitdue,經度在哪裏? – AlexWien

+0

如果你看到鏈接,你會看到參考經緯度不存在,因爲這不是真的ENU系統,但它是一個簡化。然而,這種方法允許你考慮地球「平坦」。 – hooloovoo

+0

對於地球平面有很多解決方案,比ENU簡單得多,但是你要求ENU,而不是將lat,lon轉換成笛卡爾座標 – AlexWien

0

使用goGPS libraryCoordinates.java

/** 
* @param origin 
* @return Local (ENU) coordinates 
*/ 
public void computeLocal(Coordinates target) { 
    if(this.geod==null) computeGeodetic(); 

    SimpleMatrix R = rotationMatrix(this); 

    enu = R.mult(target.minusXYZ(this)); 

} 

參見TopocentricCoordinates.java

public void computeTopocentric(Coordinates origin, Coordinates target) { 

    origin.computeLocal(target); 

    double E = origin.getE();//enu.get(0); 
    double N = origin.getN();//enu.get(1); 
    double U = origin.getU();//enu.get(2);