在南美利亚大陆利用降水和气候栅格数据

如何使用Google Colab从INPE访问MERGE降水和其他气候产品,获取全面的天气洞察

Max在Unsplash上的照片

介绍

随着2023年厄尔尼诺现象的加剧,气候和降水数据在解读其对全球或区域尺度的天气模式和气候动力学影响方面变得至关重要。在降水数据方面,两个全球公认的数据集引人注目:美国地质调查局(USGS)的CHIRPS(Climate Hazards Group InfraRed Precipitation with Station)和美国宇航局(NASA)开发的IMERGE(Integrated Multi-satellitE Retrievals for GPM),其中GPM代表全球降水测量任务。该任务利用一组卫星提供全面的全球降雨估计。虽然这些产品适用于全球模型,但它们并没有针对南美洲的情况进行特别定制。

在这种情况下,巴西国家空间研究所(INPE)提供了专门针对南美洲进行校准的每日降水栅格数据。该产品称为MERGE,依赖于IMERGE/GPM模型,但通过校准数千个原位雨量计以确保结果无偏(Rozante等,2010年,Rozante等,2020年)。INPE还提供其他气候数据,包括月平均、日平均等。

图1显示了2015年南美洲的总降水量(左侧),这是一个厄尔尼诺现象强烈的年份,以及与没有厄尔尼诺现象的前一年相比的降水异常(右侧)。

图1:左侧是2015年南美洲的总降水量,右侧是2015年与2014年的降水异常,当时没有厄尔尼诺现象。作者提供的图片。

从图中可以看出,有一个大面积的负异常区域,特别是亚马逊生物群落,与前一年相比,降雨量减少了多达2000毫米。

这些资源对于各种应用具有巨大价值,包括流域和水库管理、关键事件监测和精确农业。然而,下载和处理这些数据涉及的复杂性经常阻碍其有效利用,限制了它们主要供气象学家使用,而使水文学家和农业专家等其他专业人士缺乏装备。这是我所在组织(ANA)内观察到的一个挑战,水文学家和工程师经常难以获取特定流域的降雨数据。

为了解决这个挑战,本文旨在指导读者如何使用merge-downloader包高效下载和处理这些数据,为更广泛的跨学科使用和洞察打开大门。

安装

merge-downloader是一个非官方的库,用于更轻松地访问INPE的数据,并且源代码可在以下网址找到:https://github.com/cordmaur/merge-downloader。

安装用于地理空间应用的Python库有时可能令人畏惧,因此我强烈建议使用docker。我已经在以前在TDS上发表的故事中涵盖了这个主题:

  • 为Python空间分析配置最小化的Docker镜像
  • 为您的地理空间开发使用Devcontainers的原因

在Docker Hub上已经有一个docker镜像可用,并且可以使用以下命令在shell提示符下进行安装。

> docker pull cordmaur/merge-downloader:v1> docker run -it -p 8888:8888 merge-downloader:v1 bash

进入容器后,您可以安装包并启动jupyter,通过您的Web浏览器访问http://127.0.0.1:8888

root@89fd8c332f98:/# pip install merge-downloader
root@89fd8c332f98:/# jupyter notebook --ip=0.0.0.0 --allow-root --no-browser

另一种更直接的选择是在Google Colab上安装merge-downloader,这里将采用这种方式。

# 从代码单元格中安装%pip install merge-downloader

下载资源

我们首先要解决的问题是如何简单地从INPE下载降水和气候数据。可以使用以下命令获取可以使用merge-downloader下载的可用资源列表:

from mergedownloader.inpeparser import INPETypesINPETypes.types()result: DAILY_RAIN, MONTHLY_ACCUM_YEARLY, DAILY_AVERAGE, MONTHLY_ACCUM, MONTHLY_ACCUM_MANUAL, YEARLY_ACCUM, HOURLY_WRF, DAILY_WRF

每种类型的含义在Github文档中有详细说明,并在以下表格中进行了总结:

要下载任何资源,首先要创建一个下载实例,指向INPE的FTP服务器,并设置一个本地文件夹来存储下载的文件。

from mergedownloader.downloader import Downloaderfrom mergedownloader.inpeparser import INPETypes, INPEParsers# 创建一个临时文件夹来存储文件!mkdir ./tmpdownloader = Downloader(    server=INPEParsers.FTPurl,    parsers=INPEParsers.parsers,    local_folder='./tmp')

创建了一个下载器实例后,让我们下载某一特定日期的降水数据。我们可以使用get_file命令来实现,如下所示:

import xarray as xrfile = downloader.get_file(date='20230601', datatype=INPETypes.DAILY_RAIN)fileresult:PosixPath('tmp/DAILY_RAIN/MERGE_CPTEC_20230601.grib2')

现在可以使用xarray库打开该文件:

rain = xr.load_dataset(file)rain['prec'].plot(vmax=150)
Code result: Rain for 06/01/2023 in South America (millimiters).

打开多个资源

请注意,在上一个示例中,经度范围从240度到340度东。这不是通常的经度表示方式,通常我们使用正数和负数分别表示经度在格林威治以东和以西的位置。当我们使用Downloader实例打开资源时,这个纠正和其他一些较小的纠正,如正确的CRS定义,都会自动完成。可以通过使用open_file而不是get_file来实现。作为示例,让我们打开表示2023年前四个月降雨的多个文件。此外,我们将绘制南美洲国家作为空间参考。

