首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Basemap工具函数(1)

Basemap工具函数(1)

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

addcyclic

添加一个经度值到经度数组中,并且添加一列值到数据数组中。当数据覆盖全部经度时,非常有利于添加缺省值。

mpl_toolkits.basemap.addcyclic(arrin, lonsin)

  • 这不是一个 Basemap 方法,而是一个独立函数。
  • arrin 是输入数据。添加一列数据到 arrin 数组中以填充经度 -180 到 180 之间的空隙。
  • losin 是包含经度的一维数组
from mpl_toolkits.basemap import Basemap
from mpl_toolkits.basemap import addcyclic
import matplotlib.pyplot as plt
import numpy as np

map = Basemap(projection='sinu', 
              lat_0=0, lon_0=0)

lons = np.arange(30, 390, 30)
lats = np.arange(0, 100, 10)

data = np.indices((lats.shape[0], lons.shape[0]))
data = data[0] + data[1]

data , lons = addcyclic(data, lons)

# 注意输出变量的顺序,经度,数据
lons, data = map.shiftdata(lons, datain = data, lon_0=0)

llons, llats = np.meshgrid(lons, lats)

x, y = map(llons, llats)

map.contourf(x, y, data)

map.drawcoastlines()
plt.show()

译注:

去除下列语句后

data , lons = addcyclic(data, lons)

可以得到下图

与之前的图相比,可以看出缺失了一部分数据,而这部分数据就是使用 addcyclic 函数添加的。

从上图中可以看出,执行 addcyclic 函数后,lons 数组多了 390 ,这就是为了使全球构成一个循环而添加的,390 与 30 代表同一个点。

data 数组中添加了灰线标记的一列。这一列和data数组的第一列是相同的。

colorbars

添加 colorbar,效果类似于 matplotlib 中的 colorbar。

colorbar(mappable=None, location=’right’, size=‘5%’, pad=‘2%’, fig=None, ax=None, **kwargs)

  • mappable 是一个非常重要的参数。在地图上的字段可以使用 colorscale 来解释。其值可以是 contourf,pcolormesh,contour 等。如果为 None,将呈现最后绘制的字段。
  • location 表示 color scale 将被绘制的位置。可以是 top,bottom,left,right。
  • size 以parent axis百分比的形式设置 colorbar 的宽度。默认值为 5%。
  • pad 同样以 parent axis 百分比的形式设置 colorbar 和 axes 之间的间隔。
  • fig 表示和 colorbar 相关的 figure
  • ax 表示要设置 colorbar 的 axes (译注

大部分 matplotlib.colorbar 的参数均可使用,比如 label

colorbar 函数会返回一个对象,其具有一些有趣的方法:

  • add_lines 添加 lines 到 colorbar
  • set_ticks 可以改变 colorbar 上 ticks 和 labels 的位置
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt
from osgeo import gdal
from numpy import linspace
from numpy import meshgrid

map = Basemap(projection='tmerc', 
              lat_0=0, lon_0=3,
              llcrnrlon=1.819757266426611, 
              llcrnrlat=41.583851612359275, 
              urcrnrlon=1.841589961763497, 
              urcrnrlat=41.598674173123)

ds = gdal.Open("../sample_files/dem.tiff")
data = ds.ReadAsArray()

x = linspace(0, map.urcrnrx, data.shape[1])
y = linspace(0, map.urcrnry, data.shape[0])

xx, yy = meshgrid(x, y)

cmap = plt.get_cmap('PiYG')

colormesh = map.pcolormesh(xx, yy, data, vmin = 500, vmax = 1300, cmap=cmap)
contour = map.contour(xx, yy, data, range(500, 1350, 50), colors = 'k', linestyles = 'solid')

map.colorbar(colormesh)
cb = map.colorbar(colormesh, location='bottom', label="contour lines")

cb.add_lines(contour)
cb.set_ticks([600, 760, 1030, 1210])

plt.show()
  • 可以绘制 colormesh 和 contourf 场。能够使用一些高级 colorbar 属性。
  • 第一个 colorbar (27行)。展示了默认使用的 colorbar。pcolormesh 作为参数被传递给 colorbar,从而强制此方法绘制 pcolormesh fields 以代替 contour fields。
  • 第二个 colorbar 使用了更多的参数 1)位置改为 bottom 2)设置 label 3) 使用 add_lines 方法添加 colorbar,从而同时显示 pcolormesh 和 contour 场 4) 随机设置 tick 以展示如何改变 tick

查看 hexbin 示例可以得到如何设置对数刻度的信息。

drawmapscale

在指定位置添加地图比例尺。

