目录

上一个主题

9.1. 简介

下一个主题

9.3. 使用plot绘图

>>> from helper import info; info()
页面更新时间: 2021-08-04 20:23:42
运行环境:
     Linux发行版本: Debian GNU/Linux 11 (bullseye)
     操作系统内核: Linux-5.10.0-8-amd64-x86_64-with-glibc2.31
     Python版本: 3.9.2

9.2. 绘制地图背景

Basemap包括GSSH海岸线数据集,以及来自GMT的河流、州和国家边界的数据集。这些数据集可用于在地图上以几种不同的分辨率绘制海岸线,河流和政治边界。相关的底图方法是:

  • drawcoastlines():绘制海岸线。

  • fillcontinents():为大陆内部着色(通过填充海岸线多边形)。不幸的是,fillcontinents方法并不总是做正确的。因为Matplotlib总是尝试填充多边形的内部。在某些情况下,海岸线多边形的内部可以是模糊的,并且有时需要填充外部而不是内部。在这些情况下,建议的解决方法是使用drawlsmask()方法覆盖具有为陆地和水域指定的不同颜色的图像。

  • drawcountries():绘制国家边界。

  • drawstates():绘制北美的州界。

  • drawrivers():绘制河流。

绘制地图并不只包括绘制海岸线和政治边界,也包括地图背景的绘制。Basemap提供了绘制地图背景的几个方法:

  • drawlsmask():绘制高分辨率海陆掩码作为图像,指定土地和海洋颜色。陆地海面掩模源自GSHHS海岸线数据,并且有多个海岸线选项和像素大小可供选择。

  • bluemarble():绘制一张NASA蓝色大理石图像作为地图背景。

  • shadedrelief():绘制一个阴影浮雕图像作为地图背景。

  • etopo():绘制etopo浮雕图像作为地图背景。

  • warpimage():使用abitrary图像作为地图背景。图像必须是全球的,从国际数据线向东,南极向北,以纬度/经度坐标覆盖世界。

首先导入库,建立好运行环境:

>>> %matplotlib inline
>>> import warnings
>>> warnings.filterwarnings('ignore')
>>>
>>> from mpl_toolkits.basemap import Basemap
>>> import matplotlib.pyplot as plt
>>>
>>>

9.2.1. bluemarble

在地图上绘制bluemarble图像。

bluemarble(ax=None, scale=None, **kwargs)
  • 该比例对于降低原始图像分辨率以加速处理是有用的。将图像的大小除以4值为0.5。

  • 图像的最终投影被扭曲,所以所有投影方法均正常工作。

>>> map = Basemap(llcrnrlon=-10.5,llcrnrlat=33,urcrnrlon=10.,urcrnrlat=46.,
>>>              resolution='i', projection='cass', lat_0 = 39.5, lon_0 = 0.)
>>>
>>> map.bluemarble()
>>>
>>> map.drawcoastlines()
>>>
>>> plt.show()
_images/basemap-background_5_0.png

9.2.2. drawcoastlines

绘制海岸线。

