善用python第三方库:如何精确统计海南岛台风登陆点热点以及强度

海南岛由于其独特的地理位置,每年遭受大量来自南海或热带西太平洋的台风影响,素有“南海台风走廊”之称。建立海南岛的风暴潮模型对预防台风带来的风暴潮灾害有重要意义,而模型由台风风场驱动,如何根据不同的台风登陆点、来向、强度等因素设计敏感性试验很重要,因而我们需要根据历史资料对登陆海南岛的台风进行统计和分类。假设我们已整理好历年的台风6h数据,包括路径的经纬、强度、风速等,如何统计海南岛的台风登陆点分布呢?

首先,最容易想到的,也是前人使用较多的方法是,在研究区域及周边建立一个粗网格(如图1a所示),然后将台风路径插值到这些网格点中,对每个网格点进行统计计数,得到所有台风经过点的热力图,再根据这个图分析海南岛沿岸的登陆热点情况。这种方法虽然简单,但是缺点也很明显:过于粗糙、二次登陆和台风登出点均会对结果造成很大的误差。第二种方法是用几个矩形框将海南岛沿岸分为几个区域(如图1b),将台风路径进行加密插值,然后对每个台风路径按时间顺序遍历,判断路径点是否落在几个矩形区域内,若在区域内,进行记录,然后跳入下一个台风路径的遍历。这种方法可以避免对一次台风的多次统计,同时也对区域进行了划分,可以统计到台风的登陆热点分布情况。然而,这种方法依然不是我们想要的,不够精确,也不够优雅。

第二种方法里有“判断点在区域内”的思路,不过是判断矩形区域的,只需判断经纬坐标的范围就行,方法比较简单。我们可以在这基础上扩展一下思路:如何判断点在多边形内(Polygon Inside)。判断点在多边形内有几种方法,面积判别、夹角判别或射线法,但是自己再写这个算法显然太麻烦,这么常见的功能应该有python第三方包。上网查阅资料后发现Shapely(https://github.com/Toblerity/Shapely)符合我们的要求,它是用于处理和分析平面几何对象的一个python第三方库,基于广泛运用的GEOS(PostGIS的引擎)和JTS库,具有强大的平面几何图形(点、线、多边形等)处理和运算功能。有了Shapely,我们还需要海南岛的轮廓线。GADM(http://www.gadm.org/)提供全球的行政区划数据库,包括了几乎所有国家和地区的国界、子级行政区域划分数据,其提供的shapefile格式数据可以直接用于python的Basemap包(https://matplotlib.org/basemap/)的绘图中,也包含了所有区域轮廓的经纬坐标点。GADM提供的中国行政区域划分中分为0,1,2,3级数据,对应国、省、县(市)、乡的行政区划精度。在获得以上的数据和扩展包之后,我们便可以对台风进行登陆点统计。

首先,从GADM中国1级数据中获取海南岛的轮廓线,其包含35749个坐标点,数据量过于庞大,我们需要先用Shapely的Polygon生成海南岛轮廓线的多边形,剔除掉面积过小的区划(海南周边海岛),然后用.simplify(0.05)将多边形进行简化为49个坐标点的多边形(如图1c)。对每个台风,将台风路径用Shapely的LineString生成折线段,用Polygon.intersection与LineString进行相交得到交点。通过试验得知,Shapely中Polygon与LineString类的Intersection是会考虑LineString的坐标顺序的,因而只要LineString中的坐标顺序是按台风路径的时间顺序,我们只需要取intersection的第一个交点即可。得到所有台风的登陆点位置后,我们用GADM的3级数据的乡级行政区划来进行统计(图1d),用每个区划的轮廓经纬生成Polygon,用Polygon.contains(Point)来判断登陆点是否在区域内。但是,由于我们上面生成的海南岛的轮廓线是简化过的,登陆点可能落在区域外,因而,我们需要换个思路:用Point.buffer(0.04)将台风登陆点稍微地放大成圆形区域,然后再用Polygon.intersects(..)判断区域与圆形是否相交,若相交,则进行统计,并在接下来的区划遍历中移除该台风(防止buffered后的点与多个区划相交造成重复统计)。最后,使用Basemap将台风登陆点的分布画出,使用windrose的python包(https://github.com/python-windrose/windrose)将统计得到的数据进行展示(图2展示台风强度的风玫瑰图)。

总结:Python是一门优雅且灵活的脚本编程语言,其数量众多的丰富成熟的第三方库可以大大提高我们的工作效率。在解决实际工作问题的时候,要善于在网上寻找是否有第三方库可提供成熟的算法或解决方案,阅读这些库的Api说明文档,从中找到可行的解决路线。同样,互联网上也有许多公开的数据库或数据集,有效的利用这些数据也可以使我们的工作更加精确和高效。

发表评论

电子邮件地址不会被公开。