前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Basemap系列教程之基本函数

Basemap系列教程之基本函数

作者头像
bugsuse
发布2020-04-20 13:34:18
2.8K0
发布2020-04-20 13:34:18
举报
文章被收录于专栏:气象杂货铺气象杂货铺

在地图上绘制一个点

通常使用 plot 方法在地图上添加一个点:

代码语言: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.drawcoastlines()

x, y = map(0, 0)

map.plot(x, y, marker='D',color='m')

plt.show()
  • 当已知点的经纬度坐标时,使用Basemap实例计算点在地图坐标中的位置 如果 latlon 参数设置为 True,x 和 y 将被解释为以 度 为单位的经纬度坐标,这在以前的版本中是不支持的。
  • plot 方法需要在地图坐标中 x 和 y 的位置,marker 及 color 1)默认情况下为marker 为 point [注1] 2)默认情况下 color 为 black(k) [注2]

当你要添加多个点到地图中时,scatter 方法可能会更好一些。

代码语言: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.drawcoastlines()

lons = [0, 10, -20, -20]
lats = [0, -10, 40, -20]

x, y = map(lons, lats)

map.scatter(x, y, marker='D',color='m')

plt.show()
  • 可以传递 list 给 Basemap实例进行,而且坐标转换是一次完成的
  • scatter 方法的格式选项和 plot 是相同的

绘制栅格数据

主要有两种方法绘制栅格,contour/contourf 绘制等值线或填充等值线图,pcolor/pcolormesh 绘制伪彩色图。

contourf

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

map.contourf(xx, yy, data)

plt.show()
  • 使用和栅格文件相同的数据范围创建地图
  • 绘图之前,有两个矩阵必须创建。即和 data 矩阵每个点相对应的 x 和 y 坐标点 linspace 是 numpy 中的函数,可以在 起始点 和 终止点 之间创建 n 个元素。在此例中,地图坐标从 0 到 map.urcrnrxmap.urcrnry, 和 data 数组 data.shape[1] data.shape[0] 拥有相同的大小 meshgrid 是numpy 中的函数,用两个数组创建一个矩阵,这是绘图所需要的,其中 x 以列重复,y 以行重复
  • contourf 利用 x,y 及 data 矩阵使用默认的 colormap (jet)进行绘图,并且进行自动分级
  • 可通过传递相应的参数进行等级划分,可以在 contour 部分中看到划分方式,主要使用两种方式划分 1)一个整数表明所划分的等级数。data 数组的极端值表示 color scale 的极端值 2)列表中的值对应每一层。使用 range 函数可以很方便的设置,例如 range(0, 3000, 100) 表示每 100 个单位设置1层

contour

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

cs = map.contour(xx, yy, data, range(400, 1500, 100), cmap = plt.cm.cubehelix)
plt.clabel(cs, inline=True, fmt='%1.0f', fontsize=12, colors='k')

plt.show()
  • 数据与 contourf 个例中的数据相同
  • 使用 range 函数设置等级。采用高度设置,即从400 m 到 1400 m,每隔100 m 设置一个等值线
  • colormap 并没有使用默认的 jet。可以通过传递 cmap 参数给 cubehelix colormap 设置
  • 通常使用 contour 方法时需要设置label,但 contourf 方法不需要设置 1) inline 控制是否移除 label 下的线,默认为 True, 如果设为 False,则图中数字中会出现一条线 2)fmt 用于格式化数字 3) fontsize 设置 label 字体的大小 4)color 用于设置label 的颜色。 默认每一个label的颜色和等值线颜色相同

pcolormesh

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

map.pcolormesh(xx, yy, data)

plt.show()
  • 数据使用的是 contourf 例子中的数据
  • colormap 使用的是 contour 例子中的colormap

注意:

pcolor 和 pcolormesh 非常相似。

计算地图上点的位置

代码语言:javascript
复制
from mpl_toolkits.basemap import Basemap
import matplotlib.pyplot as plt

# 投影方式可以更改
map = Basemap(projection='aeqd', lon_0 = 10, lat_0 = 50)

print map(10, 50)
print map(20015077.3712, 20015077.3712, inverse=True)

输出为:

(20015077.3712, 20015077.3712)

(10.000000000000002, 50.000000000000014)

当 inverse 为 False时, 输入点为经纬度坐标,输出是地图坐标中的点, 当inverse 为 True 时,则相反。

注1:http://matplotlib.org/api/markers_api.html

注2:http://matplotlib.org/api/colors_api.html

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

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

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

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

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