专栏首页气象杂货铺Basemap工具函数(1)

Basemap工具函数(1)

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

本文分享自微信公众号 - 气象杂货铺(meteogs),作者:lightning

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Basemap系列教程:使用shapefiles绘制地图

    译注:绘制地图时因为一些原因可能需要使用shapefile添加地图信息,比如很多软件中的关于中国的地图信息都不是很准确,当要明确标注中国边界信息时就会出问题。这...

    bugsuse
  • Basemap系列教程:绘制子图及小地图

    使用 matplotlib 中的 subplots 可以在同一个 figure 中绘制多个地图。有几种方法可以实现这种图形的绘制,而且根据所绘图形的复杂性来选择...

    bugsuse
  • Basemap系列教程:绘图

    (1) reduce_C_function 参数用于显示每一个 bin 的最大值,从而代替平均值

    bugsuse
  • Arcgis for JS之地图自适应调整

    概述:本节讲述的内容为当浏览器大小发生变化或者地图展示区域的大小发生变化时,地图的自适应调整。地图的自适应常见于以下几种情况:1、系统中有收缩或者全屏的按钮;2...

    lzugis
  • Go 语言基础--map 浅析

    map通常是一种无序键值对的集合,map存在的意义主要是利用map的结构根据key来快速检索数据,在go中也是这样的。 map 也是一种集合,我们可以像遍历数...

    邹志全
  • Go语言:map使用笔记

    Go 的 map 是 hash map; C++ 的 map 是 tree (主流实现是红黑树); C++ 的 hash map 是unordered_ma...

    linjinhe
  • java面试必知必会遍历map键值对的四种方式

    Map结构是一个键值对结构形式的集合,在平时的使用中也很常见,历史文章数据很早就写过使用map并发控制进行业务场景的处理,翻看历史文章就可找到。

    后端Coder
  • 程序eclipse下run和debug不一致问题

        公司核心代码,这里不上了,主要将如何发现问题、如何排查问题和如何解决问题。

    尚浩宇
  • python3的一个奇怪设计--map

    这个改动真是太不正常了,ruby、js和lisp都没这么干的。我也没搞懂这样做有什么好处?

    py3study
  • Basemap系列教程:使用shapefiles绘制地图

    译注:绘制地图时因为一些原因可能需要使用shapefile添加地图信息,比如很多软件中的关于中国的地图信息都不是很准确,当要明确标注中国边界信息时就会出问题。这...

    bugsuse

扫码关注云+社区

领取腾讯云代金券