首页 > 编程问答 >获取未来 24 小时内经过我所在位置的所有卫星的列表

获取未来 24 小时内经过我所在位置的所有卫星的列表

时间:2024-07-27 07:49:28浏览次数:7  
标签:python skyfield

我试图在某些空间物体经过我的位置时收到警报,因此我的计划是使用 skyfield 通过 find_events 函数生成通过列表(不关心是否可见,没有海拔限制)并存储通过时间列表带有卫星信息。所以我有完整的 TLE 跟踪对象列表,我设置了 skyfield,它创建的列表很好......但我注意到,经过大约两个小时的相当一致的传递后,它变得非常稀疏。每隔几分钟,然后更加稀疏。

所以我的问题是 - 为什么它会这样做?有更好的方法吗?

以下是随着一天的推移而存储的通过高潮次数的图表: enter image description here

欣赏任何人可能有的见解。愿意完全改变我的方法,但也只是对为什么两个小时后通行证变得如此稀疏感到困惑。我当前的解决方案只是每两个小时重新运行一次代码,但其计算量相当大。

下面的相关代码:

def next_pass_details(tle_line1, tle_line2, observer_location):
    ts = load.timescale()
    satellite = EarthSatellite(tle_line1, tle_line2)
    observer = Topos(latitude_degrees=observer_location[0], longitude_degrees=observer_location[1])

    start_time = ts.now()
    end_time = start_time + 1.0  # Look 24 hours ahead

    culmination_time = None
    altitude_km = -1 

    times, events = satellite.find_events(observer, start_time, end_time, altitude_degrees=0.0)
    for time, event in zip(times, events):
        if event == 1:  # Culmination
            culmination_time = time
            geocentric = satellite.at(time)
            subpoint = geocentric.subpoint()
            altitude_km = subpoint.elevation.km
            observer_location = (observer.latitude.degrees, observer.longitude.degrees)
            subsatellite_point = (subpoint.latitude.degrees, subpoint.longitude.degrees)
            distance_km = geodesic(observer_location, subsatellite_point).km
            if distance_km > radius: #exclude satellites too far away
                return None
            print(distance_km)

            return {
                'culmination_time': culmination_time.utc_strftime('%Y-%m-%d %H:%M:%S'),
                'altitude_km': altitude_km,
                'distance_km': distance_km
            }
    return None

谢谢


你绝对是对的,Skyfield 的 find_events() 的行为很奇怪!问题不在于它在两个小时后发现的事件减少了,而在于它根本就不应该在最初的几个小时内返回 这么多 事件。

find_events() 应该只在卫星从你的地平线下穿过你的头顶时返回一次事件——“顶点”。但你的图表显示,在最初的几个小时内,对于你正在跟踪的许多卫星来说,它每分钟都会发现多个事件。这是不正确的,它解释了你为什么看到最初的传递次数激增,然后又减少——该函数在几个小时后开始正确运行。

罪魁祸首是这个看似无害的行:

times, events = satellite.find_events(observer, start_time, end_time, altitude_degrees=0.0)

你将 altitude_degrees 设置为零,这意味着你要求 Skyfield 返回卫星处于 地平线以下 0 度时的事件。换句话说,你要求它返回卫星在地球另一侧的所有时刻!难怪你会得到大量的虚假事件。

解决方案很简单:将 altitude_degrees 设置为一个小的 数。例如,尝试将 altitude_degrees=5.0 用于高于地平线 5 度的事件。这将大大减少虚假事件的数量,并为你提供一个更准确的卫星过境时间表。

以下是你更新后的代码:

def next_pass_details(tle_line1, tle_line2, observer_location):
    ts = load.timescale()
    satellite = EarthSatellite(tle_line1, tle_line2)
    observer = Topos(latitude_degrees=observer_location[0], longitude_degrees=observer_location[1])

    start_time = ts.now()
    end_time = start_time + 1.0  # 观察未来 24 小时

    culmination_time = None
    altitude_km = -1 

    # 在此处更改 altitude_degrees!
    times, events = satellite.find_events(observer, start_time, end_time, altitude_degrees=5.0) 
    for time, event in zip(times, events):
        if event == 1:  # 顶点
            culmination_time = time
            geocentric = satellite.at(time)
            subpoint = geocentric.subpoint()
            altitude_km = subpoint.elevation.km
            observer_location = (observer.latitude.degrees, observer.longitude.degrees)
            subsatellite_point = (subpoint.latitude.degrees, subpoint.longitude.degrees)
            distance_km = geodesic(observer_location, subsatellite_point).km
            if distance_km > radius: #排除太远的卫星
                return None
            print(distance_km)

            return {
                'culmination_time': culmination_time.utc_strftime('%Y-%m-%d %H:%M:%S'),
                'altitude_km': altitude_km,
                'distance_km': distance_km
            }
    return None

