cartopy绘制中国降雨地图

news2025/7/23 5:41:20

常用的地图可视化的编程工具有 MATLAB、IDL、R、GMT、NCL 等。相比于ArcGIS、QGIS和ArcGISpro用鼠标点来点去,编程绘图也是有很大的优点的,方便,可批量,美观。

大气科学和气象的朋友们一直使用的应该是 NCL,易用性不错,画地图的效果也很好。然而 2019 年初,NCAR 宣布 NCL 将停止更新,并会在日后转为 Python 的绘图包。

此前 Python 最常用的地图包是 Basemap,然而它将于 2020 年被弃用,官方推荐使用 Cartopy 包作为替代。Cartopy 是英国气象局开发的地图绘图包,实现了 Basemap 的大部分功能,还可以通过 Matplotlib 的 API 实现丰富的自定义效果。

似乎Cartopy是目前比较不错的选择,但是实在是太不稳定了,很多功能还不完备,目前的版本是0.21。

首先读取中国降雨格点数据,读成矩阵:

import pandas as pd
import numpy as np
import os
dir = 'D:/Acdemic/xibei/data_1/grid_prcp/'
txtLists = os.listdir(dir)
files = list(filter(lambda x: x[-4:] in ['.txt'], txtLists))
df = pd.DataFrame()
i = 0;
prcp = np.zeros((72, 128, len(files)))
for file in files:
    data = pd.read_table(dir+file, sep='\s+', header=None, index_col=False, skiprows=6)
    print(str(i) + ': ' + file)
    prcp[:, :, i] = np.array(data)
    i += 1
prcp1 = np.mean(prcp, 2) * 12
prcp1[prcp1 < -1000] = None

数据和读取之前介绍过了,参考:

写个函数绘制省界矢量,这个函数也可以用于各类矢量绘制

import cartopy.io.shapereader as shpreader
def add_shp(ax, **kwargs):
    '''
    在地图上画出中国省界的shapefile.
    Parameters
    ----------
    ax : GeoAxes
        目标地图.
    **kwargs
        绘制shape时用到的参数.例如linewidth,edgecolor和facecolor等.
    '''
    proj = ccrs.PlateCarree()
    reader = shpreader.Reader('D:/OneDrive/data/china.shp')
    provinces = reader.geometries()
    ax.add_geometries(provinces, proj, **kwargs)
    reader.close()

绘图:

import matplotlib as mpl
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
# 导入Cartopy专门提供的经纬度的Formatter
from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter
import matplotlib.ticker as mticker
# 导入底图包
import cartopy.feature as cfeature

fig = plt.figure()
proj = ccrs.PlateCarree()
ax = fig.add_subplot(111, projection=proj)

# 设置经纬度范围,限定为中国
# 注意指定crs关键字,否则范围不一定完全准确
extents = [70, 140, 15, 55]
ax.set_extent(extents, crs=proj)
# 添加各种特征
ax.add_feature(cfeature.OCEAN)
ax.add_feature(cfeature.LAND, edgecolor='black')
#ax.add_feature(cfeature.LAKES, edgecolor='black')
#ax.add_feature(cfeature.RIVERS)
#ax.add_feature(cfeature.BORDERS)
# 添加网格线
ax.gridlines(linestyle='--')

# 设置大刻度和小刻度
ax.set_xticks(np.arange(70, 140 + 20, 20), crs=proj)
ax.set_xticks(np.arange(70, 140 + 10, 10), minor=True, crs=proj)
ax.set_yticks(np.arange(15, 55 + 20, 20), crs=proj)
ax.set_yticks(np.arange(15, 55 + 10, 10), minor=True, crs=proj)

# 利用Formatter格式化刻度标签
ax.xaxis.set_major_formatter(LongitudeFormatter())
ax.yaxis.set_major_formatter(LatitudeFormatter())

# 添加底图
long = np.linspace(72, 136, 128); lat = np.linspace(18, 54, 72)
im = ax.contourf(
    long, lat[::-1], prcp1,
    levels=np.linspace(0, 2000, 11), cmap='RdYlBu_r',
    extend='both', alpha=0.8
)
cbar = fig.colorbar(
    im, ax=ax, shrink=0.9, pad=0.1, orientation='horizontal'
)

cbar.ax.tick_params(labelsize='small')
ax.set_title('Annul precipitaion (mm)')

# 添加矢量
add_shp(ax, lw=1, ec='k', fc='none')
    
