前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Basemap系列教程:背景方法

Basemap系列教程:背景方法

作者头像
bugsuse
发布2020-04-21 17:42:45
3.1K0
发布2020-04-21 17:42:45
举报
文章被收录于专栏:气象杂货铺气象杂货铺

使用背景方法可以绘制用户数据到地图。这些方法对于绘制 borders,lands等是非常有用的。下面我们就来介绍一下这些内容。

arcgisimage

使用 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)

  • 使用相同的 REST API 可以连接两个不同的服务器。
  • service 类图层用于绘图。获取所有图层列表可查看 [注1] 链接。
  • xpixels 用于控制图像的缩放。值越大获取的图像也越大,将能看到图像更多的细节。因此,当放大到足够大时, xsize应该也要足够大,才能保证分辨率。
  • ypixels 控制图像在 y 方向的像素数,从而来定义宽高比(aspect ratio)。默认值已经比较合适。
  • dpi 是在输出设备上图像的分辨率。改变其值将改变像素数,而不是缩放等级。
  • verbose 用于控制打印所获取的远程图像的链接。debug 时很有用。

非常重要的一点是:当使用此方法时必须使用 epsg 参数设置投影,除非使用 4326 或 Basemap 中的 cyl。关于投影的设置可以查看 Basemap系列教程:管理投影 部分。

代码语言:javascript
复制
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

在地图上绘制 bluemarble 图像。[注2]

bluemarble(ax=None, scale=None, **kwargs)

  • scale 参数对于降低图像分辨率提高速度是非常有用的。取值为 0.5 时图像将被分为4份。
  • 图像会适应所选投影。因此,对于所有的投影方式此方法均有用。
代码语言:javascript
复制
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

绘制海岸线。

drawcoastlines(linewidth=1.0, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)

  • linewidth 设置线宽
  • linestyle 设置线形。默认为 solid,可以是 dash,也可以是 matplotlib 其它选项。
  • color 设置颜色。默认为 black(k)。
  • antialiased 抗锯齿选项。默认为 True
  • zorder 设置图层位置。默认情况下由 Basemap 设置。
代码语言:javascript
复制
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

map = Basemap()

map.drawcoastlines()

plt.show()
plt.savefig('test.png')

drawcounties

绘制 USA counties。

drawcounties(linewidth=0.1, linestyle=’solid’, color=’k’, antialiased=1, facecolor=’none’, ax=None, zorder=None, drawbounds=False)

  • linewidth 设置线宽
  • linestyle 设置线形。默认为 solid,可以是 dash,也可以是 matplotlib 其它选项。
  • color 设置颜色。默认为 black(k)。
  • antialiased 抗锯齿选项。默认为 True
  • zorder 设置图层位置。默认情况下由 Basemap 设置。

译注

  • facecolor 设置表面颜色
  • ax 可设置axes实例从而指定绘制的axes
  • drawbounds 是否绘制边界线

注意:

facecolor 支持 counties 的颜色,但在最近的一些版本中可能不支持。

注意

  • resolution 被固定了,传递给构造器的 resolution 参数的值不会影响此函数使用的数据的精度。
  • 海岸线的添加需要其它函数。乡村的海岸并不是通常所说的海岸,因此要绘制更好的地图需要结合其它函数。
代码语言:javascript
复制
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

绘制国家边界线。

drawcountries(linewidth=1.0, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)

  • linewidth 设置线宽
  • linestyle 设置线形。默认为 solid,可以是 dash,也可以是 matplotlib 其它选项。
  • color 设置颜色。默认为 black(k)。
  • antialiased 抗锯齿选项。默认为 True
  • zorder 设置图层位置。默认情况下由 Basemap 设置。

注意:

  • resolution 表明,当创建 Basemap 实例时会产生具有更好或粗糙分辨率的图层
  • 海岸线的添加需要其它函数。乡村的海岸并不是通常所说的海岸,因此必须结合其它函数来绘制更好的地图。
代码语言:javascript
复制
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()

没有绘制海岸线,结果看起来很奇怪。

drawlsmask

