我正在尝试编写一些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)
有更好的方法吗?例如将所有内容转换为笛卡尔坐标,然后将视界作为一个完美的圆?任何意见,将不胜感激!预先感谢