这是2023年第一篇文章,今天要介绍的是使用GMT绘制星下点图,在卫星导航实验重,要求我们绘制北斗卫星的星下点图,我们需要知道卫星的轨迹,就需要计算出卫星的坐标,并进行相应的坐标转换,获得了坐标之后,需要使用GMT进行星下点图的绘制。
可以在我的其他的博客中找到计算卫星坐标的代码,此处放置链接,请自行取用。
【python】读取卫星星历(RENIX 3.04)进行卫星位置的计算(北斗卫星专题)
其大致原理是,通过读取卫星星历相应的卫星轨道信息,对相应的数据块进行读取并计算出在历元时刻的卫星位置。
由于计算获得的卫星坐标是以高斯空间直角坐标系(CGCS2000或其他坐标系),我们需要转化为BLH坐标,才能够使用GMT来进行卫星的星下点图。以下是转换坐标的相关类的代码。
class Earth():
# 建立椭球类,,采用CGCS2000中国大地坐标系数据
def __init__(self): # 给定椭球数据
# 长半轴
self.a = 6378137.0
# 短半轴
self.b = 6356752.31414
# 扁率
self.f = 1 / 298.257222101
# 第一偏心率的平方
self.e1s = m.pow(0.0818191910428, 2)
# 第二偏心率的平方
self.e2s = self.e1s / (1 - self.e1s)
class Transform():
# 建立转换类
def __init__(self): # 导入椭球数据
self.earth = Earth()
def BLH_XYZ(self, B, L, H): # 大地坐标转换为空间直角坐标
# 将角度转换为弧度
self.b = m.radians(B)
self.l = m.radians(L)
# 计算辅助函数
self.W = m.sqrt(1 - self.earth.e1s * m.pow(m.sin(self.b), 2))
# 转换为空间直角坐标
self.N = self.earth.a / self.W
self.X = (self.N + H) * m.cos(self.b) * m.cos(self.l)
self.Y = (self.N + H) * m.cos(self.b) * m.sin(self.l)
self.Z = (self.N * (1 - self.earth.e1s) + H) * m.sin(self.b)
def XYZ_BLH(self, X, Y, Z): # 空间直角坐标转换为大地坐标
# 求出大地经度
self.l = m.atan(Y / X)
# 求出大地纬度
self.r = m.sqrt(X * X + Y * Y)
self.tb1 = Z / self.r
while True:
self.tb2 = 1 / self.r * (
Z + self.earth.a * self.earth.e1s * self.tb1 /
m.sqrt(1 + self.tb1 * self.tb1 * (1 - self.earth.e1s)))
if abs(self.tb2 - self.tb1) <= 5e-10:
break
self.tb1 = self.tb2
self.b = m.atan(self.tb2)
# 求出大地高
self.W = m.sqrt(1 - self.earth.e1s * m.pow(m.sin(self.b), 2))
self.N = self.earth.a / self.W
self.H = self.r / m.cos(self.b) - self.N
# 将弧度转换为角度
self.B = m.degrees(self.b)
self.L = m.degrees(self.l)
class Point():
# 建立点类
def BLH(self, B, L, H): # 建立直角坐标点类
self.B = B
self.L = L
self.H = H
self.P = Transform()
self.P.BLH_XYZ(B, L, H)
self.X = self.P.X
self.Y = self.P.Y
self.Z = self.P.Z
def XYZ(self, X, Y, Z): # 建立直角坐标点类
self.X = X
self.Y = Y
self.Z = Z
self.P = Transform()
self.P.XYZ_BLH(X, Y, Z)
self.B = self.P.B
self.L = self.P.L
self.H = self.P.H
使用上述代码便可以编写主函数,实例化类之后进行所有点的转换。得到了所有的点的BLH后,我们将进入下一步。
Generic Mapping Tools(GMT)是科研工作者常用的画图工具。GMT的功能强大,也内置了一些统计模块。相较于其他常用的绘图工具(或含有绘图功能的软件,比如Matlab,Python,R等),GMT的特点是高效出图,缺点则是没有可操作的直观界面(GUI)。
在官网上下载GMT的软件本体和GMT的软件使用说明,需要配置环境变量,也有可能需要配置awt,这些都是需要大家实际操作的。如何判断自己正确安装了GMT,只需要Win+R运行cmd,输入
"gmt --version",出现了以下界面说明安装成功。
(本机安装的是6.4.0版本的GMT)
1)新建一个txt文档。
2)输入命令。
命令如下:
gmt set FONT_ANNOT_PRIMARY 13p
gmt pscoast -Rg-160/160/-80/80 -JX8i/6i -Ba20g20 -Dh -A5000 -G255/255/255 -S255/255/255 -N1/0.2p,white -W1/0.3p,white -I1/0.2p,white -K > sattrack.ps
psxy GEO.txt -R -J -B -Sj -Ggray -Wthinner -K -O >> sattrack.ps
psxy GEO.txt -R -J -B -Sc0.3c -Gyellow -Wthinner -K -O >> sattrack.ps
psxy IGSO.txt -R -J -B -Sj -Ggray -Wthinner -K -O >> sattrack.ps
psxy IGSO.txt -R -J -B -Sc0.3c -Gyellow -Wthinner -K -O >> sattrack.ps
psxy MEO.txt -R -J -B -Sj -Ggray -Wthinner -K -O >> sattrack.ps
psxy MEO.txt -R -J -B -Sc0.3c -Gyellow -Wthinner -K -O >> sattrack.ps
pstext GEONAME.txt -R -J -B -D-0.2/-0.4 -F+f13p -K -O >> sattrack.ps
pstext IGSONAME.txt -R -J -B -D-0.2/-0.4 -F+f13p -K -O >> sattrack.ps
pstext MEONAME.txt -R -J -B -D-0.2/-0.4 -F+f13p -K -O >> sattrack.ps
psxy C06.txt -R -J -B -W1.5p,SEAGREEN,solid -K -O >> sattrack.ps
psxy C07.txt -R -J -B -W1.5p,SEAGREEN,solid -K -O >> sattrack.ps
psxy C08.txt -R -J -B -W1.5p,SEAGREEN,solid -K -O >> sattrack.ps
psxy C09.txt -R -J -B -W1.5p,SEAGREEN,solid -K -O >> sattrack.ps
psxy C10.txt -R -J -B -W1.5p,SEAGREEN,solid -K -O >> sattrack.ps
psxy C11.txt -R -J -B -W1.5p,DARKORCHID3,solid -K -O >> sattrack.ps
psxy C12.txt -R -J -B -W1.5p,DARKORCHID3,solid -K -O >> sattrack.ps
psxy stations.txt -R -J -B -St12p -Gred -Wthinner -K -O >> sattrack.ps
pstext stations.txt -R -J -B -D0.5/-0.4 -F+f17p,40 -O >> sattrack.ps
psconvert sattrack.ps -C-sFONTPATH=C:\WINDOWS\Fonts -E600 -P -Tt
3)新建文件,放入卫星的坐标,保存退出。
4)修改文件扩展名为".bat",双击打开或者在CMD里运行也是可以的。
5)获得了tif图,则绘图完毕。
星下点图,绘制完毕。
GMT虽然配置较为麻烦,且没有好的GUI界面以供使用者使用,需要使用命令行来绘制图像,但是对于测绘来说,仍不失为一款绘图科研利器。