大地坐标转换极坐标(球坐标)

作业顺便记录一下,场面监视
1.两个函数一个是大地坐标转换球坐标Geodetic_to_spherical;一个是球坐标转换大地坐标spherical_to_Geodetic。
2.WGS84坐标系的参数:长半轴r=6378137,椭球扁率:f=1/298.257223563,短半轴b=r*(1-f),第一辅助系数W通过公式W=√(1-e²sin²B) B为纬度。椭圆曲率半径N=a/W
3.空间直角坐标原点和球坐标原点均取在地球球心
4.极坐标第三参量取角度,认为是球坐标

一.WGS84大地到球坐标

  • 大地转换空间直角坐标(坐标轴原点取地心)

大地坐标表示为:纬度B、经度L、海拔H
空间直角坐标表示方法:X、Y、Z
大地坐标转换极坐标(球坐标)_第1张图片

  • 空间按直角转球坐标

大地坐标转换极坐标(球坐标)_第2张图片

定义径向距离r,天顶角sita ,方位角fai
大地坐标转换极坐标(球坐标)_第3张图片

二.球坐标到大地坐标

大地坐标转换极坐标(球坐标)_第4张图片

大地坐标转换极坐标(球坐标)_第5张图片
Python代码

##1.两个函数一个是大地坐标转换球坐标Geodetic_to_spherical;一个是球坐标转换大地坐标spherical_to_Geodetic。
import math

#######################大地转换球坐标####################################
def Geodetic_to_spherical(latitude,longitude,altitude):
	B=math.radians(latitude);
	L=math.radians(longitude);
	H=altitude;
	f=1/298.257223563;
	r=6378137;
	b=r*(1-f);
	e=math.sqrt(2*f-f*f);
	N=r/math.sqrt(1-e*e*math.sin(B)*math.sin(B));
#大地坐标转空间直角坐标存放到data数组中
	data =[(N+H)*math.cos(B)*math.cos(L),(N+H)*math.cos(B)*math.sin(L),(N*(1-e*e)+H)*math.sin(B)];
#直角坐标住那换球坐标存放到data_spherical数组中
	data_spherical = [math.sqrt(data[0]*data[0]+data[1]*data[1]+data[2]*data[2]),\
				 math.atan(math.sqrt(data[0]*data[0]+data[1]*data[1])/data[2])*180/math.pi,\
				 math.atan(data[1]/data[0])*180/math.pi]; #空间直角坐标xyz转换成球坐标 r sita fai

	return data_spherical

##########################球转大地#########################################
def spherical_to_Geodetic(r,p,f):
	f=1/298.257223563;
	r=6378137;
	b=r*(1-f);
	e=math.sqrt(2*f-f*f);
	e2 = (1/(1-e))-1;
###得到空间直角坐标xyz存到数组data【0~2】中
	data = [r*math.sin(p)*math.cos(f),r*math.sin(p)*math.sin(f),r*math.cos(p)]
	ppp = math.atan(data[2]*r/(b*math.sqrt(data[0]*data[0]+data[1]*data[1])))
###存放大地坐标的数组data_Geodetic 【0~2】对应L B H
	data_Geodetic = [0,0,0]
#  大地坐标L=data_Geodetic[0]
	data_Geodetic[0] = math.atan(data[1]/data[0])
#  大地坐标B=data_Geodetic[1]
	data_Geodetic[1] = math.atan((data[2]+e2*e2*b*math.sin(ppp)*math.sin(ppp)*math.sin(ppp))/(math.sqrt(data[0]*data[0]+data[1]*data[1])-e*e*r*math.cos(ppp)*math.cos(ppp)*math.cos(ppp)))
	B=data_Geodetic[1]
	N = r / math.sqrt(1 - e * e * math.sin(B) * math.sin(B));
#  大地坐标H=data_Geodetic[2]
	data_Geodetic[2] = (math.sqrt(data[0]*data[0]+data[1]*data[1])/math.cos(B))-N

	return data_Geodetic

#a1存放待转换的大地坐标
a1=[100,101,1500]
a = Geodetic_to_spherical(a1[0],a1[1],a1[2])

#b1存放待转换的大地坐标
b1= [6359000, 22, 33]
b = spherical_to_Geodetic(b1[0],b1[1],b1[2])

print('输入大地坐标[L,B,H]:',a1,'  输出的球坐标为[r,sita,fai]:',a)
print('\n')
print('输入球坐标[r,sita,fai]:',b1,'  输出的大地坐标[L,B,H]为:',b)


你可能感兴趣的:(Python)