2024-02-04 14:30:25 +00:00
|
|
|
|
from skyfield.api import Topos, load, utc, EarthSatellite
|
|
|
|
|
from datetime import timedelta
|
|
|
|
|
import datetime
|
|
|
|
|
import math
|
|
|
|
|
import pytz
|
|
|
|
|
import ephem
|
|
|
|
|
|
|
|
|
|
def FIND_SATE(line1, line2, satellite_name):
|
|
|
|
|
ts = load.timescale()
|
|
|
|
|
line1 = line1
|
|
|
|
|
line2 = line2
|
|
|
|
|
satellite = EarthSatellite(line1, line2, satellite_name, ts)
|
|
|
|
|
return satellite, 1
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def find_lines_after_string(filename, search_string):
|
|
|
|
|
line1 = None
|
|
|
|
|
line2 = None
|
|
|
|
|
with open(filename, 'r') as file:
|
|
|
|
|
lines = file.readlines()
|
|
|
|
|
for i, line in enumerate(lines):
|
|
|
|
|
if search_string in line:
|
|
|
|
|
if i+1 < len(lines):
|
|
|
|
|
line1 = lines[i+1].strip()
|
|
|
|
|
if i+2 < len(lines):
|
|
|
|
|
line2 = lines[i+2].strip()
|
|
|
|
|
break
|
|
|
|
|
return line1, line2
|
|
|
|
|
def CAL_PASS_TIME(target_satellite, observer_lat, observer_lon, observer_elevation):
|
|
|
|
|
topos = Topos(latitude_degrees=observer_lat, longitude_degrees=observer_lon,
|
|
|
|
|
elevation_m=observer_elevation)
|
|
|
|
|
# 获取当前时间并创建Skyfield的时间对象
|
|
|
|
|
now = datetime.datetime.utcnow().replace(tzinfo=utc)
|
|
|
|
|
ts = load.timescale()
|
|
|
|
|
t0 = ts.utc(now)
|
|
|
|
|
t1 = t0 + timedelta(days=2) # 查找2天内过境时间
|
|
|
|
|
passes = target_satellite.find_events(topos, t0, t1)
|
|
|
|
|
# 获取北京时区
|
|
|
|
|
beijing_tz = pytz.timezone('Asia/Shanghai')
|
|
|
|
|
|
|
|
|
|
pass_times = []
|
|
|
|
|
departure_times = []
|
|
|
|
|
if not passes[0]:
|
|
|
|
|
return None, None
|
|
|
|
|
# 打印下一次过境的北京时间和离境时间
|
|
|
|
|
for time, event in zip(passes[0], passes[1]):
|
|
|
|
|
if event == 0: # 0表示升,1表示降
|
|
|
|
|
# 将UTC时间转换为北京时间
|
|
|
|
|
beijing_time = time.utc_datetime().replace(tzinfo=pytz.utc).astimezone(beijing_tz)
|
|
|
|
|
pass_times.append(beijing_time.strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
|
|
elif event == 2:
|
|
|
|
|
departure_time_utc = time.utc_datetime().replace(tzinfo=pytz.utc).astimezone(beijing_tz)
|
|
|
|
|
departure_times.append(departure_time_utc.strftime('%Y-%m-%d %H:%M:%S'))
|
|
|
|
|
|
|
|
|
|
return pass_times, departure_times
|
|
|
|
|
|
|
|
|
|
def CAL_DATA(satellite,line1,line2,observer_lon,observer_lat,observer_elevation,data,UP_HZ,DOWN_HZ):
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# 创建观测者对象并设置位置和时间
|
|
|
|
|
observer = ephem.Observer()
|
|
|
|
|
observer.lon = str(observer_lon)
|
|
|
|
|
observer.lat =str( observer_lat)
|
|
|
|
|
observer.elevation = observer_elevation
|
|
|
|
|
observer.date = data # 设置为当前UTC时间
|
|
|
|
|
|
|
|
|
|
satellite.compute(observer)
|
|
|
|
|
# 获取卫星的速度(单位:km/s)
|
|
|
|
|
range_rate = satellite.range_velocity / 1000
|
|
|
|
|
# print("速度:", range_rate, "km/s")
|
2024-02-06 08:05:12 +00:00
|
|
|
|
UP_SHIFT = range_rate / 299792.458 * UP_HZ # 单位:Hz
|
2024-02-04 14:30:25 +00:00
|
|
|
|
DOWN_SHIFT = -range_rate / 299792.458 * DOWN_HZ # 单位:Hz
|
|
|
|
|
DIS = satellite.range / 1000 # 单位从m转换为km
|
|
|
|
|
return round(math.degrees(float(satellite.az)),2), round(math.degrees(float(satellite.alt)),2),round(UP_SHIFT,0),round(DOWN_SHIFT,0),round(DIS,2)
|