------飓风数据可视化
发生在大西洋、墨西哥湾、加勒比海和北太平洋东部的热带气旋称为飓风。飓风通常发生在夏季和早秋,它来临时常常电闪雷鸣。在仅仅一天内,飓风就能够释放出大量的能量,而这些能量足以满足整个美国约六个月电的需要量。
英文Hurricane的词源自加勒比海言语的恶魔Hurican,亦有说是玛雅人神话中创世众神的其中一位,就是雷暴与旋风之神Hurakan。而台风一词则源自希腊神话中大地之母盖亚之子Typhon,它是一头长有一百个龙头的魔物,传说其孩子就是可怕的大风。至于中文“台风”一词,有人说源于日语,亦有人说来自**。以前,**东南沿海经常有风暴,当地渔民统称其为“大风”,后来变成台风。从大家的称谓中,不难看出对飓风的恐惧,而这些都出于它所带来的巨大灾害。
在西太平洋沿岸国家中,我国是受台风袭击最多的国家,有34%的热带气旋 ( 包括热带低压,热带风暴、强热带风暴,台风 )在我国登陆。我国风暴潮灾害居西太平洋沿岸国家之首。我国台风风暴潮灾的分布几乎遍布各滨海地区,特别是沿海重点经济开发区,如长江口、杭州湾、闽江口、珠江口以及雷州半岛东岸和海南岛东北部,均在风暴危害严重岸段。历史上由于风暴潮造成的生命财产损失触目惊心,清代(1696年)一次特大风暴潮使上海宝山、崇明、吴淞一带淹死十万人。1862年7月珠江口区域因风暴潮灾死亡八万人。建国后几乎每年都有潮灾发生,成重灾者平均每两年一次,也有的年份一年多次受灾(1989年曾发生 过6次这类灾害)。严重的风暴潮灾往往造成多个省市区同时受灾。据不完全统计,建国后共发生台风风暴潮灾95次,较大的有40次。
飓风作为一种破坏力极大的局地强风,对人们的生命和财产可带来巨大伤亡和损失,近年来飓风的相关研究成为了国内外气象和风工程等领域的热门课题。然而在我国,风工程领域关于飓风的研究尚处于起步阶段,实测、理论、实验、模拟、灾后调查、概率统计等方法的研究齐头并进,共同推进着学界对飓风的理解。美国、日本等发达国家均已建立了各自的飓风数据库,涵盖了飓风年频率、持续时间、灾害路径长宽等信息,这些重要的信息为了解飓风特性和基于概率的飓风风险分析奠定了基础。其中NHC(National Hurricane Center)建立了一份基于大西洋自1851年以来的飓风信息,这份信息也是本次大作业所利用到的主要数据来源。对这些数据的分析将为我国风工程的建设起到重要的借鉴作用,而借助可视化的手段,我们能够更加透彻、直观的深入了解飓风的各种特性,如频发地段、轨迹变化等详细信息。
本次龙卷风数据可视化大作业选取Atlantic hurricane database (HURDAT2)数据集,数据集包含了从1851年自2017年的大西洋飓风信息,其中每条数据周期为六小时,包括地址、最大风速、中心气压等详细信息。本次龙卷风数据可视化大作业将利用这些数据,实现两方面的数据可视化:历年飓风分布轨迹和自2000年以来的著名飓风的运动形态。其中第二部分本可以实现为展现自1851年的著名飓风运动形态,但受迫于技术手段的有限和占用空间的巨大,暂时只选取2000年以来的进行展示。希望通过数据可视化的手段,大家能够更加深刻的感受到飓风所带来的灾害,也能认识到飓风发生的各种规律和特性,为将来我国对飓风的防范事业做出一份贡献。
坦白地说,初期一直没有明确下来要做些什么,导致时间上略显仓促。在完成整个大作业之后,和老师在课上所谈到的那种感受有所相近:忙活了一大段时间,终于建好了一个模型,看了看,怎么这么丑。确实,最后的实现结果和最初的预期相去甚远,只能一声叹息。
在项目开始初期,本来只打算开发展示著名飓风运动轨迹的模块,而最初的设想是利用threejs库实时的载入信息,从而一步一步的渲染出飓风运动的轨迹,甚至于能够实现老师课上展现的那种梵高星空矢量场的形式,能实现与外界的交互就更加完美了,在脑海中这是一个动态的场景,然而限于能力的有限对webgl等知识的欠缺,最后未能实现以上设想。
无奈之下,只能对大作业的计划进行调整,在学习过程中,我了解了matplotlib下的Basemap和threejs中的贴图功能。为了使大作业的内容更加丰满,我决定添加展示历年飓风轨迹的展示。这一部分相对比较容易,暂且不表。
其实Basemap并非我的第一选择,在basemap的官方主页上介绍了Cartopy(Basemap的替代品),我对Cartopy做了一番研究,发现为其添加背景图层并不容易,bug频繁发生,故转向了Basemap的怀抱,也正是在Basemap的帮助下,我很快绘制完成所需的图片。当然,其中也有一些小曲折。首先是matplotlib在savefig时会产生一圈白边,这会对后期的展示产生不好的效果,最终通过调节plt的参数得以调节。其二是python的内存泄露问题,因为要绘制大量图片对内存的占用较大,尽管每次都delete了fig,但是实际上所占用的内存并没有释放,最终通过fig的复用才得以解决。
自己确实忽视了团队的力量,而这一点在后期WEB端实现时体现的更加明显。因为从未接触过前端,html和JavaScript都只能现学现卖,遇到要实现的每一个功能点都只能在网上寻求答案,不仅极大的延误了时间,还不时陷入一些陷阱,如JavaScript中的直接传参和引用的区别与回调函数的异步情况。总之吃了不少苦头,而这些如果有一名熟练的队友都是可以避免的。
由于对threejs和webgl的不熟悉,我最后只好采用前期先生成图片,后期直接以贴图的形式将图片覆盖在球形上来模拟地球。同时因为对threejs的更新机制不够了解,在多次尝试都失败之后,我只能采用通过按钮点击的触发事件来每次都重新渲染整个画面,效果自然是比较差的,不仅占用了大量的内存,并且操作也不够流畅。希望今后能不断改进这些缺点。
因为是通过事先生成好的图片直接加载,这也导致程序的互动性很少,除了著名飓风运动轨迹处可以调节观察角度之外,几乎没有互动,这是不符合我的预期,也是和我认知中的可视化不相符的,在我的设想中,用户能够通过实时的互动看到数据的流动、数据的可视化。例如课上老师展示的梵高星空的矢量图,不仅能够自行演变,还能根据用户的互动发生变化。与本次大作业结合的话,我脑海中最理想的设想是实现全球海洋的矢量图,从而观察飓风所带来的重重影响,同时用户还能尝试修改飓风的形态,从而观察小小改变带来的蝴蝶效应。然而现实是残酷的,自身的能力确实不够格,实现这些都需要更深一步的学习。
总之,通过这次大作业,我认识到了自身能力的欠缺,项目的完成度很低。希望今后能一点点实现自己的设想,而这些都督促着我去达到更高的程序设计能力。