plt.show()
  • extents = [70, 140, 15, 55]是图层的经纬度范围,简单来说是框的大小

  • ax.add_feature(cfeature.OCEAN)用于添加cartopy的各类内置要素,海洋大陆等等

  • ax.set_xticks(np.arange(70, 140 + 20, 20), crs=proj)ax.set_xticks(np.arange(70, 140 + 10, 10), minor=True, crs=proj)分别是主次刻度线,70, 140是x的经度开始和截至,20是间隔

  • ax.contourf( long, lat[::-1], prcp1, levels=np.linspace(0, 2000, 11), cmap='RdYlBu_r', extend='both', alpha=0.8用于添加栅格,x和y对应经纬度,一般来说nc文件自带这个数据,prcp是栅格矩阵,levels是颜色映射的level。

这样就绘制好了,结果如下:

image-20221110000631817

References:

[1] cartopy官方文档:https://scitools.org.uk/cartopy/docs/latest/reference/index.html

g-yK5m64Y1-1668745189793)]

References:

[1] cartopy官方文档:https://scitools.org.uk/cartopy/docs/latest/reference/index.html

[2] Cartopy 系列:从入门到放弃: https://zhajiman.github.io/post/cartopy_introduction/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/16945.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Windows 编写自动复制备份、删除文件定时任务脚本

目录 一、backup.bat 脚本内容如下&#xff1a; 二、脚本内容解析 1.自动生成当天日期的目录 2. 删除前 n 天的文件 forfile 命令参数说明&#xff1a; 3.复制文件到指定目录 robocopy 命令参数说明&#xff1a; 结论&#xff1a; 三、设置定时任务 1. 打开 控制面板…

【数据结构】谈谈ArrayList和LinkedList的区别

&#xff08;此图源于比特高博&#xff09; 上图简洁明了的列出了二者的不同点 下面咱们详细聊聊具体的 要问的是区别&#xff0c;问不同点&#xff0c;那就得从二者共有的但是不同的点来讨论 1.底层实现上&#xff1a;ArrayList底层是顺序表&#xff0c;采用数组结构&…

引入DDP技术:英特尔网卡让数据处理更高效

英特尔网卡引入DDP技术后&#xff0c;提高了云和NFV部署的数据包处理效率&#xff0c;按需重配置报文处理引擎&#xff0c;让数据处理更高效 ◆可编程报文处理流水线 ◆按需优化工作负载 ◆无需重启服务器 ◆设备使用更高效 ◆无缝启用新服务 Intel Ethernet 700系列产品…

谷粒商城项目总结(一)-基础篇

一、项目简介 本项目适合人群&#xff1a;学过ssm是必须的。项目里有mybatis-plus和springcloud的内容&#xff0c;你可以用本项目来做实践&#xff0c;也可以利用本项目初识cloud&#xff0c;但最好还是对微服务有一定了解。 下好了vargant&#xff0c;如果安装centos7很慢&…

是什么让 NFT 项目成为“蓝筹”?

Nov. 2022, Vincy Data Source: Footprint Analytics - Bluechip Collection 在 NFT 这样一个不稳定和新兴的行业中&#xff0c;要赋予项目为 "蓝筹 " 地位是很难的。然而&#xff0c;不少的 NFT 项目宣称自己是蓝筹项目&#xff0c;但它们是吗&#xff1f; Foot…

从零开始配置vim(29)——DAP 配置

首先给大家说一声抱歉&#xff0c;前段时间一直在忙换工作的事&#xff0c;包括但不限于交接、背面试题准备面试。好在最终找到了工作&#xff0c;也顺利入职了。期间也有朋友在催更&#xff0c;在这里我对关注本系列的朋友表示感谢。多的就不说了&#xff0c;我们正式进入vim …

【案例 5-1】 模拟订单号生成

【案例介绍】 1.任务描述 编写一个程序&#xff0c;模拟订单系统中订单号的生成。例如给定一个包括年月日以及毫秒值的 数组 arr{2019,0504,1101},将其拼接成字符串 s:[201905041101]。要求使用 String 类常用方 法来实现字符串的拼接。 2.运行结果 运行结果如图 5-1 所示 图…

【SRE】Linux加入AD域控

老牌企业一般因为安全要求或者历史遗留要求&#xff0c;会要求服务器加入AD域控 RHEL/CentOS/Ubuntu 加入 Windows ldap 域控 网上有各种各样的方法&#xff0c;很多复杂且模糊&#xff0c;操作到一大半发现没法推进&#xff0c;这个是亲测最好用的办法 使用pbis-open使Linux服…