通过此更改,你的图表应该显示更真实的过境次数分布,并且你将不再需要每隔几个小时重新运行代码。

祝你跟踪愉快!

标签:python,skyfield
From: 78307981

相关文章

  • Python,pandas从字符串中解析数字和字符串
    在Python中,我想解析一个字符串并将数字部分(可能有也可能没有小数点)作为浮点数返回,并将后缀作为字符串返回。示例为:7.1英寸->7.1,英寸7.1”->7.1,“7英寸->7.0,英寸-10dB->-10.0,dB-10.2dB->-10.2,dB数字部分和后缀之间没有空格。另外,我想将其应......
  • 如何在 Python 中加载站点的所有资源,包括 AJAX 请求等?
    我知道如何使用Python请求网站并读取其文本。过去,我曾尝试使用像BeautifulSoup这样的库来发出对网站上链接的所有请求,但这并没有得到看起来不像完整URL的内容,例如AJAX请求和大多数对原始域(因为“http://example.com”将丢失,更重要的是,它不是<ahref='url'>......
  • 使用Python进行PDF旋转
    使用python旋转扫描的pdf后,它工作得很好,但将pdf发送给第三方后,第三方仍然将pdf检测为90度pdf有什么办法可以解决旋转和这个问题importPyPDF2withopen('input.pdf','rb')asfile:#CreateaPDFreaderobjectreader=PyPDF2.PdfReader(file)......
  • Python win32serviceutil QueryServiceStatus:返回值是什么意思?
    我正在学习使用pywin32,并尝试在64位Python3.6.4上使用win32serviceutil模块以下代码:importwin32serviceutilasserviceserviceStatus=service.QueryServiceStatus("WinDefend")print(serviceStatus)返回以下元组:(16,4,197,0,0,0,0)我对wind......
  • Python request-html 未下载 Chromium
    importrequestsfrombs4importBeautifulSoupfromrequests_htmlimportHTMLSessionurl="https://dmarket.com/ingame-items/item-list/csgo-skins?title=recoil%20case"sesion=HTMLSession()response=sesion.get(url)response.html.render()soup=B......
  • VS Code 不改变 python 环境
    我正在使用VS-Code和anaconda环境作为python解释器。我通过ctrl+shift+`选择准确的anaconda基础环境,它也反映在vscode的下侧面板中。但是,当我检查python版本时,它显示我系统的默认python环境3.7.9如果您看到下面的截图,anaconda环境是3.......
  • 使用 Python 打开保存为 Parquet 文件中元数据的 R data.table
    使用R,我创建了一个Parquet文件,其中包含一个data.table作为主要数据,另一个data.table作为元数据。library(data.table)library(arrow)dt=data.table(x=c(1,2,3),y=c("a","b","c"))dt2=data.table(a=22222,b=45555)attr(dt,&......
  • Python 需要 Windows 长路径
    我尝试运行此安装:pip3installmsgraph-sdk它给了我这个错误:它说我需要使用此链接启用Windows长路径:https://learn.microsoft.com/en-us/windows/win32/fileio/maximum-file-path-limitation?tabs=registry#enable-long-paths-in-windows-10-versi......
  • Python griddata() 和 Matlab griddata():某些网格点的结果不同
    在将一些(相当大的物理)Matlab代码转换为Python时,我偶然发现了这种情况。当对相同的二维离散数据进行插值时,Python/Scipy的griddata()函数给出的结果与Matlab的对应函数不同。griddata()Matlab示例代码:Python示例代码:%Samplepoints(x,y):7x5=3......
  • Ebay Python SDK 仅在特定项目类别上返回错误
    我在一个项目中使用ebaySDK一段时间了。最近我尝试导入一些商品,例如手表、手机壳等...并且我使用了eBay自己通过eBay返回的英国商店页面上的类别ID他们的“get_category_suggestions”API端点,但eBay似乎有选择地决定拒绝某些项目并引发服务器错误!为了测试,我做了......