python中的.nc文件处理 | 04 利用矢量边界提取NC数据
利用矢量边界提取.nc数据
import osimport numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import cartopy.crs as ccrs
import cartopy.feature as cfeature
import seaborn as sns
import geopandas as gpd
import earthpy as et
import xarray as xr
# .nc文件的空间切片包
import regionmask# 绘图选项
sns.set(font_scale=1.3)
sns.set_style("white")
读取数据
data_path_monthly='http://thredds.northwestknowledge.net:8080/thredds/dodsC/agg_macav2metdata_tasmax_BNU-ESM_r1i1p1_rcp45_2006_2099_CONUS_monthly.nc'with xr.open_dataset(data_path_monthly) as file_nc:monthly_forecast_temp_xr=file_ncmonthly_forecast_temp_xr
读取感兴趣区的Shapefile文件
# 下载数据
# et.data.get_data(
# url="https://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_1_states_provinces_lakes.zip")# 读取.shp文件
states_path = "ne_50m_admin_1_states_provinces_lakes"
states_path = os.path.join(states_path,"ne_50m_admin_1_states_provinces_lakes.shp"
)states_gdf=gpd.read_file(states_path)
states_gdf.head()
筛选出California州范围
cali_aoi=states_gdf[states_gdf.name=="California"]
# 获取其外包络矩形坐标
cali_aoi.total_bounds
array([-124.37165376, 32.53336527, -114.12501824, 42.00076797])
根据外包络矩形经纬度对nc数据进行切片
- 利用
sel()函数
# 获取外包络矩形的左下角和右上角经纬度坐标
aoi_lat = [float(cali_aoi.total_bounds[1]), float(cali_aoi.total_bounds[3])]
aoi_lon = [float(cali_aoi.total_bounds[0]), float(cali_aoi.total_bounds[2])]
print(aoi_lat, aoi_lon)
# 将坐标转换为标准经度,即去掉正负号
aoi_lon[0] = aoi_lon[0] + 360
aoi_lon[1] = aoi_lon[1] + 360
print(aoi_lon)
[32.533365269889316, 42.00076797479207] [-124.3716537616361, -114.12501823892204]
[235.62834623836392, 245.87498176107795]
# 根据指定的时间和空间范围进行切片
start_date = "2010-01-15"
end_date = "2010-02-15"two_months_cali = monthly_forecast_temp_xr["air_temperature"].sel(time=slice(start_date, end_date),lon=slice(aoi_lon[0], aoi_lon[1]),lat=slice(aoi_lat[0], aoi_lat[1]))
two_months_cali
# 绘制切片数据分布的直方图
two_months_cali.plot()
plt.show()

# 绘制切片数据的空间分布
two_months_cali.plot(col='time',col_wrap=1)
plt.show()

# 若不指定时间范围
cali_ts = monthly_forecast_temp_xr["air_temperature"].sel(lon=slice(aoi_lon[0], aoi_lon[1]),lat=slice(aoi_lat[0], aoi_lat[1]))
cali_ts
提取每个点的每年的最高气温
cali_annual_max=cali_ts.groupby('time.year').max(skipna=True)
cali_annual_max
提取每年的最高气温
cali_annual_max_val=cali_annual_max.groupby('year').max(["lat","lon"])
cali_annual_max_val
绘制每年的最高温变化图
f,ax=plt.subplots(figsize=(12,6))
cali_annual_max_val.plot.line(hue="lat",marker="o",ax=ax,color="grey",markerfacecolor="purple",markeredgecolor="purple")
ax.set(title="Annual Max Temperature (K) in California")
plt.show()

使用Shapefile对nc文件进行切片
在上述的操作中,使用外包络矩形的坐标对nc数据进行了切片,但有时我们希望能得到不规则边界的数据,此时需要使用到regionmask包创建掩膜
f,ax=plt.subplots()
cali_aoi.plot(ax=ax)
ax.set(title="california AOI Subset")plt.show()

