【问题标题】:Overlay coastlines on a matplotlib plot在 matplotlib 图上叠加海岸线
【发布时间】:2015-02-25 17:47:56
【问题描述】:

我希望在代表一个区域的图表上叠加一些海岸线。该区域由框定义:

  • 顶部:3900000
  • 底部:3450000
  • 左:300000
  • 右:800000

使用坐标系 WGS_1984_UTM_Zone_36N。

我尝试过使用 mpl_toolkits.basemap,但是我不知道如何指定该区域,因为 Basemap 不接受 ESPG 代码 (32636),并且当我尝试手动插入投影参数时 (m = Basemap(projection='tmerc', k_0=0.9996, lat_0=0, lon_0=33, llcrnrx=300000, llcrnry=3450000, urcrnrx=800000, urcrnry=3900000 ) 它仍然需要一个 lat long 边界框。

还有其他方法可以在底图中定义该区域吗?

谢谢!

编辑:我正在尝试返回由 utm 系统中的框定义的海岸线区域,对框的末端使用 lat/long 值会导致海岸线覆盖的区域重叠/重叠当转换回utm系统时(我想,如果我错了,请纠正我)。

【问题讨论】:

  • 你看过PyProj吗? this 有用吗?
  • 我将它分成两部分,(1)将您的顶部/底部/等转换为纬度/经度角,然后(2)使用底图绘制。您可以使用 PyProj(如 farenorth 建议的那样)或一个名为“utm”的小型实用程序,它几乎可以完成这些转换(您可以得到它here
  • farnorth @Ajean,感谢您的意见(尤其是 utm 实用程序),但请参阅我的问题的编辑。

标签: python matplotlib matplotlib-basemap map-projections


【解决方案1】:

试试 cartopy 及其新的 epsg 功能:

projection = ccrs.epsg(32636)
fig, ax = plt.subplots(figsize=(5, 5),
                      subplot_kw=dict(projection=projection))
ax.coastlines(resolution='10m')

这是一个带有示例的笔记本: http://nbviewer.ipython.org/gist/ocefpaf/832cf7917c21da229564

【讨论】:

  • 感谢 ocefpaf,但是请参阅我的问题的编辑,我不是要在纬度/经度定义的框中提取海岸线,而是在定义的框中提取海岸线在 utm 系统中(米)。这些是不同的东西,因为子午线是球体上的直线,而恒定的 utm 北向是平面地图上的直线。
  • 你看到笔记本了吗?我没有定义 lon/lat bbox。我正在使用你的 UTM 坐标。
  • 是的,您输入了 UTM 坐标,然后将其转换为 lat long,程序从 lat long 框定义的框中提取海岸线。经纬盒顶点之间的直线与 UTM 盒顶点之间的直线相比,跨越不同的地方。这是我一直试图达到的差异。另一种看待它的方式是:如果不是这种情况,为什么 lat long 和 utm 坐标系统都存在?
  • 没有。程序从EPGS投影代码中提取海岸线和UTM中定义的轴IS!!! UTM2LonLat 只是检查值是否正常!!!
  • @ocefpaf-对不起,由于某种原因,我查找原始问题坐标的方式意味着它们与我实际所追求的略有不同(例如,80000 而不是 75000),所以当我看到返回的海岸线区域我认为是程序将它们略微返回。我想我永远也无法理解为什么 ArcGIS 会做一些事情。
【解决方案2】:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import numpy as np

# make sure the value of resolution is a lowercase L,
#  for 'low', not a numeral 1
map = Basemap(projection='merc', lat_0=57, lon_0=-135,
    resolution = 'h', area_thresh = 0.1,
    llcrnrlon=-136.25, llcrnrlat=56,
    urcrnrlon=-134.25, urcrnrlat=57.75)

map.drawcoastlines()
map.drawcountries()
map.fillcontinents(color='coral')
map.drawmapboundary()

map.drawmeridians(np.arange(0, 360, 30))
map.drawparallels(np.arange(-90, 90, 30))

plt.show()

全部在这个链接https://peak5390.wordpress.com/2012/12/08/matplotlib-basemap-tutorial-making-a-simple-map/

【讨论】:

  • 您好乔纳森,感谢您的回复。也许我误解了投影的工作原理,但我认为虽然您可以在纬度/经度和 utm 之间转换点,但转换由其中四个点制成的框会导致转换区域的弯曲边缘(在一定比例以下可以忽略不计)。我已经更新了我的问题,以更具体地了解 utm 边界。
  • 我在 ubuntu 20.04 和 Python 3.8.10 中通过 sudo apt update; sudo apt install libgeos++-dev libgeos-3.8.0 libgeos-c1v5 libgeos-dev libgeos-doc # 在正确的 venv 中管理安装所需的库:pip install https://github.com/matplotlib/basemap/archive/master.zip 工作正常!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-22
  • 1970-01-01
相关资源
最近更新 更多