【问题标题】:Equidistant Grid on Map Projection地图投影上的等距网格
【发布时间】:2018-07-02 14:30:59
【问题描述】:

我希望使用纬度和经度而不是度数在曼哈顿地图(比如 200 米乘 200 米)投影上创建一个等距网格。我正在使用底图,但无法找到继续执行任务的方法。这是投影代码。

m = Basemap(projection='mill',
        llcrnrlat= 40.6968,
        llcrnrlon= -74.0224,
        urcrnrlat= 40.8964, 
        urcrnrlon= -73.8927,
        resolution='h')

完成上述操作的最佳方法是什么,我还需要存储每个网格顶点的纬度、经度值。

【问题讨论】:

    标签: python-3.x matplotlib-basemap map-projections


    【解决方案1】:

    来自basemap documentation

    为了在地图上绘制数据,数据的坐标必须是 在地图投影坐标中给出。调用 Basemap 类实例 使用参数 lon,lat 将 lon/lat(以度为单位)转换为 x/y 地图投影坐标(以米为单位)。逆变换是 如果可选关键字 inverse 设置为 True,则完成。

    文档页面中还有一个示例。为了使这个示例适应您的用例,我将左下角转换为米,生成一个间距为 2000 m 的规则网格(200 m 有点太密集)并将网格转换回 lon/lat 坐标,然后可以由drawparallels()drawmeridians 使用。

    from matplotlib import pyplot as plt
    from mpl_toolkits.basemap import Basemap
    import numpy as np
    
    fig, ax = plt.subplots()
    
    lon0 = -74.0224
    lat0 = 40.6968
    
    m = Basemap(
        projection='mill',
        llcrnrlat= 40.6968,
        llcrnrlon= -74.0224,
        urcrnrlat= 40.8964, 
        urcrnrlon= -73.8927,
        resolution='h',
        ax = ax,
        )
    
    x0, y0 = m(lon0, lat0)
    
    x = np.arange(20)*2000+x0
    y = np.arange(20)*2000+y0
    
    lons, lats = m(x,y,inverse=True)    
    
    m.drawcoastlines()
    m.drawcountries()
    m.drawstates()
    m.drawmeridians(lons)
    m.drawparallels(lats)
    
    plt.show()
    

    结果如下:

    希望这会有所帮助。

    【讨论】:

    • 谢谢@Thomas。你是救生员。
    猜你喜欢
    • 1970-01-01
    • 2023-02-25
    • 2020-05-24
    • 2012-02-10
    • 2014-02-28
    • 2016-06-04
    • 2014-04-23
    • 2018-04-04
    • 1970-01-01
    相关资源
    最近更新 更多