1.卫星TLE数据
概括:两行字符串表示的卫星参数
字段 | 字符串位置(以0为起点) | 描述内容 | 注释 |
---|---|---|---|
1 | 01–01 | 卫星编号 | |
2 | 03-07 | 卫星类别 | 卫星类别(U表示不保密,可供公众使用的;C 表示保密,仅限NORAD使用;S表示保密的,仅限NORAD使用) |
3 | 08-08 | 发射年份后两位 | 98 |
4 | 10-11 | 当年发射顺序 | 067表示卫星1998年第67次发射 |
5 | 12-14 | 发射卫星个数 | A表示是第一个,如果一次发射多颗卫星,使用26个英文字母排序;如果超过了26个编号,则使用两位字母,如AA、AB、AC编号 |
6 | 15-17 | TLE历时 | 年份后两位 |
7 | 19-20 | TLE历时 | 用十进制小数表示一年中的第几日和日中的小数部分 |
8 | 21-32 | 平均运动的一阶时间导数 | 用来计算每一天平均运动的变化带来的轨道漂移,提供给轨道计算软件预测卫星的位置。两行式轨道数据使用这个数据校准卫星的位置 |
9 | 34-43 | ||
10 | 45-52 | 平均运动的二阶时间导数 | 用来计算每一天平均运动的变化带来的轨道漂移,提供给轨道计算软件预测卫星的位置 |
11 | 54-61 | BSTAR拖调制系数 | |
12 | 63-63 | 1或0 | 美国空军空间指挥中心内部使用的为1;美国空军空间指挥中心以外公开使用标识为0 |
13 | 65-68 | 星历编号 | TLE数据按新发现卫星的先后顺序的编号 |
14 | 69-69 | 校验和,指这一行的所有非数字字符,按照“字母、空格、句点、正号= 0;负号=1”的规则换算成0和1后,将这一行中原来的全部数字加起来,以10为模计算后所得的和。 | 校验和可以检查出90%的数据存储或传送错误。按十进制加起来的个位数字的校验和,用于精确纠正误差。 |
第二行
字段 | 字符串位置(以0为起点) | 描述内容 | 注释 |
---|---|---|---|
1 | 01–01 | 行号 | |
2 | 03-07 | 卫星编号 | |
3 | 09–16 | 轨道的交角是指天体的轨道面和地球赤道面之间的夹度,用0~90°来表示顺行轨道 | 用90~180°表示逆行轨道(从地球北极上空看是顺时针运行 51.6416 |
4 | 18–25 | 升交点赤经,升交点赤经是指卫星由南到北穿过地球赤道平面时,与地球赤道平面的交点 | 升交点赤经是指卫星由南到北穿过地球赤道平面时,与地球赤道平面的交点 |
5 | 27–33 | 轨道偏心率 | 指卫星椭圆轨道的中心点到地球的球心点的距离(c)除以卫星轨道半长轴(a)得到的一个0(圆型)到1(抛物线)之间的小数值 |
6 | 35–42 | 近地点幅角 | |
7 | 44–51 | 平近点角 | |
8 | 53–63 | 每天环绕地球的圈数 | |
9 | 64–68 | 发射以来飞行的圈数 | |
10 | 69–69 | 校验和 |
2.依据TLE数据生成可见窗口
(1)准备TLE数据的txt
链接:CelesTrak: Search Satellite Catalog
其他的卫星信息网站:
· space-track
链接:https://www.space-track.org/#catalog
· Gunter’s space page
链接:Gunter's Space Page - Information on spaceflight, launch vehicles and satellites
· Satellite Tracker 3D
(2)准备经纬度数据
lat | lon | id |
43.507804 | -124.1 | 0 |
44.440934 | -124.05 | 1 |
48.342292 | -123.016667 | 2 |
(3)安装Skyfield库
pip install skyfield
安装好后运行
import pandas as pd
from skyfield.api import Topos, load, EarthSatellite, utc
from datetime import datetime
# 从TLE文件加载卫星数据
def load_tle_from_file(satname, tle_file_path):
"""
从TLE文件中加载卫星轨道数据。
参数:
satname (str): 卫星名称
tle_file_path (str): TLE文件路径
返回:
EarthSatellite: Skyfield的EarthSatellite对象
"""
with open(tle_file_path, 'r') as file:
lines = file.readlines()
tle_line1 = lines[0].strip()
tle_line2 = lines[1].strip()
satellite = EarthSatellite(tle_line1, tle_line2, satname, load.timescale())
return satellite
# 加载目标点数据
def load_target_points(csv_path):
"""
从CSV文件中加载目标点数据。
参数:
csv_path (str): CSV文件路径
返回:
DataFrame: 包含目标点信息的Pandas DataFrame
"""
return pd.read_csv(csv_path)
# 计算卫星的可见窗口
def compute_visibility(satellite, target_lat, target_lon, start_time, end_time):
"""
计算卫星对指定目标点的可见窗口。
参数:
satellite (EarthSatellite): Skyfield的EarthSatellite对象
target_lat (float): 目标点的纬度
target_lon (float): 目标点的经度
start_time (datetime): 可见窗口计算起始时间(UTC)
end_time (datetime): 可见窗口计算结束时间(UTC)
返回:
list: 包含可见窗口起止时间的列表
"""
ts = load.timescale()
observer_location = Topos(latitude_degrees=target_lat, longitude_degrees=target_lon)
t0 = ts.utc(start_time)
t1 = ts.utc(end_time)
times, events = satellite.find_events(observer_location, t0, t1, altitude_degrees=0)
visibility_windows = []
for time, event in zip(times, events):
if event == 0: # 卫星升轨
start_time = time.utc_datetime()
elif event == 2: # 卫星降轨
end_time = time.utc_datetime()
visibility_windows.append((start_time, end_time))
return visibility_windows
# 整合所有目标点计算可见窗口并生成结果表格
def generate_visibility_table(satellite, target_points, start_time, end_time):
"""
为所有目标点计算可见窗口,并生成结果表格。
参数:
satellite (EarthSatellite): Skyfield的EarthSatellite对象
target_points (DataFrame): 包含目标点信息的Pandas DataFrame
start_time (datetime): 可见窗口计算起始时间(UTC)
end_time (datetime): 可见窗口计算结束时间(UTC)
返回:
DataFrame: 包含可见窗口信息的Pandas DataFrame
"""
results = []
window_id = 0 # 可见窗口编号
for _, row in target_points.iterrows():
target_lat = row['lat']
target_lon = row['lon']
landid = row['landid']
visibility_windows = compute_visibility(satellite, target_lat, target_lon, start_time, end_time)
for start, end in visibility_windows:
window_duration = (end - start).total_seconds() # 计算窗口时长(秒)
results.append({
'sat': 0, # 假设卫星编号为0
'id': id, # 使用landid作为目标点的ID
'satname': satellite.name,
'winid': window_id,
'dtime': int(window_duration), # 窗口时长(秒)
'starttime': int((start - datetime(2024, 8, 1, 0, 0, 0, tzinfo=utc)).total_seconds()), # 相对起始秒数
'endtime': int((end - datetime(2024, 8, 1, 0, 0, 0, tzinfo=utc)).total_seconds()), # 相对起始秒数
'lat': target_lat,
'lon': target_lon,
})
window_id += 1
return pd.DataFrame(results)
# 主程序
if __name__ == "__main__":
# 设置时间范围(UTC)
start_time = datetime(2024, 8, 1, 0, 0, 0, tzinfo=utc)
end_time = datetime(2024, 8, 2, 0, 0, 0, tzinfo=utc)
# 卫星名称列表
satname = "satllite1"
# TLE文件路径
tle_file_path = f"{satname}TLE.txt"
satellite = load_tle_from_file(satname, tle_file_path)
# 加载目标点数据(格式为记录经纬度的csv)
csv_path = "test.csv"
target_points = load_target_points(csv_path)
# 计算可见窗口
visibility_table = generate_visibility_table(satellite, target_points, start_time, end_time)
# 保存结果为CSV文件
output_path = f"{satname}_window.csv"
visibility_table.to_csv(output_path, index=False)
print(f"可见窗口表已生成并保存为 {output_path}")