如何使用cartopy和matplotlib绘制天梭?

如何使用cartopy和matplotlib绘制天梭?,matplotlib,cartopy,Matplotlib,Cartopy,对于绘制天空地图,我刚从Basemap切换到cartopy,我更喜欢它 (主要原因是一些计算机上的底图错误,我无法修复) 我唯一要做的就是弄一个天梭圆(用来显示我们望远镜的视锥) 这是一些绘制随机星体的示例代码(我使用了一个真实星体的目录): 我如何向该图像添加具有一定半径(以度为单位)的天梭圆? 我一直想返回并添加GeographicalIB中的两个函数,这两个函数提供正向和反向测地计算,使用这两个函数,只需通过在给定纬度/经度/半径的适当方位处采样来计算测地圆即可。唉,我还没有这样做,但是

对于绘制天空地图,我刚从Basemap切换到cartopy,我更喜欢它

(主要原因是一些计算机上的底图错误,我无法修复)

我唯一要做的就是弄一个天梭圆(用来显示我们望远镜的视锥)

这是一些绘制随机星体的示例代码(我使用了一个真实星体的目录):

我如何向该图像添加具有一定半径(以度为单位)的天梭圆?

我一直想返回并添加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()