打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
移动的台风:论matplotlib和cartopy配合的地图动画漫游
userphoto

2023.04.21 北京

关注

前面是虾神的话:吴道长一直在念叨这是他写的python的封笔之作了,不过虾神一直不相信道长的人品,所以他说的话,基本不作数,以后肯定还会有的……

————我是分割线————

练得身形似鹤形,

千株松下两函经。
我来问道无馀说,

云在青天水在瓶。
-------------------------------------------------------

道长是一只数据猿,每天需要面对形形色色的数据:有.xls的,有.shp的,有.tif的还有.avi的,更有.rmd的………………..当然除了后面两个,其他的数据都是死的,生硬的,当如果数据能够按着一定方向,反复,有规律地进行某种神圣的原始运动,你会发现,咦,生命是多么奇妙啊!
静者,时也;动者,常也。
鄙司是一家专门做防灾减灾的企业,台风一来我们就会高喊一声'妈妈桑,来且了’,测试'莫拉克’台风期间的网页浏览人数的压力中,当达到300W次数时,司里的技术员达到一种莫名的亢奋,当然道长没有开爬虫去爬自家数据,不然也是一股子攒力。
 


道长也是初等Python的伪程序猿,每天在思考的是如何用Python更方便地处理手上的数据,能有更多的时间来放空自己,当然我也更希望数据能在自己手上活动起来,so,我就想把这次的比较诡异的台风路径,当然这份数据爬出来的,至于哪里爬,你猜猜………
重申一下,Matplotlib包是Python里面最流行的可视化包,可以做二维,可以做三维的,想让它动起来,对他能做!这构成让台风数据动起来的基本条件,还有一点,需要给一个正确的地理背景,不然动起来挺没意思的,就像道长喜欢看有剧情的动作片一样【强烈推荐这家公司,你懂的】。在matplotlib直接绘制shp可行,但是麻烦。好在matplotlib的插件中有两种选择的:basemap和cartopy这两个包,道长选择后者,因为basemap语句很叽歪,而且cartopy可以读取我自定义的shp图层,方便控制图层的精度和范围。插播一句不管是basemap还是cartopy都不太好安装,他们牵扯到太多其他库,所以我建议用conda装。
至此地图动画漫游在Python实现中两个条件完备。

瞅瞅绘制的效果:

 
下面瞅瞅我写的代码:

# -*- coding: gbk -*-
import json
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import NullFormatter
from matplotlib.animation import FuncAnimation
from matplotlib.colorbar import Colorbar
from numpy.ma.core import size
from pylab import mpl
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter

###以下是解析我获得某份台风路径的json
File =  file(r'E:\桌面\台风路径\tsconfig.json')
jsonobj = json.load(File)
X = [ float(jsonobj[0]['points'][i]['lng'])  for i in range(94)]
Y = [ float(jsonobj[0]['points'][i]['lat'])  for i in range(94)]
num = len(X)
File.close()

###在这里我用cartopy绘制了地理背景和一个鹰眼图
fig = plt.figure(figsize=(14,10))
axMap = plt.axes([0.1,0.1,0.8,0.8],projection=ccrs.PlateCarree())
axMap.set_extent([114,130,18.5,29.5], ccrs.Geodetic())
land1 = cfeature.NaturalEarthFeature('cultural', 'china_coastalProvince','50m',edgecolor='white',facecolor='khaki')
axMap.add_feature(land1)
ocean = cfeature.NaturalEarthFeature('cultural', 'ocean','50m',edgecolor='khaki',facecolor=cfeature.COLORS['water'])
axMap.add_feature(ocean)
axMap.set_xticks([114.5,117.5,120.5,123.5,126.5,129.5],crs=ccrs.PlateCarree())
axMap.set_yticks([19,21,23,25,27,29],crs=ccrs.PlateCarree())
axMap.xaxis.set_major_formatter(LongitudeFormatter())
axMap.yaxis.set_major_formatter(LatitudeFormatter())
axMap.grid()
    
eagleMap = plt.axes([0.635,0.58,0.3,0.3],projection=ccrs.PlateCarree())
land2 = cfeature.NaturalEarthFeature('cultural', 'land','10m',edgecolor='face',facecolor=cfeature.COLORS['land'])
eagleMap.add_feature(land2, facecolor='0.85')
eagleMap.set_extent([118,121,22,25], ccrs.Geodetic())
    
   
P = np.zeros(num, dtype=[('size', float, 1),('color',float, 4)])
scat = axMap.scatter(X,Y, P['size'], lw = 1,edgecolors =P['color'] , facecolors='None', zorder=10)
line1, = axMap.plot([],[], lw=0.5,marker='+',color='green')
line2, = eagleMap.plot([],[], lw=0.5,marker='+',color='blue')
    
###以下是一个动画装置,设定了一个流程内的动画的帧数和效果
def update(frame):
        
    i = frame % num
    P['color'][:,3] = np.maximum(0, P['color'][:,3] - 1.0/4)
    P['size'] -= (400 - 0)/4
    P['size'][i] = 800
    P['color'][i] = 0,0,1,1
    scat.set_edgecolors(P['color'])
    scat.set_facecolors(P['color']*(1,1,1,0.75))
    scat.set_sizes(P['size'])
        
    n = X[:i+1]
    m = Y[:i+1]
    line1.set_data(n, m)
    line2.set_data(n, m)
    return line1,line2,scat
    
animation = FuncAnimation(fig,update, interval = 300)###动画触发器
fig.suptitle(u'201601-Nepartak-RambleRoute',fontsize=16)
plt.show()

最后看看我的动图效果吧。


这是道长写的最后一篇Python,除非在pygame上有好玩的事物的发现。半年来,涉入代码的领域,勉强成了一只初级程序猿。受益良多,当然道长兴趣点是可视化,Python能做有点局限的,so,我想转个方向了,但是Python大法一定好。最后大谢,大虾和熊爷的教导。

-------------------------------------------------------------------

最后虾神点评:

贴出一本书:《代码简洁之道》

全文如下:

【用python】

全书完……

所以我坚信道长以后还会回来继续写python的……

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
matplotlib cartopy geopandas,实现专业地图可视化!
Python空间绘图--Cartopy简介
Cartopy,一个神奇的 python 库
超全的多子图(subplots)绘制技巧分享~~
Python最强地理可视化库Cartopy安装教学
WRF杂谈 | 画图时的投影
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服