一次性绘制 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)

  • land_color 设置 land 颜色(默认为 gray)
  • ocean_color 设置 ocean 颜色(默认为 white)
  • lsmask : mask 数组。 0表示 ocean,1表示land,2表示lake和pond。默认为 None,即使用默认的 5 minutes mask 数据。
  • lsmask_lons :lsmask 数组需要的经度信息(译注:一维数组,必须由-180 W向东)
  • lsmask_lats : lsmask是数组需要的纬度信息(译注:一维数组,必须由 -90S向北)
  • resolution 可以改变 Basemap 实例定义的海岸线数据精度
  • grid 表示 mask 数组网格精度。默认为 5 minutes。译注:其余可选值为10,2.5,1.25
代码语言:javascript
复制
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

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

drawmapboundary(color=’k’, linewidth=1.0, fill_color=None, zorder=None, ax=None)

  • linewidth 设置线宽
  • color 设置颜色。默认为 black(k)。
  • face_color 设置填充全球的颜色。默认为 None。
  • zorder 设置图层位置。默认情况下由 Basemap 设置。
代码语言:javascript
复制
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

在地图上绘制子午线,即绘制经度线。

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)

  • meridians 是要绘制的经度线列表。可以使用 range 函数创建一系列 integer。也可以使用 np.arange 函数创建 float。
  • color 可以设置线的颜色。所有可用颜色可以查看文档。[注3]
  • linewidth 设置线宽
  • zorder 可以设置线的位置。land 可以在线的上面,也可以设置在线下面。
  • dashes 可以设置 dash类型。第一个元素是绘制的点数,第二个元素是跳过的点数。
  • label 可以改变要添加的 label 的位置。设置为 1 可以将 label 绘制在所选地图的边缘。四个位置是[left,right,top,bottom]
代码语言:javascript
复制
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

在地图上绘制平行线,即纬度线。

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)

  • circles [注4] 是要绘制的纬度列表。可以使用 range 函数创建一系列 integer。也可以使用 np.arange 函数创建 float。
  • color 可以设置线的颜色。所有可用颜色可以查看文档。[注3]
  • linewidth 设置线宽
  • zorder 可以设置线的位置。land 可以在线的上面,也可以设置在线下面。
  • dashes 可以设置 dash类型。第一个元素是绘制的点数,第二个元素是跳过的点数。
  • label 可以改变要添加的 label 的位置。设置为 1 可以将 label 绘制在所选地图的边缘。四个位置是[left,right,top,bottom]
代码语言:javascript
复制
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。

drawrivers

绘制rivers。

drawrivers(linewidth=0.5, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)

  • linewidth 设置线宽
  • linestyle 设置线形。默认为 solid,可以是 dash,也可以是 matplotlib 其它选项。
  • color 设置颜色。默认为 black(k)。
  • antialiased 抗锯齿选项。默认为 True
  • zorder 设置图层位置。默认情况下由 Basemap 设置。

注意:

精度是固定的, Basemap 构造器中的 resolution 参数并不会影响其精度。

代码语言:javascript
复制
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

绘制美国各州的边界,也可以绘制澳大利亚各州的边界。

drawstates(linewidth=0.5, linestyle=’solid’, color=’k’, antialiased=1, ax=None, zorder=None)

  • linewidth 设置线宽
  • linestyle 设置线形。默认为 solid,可以是 dash,也可以是 matplotlib 其它选项。
  • color 设置颜色。默认为 black(k)。
  • antialiased 抗锯齿选项。默认为 True
  • zorder 设置图层位置。默认情况下由 Basemap 设置。

注意:

  • 精度是固定的,不会受到构造器的 resolution 参数设置的影响。
  • 此方法不会绘制国家边界线。因此,如果不和 drawcountries 方法一起使用会有一些奇怪的影响(译注:就是你会看不到 国界线)。
代码语言:javascript
复制
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

使用 etopo 从 NOAA [注5] 获取资源绘制简单的图像。由于图像分辨率低的关系,当放大图像时效果并不会很好。

etopo(ax=None, scale=None, **kwargs)

  • scale 参数对于降低图像分辨率提高速度是非常有用的。取值为 0.5 时图像将被分为4份。
  • 图像会适应所选投影。因此,对于所有的投影方式此方法均有用。
