如何使用cartopy和matplotlib绘制天梭?
对于绘制天空地图,我刚从Basemap切换到cartopy,我更喜欢它 (主要原因是一些计算机上的底图错误,我无法修复) 我唯一要做的就是弄一个天梭圆(用来显示我们望远镜的视锥) 这是一些绘制随机星体的示例代码(我使用了一个真实星体的目录): 我如何向该图像添加具有一定半径(以度为单位)的天梭圆?如何使用cartopy和matplotlib绘制天梭?,matplotlib,cartopy,Matplotlib,Cartopy,对于绘制天空地图,我刚从Basemap切换到cartopy,我更喜欢它 (主要原因是一些计算机上的底图错误,我无法修复) 我唯一要做的就是弄一个天梭圆(用来显示我们望远镜的视锥) 这是一些绘制随机星体的示例代码(我使用了一个真实星体的目录): 我如何向该图像添加具有一定半径(以度为单位)的天梭圆? 我一直想返回并添加GeographicalIB中的两个函数,这两个函数提供正向和反向测地计算,使用这两个函数,只需通过在给定纬度/经度/半径的适当方位处采样来计算测地圆即可。唉,我还没有这样做,但是
我一直想返回并添加GeographicalIB中的两个函数,这两个函数提供正向和反向测地计算,使用这两个函数,只需通过在给定纬度/经度/半径的适当方位处采样来计算测地圆即可。唉,我还没有这样做,但是pyproj中有一个相当原始(但有效)的功能包装器 要实现天梭indicatrix,代码可能如下所示:
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import numpy as np
from pyproj import Geod
import shapely.geometry as sgeom
def circle(geod, lon, lat, radius, n_samples=360):
"""
Return the coordinates of a geodetic circle of a given
radius about a lon/lat point.
Radius is in meters in the geodetic's coordinate system.
"""
lons, lats, back_azim = geod.fwd(np.repeat(lon, n_samples),
np.repeat(lat, n_samples),
np.linspace(360, 0, n_samples),
np.repeat(radius, n_samples),
radians=False,
)
return lons, lats
def main():
ax = plt.axes(projection=ccrs.Robinson())
ax.coastlines()
geod = Geod(ellps='WGS84')
radius_km = 500
n_samples = 80
geoms = []
for lat in np.linspace(-80, 80, 10):
for lon in np.linspace(-180, 180, 7, endpoint=False):
lons, lats = circle(geod, lon, lat, radius_km * 1e3, n_samples)
geoms.append(sgeom.Polygon(zip(lons, lats)))
ax.add_geometries(geoms, ccrs.Geodetic(), facecolor='blue', alpha=0.7)
plt.show()
if __name__ == '__main__':
main()
让我试着理解一下。是否查找距离指定坐标
半径的n_点
点?所以fwd计算给定坐标的端点加上给定方向上的半径?是的。fwd根据距离和方向计算新位置。逆向计算两点之间的距离和方向。是的,这是最近才做的。现在cartopy为我们提供了很多这方面的功能。
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import numpy as np
from pyproj import Geod
import shapely.geometry as sgeom
def circle(geod, lon, lat, radius, n_samples=360):
"""
Return the coordinates of a geodetic circle of a given
radius about a lon/lat point.
Radius is in meters in the geodetic's coordinate system.
"""
lons, lats, back_azim = geod.fwd(np.repeat(lon, n_samples),
np.repeat(lat, n_samples),
np.linspace(360, 0, n_samples),
np.repeat(radius, n_samples),
radians=False,
)
return lons, lats
def main():
ax = plt.axes(projection=ccrs.Robinson())
ax.coastlines()
geod = Geod(ellps='WGS84')
radius_km = 500
n_samples = 80
geoms = []
for lat in np.linspace(-80, 80, 10):
for lon in np.linspace(-180, 180, 7, endpoint=False):
lons, lats = circle(geod, lon, lat, radius_km * 1e3, n_samples)
geoms.append(sgeom.Polygon(zip(lons, lats)))
ax.add_geometries(geoms, ccrs.Geodetic(), facecolor='blue', alpha=0.7)
plt.show()
if __name__ == '__main__':
main()