关于Ubuntu ssh远程连接报错和无法root登录的解决方法

一、使用远程工具连接Ubuntu提示报错 MobaXterm v22.0 版本直接可以远程连接上&#xff08;前提是sshd服务是开启的状态&#xff09; 注意&#xff1a;须使用最新版本或较高版本的ssh远程连接工具&#xff0c;进行ssh连接&#xff1b;若使用较低版本的ssh远程连接工具&#xf…

MySQL产生死锁原因

阅读目录锁类型介绍死锁产生原因和示例1、产生原因2、产生示例案例一案例二案例三案例四案例五案例六锁类型介绍 MySQL 有三种锁的级别&#xff1a;页级、表级、行级 1 表级锁&#xff1a;开销小&#xff0c;加锁快&#xff1b;不会出现死锁&#xff1b;锁定粒度大&#xff0c…

正则表达式(常用最新版)

密码 【1】密码必须为包含大小写字母和数字的组合&#xff0c;不能使用特殊字符&#xff0c;长度在6-10之间。 /^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{6,10}$/ 【2】密码必须为包含大小写字母和数字的组合&#xff0c;可以使用特殊字符&#xff0c;长度在6-10之间。 /^(?.*[a-z]…

【快速上手系列】百度富文本编辑器的快速上手和简单使用

【快速上手系列】百度富文本编辑器的快速上手和简单使用 使用步骤 1、首先要把demo下载下来 demo链接&#xff1a; (18条消息) 百度富文本编辑器demo-Javascript文档类资源-CSDN文库 index.html&#xff1a;demo中的测试页面&#xff0c;可以看到很多方法使用 2、新建一个we…

【freeRTOS】操作系统之二-队列

在任何RTOS中&#xff0c;都具有一个重要的通信机制----消息队列。 ​ 队列是任务间通信的主要形式。**它们可用于在任务之间、中断和任务之间发送消息。**在大多数情况下&#xff0c;它们被用作线程安全的FIFO(先进先出)缓冲区&#xff0c;新数据被发送到队列的后面&#xff…

OpenCV图像处理——傅里叶变换

总目录 图像处理总目录←点击这里 十三、傅里叶变换 13.1、原理 我们生活在时间的世界中&#xff0c;早上7:00起来吃早饭&#xff0c;8:00去挤地铁&#xff0c;9:00开始上班。。。 以时间为参照就是时域分析。在频域中一切都是静止的 对傅里叶变换写的很好的一篇文章→ h…

【C++】队列来喽,真的很简单的

我们经历了那么多练习和顺序表&#xff0c;链表&#xff0c;栈的大风大浪&#xff0c;小小一个队列可以说简单至极了 练习&#xff0c;以及顺序表之类的文章都在我的主页哦&#xff0c;请认真学习之后再看本文 目录 1.队列的结构 2.实现 3.栈和队列的相互实现 1.队列的结构 …

Postgresql源码(88)column definition list语义解析流程分析

0 总结 如果调用函数时同时满足以下几种情况 在from后面。返回值为RECORD&#xff08;或者是anyelement表示的RECORD&#xff09;&#xff08;anyelement的实际类型由入参决定&#xff0c;入参是RECORD&#xff0c;返回就是RECORD&#xff09;。返回值被判定为TYPEFUNC_RECOR…

11.18 - 每日一题 - 408

每日一句&#xff1a;不如就利用孤单一人的时间&#xff0c;使自己变得更优秀&#xff0c;给来的人一个惊喜&#xff0c;也给自己一个好的交代 数据结构 1 当一棵有n个结点的二叉树按层次从上到下&#xff0c;同层次从左到右将结点中的数据存放在一维数组A[1…n&#xff3d;中…

Android App事件交互Event之模仿京东App实现下拉刷新功能(附源码 可直接使用)

运行有问题或需要源码请点赞关注收藏后评论区留言~~~ 一、正常下拉与下拉刷新的冲突处理 电商App的首页通常都支持下拉刷新&#xff0c;比如京东首页的头部轮播图一直顶到系统的状态栏&#xff0c;并且页面下拉到顶后&#xff0c;继续下拉会拉出带有下拉刷新字样的布局&#x…

leaflet教程039: 只显示一屏地图,设定范围不让循环延展

第039个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet只显示一屏地图,并且根据maxBounds和bounds的设定,来改变不同的地图呈现状态。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共68行)心得总结相…

[附源码]java毕业设计期刊在线投稿平台

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…