【可视化】基于Cartopy绘制中国PM2.5浓度分布填色图

【可视化】基于Cartopy绘制中国PM2.5浓度分布填色图

结合GeopandasCartopy两个强大的地理数据处理库,对中国的PM2.5浓度进行可视化。通过一个简单案例,帮助大家熟悉Python绘制地图的方法。其中利用Geopandas处理和分析地理空间数据,并利用Cartopy生成平面填色地图,最终将展示中国全年平均PM2.5浓度的空间分布

相关库简介

Cartopy 是一个用于地理数据处理和可视化的 Python 库,专门设计来处理地图投影和地理空间数据的绘制。它是基于 Matplotlib 的高层次接口,主要用于创建地理参考图形和地图。Cartopy 提供了丰富的功能来处理不同的地图投影、地理参考数据的转换,以及与流行的地理信息系统(GIS)数据格式的集成。

Cartopy 的主要功能

地图投影支持:支持多种地图投影,如正射投影、墨卡托投影、兰伯特投影等,方便地进行地理数据的展示。

地理数据处理:提供了功能强大的工具来处理矢量数据(如点、线、面)和栅格数据,并可以与Shapefile、GeoTIFF等格式的数据进行交互。

集成 Matplotlib:作为 Matplotlib 的扩展,Cartopy 允许用户利用 Matplotlib 强大的绘图功能来创建复杂的地图和地理数据可视化。

地理参考数据:可以轻松地从自然地球数据库(Natural Earth)、GSHHS(全球自洽海岸线)等来源获取地理参考数据,用于绘制海岸线、国界、河流等地理要素。

高级可视化功能:支持地形渲染、气候数据的绘制以及与各种 GIS 工具的集成,如 GDAL、Shapely 等。

代码实现

导入相关库

# -*- coding: UTF-8 -*-
# 导入相关库
import xarray as xr
import geopandas as gpd
import numpy as np
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
from shapely.geometry import box
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter

加载数据

长时序无缝高分辨率空气污染物浓度数据集(简称LGHAP)对环境管理和地球系统科学分析具有重要意义。在当前发布的 LGHAP 数据集 (LGHAP v2) 中,提供了长达 22 年的无缝气溶胶光学深度 (AOD),近地表 PM2.5 和PM10浓度格网数据,空间分辨率为1km,覆盖中国陆地。详细数据介绍和获取方式见zenodo

读取全球年均1 km无缝PM2.5网格数据集(LGHAP v2)

#读取全球PM25数据,其以nc文件存储
pm25_data = xr.open_dataset('LGHAP.Global_PM25.Y001.A2021.nc',engine ='netcdf4')

pm25_data.head(10)
# 提取 PM2.5 浓度值和坐标
pm25 = pm25_data['PM25']  
lat = pm25_data['lat']  
lon = pm25_data['lon'] 

裁剪中国区划范围

#读取中国城市区划shp
china_gdf=gpd.read_file('市.shp')
# 使用 unary_union 将中国的多个行政区划合并为一个
china_shape = china_gdf.geometry.union_all()
#根据行政区划对象创建裁剪范围
min_lon, min_lat, max_lon, max_lat = china_shape.bounds
bbox = box(min_lon, min_lat, max_lon, max_lat)
# 裁剪 PM2.5 数据
china_pm25_data = pm25_data.sel(lon=slice(min_lon, max_lon), lat=slice(min_lat,max_lat))
china_pm25_values = china_pm25_data['PM25']
lon2d, lat2d = np.meshgrid(china_pm25_data['lon'], china_pm25_data['lat'])

读取中国的行政区划和国界线shp

#读取国界线
china_boundary = gpd.read_file('国界线_WGS84.shp') 
#读取行政区划
city_boundry=gpd.read_file('市.shp')

基于Cartopy绘制中国PM2.5浓度分布填色图

#新建绘图框,clear=True在每次新建绘图时删除前置图,节省内存
fig = plt.figure(figsize=(15,15),dpi=300,clear=True)
#创建地图
ax = fig.add_subplot(111,projection=ccrs.PlateCarree())
ax.set_extent([min_lon, max_lon, min_lat, max_lat],crs=ccrs.PlateCarree())
# 添加河流,湖泊
ax.add_feature(cfeature.RIVERS.with_scale('50m'))
ax.add_feature(cfeature.LAKES.with_scale('50m'))
#绘制行政区划
ax.add_geometries(city_boundry["geometry"],crs=ccrs.PlateCarree(),
                fc="None",ec="black",linewidth=.3)
#绘制国界线
ax.add_geometries(china_boundary["geometry"],crs=ccrs.PlateCarree(),
                fc="None",ec="black",linewidth=.7)
#绘制PM2.5浓度
cf=ax.contourf(np.transpose(lon2d), np.transpose(lat2d),china_pm25_values,levels=np.arange(0, 80), cmap='Spectral_r',transform=ccrs.PlateCarree())
#添加colorbar
plt.colorbar(cf,ax=ax, extend='both',orientation='horizontal',label='PM2.5(μg/m3)',pad=0.05) 
#绘制南海子图
sub_ax = fig.add_axes([0.72, 0.3, 0.15, 0.15],
                      projection=ccrs.PlateCarree())
#设置子图范围
sub_ax.set_extent([105,125,0,25], crs=ccrs.PlateCarree())
#绘制子图
sub_ax.add_geometries(city_boundry["geometry"],crs=ccrs.PlateCarree(),
                fc="None",ec="black",linewidth=.3)
sub_ax.add_geometries(china_boundary["geometry"],crs=ccrs.PlateCarree(),
                fc="None",ec="black",linewidth=.5)
sub_ax.contourf(np.transpose(lon2d), np.transpose(lat2d),china_pm25_values,levels=np.arange(0, 80), cmap='Spectral_r',transform=ccrs.PlateCarree())
#添加经纬度刻度
x_extent = [ 80,90,100,110,120,130]
y_extent = [ 5,15,25,35,45]
ax.set_xticks(x_extent, crs=ccrs.PlateCarree())
ax.set_yticks(y_extent, crs=ccrs.PlateCarree())

# 利用Formatter格式化刻度标签
lon_formatter = LongitudeFormatter(zero_direction_label=False)
lat_formatter = LatitudeFormatter()
ax.xaxis.set_major_formatter(lon_formatter)
ax.yaxis.set_major_formatter(lat_formatter)
#展示结果
plt.show()

结果展示

中国PM2.5浓度分布填色图

在这里插入图片描述

推荐阅读

欢迎关注我的公众号“AI拾贝”,原创技术文章第一时间推送。后台发送pm2.5,自动回复源码和数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值