【问题标题】:How to plot a tissot with cartopy and matplotlib?如何用 cartopy 和 matplotlib 绘制 tissot?
【发布时间】:2015-10-08 03:25:30
【问题描述】:

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

(主要原因是某些计算机上的 Basemap 段错误,我无法修复)。

唯一让我苦苦挣扎的事情是获得一个 tissot 圆圈(用于显示我们望远镜的视锥。)

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

import matplotlib.pyplot as plt
from cartopy import crs
import numpy as np

# create some random stars:

n_stars = 100
azimuth = np.random.uniform(0, 360, n_stars)
altitude = np.random.uniform(75, 90, n_stars)
brightness = np.random.normal(8, 2, n_stars)

fig = plt.figure()
ax = fig.add_subplot(1,1,1, projection=crs.NorthPolarStereo())
ax.background_patch.set_facecolor('black')

ax.set_extent([-180, 180, 75, 90], crs.PlateCarree())

plot = ax.scatter(
    azimuth,
    altitude,
    c=brightness,
    s=0.5*(-brightness + brightness.max())**2,
    transform=crs.PlateCarree(),
    cmap='gray_r',
)

plt.show()

如何向该图像添加具有一定半径的天梭圆度数? https://en.wikipedia.org/wiki/Tissot%27s_indicatrix

【问题讨论】:

    标签: matplotlib cartopy


    【解决方案1】:

    我一直想返回并添加来自 GeographicLib 的两个函数,它们提供正向和反向测地线计算,这只是通过在给定纬度/经度/半径的适当方位角采样来计算大地圆的问题.唉,我还没有这样做,但是 pyproj 中有一个相当原始(但有效)的包装器用于该功能。

    要实现天梭指标,代码可能类似于:

    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()
    

    【讨论】:

    • 让我试着理解这一点。您正在寻找远离指定坐标的radiusn_points 点吗?那么 fwd 计算给定坐标的端点加上给定方向上的半径?
    • 是的。 fwd 根据距离和方向计算新位置。逆计算两点之间的距离和方向。
    • 是的,这是最近完成的。 github.com/SciTools/cartopy/pull/656 现在从 cartopy 中为我们提供了很多此类功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-18
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多