# 打开国家数据集countries = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))south_america = countries.query("continent == 'South America'")# 选择要下载的月份dates = ['2023-01', '2023-02', '2023-03', '2023-04']monthly_rains = [downloader.open_file(date, datatype=INPETypes.MONTHLY_ACCUM_YEARLY) for date in dates]# 创建一个包含月降水的图形fig, axs = plt.subplots(2, 2, figsize=(12, 11))for i, rain in enumerate(monthly_rains):    ax = axs.reshape(-1)[i]    rain.plot(ax=ax, vmax=1200)    south_america.plot(ax=ax, facecolor='none', edgecolor='white')
代码结果:2023年前四个月累积降雨量。

创建数据立方体

现在,假设我们需要评估2023年6月上半月在特定地区(例如亚马逊生物群落)发生的累积降水量。在这种情况下,与逐个打开每个文件、剪辑区域、堆叠等相比,创建一个数据立方体并直接对其进行操作要容易得多。该立方体由多个沿着“时间”维度堆叠的栅格组成。

因此,首先让我们创建立方体。下载器类可以自动为我们创建给定日期范围的立方体。

# 为6月上半月创建立方体cube = downloader.create_cube(    start_date='20230601',    end_date='20230615',    datatype=INPETypes.DAILY_RAIN)cube

接下来,我们需要执行两个操作。剪辑,将数据限制在所需区域内,以及求和,累积所需天数的降水量。因此,在第一步中,我们将立方体裁剪到亚马逊生物群落的范围内。我们可以通过GISUtil.cut_cube_by_geoms()方法来执行此操作。然后,我们沿着“时间”轴求和,这样我们就得到了一个单独的二维层。让我们逐步看一下。

from mergedownloader.utils import GISUtil# 打开亚马逊地区的几何图形amazon = gpd.read_file('https://raw.githubusercontent.com/cordmaur/Fastai2-小猪AI/master/Data/amazon.geojson')# 根据给定的几何图形裁剪立方体amazon_cube = GISUtil.cut_cube_by_geoms(    cube=cube,    geometries = amazon.geometry)# 沿着时间轴累积降雨量amazon_rain = amazon_cube.sum(dim='time', skipna=False)# 绘制图形fig, ax = plt.subplots(figsize=(8, 5))amazon_rain.plot(ax=ax)south_america.plot(ax=ax, facecolor='none', edgecolor='firebrick')
代码结果:2023年6月上半月亚马逊地区的降雨量。

创建时间序列

为特定区域创建时间序列可以提供有价值的见解,特别是考虑到降雨量或历史气候学数据。例如,您可能希望绘制2015年厄尔尼诺现象期间亚马逊地区的月降水量,并将其与该地区每个月的长期平均降水量进行比较。

要开始,我们将创建两个立方体。一个是从2015年1月到12月的月降水量,另一个是长期平均降水量。INPE提供的长期平均值是从2000年到2022年(23年的数据)计算得出的,在这种情况下,我们可以将任何年份作为参考。

请注意以下代码中,我们使用的是reducer=xr.DataArray.mean,这是用于聚合每个像素的值的方法,只保留了“时间”维度。

# 创建立方体cube_2015 = downloader.create_cube(    start_date='2015-01',    end_date='2015-12',    datatype=INPETypes.MONTHLY_ACCUM_YEARLY)cube_lta = downloader.create_cube(    start_date='2015-01',    end_date='2015-12',    datatype=INPETypes.MONTHLY_ACCUM)# 创建时间系列series_2015 = downloader.get_time_series(    cube=cube_2015,     shp=amazon,    reducer=xr.DataArray.mean)series_lta = downloader.get_time_series(    cube=cube_lta,     shp=amazon,    reducer=xr.DataArray.mean)# 创建只包含年份和月份的字符串索引series_lta.index = series_2015.index = series_2015.index.astype('str').str[:7]# 绘制图形fig, ax = plt.subplots(figsize=(12,6))series_lta.plot(ax=ax, kind='line', color='orange', marker='x')series_2015.plot(ax=ax, kind='bar')

结论

“merge-downloader”软件包和INPE的降水和气候数据为环境分析应用提供了有效的资源。该软件包与geopandas和xarray等成熟的库兼容,进一步增强了其适用性。

通过各种案例示例,该软件包的功能从下载和绘制降水数据等简单任务,到生成数据立方体、实施空间剪切和执行时间序列分析等高级操作。用户可以根据自己的具体需求应用这些工具,从而方便进行环境变化跟踪、气候事件监测或综合区域研究等任务。图2显示了一个完全使用“merge-downloader”和其他Python地理空间工具的报告示例。

图2:使用MERGE数据为巴西多个流域生成的报告示例。作者提供的图片。

所提出的方法允许在任何空间定义区域评估降水数据并与气候参考进行比较,并可服务于多个领域。

保持联系

如果您喜欢这篇文章,请考虑成为小猪AI的会员,解锁数千篇类似的文章。

作为小猪AI的会员,您会员费的一部分将用于支付您阅读的作者,并且您将获得完全访问每个故事的权限…

cordmaur.medium.com