代码语言:javascript
复制
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

填充陆地。

fillcontinents(color=‘0.8’, lake_color=None, ax=None, zorder=None, alpha=None)

  • color 设置为 陆地色。默认颜色为 gray。关于颜色的选项解释可查看文档。[注6]
  • lake 颜色设置为 lake 颜色。默认情况下不绘制 lake,但你可以设置其值为 aqua,从而绘制为蓝色。
  • alpha 是值为 [0 1]的参数,用以设置透明色。
  • zorder 设置图层位置。可以用来隐藏(显示)contourf 图层
代码语言:javascript
复制
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()

shadedrelief

绘制简单的阴影图。源为 www-shadedrelief.com。原始图像的大小为10800x5400。

shadedrelief(ax=None, scale=None, **kwargs)

  • scale 参数对于降低图像分辨率提高速度是非常有用的。取值为 0.5 时图像将被分为4份。原始图像的大小为 10800x5400。
  • 图像会适应所选投影。因此,对于所有的投影方式此方法均有用。
代码语言:javascript
复制
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

显示一个图像作为背景。

warpimage(image=’bluemarble’, scale=None, **kwargs)

  • 默认情况下,显示 NASA Bluemarble 图像。
  • 图像必须是 latlon 投影。因此,x 的大小必须是 y 大小的两倍。
  • 图像必须能覆盖全球,经度要以 -180 起始。
  • 图像大小要重置以适应地图。译注:由于示例脚本中使用了 tmpdir 变量指定了目录,如果你使用的为 windows 系统,你可以更改为相应的目录才可正确运行示例脚本。
代码语言:javascript
复制
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 变量的基础上,还需要更改

代码语言:javascript
复制
import Image

代码语言:javascript
复制
from  PIL import Image

wmsimage

使用 WMS 协议下载并绘制图像。

wmsimage(server, xpixels=400, ypixels=None, format=’png’, verbose=False, **kwargs)

注意:

许多参数没有文档可查,因此使用此方法会比较困难。

  • 使用 REST API 可以连接 server 和另一个 server。
  • xpixels 控制图像的放大。更大的数将会获取更大的图像,可以获得更多的细节。因此,当放大到足够大时, xsize 应该也要足够大以保证分辨率。
  • ypixels 控制图像在 y 方向上有不同的数目的像素,从而来定义宽高比(aspect ratio)。默认值已经比较合适。
  • format 设置从 WMS 服务器获取的图像的格式。通常,可能的值为 png/gif/jpeg。
  • verbose 可以打印从服务器获取的图片的链接。需要进行 debug 时非常有用。可以打印所有的 图层,EPSG代码的投影以及一些其他信息。

仅使用这些参数并不能添加合适的图层。还需要设置一些其它参数:

  • layers 是 WMS要使用的图层的列表。为了获取所有的图层,可以看看 WMS GetCapablities,或设置 verbose = True 打印处这些信息 当图层名中还有空格时,方法将不会起作用,至少目前我没有成功。然而不幸的是大部分服务器提供的图层都含有空格
  • styles 是从WMS服务器获取图层类型的列表。由于服务器设置有默认值,没有此参数同样能够工作。
  • 其它参数,比如date,elevation,colorscale等和WMS标准中规定的具有相同的名称,并且能够完成同样的工作。
  • 使用此方法时非常重要的一点是:投影必须使用 epsg 参数进行设置,除了 4326 或 Basemap 中的 cyl 投影。

注意:

此方法需要 OWSLib。可使用 sudo pip install OWSLib 安装之。

Basemap 测试脚本展示了如何更好的使用此方法。[注7]

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-03-16,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象杂货铺 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • arcgisimage
  • bluemarble
  • drawcoastlines
  • drawcounties
  • drawcountries
  • drawlsmask
  • drawmapboundary
  • drawmeridians
  • drawparallels
  • drawrivers
  • drawstates
  • etopo
  • fillcontinents
  • shadedrelief
  • warpimage
  • wmsimage
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档