使用背景方法可以绘制用户数据到地图。这些方法对于绘制 borders,lands等是非常有用的。下面我们就来介绍一下这些内容。
使用 arcgis REST API 下载并绘制图像。[注1]
arcgisimage(server=’http://server.arcgisonline.com/ArcGIS’, service=’ESRI_Imagery_World_2D’, xpixels=400, ypixels=None, dpi=96, verbose=False, **kwargs)
非常重要的一点是:当使用此方法时必须使用 epsg 参数设置投影,除非使用 4326 或 Basemap 中的 cyl。关于投影的设置可以查看 Basemap系列教程:管理投影 部分。
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
map = Basemap(llcrnrlon=3.75,llcrnrlat=39.75,urcrnrlon=4.35,urcrnrlat=40.15, epsg=5520)
#http://server.arcgisonline.com/arcgis/rest/services
map.arcgisimage(service='ESRI_Imagery_World_2D', xpixels = 1500, verbose= True)
plt.show()
此例使用 Zone 31N UTM投影显示Menorca小岛。默认是 ESRI_Imagery_World_2D 图层,当然也可以使用其它图层。
World_Shaded_Relief 图层
在地图上绘制 bluemarble 图像。[注2]
bluemarble(ax=None, scale=None, **kwargs)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
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()
绘制海岸线。
drawcoastlines(linewidth=1.0, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
map = Basemap()
map.drawcoastlines()
plt.show()
plt.savefig('test.png')
绘制 USA counties。
drawcounties(linewidth=0.1, linestyle=’solid’, color=’k’, antialiased=1, facecolor=’none’, ax=None, zorder=None, drawbounds=False)
译注:
注意:
facecolor 支持 counties 的颜色,但在最近的一些版本中可能不支持。
注意:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
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='#cc9955', lake_color='aqua')
map.drawcounties()
plt.show()
drawbounds = False
drawbounds = True
绘制国家边界线。
drawcountries(linewidth=1.0, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
注意:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
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()
没有绘制海岸线,结果看起来很奇怪。
一次性绘制 lakes,land 和 oceans 的方法,避免使用 fillcontinents 和 drawmapboundary 方法。除此之外,还可以改变原数据自定义点数组。
与其它方法的差异是,此方法不能设置 zorder 参数。
drawlsmask(land_color=‘0.8’, ocean_color=’w’, lsmask=None, lsmask_lons=None, lsmask_lats=None, lakes=True, resolution=’l’, grid=5, **kwargs)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
map = Basemap(projection='ortho',
lat_0=0, lon_0=0)
map.drawlsmask(land_color = "#ddaa66",
ocean_color="#7777ff",
resolution = 'l')
plt.show()
在地图上绘制地球边界。可选择填充。
drawmapboundary(color=’k’, linewidth=1.0, fill_color=None, zorder=None, ax=None)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
plt.figure(0)
map = Basemap(projection='ortho',lon_0=0,lat_0=0,resolution='c')
map.drawmapboundary()
plt.figure(1)
map = Basemap(projection='sinu',lon_0=0,resolution='c')
map.drawmapboundary(fill_color='aqua')
plt.show()
Orthographic projection
Sinusoidal Projection
在地图上绘制子午线,即绘制经度线。
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)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
map = Basemap(projection='aeqd',
lon_0=0.0, lat_0=0,
width=25000000, height=25000000)
map.drawmeridians(range(0, 360, 20))
plt.show()
此例展示了使用此函数的简单方法,更复杂的使用可以参考 drawparallels 方法。
在地图上绘制平行线,即纬度线。
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)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
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()
此例展示了一些高级用法,比如 labels 和 zorder。
绘制rivers。
drawrivers(linewidth=0.5, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
注意:
精度是固定的, Basemap 构造器中的 resolution 参数并不会影响其精度。
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
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()
# 原文中颜色为 '#0000ff',此处改为 'g'
map.drawrivers(color='g')
plt.show()
绘制美国各州的边界,也可以绘制澳大利亚各州的边界。
drawstates(linewidth=0.5, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)
注意:
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
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.drawcoastlines(color = 'b')
map.drawcountries()
map.drawstates(color='0.5')
plt.show()
使用 etopo 从 NOAA [注5] 获取资源绘制简单的图像。由于图像分辨率低的关系,当放大图像时效果并不会很好。
etopo(ax=None, scale=None, **kwargs)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
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()
填充陆地。
fillcontinents(color=‘0.8’, lake_color=None, ax=None, zorder=None, alpha=None)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
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()
绘制简单的阴影图。源为 www-shadedrelief.com。原始图像的大小为10800x5400。
shadedrelief(ax=None, scale=None, **kwargs)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
map = Basemap(llcrnrlon=-10.5,llcrnrlat=33,urcrnrlon=10.,urcrnrlat=46.,
resolution='i', projection='cass', lat_0 = 39.5, lon_0 = 0.)
map.shadedrelief()
map.drawcoastlines()
plt.show()
显示一个图像作为背景。
warpimage(image=’bluemarble’, scale=None, **kwargs)
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
import Image
map = Basemap(projection='ortho',
lat_0=0, lon_0=0)
tmpdir = '/tmp'
size = [600, 300]
im = Image.open("../sample_files/by.png")
im2 = im.resize(size, Image.ANTIALIAS)
im2.save(tmpdir+'/resized.png', "PNG")
map.warpimage(tmpdir+'/resized.png')
map.drawcoastlines()
plt.show()
译注:如果你使用的 python2.x,在改变 tmpdir 变量的基础上,还需要更改
import Image
为
from PIL import Image
使用 WMS 协议下载并绘制图像。
wmsimage(server, xpixels=400, ypixels=None, format=’png’, verbose=False, **kwargs)
注意:
许多参数没有文档可查,因此使用此方法会比较困难。
仅使用这些参数并不能添加合适的图层。还需要设置一些其它参数:
注意:
此方法需要 OWSLib。可使用 sudo pip install OWSLib 安装之。
Basemap 测试脚本展示了如何更好的使用此方法。[注7]
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
map = Basemap(llcrnrlon=8.35,llcrnrlat=41.225,urcrnrlon=10.01,urcrnrlat=43.108,
projection='cyl', epsg=4326)
wms_server = "http://www.ga.gov.au/gis/services/topography/Australian_Topography/MapServer/WMSServer"
wms_server = "http://wms.geosignal.fr/metropole?"
map.wmsimage(wms_server, layers=["Communes", "Nationales", "Regions"], verbose=True)
plt.show()
地图数据的源在 http://www.geosignal.org,可以找到很多法国的图层。
注1:http://server.arcgisonline.com/arcgis/rest/services
注2:http://visibleearth.nasa.gov/
注3:http://matplotlib.org/api/colors_api.html
注4:原文此处为 parallels,此处译为 circles 从而与 circles 参数对应。
注5:https://www.ngdc.noaa.gov/mgg/global/global.html
注6:http://matplotlib.org/api/colors_api.html
注7:
https://github.com/matplotlib/basemap/blob/master/examples/testwmsimage.py