我試圖合併兩個數據庫來合併兩個客戶的網站。然而,客戶端A一直使用常規的緯度/經度對進行地理定位,而客戶端B正在使用蘭伯特72(X/Y)座標。Lambert 72轉換爲Lat/Lon對
我已經構建了一個腳本,應該轉換這些座標(因爲我不知道哪個座標將在最終的合併數據庫中使用,我試圖轉換它們)。 我從這裏拿了一些片段:http://zoologie.umh.ac.be/tc/algorithms.aspx
請注意,下面提到的所有座標都指向比利時的地點。
我正在轉換一些座標來查看計算是否正確,但我得到的座標似乎沒有辦法。作爲參考,比利時的中心大致(北50.84323737103243,東4.355735778808594),所以我希望所有的座標接近這些值。
我將Lambert 72值(X:151488250,Y:170492909)轉換爲Lat/Lon對,但結果爲:(-87.538 ....,-50.724 ....)從預期值。 如果我轉換完整的圓圈(Lambert-> LatLon-> Lambert,反之亦然),我得到與我輸入相同的結果值,所以我知道我的轉換至少是一致的,並且轉換是相互完美的反轉。
我也嘗試了一些在線轉換工具,它們給我一樣的結果(-87.538 ....,-50.724 ....)。
由於多個來源產生相同的結果,並且我的轉換是對彼此正確的反轉,我認爲計算本身是正確的,但結果值仍需要進一步轉換/偏移?
我認爲自己在代數學方面已經足夠了,但製圖預測完全沒有考慮到我。
有人可以請說一說嗎?
額外的資訊
- 我希望我張貼這在正確的論壇。由於這是一個混合的地理,數學和編碼/轉換......我不確定該把這個放在哪裏......
- 提到的蘭伯特座標(X:151488250,Y:170492909)指向布魯塞爾的一個位置,所以Lat/Lon結果應該是非常接近(北50.84323737103243,東4.355735778808594)。
請找我的轉換函數如下:
public static Lambert72 LatLon_To_Lambert72(LatLon latlon) { var lat = latlon.Lat; var lng = latlon.Lon; double LongRef = 0.076042943; //=4°21'24"983 double bLamb = 6378388 * (1 - (1/297)); double aCarre = Math.Pow(6378388, 2); double eCarre = (aCarre - Math.Pow(bLamb, 2))/aCarre; double KLamb = 11565915.812935; double nLamb = 0.7716421928; double eLamb = Math.Sqrt(eCarre); double eSur2 = eLamb/2; //conversion to radians lat = (Math.PI/180) * lat; lng = (Math.PI/180) * lng; double eSinLatitude = eLamb * Math.Sin(lat); double TanZDemi = (Math.Tan((Math.PI/4) - (lat/2))) * (Math.Pow(((1 + (eSinLatitude))/(1 - (eSinLatitude))), (eSur2))); double RLamb = KLamb * (Math.Pow((TanZDemi), nLamb)); double Teta = nLamb * (lng - LongRef); double x = 0; double y = 0; x = 150000 + 0.01256 + RLamb * Math.Sin(Teta - 0.000142043); y = 5400000 + 88.4378 - RLamb * Math.Cos(Teta - 0.000142043); return new Lambert72(x, y); } public static LatLon Lambert72_To_LatLon(Lambert72 lb72) { double X = lb72.X; double Y = lb72.Y; double LongRef = 0.076042943; //=4°21'24"983 double nLamb = 0.7716421928; double aCarre = Math.Pow(6378388, 2); double bLamb = 6378388 * (1 - (1/297)); double eCarre = (aCarre - Math.Pow(bLamb, 2))/aCarre; double KLamb = 11565915.812935; double eLamb = Math.Sqrt(eCarre); double eSur2 = eLamb/2; double Tan1 = (X - 150000.01256)/(5400088.4378 - Y); double Lambda = LongRef + (1/nLamb) * (0.000142043 + Math.Atan(Tan1)); double RLamb = Math.Sqrt(Math.Pow((X - 150000.01256), 2) + Math.Pow((5400088.4378 - Y), 2)); double TanZDemi = Math.Pow((RLamb/KLamb), (1/nLamb)); double Lati1 = 2 * Math.Atan(TanZDemi); double eSin = 0; double Mult1 = 0; double Mult2 = 0; double Mult = 0; double LatiN = 0; double Diff = 0; double lat = 0; double lng = 0; do { eSin = eLamb * Math.Sin(Lati1); Mult1 = 1 - eSin; Mult2 = 1 + eSin; Mult = Math.Pow((Mult1/Mult2), (eLamb/2)); LatiN = (Math.PI/2) - (2 * (Math.Atan(TanZDemi * Mult))); Diff = LatiN - Lati1; Lati1 = LatiN; } while (Math.Abs(Diff) > 2.77777E-08); lat = (LatiN * 180)/Math.PI; lng = (Lambda * 180)/Math.PI; return new LatLon(lat, lng); }
顯然轉換不是項目的一部分,所以我們跳過它,但很高興知道它爲什麼不工作,謝謝! – Flater