python - 如何使用 basemap 绘制靠近两极的地球观测卫星的视野?

标签 python matplotlib-basemap cartopy satellite fieldofview

我正在尝试绘制卫星沿其轨道的最大(理论)视野。我正在使用 Basemap,我想在其上绘制沿轨道的不同位置(散点图),并且我想使用 tissot 方法(或等效方法)添加整个视野。 在 300 公里高空轨道上,在北纬 75 度左右之前,下面的代码可以正常工作。超出此代码输出 ValueError: “ValueError:未定义的逆测地线(可能是对映点)”

import matplotlib.pyplot as plt
from mpl_toolkits.basemap import Basemap
import math

earth_radius = 6371000.  # m
fig = plt.figure(figsize=(8, 6), edgecolor='w')
m = Basemap(projection='cyl', resolution='l',
            llcrnrlat=-90, urcrnrlat=90,
            llcrnrlon=-180, urcrnrlon=180)

# draw the coastlines on the empty map
m.drawcoastlines(color='k')

# define the position of the satellite
position = [300000., 75., 0.]  # altitude, latitude, longitude

# radius needed by the tissot method
radius = math.degrees(math.acos(earth_radius / (earth_radius + position[0])))
m.tissot(position[2], position[1], radius, 100, facecolor='tab:blue', alpha=0.3)
m.scatter(position[2], position[1], marker='*', c='tab:red')

plt.show()

请注意,代码在南极(纬度低于 -75)工作正常。我知道这是一个已知错误,是否有针对此问题的已知解决方法? 感谢您的帮助!

最佳答案

您发现的是 Basemap 的一些限制。让我们暂时切换到 Cartopy。工作代码会有所不同,但差别不大。

import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import math

earth_radius = 6371000.
position = [300000., 75., 0.]   # altitude (m), lat, long
radius = math.degrees(math.acos(earth_radius / (earth_radius + position[0])))
print(radius)  # in subtended degrees??

fig = plt.figure(figsize=(12,8))

img_extent = [-180, 180, -90, 90]

# here, cartopy's' `PlateCarree` is equivalent with Basemap's `cyl` you use
ax = fig.add_subplot(1, 1, 1, projection = ccrs.PlateCarree(), extent = img_extent)

# for demo purposes, ...
# let's take 1 subtended degree = 112 km on earth surface (*** you set the value as needed ***)
ax.tissot(rad_km=radius*112, lons=position[2], lats=position[1], n_samples=64, \
             facecolor='red', edgecolor='black', linewidth=0.15, alpha = 0.3)

ax.coastlines(linewidth=0.15)
ax.gridlines(draw_labels=False, linewidth=1, color='blue', alpha=0.3, linestyle='--')
plt.show()

使用上面的代码,结果图是:

enter image description here

现在,如果我们使用正交投影,(用这个替换相关的代码行)

ax = fig.add_subplot(1, 1, 1, projection = ccrs.Orthographic(central_longitude=0.0, central_latitude=60.0))

你得到这个情节:

enter image description here

关于python - 如何使用 basemap 绘制靠近两极的地球观测卫星的视野?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54202958/

相关文章:

python - 初始化 Airflow 数据库时出现导入 _mysql 错误

python - 单个django查询集获取n个相邻项目

python - 有没有一种简单的方法可以在没有图像的情况下为 Kivy 标签、按钮、小部件等添加边框?

python - basemap 上的子图

python - 使用双三次插值的彩色 matplotlib map

python - 在 basemap 中绘制包裹路径

python - 如何在 matplotlib 绘图中正确设置 cartopy geoaxes 中的投影和变换

python - 定义装饰器中的使用次数(带装饰器的单例模式)

python - 如何删除 Cartopy/Matplotlib 图周围的框架和轴?

python - 使用 Cartopy 插入城市地区的温度数据