地理空间坐标系统-城市坐标系与国家统一坐标系之间的转换(含四参数转换代码)
先梳理一下兩個概念:“國家統一坐標系“和”城市坐標系“
國家統一坐標系:此處可以認為是基于國家規定的大地橢球構建的球面坐標系(經緯度),經過高斯投影后形成的平面坐標系,各城市分屬國家統一坐標系的不同分帶坐標系中,此坐標是平面坐標,單位是長度單位,米或千米等
城市坐標系:在市政測繪中,工程制圖和施工放樣使用的都是大比例尺測繪數據,一般要求投影長度變形不大于2.5cm/km,國家統一坐標系很難滿足需求,為此各地都建立了當地高精度的城市坐標系。此坐標是平面坐標,單位是長度單位,米或千米等。目前城市坐標系主要有以下兩種。(1)與國家坐標系統一致的城市坐標系統(2)地方獨立坐標系統。?
針對上述兩種城市坐標系,第一種由于和國家統一坐標系一致,測繪成果可以直接納入國家統一坐標系。第二種獨立于國家統一坐標系,要將此坐標系下的測繪成果納入國家統一坐標系,就需要進行坐標轉換。所以我們重點討論的是城市坐標系中的第二種類型與國家統一坐標系之間的轉換。屬于兩個平面坐標系之間的轉換。
二維平面直角坐標之間的轉換
兩個二維平面直角坐標系的轉換通常使用的是四參數模型,四參數適合小范圍測區(5KM范圍)的坐標轉換。四參數轉換模型公式如下:
在該模型中有四個未知參數,
(1)兩個坐標平移量(△X,△Y),即兩個平面坐標系的坐標原點之間的坐標差值。
(2)平面坐標軸的旋轉角度,通過旋轉一個角度,可以使兩個坐標系的X和Y軸重合在一起。
(3)尺度因子K,即兩個坐標系內的同一段直線的長度比值,實現尺度的比例轉換。通常K值幾乎等于1。
四個參數:△X,△Y,,m
已四參數,進行二維平面直角坐標之間的轉換
按上述四參數轉換模型公式,構建對應矩陣進行運算。即可求得轉換后的目標坐標。相對比較簡單,代碼就不寫了。需要用到矩陣,矩陣類庫在《地理空間坐標系統-不同橢球基準間的坐標轉換-相關算法代碼實現C#》一節有分享。
未知四參數,通過兩個以上的坐標點對反算四參數
反算四參數,常規做法是將四參數轉換模型公式通過矩陣變換轉換為復合最小二乘求解的矩陣表達式。簡化過程如下(網上查找,高精度建議看相關論文):
此時的表達式符合B=AX的結構,可通過最小二乘公式進行求解:
未知四參數,通過兩個以上的坐標點對反算四參數,代碼實現C#
矩陣類庫在《地理空間坐標系統-不同橢球基準間的坐標轉換-相關算法代碼實現C#》
/// <summary>///兩個以上的坐標點對計算四參數/// </summary>/// <param name="originalCooords舊坐標"></param>/// <param name="targetCooords新坐標"></param>/// <param name="rota旋轉參數"></param>/// <param name="scale比例"></param>/// <param name="dx x的平移"></param>/// <param name="dy y的平移"></param>public static void CalFourParaByTwoPlaneRectangularCoords2(Point2d[] originalCooords, Point2d[] targetCooords,ref double rota, ref double scale,ref double dx, ref double dy) {int pointCount = originalCooords.Length;if (pointCount < 2){//坐標點數小于三。return;}if (targetCooords.Length < pointCount){//新舊坐標個數不匹配return;}double[,] pA = new double[pointCount * 2, 4];double[,] pB = new double[pointCount * 2, 1];for (int i = 0; i < pointCount * 2; i++){if (i % 2 == 0){pA[i, 0] = 1;pA[i, 1] = 0;pA[i, 2] = originalCooords[i / 2].X;pA[i, 3] = -originalCooords[i / 2].Y;}else if (i % 2 == 1){pA[i, 0] = 0;pA[i, 1] = 1;pA[i, 2] = originalCooords[i / 2].Y;pA[i, 3] = originalCooords[i / 2].X;}}///初始化B矩陣第一步for (int i = 0; i < pointCount * 2; i++){if (i % 2 == 0){pB[i, 0] = targetCooords[i / 2].X - originalCooords[i / 2].X;}else if (i % 2 == 1){pB[i, 0] = targetCooords[i / 2].Y - originalCooords[i / 2].Y;}}GMatrix A = new GMatrix(pA);GMatrix AT = A.Transpose();GMatrix W = AT * A;GMatrix W1 = W.Inverse();GMatrix B = new GMatrix(pB);GMatrix reslut = W1 * AT * B;double X_offset, Y_offset, a1, a2;X_offset = reslut[0, 0]; //x0Y_offset = reslut[1, 0]; //y0a1 = reslut[2, 0];a2 = reslut[3, 0];dx = X_offset; //x0dy = Y_offset; //y0rota = Math.Atan(a2 / (a1 + 1));scale = (a1 + 1) / Math.Cos(rota);}?
?
?
?
總結
以上是生活随笔為你收集整理的地理空间坐标系统-城市坐标系与国家统一坐标系之间的转换(含四参数转换代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java接口废弃注释_Java注释Ove
- 下一篇: 王道操作系统考研笔记——2.3.3 进程