计算卫星视线何时与地面目标区域重叠

时间:2019-05-13 14:49:12

标签: python shapely pyephem shapely.geometry

我正在尝试编写一些python代码,以解决国际空间站的地平线与地面目标区域重叠的问题。就我而言,我选择了中国。我有一些有效的代码,但是我不确定我是否在数学上正确地解决了问题,并且可以提出一些建议。

我使用的代码使用极坐标形状良好地定义了中国国界的粗多边形。然后,我使用ephem计算国际空间站的地面坐标和高程。高度以米为单位,所以我用它来计算距该高度的眼球到地平线的距离(地平线的半径)。

接下来的想法是创建一个以国际空间站为中心的圆形多边形(.buffer(1)),并使用形状内置的函数简单地查看它是否与中国的多边形相交。

但这有点棘手,因为China多边形在极坐标中,而地平线距离以米为单位。因此,要考虑到经线在赤道处较宽而在两极处较窄的事实,我必须进行计算以首先计算出当前纬度处的经度线之间的距离,然后使用该值来计算圆必须在x和y方向上有许多极性。然后,我将这些尺寸制作成椭圆形,然后查看相交处是否存在。

import time
import ephem
import math
from shapely.geometry import Polygon, Point
import shapely.affinity
import datetime

R = 6371 * 1000.0

dist_1_deg_long_equator = 111321
dist_1_deg_lat_equator = 111000

def get_dist_to_horizon(elevation_meters):
    eye = R + elevation_meters
    return R * math.acos(R / eye)

china = Polygon([
    (48.74, 87.17),
    (39.09, 74.05),
    (33.25, 79.13),
    (28.24, 86.44),
    (29.58, 95.74),
    (26.33, 98.82),
    (24.29, 97.89),
    (21.85, 100.82),
    (23.57, 105.32),
    (21.65, 108.14),
    (23.04, 116.23),
    (27.10, 120.31),
    (30.63, 122.08),
    (39.81, 124.09),
    (46.87, 133.90),
    (53.37, 121.73),
    (46.57, 119.57),
    (41.64, 105.26),
    (42.75, 96.28),
    (45.30, 90.76)])

name = "ISS (ZARYA)             "
line1 = "1 25544U 98067A   19094.21920345  .00002412  00000-0  46183-4 0  9994"
line2 = "2 25544  51.6444   8.9214 0002426 147.8175  11.8704 15.52483300163762"

iss = ephem.readtle(name, line1, line2)

while True:
    iss.compute()
    iss_horizon_radius = get_dist_to_horizon(iss.elevation)    

    dist_1_deg_long_current = math.cos(iss.sublat) * dist_1_deg_long_equator

    x_fact = iss_horizon_radius / dist_1_deg_long_current  # include more lines of longitude further from equator
    y_fact = iss_horizon_radius / dist_1_deg_lat_equator  # latitude lines are approx equal distant

    iss_horizon_circle = Point(math.degrees(iss.sublat), math.degrees(iss.sublong)).buffer(1)
    iss_horizon_ellipse = shapely.affinity.scale(iss_horizon_circle, x_fact, y_fact, origin='center')

    if iss_horizon_ellipse.intersects(china):
        print("ISS horizon is over China! %s" % datetime.datetime.utcnow())

    time.sleep(30)

有更好的方法吗?例如将所有内容转换为笛卡尔坐标,然后将视界作为一个完美的圆?任何意见,将不胜感激!预先感谢

0 个答案:

没有答案