Python依据卫星TLE轨道根数,计算可见时间窗口

1.卫星TLE数据

概括:两行字符串表示的卫星参数

字段 字符串位置(以0为起点) 描述内容注释
1 01–01卫星编号
203-07卫星类别卫星类别(U表示不保密,可供公众使用的;C 表示保密,仅限NORAD使用;S表示保密的,仅限NORAD使用) 
308-08发射年份后两位98
410-11当年发射顺序067表示卫星1998年第67次发射
512-14发射卫星个数A表示是第一个,如果一次发射多颗卫星,使用26个英文字母排序;如果超过了26个编号,则使用两位字母,如AA、AB、AC编号
615-17TLE历时年份后两位
719-20TLE历时用十进制小数表示一年中的第几日和日中的小数部分
821-32平均运动的一阶时间导数用来计算每一天平均运动的变化带来的轨道漂移,提供给轨道计算软件预测卫星的位置。两行式轨道数据使用这个数据校准卫星的位置
934-43
1045-52平均运动的二阶时间导数用来计算每一天平均运动的变化带来的轨道漂移,提供给轨道计算软件预测卫星的位置
1154-61BSTAR拖调制系数
1263-631或0美国空军空间指挥中心内部使用的为1;美国空军空间指挥中心以外公开使用标识为0
1365-68星历编号TLE数据按新发现卫星的先后顺序的编号
1469-69

校验和,指这一行的所有非数字字符,按照“字母、空格、句点、正号= 0;负号=1”的规则换算成0和1后,将这一行中原来的全部数字加起来,以10为模计算后所得的和。

校验和可以检查出90%的数据存储或传送错误。按十进制加起来的个位数字的校验和,用于精确纠正误差。

第二行

字段 字符串位置(以0为起点) 描述内容注释
1 01–01行号
203-07卫星编号 
309–16轨道的交角是指天体的轨道面和地球赤道面之间的夹度,用0~90°来表示顺行轨道用90~180°表示逆行轨道(从地球北极上空看是顺时针运行    51.6416
418–25 升交点赤经,升交点赤经是指卫星由南到北穿过地球赤道平面时,与地球赤道平面的交点 升交点赤经是指卫星由南到北穿过地球赤道平面时,与地球赤道平面的交点
527–33  轨道偏心率指卫星椭圆轨道的中心点到地球的球心点的距离(c)除以卫星轨道半长轴(a)得到的一个0(圆型)到1(抛物线)之间的小数值
635–42近地点幅角
7 44–51平近点角
853–63 每天环绕地球的圈数 
964–68发射以来飞行的圈数
1069–69 校验和

2.依据TLE数据生成可见窗口

(1)准备TLE数据的txt

CelesTrak

链接: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

链接:Satellite Tracker 3D

(2)准备经纬度数据

latlonid
 43.507804  -124.1 0
44.440934    -124.051
48.342292 -123.016667    2

(3)安装Skyfield库

pip install skyfield

Skyfield中文手册(部分内容) - 知乎

skyfield · PyPI

安装好后运行

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}")

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值