Cartopy自定义底图

Cartopy自定义底图

蓝色弹珠

前几天微信的启动页面做了短时间的“变脸”:从NASA的蓝色弹珠(Blue Marble) 换成了风云四号拍摄的高清图像。

蓝色弹珠可谓是妇孺皆知的地球照片,是阿波罗17号太空船船员于1982年12月7日所拍摄。2000年,NASA利用卫星遥感数据以“蓝色弹珠”为名发布了全新的地球全景影像。2005年,NASA更是发布了“Blue Marble: Next Generation ”,包含总共十二个月份拍摄的地球卫星影响,可以显示地球在这十二个月内不同季节产生的变化,包含冰层的扩张与缩减、植被的疏密的改变、季节性干旱、南北半球因季节不同而形成的差异等。此后,蓝色弹珠又多次更新,并且可以在NASA的网站上选择合适的版本下载。

2005年的“蓝色弹珠:下一代”

“蓝色弹珠”用作底图

从前面的文章可以看到,Cartopy的底图实在是乏善可陈,默认的底图只有stock_img()中的一张。幸运的是,从Cartopy 0.15开始,可以利用background_img()自定义底图,而Blue Marble就是一个合适的选择。
不过,Cartopy添加底图的过程还是有些麻烦,主要包括:

  1. 下载底图,可以从NASA VisibleEarth上下载;

  2. 设定Cartopy底图的环境变量

    os.environ["CARTOPY_USER_BACKGROUNDS"]="存放底图的文件路径"
    
    
  3. 编写底图的json文件,需要的信息包括

    • "__comment__"
    • "__source__"
    • "__projection__"
    • "__source__"
  4. 绘制底图,例如选择中等分辨率的蓝色弹珠底图(其实Blue Marble提供的分辨率相当高,可以根据自己的需要重新调整):

    ax.background_img(name='blue_marble', resolution='medium')

我选择了北半球绿色最多的7月份,最后呈现的效果,如下所示:

更丰富的台风信息呈现

台风信息

在CMA提供的台风BST数据中,除了台风的经纬度以外,还有记录的时刻、相应时刻的台风等级、中心最低气压和2分钟平均近中心最大风速。

在作图时,可以将这些信息都呈现出来:

  • 根据台风等级的不同,绘制相应台风路径的颜色;
  • 整个过程中台风中心最低气压的变化情况;
  • 整个过程中台风近中心最大风速的变化情况;
  • 在每个记录时刻,台风的相应信息

根据信息作图

台风等级与路径颜色

热带气旋可以分为弱于热带风暴到超强台风7个等级,此外还有变性,用0~6和9表示,对这9个等级建立颜色的字典,用于后续调用。

level_dict = {0: '弱于热带风暴', 1: '热带低压', 2: '热带风暴', 3: '强热带风暴', 4: '台风', 5: '强台风', 6: '超强台风', 9: '变性'}

路径点&线作图

对于k时刻的台风,需要将该时刻及以前的k个路径点和(k-1)条线段按照强度对应的颜色画出来。

首先,根据k个点的强度值,设定颜色的循环顺序:
color_seq = [color_dict[lev] for lev in level] plt.rc('axes', prop_cycle=(cycler('color', color_seq)))

对于折线图,可以按照设定好的循环直接画图,但是对于散点图,如果利用scatter()一次性画出所有路径点,颜色循环是无效的,需要直接传入color参数:

其他信息子图显示

台风路径所占的经纬度范围是已知的,适当多画一些范围,在底图的右下角分别绘制中心气压和最大风速的底图,调用的函数为add_axes(),例如中心气压的绘制代码如下:

显示中心气压的子图

ax_pressure = fig.add_axes([0.7, 0.45, 0.15, 0.1])
ax_pressure.set_title('中心最低气压(hPa)', fontsize=10, fontproperties=font)
ax_pressure.plot(range(1, N + 1), single_track.pres)
ax_pressure.axvline(i, color='red')

文字注释

matplotlib中的annotate()函数可以在图中添加注释。

对每个路径点,在路径点旁边注释该位置的台风等级:

ax.annotate(level_dict[temp.level], xy=(temp.lons, temp.lats), xycoords= transform,
xytext=(-5, -30), textcoords='offset points', ha='right', va='bottom',
bbox=dict(boxstyle='round,pad=0.5', fc=color_dict[temp.level], alpha=0.8),
fontproperties=font,
arrowprops=dict(arrowstyle='->', connectionstyle='arc3,rad=0'))

此外,还要在图的左上角显示台风的相关信息,例如台风名称、数据来源、图像对应的记录时刻等:
ax.annotate('台风名称: %s\n\n时间:%s\n数据来源:CMA\n张da统帅制作' % (temp['name'], temp.time),
xy=(0, 1), xytext=(12, -12), va='top', ha='left', fontproperties=font,
xycoords='axes fraction', textcoords='offset points')
这样,得到某一时刻的台风路径图如下所示:


image.png

利用pillow绘制台风动图

按照以上步骤,把一个台风对应的所有时刻的台风路径图片绘制出来,按照绘制的顺序进行命名,并保存在一个文件夹下,把这个文件夹下所有的路径按照顺序读取:

os.chdir(path)
imgFiles = [fn for fn in os.listdir('.') if fn.endswith('.png')]
imgFiles.sort(key=lambda x:int(x[:-4]))

图片的读取和GIF图片的制作,可以用Pillow`工具包完成,Anaconda安装的时候已经自带,可以直接是用。在制作gif时,可以设定gif的帧率等,代码非常简单:
images = [Image.open(fn) for fn in imgFiles]
im = images[0]
filename = 'test.gif'
im.save(fp=filename, format='gif', save_all=True, append_images=images[1:], duration=500)
</pre>

最后的效果如下所示(GIF图片较大,加载速度较慢):

Map tile acquisition

https://scitools.org.uk/cartopy/docs/latest/gallery/eyja_volcano.html


参考文献

  1. https://earthobservatory.nasa.gov/Features/BlueMarble/ Blue Marble: Next Generation
  2. http://www.cnblogs.com/vamei/archive/2012/11/07/2758006.html 飓风“桑迪”路径图的制作
  3. http://earthpy.org/cartopy_backgroung.html Background image in cartopy
  4. https://pillow.readthedocs.io/en/4.2.x/ Pillow documentation

5 Replacing Cartopy’s Background Image!!!!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容