drawmapscale(lon, lat, lon0, lat0, length, barstyle=’simple’, units=’km’, fontsize=9, yoffset=None, labelstyle=’simple’, fontcolor=’k’, fillcolor1=’w’, fillcolor2=’k’, ax=None, format=’%d’, zorder=None)

  • lon 和 lat 表示比例尺在地图上的位置。在地理坐标系中使用会有一个问题,就是比例尺无法放到地图外
  • lon0 和 lat0 表示要计算比例尺的点
  • length 表示比例尺上呈现的千米数
  • barstyle 表示比例尺的类型。可以是 'simple' 或 'fancy'。此例中展示了这两种类型
  • units 表示比例尺中使用的单位。默认是 km
  • fontsize 可以改变比例尺上单位的大小
  • fontcolor 设置比例尺上单位的颜色
  • yoffset 控制比例尺的高度。默认是地图高度的 0.02 倍。但在有些版本中可能会出问题。
  • fillcolor1 和 fillcolor2 用以设置当 labelstyle 为 'fancy' 时比例尺的颜色
  • format 设置比例尺上数字格式

注意:

默认的 cyl 投影无法使用此方法。[注1]

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

map = Basemap(llcrnrlon=-10.5,llcrnrlat=35,urcrnrlon=4.,urcrnrlat=44.,
             resolution='i', projection='tmerc', lat_0 = 39.5, lon_0 = -3.25)

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='#cc9955',lake_color='aqua')
map.drawcoastlines()

map.drawmapscale(-7., 35.8, -3.25, 39.5, 500, barstyle='fancy')

map.drawmapscale(-0., 35.8, -3.25, 39.5, 500, fontsize = 14)

plt.show()

译注:

由下图可以看出,cyl投影不支持设置比例尺。(python 2.7 ,basemap 1.0.7)

gcpoints

沿着给定两个坐标点的线计算 n 个点。

gcpoints(lon1, lat1, lon2, lat2, npoints)

  • lon1 和 lat1 是地理坐标系中的起始点
  • lon2 和 lat2 是地理坐标系中的终止点
  • npoints 表示要计算的点数

注意:

要绘制大圆圈时,greatcircle 函数很容易使用。当使用 greatcircle 函数绘制出问题时, gcpoints 函数会很有用,尤其是获取点时。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

map = Basemap(projection='merc', 
              lat_0=0, lon_0=0,
              llcrnrlon=-20.,llcrnrlat=0.,urcrnrlon=180.,urcrnrlat=80.)

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()

x, y = map.gcpoints(2.3, 48.9, 139.7, 35.6, 300)

print x, y

map.plot(x, y)
plt.show()

greatcircle

当传递两个球上的点给函数时,将会绘制最大的圆。[注2]

drawgreatcircle(lon1, lat1, lon2, lat2, del_s=100.0, **kwargs)

  • lon1 和 lat1 是地理坐标系中的起始点
  • lon2 和 lat2 是地理坐标系中的终止点
  • del_s 表示大圆上两点之间的距离(km)。默认为 100
  • linewidth 设置线宽
  • color 设置线的颜色

注意:

如果起始及终止点坐标不能覆盖全球的话(比如经度以 -179开始,179结束。),此函数无法很好的解决此问题。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

map = Basemap(projection='merc', 
              lat_0=0, lon_0=0,
              llcrnrlon=-20.,llcrnrlat=0.,urcrnrlon=180.,urcrnrlat=80.)

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()

map.drawparallels(range(0, 90, 20))
map.drawmeridians(range(0, 180, 20))

#Paris-Tokyo
map.drawgreatcircle(2.3, 48.9, 139.7, 35.6,linewidth=2,color='r')
#Tokyo-Dubai
map.drawgreatcircle(139.7, 35.6, 55.2, 25.,linewidth=2,color='r')
#Dubai-Paris
map.drawgreatcircle(55.2, 25., 2.3, 48.9,linewidth=2,color='r')

plt.show()

当使用 Mercator 投影时,经纬度线将是直线,但绘制的大圆的线不是。

from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

map = Basemap(projection='gnom', 
        width=15.e6,height=15.e6,
              lat_0=70, lon_0=80)

map.drawmapboundary(fill_color='aqua')
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()

map.drawparallels(range(0, 90, 20))
map.drawmeridians(range(0, 360, 20))

#Paris-Tokyo
map.drawgreatcircle(2.3, 48.9, 139.7, 35.6,linewidth=2,color='r')
#Tokyo-Dubai
map.drawgreatcircle(139.7, 35.6, 55.2, 25.,linewidth=2,color='r')
#Dubai-Paris
map.drawgreatcircle(55.2, 25., 2.3, 48.9,linewidth=2,color='r')

plt.show()

对于gnomonic 投影,大圆的线在任何方向都是直线。


注1:https://sourceforge.net/p/matplotlib/mailman/message/23863531/

注2: great circle https://en.wikipedia.org/wiki/Great_circle

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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • addcyclic
  • colorbars
  • drawmapscale
  • gcpoints
  • greatcircle
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档