高斯投影坐标换带——纯“手算”,你信吗?

我是不信,哈哈哈

前言

本文只涉及到6°带到6°带的转换

正文

换带的原因

高斯投影等角,但有长度变形,离中央子午线越远,变形越大,为限制其长度变形,将椭球面按照一定的精度划分成不同的投影带,把投影范围限制在中央子午线东西两侧一定范围内。由于中央子午线经度不同,使得椭球面上统一的大地坐标系被分成独立的平面坐标,为了得到统一性的坐标,因此必须进行换算。(从这里扒的:原文.)

基于Matlab的实现

就仅仅为了写个题目,交作业,大佬跳过。为了体现我的认(B)真(格)学(之)习(高)和我勤(懒)奋(惰)的精神,于是有了以下代码(建议用matlab的实时脚本打开运行):

%% 定义椭球参数
a = 6378137; b = 6352752.31414; e = 0.0818191910428; 


%mi
m0 = a*(1-e*e);
m2 = 1.5*e*e*m0;
m4 = 1.25*e*e*m2;
m6 = 7/6*e*e*m4;
m8 = 9/8*e*e*m6;
%ai
a0 = m0+m2/2+3*m4/8+5*m6/16+35*m8/128;
a2 = m2/2+m4/2+15*m6/32+7/16*m8;
a4 = m4/8+3*m6/16+7*m8/32;
a6 = m6/32+m8/16;
a8 = m8/128;

% 点的坐标,把y给改过来,这里手动改
x = 2463578.879;  y = -264403.472;

%计算bf
bf1 = x/a0
bf2 = (x-(-a2/2*sin(2*bf1)+a4/4*sin(4*bf1)-a6/6*sin(6*bf1)+a8*sin(b*bf1)))/a0
t = 1
while t>0.000001
    bf1 = bf2;
    bf2 = (x-(-a2/2*sin(2*bf1)+a4/4*sin(4*bf1)-a6/6*sin(6*bf1)+a8*sin(b*bf1)))/a0
    t = abs(bf2-bf1)

end
mf = a*(1-e*e)/(sqrt(1-e*e*sin(bf2)*sin(bf2))^3) % mf
nf = a/(sqrt(1-e*e*sin(bf2)*sin(bf2))) % nf
tf = tan(bf2) % tf
nf2 = cos(bf2)*cos(bf2)*(a*a-b*b)/(b*b) % eta_平方

% 反算公式
B = bf2-tf/(2*mf*nf)*y^2+tf/(24*mf*nf^3)*(5+3*tf^2+nf2-9*nf2*tf^2)-tf/(720*mf*nf^5)*(61+90*tf^2+45*tf^4)*y^6
l = 1/(nf*cos(bf2))*y-1/(6*nf^3*cos(bf2))*(1+2*tf^2+nf2)*y^3+1/(120*nf^5*cos(bf2))*(5+28*tf^2+6*nf2+24*tf^2+8*tf^4*nf2)*y^5

dai_0 = 19  % 原来带号
dai_1 = 18 

 % 要投影到哪一个带上,这里也是根据自己的带号手动修改
n = a/sqrt(1-e*e*sin(B)^2)  % n
t = tan(B)  % t
n2 = cos(B)*cos(B)  % eta_平方

% 计算新的经度差
l = l+(dai_0-dai_1)/30*pi

% 正算公式
x_dai = x+n/2*sin(B)*cos(B)*l^2+n/24*sin(B)*cos(B)^3*(5-t+9*n2+4*n2^2)*l^4+n/720*sin(B)*cos(B)^5*(61-58*t^2+t^4)*l^6
y_dai = n*cos(B)*l+n/6*cos(B)^3*(1-t^2+n2)*l^3+n/120*cos(B)^5*(5-18*t^2+t^4+14*n2-58*t^2*n2)*l^5

% 别忘了转化成2000统一坐标系
sprintf("点投影到%d带后的坐标为:(%.3f, %d%.3f)",dai_1, x_dai, dai_1, y_dai+500000)
sprintf("嘤嘤嘤,终于写完了")


就这?
嗯,确实就这,完了。

总结

怎么硕呢?matlab确实在计算这一方面挺强的。另外,这个高斯投影的正算和反算属实算起来很费劲。不过,既然处于计算机这么发达的一个时代,让机器为我所用,何乐而不为呢?
如有错误,请各位批评指正,大伙一起进步,谢谢。

你可能感兴趣的:(高斯投影坐标换带——纯“手算”,你信吗?)