cali_aoi
根据GeoPandasDataFrame生成掩膜
cali_mask=regionmask.mask_3D_geopandas(cali_aoi,monthly_forecast_temp_xr.lon,monthly_forecast_temp_xr.lat)
cali_mask
根据时间和掩膜对数据进行切片
two_months=monthly_forecast_temp_xr.sel(time=slice("2099-10-25","2099-12-15"))two_months=two_months.where(cali_mask)
two_months
绘制掩膜结果
two_months["air_temperature"].plot(col='time',col_wrap=1,figsize=(10, 10))
plt.show()

可以看到此时图中显示范围较大,可以通过设置经纬度进一步切片
two_months_masked = monthly_forecast_temp_xr["air_temperature"].sel(time=slice('2099-10-25','2099-12-15'),lon=slice(aoi_lon[0],aoi_lon[1]),lat=slice(aoi_lat[0],aoi_lat[1])).where(cali_mask)
two_months_masked.dims
('time', 'lat', 'lon', 'region')
two_months_masked.plot(col='time', col_wrap=1)
plt.show()

同时对多个区域进行切片
# 选取多个州
cali_or_wash_nev = states_gdf[states_gdf.name.isin(["California", "Oregon", "Washington", "Nevada"])]
cali_or_wash_nev.plot()
plt.show()

# 根据多个州的范围进行掩膜的生成
west_mask = regionmask.mask_3D_geopandas(cali_or_wash_nev,monthly_forecast_temp_xr.lon,monthly_forecast_temp_xr.lat)
west_mask
帮助生成多个mask的函数
def get_aoi(shp, world=True):"""Takes a geopandas object and converts it to a lat/ lonextent Parameters-----------shp : geopandas objectworld : booleanReturns-------Dictionary of lat and lon spatial bounds"""lon_lat = {}# Get lat min, maxaoi_lat = [float(shp.total_bounds[1]), float(shp.total_bounds[3])]aoi_lon = [float(shp.total_bounds[0]), float(shp.total_bounds[2])]if world:aoi_lon[0] = aoi_lon[0] + 360aoi_lon[1] = aoi_lon[1] + 360lon_lat["lon"] = aoi_lonlon_lat["lat"] = aoi_latreturn lon_latwest_bounds = get_aoi(cali_or_wash_nev)
# 设定提取的起止时间
start_date = "2010-01-15"
end_date = "2010-02-15"# Subset
two_months_west_coast = monthly_forecast_temp_xr["air_temperature"].sel(time=slice(start_date, end_date),lon=slice(west_bounds["lon"][0], west_bounds["lon"][1]),lat=slice(west_bounds["lat"][0], west_bounds["lat"][1]))
two_months_west_coast
two_months_west_coast.plot(col="region",row="time",sharey=False, sharex=False)
plt.show()

计算每个区域的温度均值
summary = two_months_west_coast.groupby("time").mean(["lat", "lon"])
summary.to_dataframe()
本节完整代码
# 提取geopandas对象的外包络矩形经纬度
def get_aoi(shp, world=True):"""Takes a geopandas object and converts it to a lat/ lonextent """lon_lat = {}# Get lat min, maxaoi_lat = [float(shp.total_bounds[1]), float(shp.total_bounds[3])]aoi_lon = [float(shp.total_bounds[0]), float(shp.total_bounds[2])]# Handle the 0-360 lon valuesif world:aoi_lon[0] = aoi_lon[0] + 360aoi_lon[1] = aoi_lon[1] + 360lon_lat["lon"] = aoi_lonlon_lat["lat"] = aoi_latreturn lon_lat
# 本节完整代码# 读取矢量数据
states_path = "ne_50m_admin_1_states_provinces_lakes"
states_path = os.path.join(states_path, "ne_50m_admin_1_states_provinces_lakes.shp")states_gdf = gpd.read_file(states_path)# 读取nc数据
data_path_monthly = 'http://thredds.northwestknowledge.net:8080/thredds/dodsC/agg_macav2metdata_tasmax_BNU-ESM_r1i1p1_rcp45_2006_2099_CONUS_monthly.nc'
with xr.open_dataset(data_path_monthly) as file_nc:monthly_forecast_temp_xr = file_nc# 数据对象
monthly_forecast_temp_xr# 将geopandas对象转换成掩膜
states_gdf["name"]cali_or_wash_nev = states_gdf[states_gdf.name.isin(["California", "Oregon", "Washington", "Nevada"])]west_mask = regionmask.mask_3D_geopandas(cali_or_wash_nev,monthly_forecast_temp_xr.lon,monthly_forecast_temp_xr.lat)
west_mask
west_bounds = get_aoi(cali_or_wash_nev)# 根据时间、掩膜范围对数据进行切片 .sel().where()
start_date = "2010-01-15"
end_date = "2020-02-15"two_months_west_coast = monthly_forecast_temp_xr["air_temperature"].sel(time=slice(start_date, end_date),lon=slice(west_bounds["lon"][0], west_bounds["lon"][1]),lat=slice(west_bounds["lat"][0], west_bounds["lat"][1])).where(west_mask)# 输出切片数据
two_months_west_coast# 直方图绘制
two_months_west_coast.plot()
plt.show()

