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

Basemap系列:管理投影

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

所有的地图都拥有一个投影。投影方式及其特征在Basemap对象创建时确定。这种方式和其他库(比如 GDAL)的做法具有很大不同。

投影

使用 projection 参数设置投影:

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

map = Basemap(projection='cyl')

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

plt.show()

默认值是 cyl 或 Cylindrical Equidistant projection,也是常说的 Equirectangular projectionPlate Carrée。

许多投影需要设置额外的参数:

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

map = Basemap(projection='aeqd', lon_0 = 10, lat_0 = 50)

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

plt.show()

现在地图是以经度=10,纬度=50为中心的等距投影。有些投影需要更多的参数设置,而且想要绘制更好的地图也需要设置很多参数进行地图的构建。更多参数的设置可以查看官方文档。

使用 epsg 设置投影

EPSG代码是一种使用数值代码命名投影的标准。Basemap允许使用这一准则创建地图,但仅适用于特定情况。使用这种方式设置投影时可传递 epsg 参数给 Basemap 构造器。

Basemap支持的epsg代码在 <python_packages_path>/mpl_toolkits/basemap/data/epsg 文件中。尽管epsg代码在文件中,但有时还是会出现一些问题。

ValueError: 23031 is not a supported EPSG code

‘utm’类投影(例如: 20231 或15831)并没有得到很好的支持,但 tmerc 可以使用。

下例展示了使用 UTM(zone 31N)投影的 Menorca 小岛:

代码语言: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, resolution = 'h', epsg=5520)

map.drawmapboundary(fill_color='aqua')
#Fill the continents with the land color
map.fillcontinents(color='coral',lake_color='aqua')
map.drawcoastlines()
plt.show()

扩展

目前为止,所采用的例子均采用了全球地图。仅绘制区域地图时可通过设置边界框或设置地图中心及大小完成。官方文档中表明两种方式都可使用,但也有一些意外情况。

注意:使用 cyl,merc,mill,cea 和 gall投影,默认的corners为-180, -90, 180, 90(即全球范围)。对于其它投影需要使用下面三种方法之一进行设置。

设置边界框

代码语言:javascript
复制
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='coral',lake_color='aqua')
map.drawcoastlines()

plt.show()

左下角和右上角均传递了参数,而且以经纬度为单位,非地图单位。这就是为什么有些投影会失败的原因,因为有些以经纬度设置的方形框在投影单位中不会给出一个适合的边界框。

在此例中,使用的是 UTM (Transverse Mercator)投影。使用边界框方法绘制区域图是比较容易的,因为从地图中心以 UTM单位计算宽度是非常困难的。

注意:

使用 sinu,moll,hammer,npstere,spstere,nplaea,splaea,npaeqd,spaeqd,robin,eck4,kav7或mbtfpq投影时,上述方法无法使用。因为绘制全球地图时无法使用或是无法由地理坐标计算区域地区的延伸范围。

在地图坐标中设置边界框

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

map = Basemap(resolution='l', 
              satellite_height=3000000.,
              projection='nsper', 
              lat_0 = 30., lon_0 = -27.,
              llcrnrx=500000.,llcrnry=500000.,urcrnrx=2700000.,urcrnry=2700000.
             )

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

plt.show()

一些投影可以使用地图坐标设置区域地图范围。投影参数必须要设置(中心点),绘制区域要为全球地图的一部分。

注意:只有ortho,geos 和 nsper投影可以使用此方法设置地图范围。

设置中心,宽度和高度

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

map = Basemap(projection='aeqd',
              lon_0 = 0,
              lat_0 = 90,
              width = 10000000,
              height = 10000000)

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

for i in range(0, 10000000, 1000000):
    map.plot(i, i, marker='o',color='k')

plt.show()

在此例中,投影中心,投影宽度及高度作为参数被传递给Basemap构造器。

投影中心的设置是比较容易的,但区域大小的设置就显得 tricky~

单位是以 m 为投影单位。点(0,0)为左下角,点(width,height)为右上角。因此位置的源点并不是由GDAL中的投影所确定的。投影仅是定义所使用的单位的大小,而不是原点。(译注:仅当你知道设置的参数将满足你的要求时使用)

上例展示了如何使用 plot 函数使用几个点显示坐标由 0 到 width 和 height的范围。

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

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

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

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

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