高斯投影(高斯-克呂格投影)的反算
更新2020-06,將座標系統統一換爲WGS-84座標系,整理一下腳本函數
高斯投影的反算是指由當地的局部座標系(x,y)轉換爲當地的地理座標系(B: 緯度, L: 經度)。由於之前的博文MATLAB實現高斯-克呂格投影正算已經對高斯投影進行過簡要的說明,故本博文不再對高斯-克呂格投影的原理進行介紹,只給出高斯投影反算的算法流程和實現的MATLAB腳本。本博文參考文獻資料如下:
[1] 孔祥元, 郭際明, 劉宗泉, 等. 大地測量學基礎(第二版)[M]. 武漢: 武漢大學出版社, 2009.
[2] 程鵬飛,成英燕,文漢江,等.2000國家大地座標系實用寶典[M]. 北京:測繪出版社, 2008.
[3] 牛麗娟. 測量座標轉換模型研究與轉換系統實現[D]. 長安大學, 2010.
[4] 李厚朴,邊少鋒.高斯投影的複變函數表示[J].測繪學報,2008(01):5-9
高斯投影反算公式
當地緯度的計算公式如下:
當時的緯度稱爲底點緯度,底點緯度的迭代計算公式爲:
其中,
迭代計算過程爲:
迭代初始: 令
迭代過程: 令; 令
迭代停止: 當時則停止迭代.
注:爲給定的閾值,閾值通常小於1E-8.
當地經度的計算公式如下:
上述式中:
- 爲北方向的座標,
- 爲東方向的座標(中國地區內需減去500000m),
- 爲弧度秒,
- 爲地球橢球長半徑,
- 爲地球橢球第一偏心率,
- 爲地球橢球第二偏心率,
- 爲底點緯度處地球的卯酉圈曲率半徑,
- 爲底點緯度處地球的子午圈曲率半徑,
- ,
- 。
高斯投影反算的MATLAB函數
function Coord = GaussProInverse(Pos)
% INPUT // Units of longitude and latitude is RAD (°)
% REF[1]// 程鵬飛,等.2000國家大地座標系實用寶典[M].北京:測繪出版社,2008.
% REF[2]// 孔祥元,郭際明.大地測量學基礎(第二版)[M].武漢:武漢大學出版社,2010.
% Longitude of the Earth central meridian
MerLon = 114; % Wuhan is 114 deg
% Extract the local projected coordinate (x & y)
Coord = Pos;
Eth.D2R = 0.0174532925199433; % pi/180
x = Pos(1);
y = Pos(2) - 500000;
%% Earth orientation parameters of WGS 84 Coordinate System
Eth.R0 = 6378137.0;
Eth.f = 1/298.257223563;
Eth.Rp = 6356752.3142452; % R0*(1 - f);
% First Eccentricity and its Squared
Eth.e12 = 0.006694379990141; % (2f - f*f);
Eth.e11 = 0.081819190842622; % sqrt(2f - f*f);
% Second Eccentricity and its Squared
Eth.e22 = 0.00673949674227643; % (2f - f*f)/(1 + f*f - 2*f);
Eth.e21 = 0.08209443794969570; % sqrt((2f - f*f)/(1 + f*f - 2*f));
Bf = Meridian2Latitude(x, Eth.R0, Eth.e12);
tnBf = tan(Bf); tn2Bf = tnBf*tnBf; tn4Bf = tn2Bf*tn2Bf;
csBf = cos(Bf); cs2Bf = csBf*csBf; Eta2 = Eth.e22*cs2Bf;
COE = sqrt(1 - Eth.e12*sin(Bf)*sin(Bf));
Nf = Eth.R0/COE;
Mf = Eth.R0*(1 - Eth.e12)/COE^3;
%% Calculate Latitude(B)
YNf = y/Nf;
YNf2 = YNf*YNf;
YNf4 = YNf2*YNf2;
TYMN = 0.5*tnBf*y*YNf/Mf;
COE1 = (5 + 3*tn2Bf + Eta2 -9*Eta2*tn2Bf)*YNf2/12;
COE2 = (61 + 90*tn2Bf + 45*tn4Bf)*YNf4/360;
Lat = Bf - TYMN*(1 - COE1 + COE2);
%% Calculate Longitude(L)
YBNf = YNf/csBf;
COE3 = (1 + 2*tn2Bf + Eta2)*YNf2/6;
COE4 = (5 + 28*tn2Bf + 24*tn4Bf + 6*Eta2 + 8*Eta2*tn2Bf)*YNf4/120;
Lon = MerLon*Eth.D2R + YBNf*(1 - COE3 + COE4);
Coord(1) = Lat/Eth.D2R;
Coord(2) = Lon/Eth.D2R;
end
function Bf = Meridian2Latitude(x,a,e12)
m0 = a*(1 - e12); m2 = 3*e12*m0/2;
m4 = 5*e12*m2/4; m6 = 7*e12*m4/6;
m8 = 9*e12*m6/8; a8 = m8/128;
a6 = m6/32 + m8/16; a4 = m4/8 + 3*m6/16 + 7*m8/32;
a0 = m0 + m2/2 + 3*m4/8 + 5*m6/16 + 35*m8/128;
a2 = m2/2 + m4/2 + 15*m6/32 + 7*m8/16;
B0 = x/a0;
while 1
F = -a2*sin(2*B0)/2 + a4*sin(4*B0)/4 - a6*sin(6*B0)/6 + a8*sin(8*B0)/8;
Bf = (x - F)/a0;
if abs(B0 - Bf)<1e-10
break;
end
B0 = Bf;
end
end