# 绘制每个区域的变化
regional_summary = two_months_west_coast.groupby("region").mean(["lat", "lon"])
regional_summary.plot(col="region",marker="o",color="grey",markerfacecolor="purple",markeredgecolor="purple",col_wrap=2)
plt.show()

# 转换为dataframe
two_months_west_coast.groupby("region").mean(["lat", "lon"]).to_dataframe()
参考链接:
https://www.earthdatascience.org/courses/use-data-open-source-python/hierarchical-data-formats-hdf/summarize-climate-data-by-season/
https://gitee.com/jiangroubao/learning/tree/master/NetCDF4
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yWEE3qlj-1676603621866)(null)]
相关文章:
python中的.nc文件处理 | 04 利用矢量边界提取NC数据
利用矢量边界提取.nc数据 import osimport numpy as np import pandas as pd import matplotlib.pyplot as plt import cartopy.crs as ccrs import cartopy.feature as cfeature import seaborn as sns import geopandas as gpd import earthpy as et import xarray as xr # …...
使用 PyNeuraLogic 超越 Transformers
展示神经符号编程的力量neuro-symbolic1. 简介 在过去的几年里,我们看到了基于 Transformer 的模型的兴起,并在自然语言处理或计算机视觉等许多领域取得了成功的应用。在本文[1]中,我们将探索一种简洁、可解释和可扩展的方式来表达深度学习模…...
微信点金计划(服务商角度)
时间:2023/2/17 背景:微信在推出点金计划后,原本window.WeixinJSBridge.invoke方法的回调失效了,需要在微信支付服务商平台|平台开放更多能力,与服务商一起成长这里进行配置,配置流程跟着官方给…...
2023年美赛 MCM B题 重新构想马赛马拉岛
背景肯尼亚的野生动物保护区最初主要是为了保护野生动物和其他自然资源。肯尼亚议会于2013 年通过了《野生动物保护和管理法》,以提供更公平的资源共享,并允许进行替代的、以社 区为基础的管理工作[1].此后,肯尼亚增加了修正案,以…...
指标体系的应用与搭建
一、指标体系的介绍 体系泛指一定范围内同类事物按照一定的顺序或内在联系而组成的整体。指标体系也一样,指的是不同指标按照一定的顺序及内部联系而组成的整体。此外,在指标体系中,除了以应用为出发点搭建,还会加入使用指南&…...
固态继电器的五大优势
固态继电器的优点和五个关键优势,现代电气控制系统因二极管、晶体管和晶闸管等固态器件的发明而得到极大的增强。对于加热器和电机等大负载设备,固态继电器可能比传统的机械继电器具有巨大的优势。 虽然并非适用于所有情况,但它们具有许多吸引…...
特征检测之HOG特征算法详解及Opencv接口使用
1. HOG特征简介 特征描述符是图像或图像补丁的表示形式,它通过提取有用信息并丢弃无关信息来简化图像。 通常,特征描述符将大小W x H x 3(通道)的图像转换为长度为n的特征向量/数组。对于 HOG 特征描述符,输入图像的…...
一款好的低代码开发平台应该是什么样?
一款好的低代码开发平台应该是什么样? 以企业级应用构建来讲,完成一个应用复杂度随着技术的进步、需求的细化、业务要求的变化并不是逐渐降低,而是逐渐提升。用户想要有更好的体验,复杂度更是成倍提升。 基于此,低代码…...
基于Spring cloud搭建oauth2
1,OAuth2.0简介 OAuth(开发授权)是一个开放标准,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,而不需要将用户名和密码提供给第三方应用或分享他们数据的所有内容。 OAuth2.0是OAuth的延续…...
实现一个小程序分享图 wxml2canvas
我们经常会遇上动态生成海报的需求,而在小程序中,生成图片非Canvas莫属。但是在实际工作当中,为了追求效率,我们会不可避免地去使用一些JS插件,而 wxml-to-canvas 就是一款官方推荐且非常优秀的插件,它可以…...
基于matlab设计x波段机载SAR系统
一、前言此示例说明如何设计在 X 波段工作的合成孔径雷达 (SAR) 传感器并计算传感器参数。SAR利用雷达天线在目标区域上的运动来提供目标区域的图像。当SAR平台在目标区域上空行进时,当脉冲从雷达天线发送和接收时,会产生合成孔径…...
WPF学习:Slider — 冒泡显示值
想做一个下图所示的Slider,以冒泡的方式显示其Value值,该怎么做呢? 功能要求,当鼠标放在滑块上的时候,冒“泡”显示值;当滑块移动的时候,“泡”跟随移动。 看似简单的功能,但要完美…...
Vue实战第4章:主页设计之中部内容设计
前言 本篇在讲什么 接上篇文章,我们制作了一个自定义的网页导航栏,本篇文章我们简单制作一个内容页 仅介绍简单的应用,仅供参考 本篇适合什么 适合初学Vue的小白 适合想要自己搭建网站的新手 适合没有接触过vue-router的前端程序 本篇…...
数据结构代码总结(C语言实现)
目录如何应对数据结构的代码题?采取的学习流程①首先对C语言的语法的熟悉②学习掌握基本代码的写法,做到熟练2.1插入排序2.2快速排序2.3二分查找2.4树的遍历③跟着网上视频开始熟悉对一些问题的解答④结合真题的代码,寻找其中的结题规律如何应…...
zookeeper 复习 ---- chapter04
zookeeper 复习 ---- chapter04zookeeper 的精髓是什么? 1:它有四个节点类型 持久无序的节点 临时无序的节点 持久有序的节点 临时有序的节点 临时的节点的特征:当客户端和服务器端断开连接,当前客户端创建的节点被服务器端自动删…...
thinkphp6.0连接MYSQL
目录8.连接多个数据库7.多级控制器不存在6.分页5.非法请求4.关于路由**3.初体验页面****2.加入fileheader添加注释****1.配置mysql0. 官方开发手册一些网址 http://127.0.0.1:8000/index 原桌面 http://127.0.0.1:8000/hello/fsh hello,fsh(index中hello方法&#x…...
商家必读!超店有数分享,tiktok达人营销变现如何更快一步?
近几年来,“粉丝经济”发展越来越迅猛,“网红带货”已经成为了一种营销的方式。这种方式让商家能基于达人的影响下迅速抢占自己的私域流量池。消费者会基于对达人的信任,购买达人推荐的产品。达人效应可以助力品牌走出营销困境。如果商家想要…...
操作系统(day11)--快表,两级页表
具有快表的地址变换机构 时间局限性:会有大量连续的指令需要访问同一个内存块的数据的情况(程序中的循环) 空间局限性:一旦程序访问了某个存储单元,在不久之后,其附近的存储单元也很有可能被访问。…...
预告| 亮点抢先看!第四届OpenI/O启智开发者大会主论坛24日启幕!
2023年2月24日至25日,第四届OpenI/O启智开发者大会将在深圳隆重举行。“算网筑基、开源启智、AI赋能”作为今年大会的主题,吸引了全球业界关注的目光。大会集结中国算力网资源基座、开源社区治理及AI开源生态建设、国家级开放创新应用平台、NLP大模型等前…...
猪齿鱼(Choerodon UI )的通用提交的封装 —— 两种方案,A.使用dataSet的自身的submit,B.使用axios.post来提交
submit组件(otherSubmit/axiosSubmit) 一、背景与简介 1、首先我们申请表提交,分为【保存】提交与【其他】提交; 1.1【保存】提交,要求表单必须要有变更,DataToJSON默认为dirty(只转换变更的…...
初创团队如何借助 Taotoken 实现低成本且灵活的大模型能力集成
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创团队如何借助 Taotoken 实现低成本且灵活的大模型能力集成 对于资源有限的初创技术团队而言,在开发新产品时集成 A…...
Win11Debloat:如何用5分钟让Windows 11回归纯净本质?
Win11Debloat:如何用5分钟让Windows 11回归纯净本质? 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declut…...
GAD7980 ADC在振动数据采集中的实战应用与设计要点
1. 项目概述:为什么我们需要“快、精、高”的振动数据采集?在工业设备状态监测、精密仪器分析乃至消费电子性能评估领域,振动数据就像设备的“心电图”。它直接反映了机械结构的健康状况、运动部件的平衡性以及系统运行的稳定性。过去&#x…...
从Scratch图形化到Python代码:用树莓派给LeArm机械臂做二次开发实战
从Scratch图形化到Python代码:用树莓派给LeArm机械臂做二次开发实战 当Scratch积木块拼接的机械臂动作开始显得单调时,便是时候揭开底层控制的神秘面纱了。本文将带您跨越图形化编程的舒适区,用树莓派的Python环境重新定义LeArm机械臂的智能—…...
AI驱动博客平台CodeBlog-app:开发者技术分享的智能解决方案
1. 项目概述:一个为开发者而生的AI驱动博客平台最近在GitHub上看到一个挺有意思的开源项目,叫CodeBlog-ai/codeblog-app。光看名字,你可能会觉得这又是一个普通的博客系统,或者是一个AI写作工具。但当我深入去研究它的代码和设计理…...
高考解析几何“秒杀”技巧:用极点极线快速搞定椭圆定点定值难题
高考解析几何“秒杀”技巧:用极点极线快速搞定椭圆定点定值难题 解析几何作为高考数学的压轴题型,常常让考生望而生畏。面对复杂的计算和抽象的条件,如何在有限时间内快速找到突破口?极点极线理论作为高等几何中的重要工具&#x…...
别再死记硬背了!用MATLAB手把手教你画根轨迹图(附代码与避坑指南)
MATLAB实战:从零绘制根轨迹图的完整指南与避坑技巧 在控制系统的设计与分析中,根轨迹图是理解系统动态特性的重要工具。传统教学中,学生往往被要求死记硬背绘制规则,却难以理解其实际应用价值。本文将彻底改变这一现状——通过MAT…...
Steam成就管理器终极指南:3步修复错失的游戏成就
Steam成就管理器终极指南:3步修复错失的游戏成就 【免费下载链接】SteamAchievementManager A manager for game achievements in Steam. 项目地址: https://gitcode.com/gh_mirrors/st/SteamAchievementManager Steam Achievement Manager(SAM&a…...
多维子集和问题:NP难问题的算法与应用解析
1. 多维子集和问题概述多维子集和问题(Multi-dimensional Subset Sum Problem)是计算复杂度理论中的经典NP难问题。简单来说,它要求在给定的n维向量集合中,找出一个子集,使得该子集中所有向量在每一维上的和恰好等于目标向量对应的分量。这个…...
基于Groq LPU与React技术栈构建极速AI聊天应用实战
1. 项目概述:当极速推理遇上聊天应用最近在折腾AI应用开发的朋友,估计都绕不开一个词:推理速度。模型能力再强,如果生成一句话要等上十几秒,用户体验就无从谈起。正是在这种背景下,我注意到了unclecode/gro…...
