作业顺便记录一下,场面监视
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.极坐标第三参量取角度,认为是球坐标
大地坐标表示为:纬度B、经度L、海拔H
空间直角坐标表示方法:X、Y、Z
##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)