drawcoastlines(linewidth=1.0, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
  • 线宽集。线宽以像素为单位。

  • linestyle设置线型。默认情况下是固体,但可以是虚线,或任何matplotlib选项。

  • 颜色默认为k(black)。遵循matplotlib约定。

  • 抗锯齿默认为true

  • zorder设置图层位置。默认情况下,顺序由Basemap设置。

>>> map = Basemap()
>>>
>>> map.drawcoastlines()
>>>
>>> plt.show()
_images/basemap-background_7_0.png

9.2.3. drawcounties

从库包括的图层绘制国家边界。

drawcounties(linewidth=0.1, linestyle=’solid’, color=’k’, antialiased=1, facecolor=’none’, ax=None, zorder=None, drawbounds=False)
  • 线宽集。线宽以像素为单位。

  • linestyle设置线型。默认情况下是固体,但可以是虚线,或任何matplotlib其他选项。

  • 颜色默认为k(black)。遵循matplotlib约定。

  • 抗锯齿默认为true。

  • zorder设置图层位置。默认情况下,顺序由Basemap设置。

注:facecolor参数,它应该是县的颜色,但在一些Basemap版本不能运行。

注意:

  • 分辨率是固定的,不依赖于传递给类构造函数的分辨率。

  • 海岸线是另一个功能,而乡镇海岸线不被认为是海岸线,因此有必要把这个方法和其他的方法结合起来以获得好的地图。

9.2.4. drawcountries

从库中包含的图层绘制国家/地区边界。

drawcountries(linewidth=1.0, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
  • 线宽集。线宽以像素为单位。

  • linestyle设置线型。默认情况下是固体,但可以是虚线,或任何matplotlib选项。

  • 颜色默认为k(black)。遵循matplotlib约定。

  • 抗锯齿默认为true zorder设置图层位置。默认情况下,顺序由Basemap设置。

注意:

  • 创建Basemap实例时会产生具有更好或粗糙分辨率的图层。

  • 海岸线是另一个功能,乡镇海岸线不是通常的海岸线,因此要结合其它函数来绘制地图。

>>> map = Basemap(projection='ortho',
>>>               lat_0=0, lon_0=0)
>>>
>>> map.drawmapboundary(fill_color='aqua')
>>> map.fillcontinents(color='coral',lake_color='aqua')
>>>
>>> map.drawcountries()
>>>
>>> plt.show()
_images/basemap-background_10_0.png

没有绘制海岸线,结果有些奇怪:

>>> map = Basemap(projection='ortho',
>>>               lat_0=0, lon_0=0)
>>>
>>> map.drawcountries()
>>>
>>> plt.show()
_images/basemap-background_12_0.png

9.2.5. Drawlsmask

Drawlsmask是绘制湖泊,陆地和海洋的方法。尽量避免使用fillcontinents和drawmapboundary方法。此外,Drawlsmask可以将数据源更改为自定义点阵列。 与其他方法的不同之处在于,在此方法中无法设置zorder。

drawlsmask(land_color=‘0.8’, ocean_color=’w’, lsmask=None, lsmask_lons=None, lsmask_lats=None, lakes=True, resolution=’l’, grid=5, **kwargs)
  • land_color设置给土地的颜色(默认为灰色)

  • ocean_color设置海洋的颜色(默认为白色)

  • lsmask具有备用数据的阵列。如果为“无”,则将采用库中的默认数据。该数组必须包含海洋的0和土地的1

  • lsmask_lons替换陆地海面掩码的经度

  • lsmask_lats替代陆地海面的纬度

  • 分辨率可以更改由Basemap实例定义的数据的分辨率

  • grid栅格数组栅格分辨率,单位为弧度。默认值为5分钟

9.2.6. drawmapboundary

在地图上绘制地球边界,可选择填充。

drawmapboundary(color=’k’, linewidth=1.0,     fill_color=None, zorder=None, ax=None)
  • 线宽集。线宽以像素为单位

  • 颜色设置边缘颜色,默认为k(black)。遵循matplotlib约定

  • fill_color设置填充球体颜色,默认情况下为None。还遵循matplotlib约定

  • zorder设置图层位置。默认情况下,顺序由Basemap设置

>>> plt.figure(121)
>>> map = Basemap(projection='ortho',lon_0=0,lat_0=0,resolution='c')
>>> map.drawmapboundary()
>>>
>>> plt.figure(122)
>>> map = Basemap(projection='sinu',lon_0=0,resolution='c')
>>> map.drawmapboundary(fill_color='aqua')
>>>
>>> plt.show()
_images/basemap-background_15_0.png _images/basemap-background_15_1.png

9.2.7. Drawmeridians

在地图上绘制经线。

drawmeridians(meridians, color=’k’, linewidth=1.0, zorder=None, dashes=[1, 1], labels=[0, 0, 0, 0], labelstyle=None, fmt=’%g’, xoffset=None, yoffset=None, ax=None, latmax=None, **kwargs)
  • 经线是一个有经度的列表。如果值是整数,则可以使用range()创建。如果你需要浮点数,np.arange()是一个不错的选择

  • color设置线的颜色。

  • 线宽集。线宽以像素为单位

  • zorder可以设置线的位置,土地覆盖经线,或相反。

  • dashing可以设置dash样式。第一个元素是要绘制的像素数,第二个是要跳过的像素数

  • 更改绘制标签的位置。将值设置为1使得标签在地图的所选边上绘制。四个位置是[左,右,上,下]

>>> map = Basemap(projection='aeqd',
>>>               lon_0=0.0, lat_0=0,
>>>               width=25000000, height=25000000)
>>>
>>> map.drawmeridians(range(0, 360, 20))
>>>
>>> plt.show()
_images/basemap-background_17_0.png

9.2.8. parallels

在地图上绘制纬线。

drawparallels(circles, color=’k’, linewidth=1.0, zorder=None, dashes=[1, 1], labels=[0, 0, 0, 0], labelstyle=None, fmt=’%g’, xoffset=None, yoffset=None, ax=None, latmax=None, **kwargs)
  • rallels是要绘制的纬度的列表。如果值是整数,则可以使用range()创建。如果你需要浮点数,np.arange()是一个不错的选择。

  • color设置线的颜色。

  • 线宽集,当然,线宽以像素为单位

  • order可以设置线的位置,以便能够例如使得平面覆盖纬线或相反。

  • 设置dashing样式。第一个元素是要绘制的像素数,第二个是要跳过的像素数。

  • 标签更改绘制标签的位置。将值设置为1使得标签在地图的所选边上绘制。四个位置是[左,右,上,下]。

>>> map = Basemap(projection='poly',
>>>               lon_0=0.0, lat_0=0,
>>>               llcrnrlon=-80.,llcrnrlat=-40,urcrnrlon=80.,urcrnrlat=40.)
>>>
>>> map.drawmapboundary(fill_color='aqua')
>>> map.fillcontinents(color='coral',lake_color='aqua')
>>> map.drawcoastlines()
>>>
>>> map.drawparallels(range(-90, 100, 10), linewidth=2, dashes=[4, 2], labels=[1,0,0,1], color='r', zorder=0 )
>>> plt.show()
_images/basemap-background_19_0.png

9.2.9. Drawrivers

从库中包含的图层绘制河流。

drawrivers(linewidth=0.5, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
  • 线宽集。线宽以像素为单位

  • linestyle设置线型。默认情况下是固体,也可以是虚线,或任何matplotlib选项

  • 颜色默认为k(黑色)。还遵循matplotlib约定

  • 抗锯齿默认为true

  • zorder设置图层位置。默认情况下,顺序由Basemap设置

注意:

分辨率是固定的,不依赖于传递给类构造函数的分辨率参数。

>>> map = Basemap(llcrnrlon=-93,llcrnrlat=40,urcrnrlon=-75,urcrnrlat=50,
>>>              resolution='i', projection='tmerc', lat_0 = 40., lon_0 = -80)
>>>
>>> map.drawmapboundary(fill_color='aqua')
>>> map.fillcontinents(color='#ddaa66', lake_color='#0000ff')
>>>
>>> map.drawcountries()
>>> map.drawrivers(color='#0000ff')
>>>
>>> plt.show()
---------------------------------------------------------------------------

ProjError                                 Traceback (most recent call last)

<ipython-input-17-34e66ecf8dc2> in <module>
----> 1 map = Basemap(llcrnrlon=-93,llcrnrlat=40,urcrnrlon=-75,urcrnrlat=50,
      2              resolution='i', projection='tmerc', lat_0 = 40., lon_0 = -80)
      3
      4 map.drawmapboundary(fill_color='aqua')
      5 map.fillcontinents(color='#ddaa66', lake_color='#0000ff')


/usr/lib/python3/dist-packages/mpl_toolkits/basemap/__init__.py in __init__(self, llcrnrlon, llcrnrlat, urcrnrlon, urcrnrlat, llcrnrx, llcrnry, urcrnrx, urcrnry, width, height, projection, resolution, area_thresh, rsphere, ellps, lat_ts, lat_1, lat_2, lat_0, lon_0, lon_1, lon_2, o_lon_p, o_lat_p, k_0, no_rot, suppress_ticks, satellite_height, boundinglat, fix_aspect, anchor, celestial, round, epsg, ax)
   1129             # replace coastsegs with line segments (instead of polygons)
   1130             self.coastsegs, types =\
-> 1131             self._readboundarydata('gshhs',as_polygons=False)
   1132         # create geos Polygon structures for land areas.
   1133         # currently only used in is_land method.


/usr/lib/python3/dist-packages/mpl_toolkits/basemap/__init__.py in _readboundarydata(self, name, as_polygons)
   1410                                     # transformation from lat/lon to
   1411                                     # map projection coordinates.
-> 1412                                     bx, by = self(blons, blats)
   1413                                     if not as_polygons or len(bx) > 4:
   1414                                         polygons.append(list(zip(bx,by)))


/usr/lib/python3/dist-packages/mpl_toolkits/basemap/__init__.py in __call__(self, x, y, inverse)
   1190             except TypeError:
   1191                 y = [_dg2rad*yy for yy in y]
-> 1192         xout,yout = self.projtran(x,y,inverse=inverse)
   1193         if self.celestial and inverse:
   1194             try:


/usr/lib/python3/dist-packages/mpl_toolkits/basemap/proj.py in __call__(self, *args, **kw)
    291             outxy = self._proj4(xy, inverse=inverse)
    292         else:
--> 293             outx,outy = self._proj4(x, y, inverse=inverse)
    294         if inverse:
    295             if self.projection in ['merc','mill','gall']:


/usr/lib/python3/dist-packages/pyproj/proj.py in __call__(self, longitude, latitude, inverse, errcheck, radians)
    180         else:
    181             direction = TransformDirection.FORWARD
--> 182         return self.transform(
    183             xx=longitude,
    184             yy=latitude,


/usr/lib/python3/dist-packages/pyproj/transformer.py in transform(self, xx, yy, zz, tt, radians, errcheck, direction)
    486             intime = None
    487         # call pj_transform.  inx,iny,inz buffers modified in place.
--> 488         self._transformer._transform(
    489             inx,
    490             iny,


pyproj/_transformer.pyx in pyproj._transformer._Transformer._transform()


ProjError: x, y, z, and time must be same size

9.2.10. drawstates

从库包括的图层中绘制北美州界。也可以绘制澳大利亚州的边界。

drawstates(linewidth=0.5, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
  • 线宽集,当然,线宽以像素为单位

  • linestyle设置线型。默认情况下是固体,也可以是虚线,或任何matplotlib选项

  • 颜色默认为k(black)。还遵循matplotlib约定

  • 抗锯齿默认为true

  • zorder设置图层位置。默认情况下,顺序由Basemap设置

注意:

  • 分辨率是固定的,不依赖于传递给类构造函数的分辨率参数

  • 国家边框未绘制,如果方法不与绘图帐户一起使用,将创建一个奇怪的效果

>>> map = Basemap(width=12000000,height=9000000,
>>>             rsphere=(6378137.00,6356752.3142),\
>>>             resolution='l',area_thresh=1000.,projection='lcc',\
>>>             lat_1=45.,lat_2=55,lat_0=50,lon_0=-107.)
>>>
>>> map.drawmapboundary(fill_color='aqua')
>>> map.fillcontinents(color='#ddaa66', lake_color='aqua')
>>>
>>> map.drawcountries()
>>> map.drawstates(color='0.5')
>>>
>>> plt.show()

9.2.11. etopo

从NOAA取得etopo来绘制一个浮雕图像。图像具有1英寸的弧度分辨率,因此在放大时,结果相当差。

etopo(ax=None, scale=None, **kwargs)
  • 该比例对于降低原始图像分辨率以加速处理是有用的。值为0.5将图像的大小除以4

  • 图像被扭曲到最终投影,所以所有projectinos使用此方法正常工作

>>> map = Basemap(llcrnrlon=-10.5,llcrnrlat=33,urcrnrlon=10.,urcrnrlat=46.,
>>>              resolution='i', projection='cass', lat_0 = 39.5, lon_0 = 0.)
>>>
>>> map.etopo()
>>>
>>> map.drawcoastlines()
>>>
>>> plt.show()

9.2.12. Fillcontinents

用大陆绘制填充多边形。

fillcontinents(color=‘0.8’, lake_color=None, ax=None, zorder=None, alpha=None)
  • 颜色设置成大陆颜色。默认情况下是gry颜色。

  • 湖色设置湖的颜色。默认情况下不绘制湖的颜色,但您可以设置其值为aqua,进而将其绘制为蓝色。

  • alpha是从0到1的值以设置透明度

  • zorder设置层的位置。它可以用于隐藏(或显示)contourf图层,应该只在海上,例如

>>> map = Basemap(projection='ortho', lat_0=0, lon_0=0)
>>>
>>> # Fill the globe with a blue color
>>> map.drawmapboundary(fill_color='aqua')
>>> #Fill the continents with the land color
>>> map.fillcontinents(color='coral',lake_color='aqua')
>>>
>>> map.drawcoastlines()
>>>
>>> plt.show()
_images/basemap-background_27_0.png