1

我試圖合併兩個數據庫來合併兩個客戶的網站。然而,客戶端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); 
    } 
    

回答

2

我是作者或者您在您的文章提到的頁面。 我不知道你是否已經解決了你的問題,但你提供的Lambert座標不正確。我認爲你必須將它們除以1000.這給出了x = 151488.250和y = 170492.909,它們是可能的座標,並對應於布魯塞爾的一條街道。 在轉換爲lat/lng值和從lat/lng值轉換時要小心選擇基準面。

+0

顯然轉換不是項目的一部分,所以我們跳過它,但很高興知道它爲什麼不工作,謝謝! – Flater