python批量读取nc气象数据并转为tif

news2025/7/21 9:51:50

python批量nc数据转tif

各类地理数据中,NC格式是很常见的,然而这种格式ArcGIS是无法打开的。一旦下载的话nc也是多时序的(多年、多月等等),让我们看看如何批量操作吧。

直接上代码:

import numpy as np
import netCDF4 as nc
from osgeo import gdal,osr,ogr
import os
import glob
def NC_to_tiffs(data,Output_folder):
    nc_data_obj = nc.Dataset(data)
    Lon = nc_data_obj.variables['lon'][:]
    Lat = nc_data_obj.variables['lat'][:]
    PM = nc_data_obj.variables['di_01']
    tp_arr = np.asarray(nc_data_obj.variables['di_01'])#将tp数据读取为数组
    tp_arr_float = tp_arr.astype(float)
    LonMin,LatMax,LonMax,LatMin = [Lon.min(),Lat.max(),Lon.max(),Lat.min()]
    N_Lat = len(Lat)
    N_Lon = len(Lon)
    Lon_Res = (LonMax - LonMin) /(float(N_Lon)-1)
    Lat_Res = (LatMax - LatMin) / (float(N_Lat)-1)
    for i in range(len(tp_arr[:])):#创建.tif文件
        driver = gdal.GetDriverByName('GTiff')
        out_tif_name = Output_folder + '\\'+ data.split('\\')[-1].split('.')[0] + '_' + str(i+1) + '.tif'
        out_tif = driver.Create(out_tif_name,N_Lon,N_Lat,1,gdal.GDT_Float32)# 设置影像的显示范围#-Lat_Res一定要是-的
        geotransform = (LonMin,Lon_Res, 0, LatMax, 0, -Lat_Res)
        out_tif.SetGeoTransform(geotransform)#获取地理坐标系统信息,用于选取需要的地理坐标系统
        srs = osr.SpatialReference()
        srs.ImportFromEPSG(4326)# 定义输出的坐标系为"WGS 84",AUTHORITY["EPSG","4326"]
        out_tif.SetProjection(srs.ExportToWkt()) # 给新建图层赋予投影信息#数据写出
        out_tif.GetRasterBand(1).WriteArray(tp_arr_float[i]) # 将数据写入内存,此时没有写入硬盘
        out_tif.FlushCache() # 将数据写入硬盘
        out_tif = None # 注意必须关闭tif文件

def main():
    Input_folder = 'D:/OneDrive/data/GPCC_AI/inputNC'
    Output_folder = 'D:/OneDrive/data/GPCC_AI/output'# 读取所有nc数据
    data_list = glob.glob(Input_folder + '\\*.nc')
    for i in range(len(data_list)):
        data = data_list[i]
        NC_to_tiffs(data,Output_folder)
        print(str(i) + ': ' + data)
main()

运行之后会打印转换成功的数据和序号:

0: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201301.nc
1: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201302.nc
2: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201303.nc
3: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201304.nc
4: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201305.nc
5: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201306.nc
6: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201307.nc
7: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201308.nc
8: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201309.nc
9: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201310.nc
10: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201311.nc
11: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201312.nc
12: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201401.nc
13: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201402.nc
14: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201403.nc
15: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201404.nc
16: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201405.nc
17: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201406.nc
18: D:/OneDrive/data/GPCC_AI/inputNC\GPCC_DI_201407.nc
...

打开文件夹,TIF也转换好了,此时发现我们的图像是上下左右颠倒的?

image-20221109235922077

由于不同NC维度不同,数据格式、类型、存储方式都可能不同,因此一定要真正理解代码,才能对其进行修改,使之适合自己的数据。

在本例中,数据上下左右发生了颠倒,我们只需要用数组反转函数即可:

numpy.flipud() # 上下翻转
numpy.flip() # 左右翻转

那么把代码加到哪里呢?让我们来看看函数是如何工作的:

主函数的前几行是比较关键的,中括号的内部是变量名:

Lon = nc_data_obj.variables['lon'][:]
Lat = nc_data_obj.variables['lat'][:]
PM = nc_data_obj.variables['di_01']

那么如何查看变量名呢?这就需要数据预读取,代码如下:

data = 'D:/OneDrive/data/GPCC_AI/GPCC_DI_201301.nc'
nc_data_obj = nc.Dataset(data)
nc_data_obj.variables

下图中是结果,红框是变量名,蓝框是数据类型,绿框是数据大小

image-20221110000631817

一般nc数据中lon和lat是必有的,只不过名字也许不同,可能有的是“longtitude”和“latitude”,我们要的数据是“di_01”。

PM = nc_data_obj.variables['di_01']
tp_arr = np.asarray(nc_data_obj.variables['di_01'])#将tp数据读取为数组

所以修改了上述两行

该函数主要是将nc读成多维数组,再循环写成tif,因此我们在数组这一步进行翻转:

for i in range(len(tp_arr[:])):#创建.tif文件
    tp_arr_float[i] = np.flipud(tp_arr_float[i])  
    driver = gdal.GetDriverByName('GTiff')

从预览图来看,结果正确!

image-20221110001325751

接下来是比较重要的投影信息:

EPSG:4326是WGS84的地理坐标

srs.ImportFromEPSG(4326)

最后是输入路径和输出路径,输出路径是一空文件夹,输入路径记录了全部的nc文件

Input_folder = 'D:/OneDrive/data/GPCC_AI/inputNC'
Output_folder = 'D:/OneDrive/data/GPCC_AI/output'# 读取所有nc数据

径记录了全部的nc文件

Input_folder = 'D:/OneDrive/data/GPCC_AI/inputNC'
Output_folder = 'D:/OneDrive/data/GPCC_AI/output'# 读取所有nc数据

这样就能实现批量操作了,读成数组之后,可以进行你要做的任何操作!

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

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

相关文章

[附源码]Python计算机毕业设计本科生外出请假管理信息系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

数据结构和算法

1.数据结构 食谱和算法之间最大的区别就在于算法是严密的。食谱上经常会有描述得比较模糊的部分, 而算法的步骤都是用数学方式来描述的,所以十分明确。 算法和程序有些相似,区别在于程序是以计算机能够理解的编程语言编写而成的,…

构造函数详解

构造函数详解1.构造函数的概念与特性2.默认构造函数(1)概念(2)分类(3)工作原理3.初始化列表(1)定义(2)为什么使用初始化列表(3)必须使…

WebRTC系列<五>我与一位大佬的聊天记录

原本打算想用webrtc部署虚幻项目。后来在了解虚幻过程中,得知虚幻有像素流插件,导出项目里带有STUN和TURN服务,但是在webGL项目里比如three.js、babylon.js如果也能部署在服务器端,那就厉害了,也很有想象力空间。 基本…

表白墙网站练习【前端+后端+数据库】

表白墙网站练习【前端后端数据库】 开发该表白墙(简单网站)的基本步骤: 1.约定前后端交互接口 2.开发服务器代码 编写Servlet能够处理前端发来的请求编写数据库代码,来获取/存储关键数据 3.开发客户端代码 基于ajax能够构造请…

一体化Ethercat通信伺服电机在汇川H5U PLC上的应用案例介绍(上)

内容介绍了一体化低压伺服Ethercat通信的电机在汇川H5UPLC上的使用,本篇主要讲解环境的搭建以及使用AutoShop软件的在线调试功能,简单控制电机位置、速度模式运行; 一、系统构成 本系统主要构成是电脑,H5U-1614MTD-A8,…

家长杂志家长杂志社家长编辑部2022年第30期目录

卷首语 读懂童心,营造乐学趣学好场景 本刊编辑部; 1 本刊视线_关注《家长》投稿:cn7kantougao163.com 留守儿童学习动力不足的成因与激发策略 蔡斌林; 4-6 农村留守儿童加强心理健康教育的策略 张芸; 7-9 本刊视线_学校体育 中学体育线上线下教学融…

【Struts2框架】idea快速搭建struts2框架

文章目录什么是SSH框架?Struts2框架1、struts2的环境搭建1.1 创建web项目(maven),导入struts2核心jar包1.2 配置web.xml(过滤器),是struts2的入口,先进入1.3 创建核心配置文件struts…

STM32 Bootloader开发记录 3 固件签名校验

STM32 Bootloader开发记录 3 固件签名校验 文章目录STM32 Bootloader开发记录 3 固件签名校验1. 移植mbedtls1.1 编译mbedtls1.2 修复rsa_sign的一个bug1.3 测试RSA1.3.1 **RSA加解密:**1.3.2 **RSA签名验签:**1.3.3 **生成秘钥对**1.4 移植到STM321.4.1…

NFV中:DPDK与SR-IOV应用场景及性能对比

DPDK与SR-IOV两者目前主要用于提高IDC(数据中心)中的网络数据包的加速。但是在NFV(网络功能虚拟化)场景下DPDK与SR-IOV各自的使用场景是怎样的?以及各自的优缺点? 本文主要通过从以下几点来阐述这个问题&a…

视觉SLAM十四讲(高翔版本),ch4章节部分笔记

目标:理解slam的框架以及它的理论知识。供以后自己查阅。 这一章主要非常重要,也是理解后续优化的基础,它是将旋转矩阵和平移向量,转化为李代数的形式进行优化,因为它有很多好处。好处如下: 意思就是采用…

Linux硬盘垃圾清理心得

最近有台系统盘才10G的服务器咔咔报警,一共才10G的空间,运维还设置了80%的报警阈值,实在难顶。为了清理硬盘里的垃圾,敲了不少命令,怕以后忘了,记录一下。 首先输入df -h查看一下硬盘空间占用情况&#xf…

呼叫中心中间件(mod_cti基于FreeSWITCH)-通话记录(CDR)接口

支持把FreeSWITCH的通话记录写入mysql,sqlserver,oracle等数据库,也可以写入redis的list,或者PUBLISH到redis的channel,方便业务程序实时获取通话记录。 使用说明 如果一个通话是A呼叫B,那么就有2个通话记录,一个叫aleg,一个叫b…

Vue3 - 全局指令(详细教程)

前言 咱们在真实项目开发中,其实有很多指令都是通用的。我们绝对不可能去每个页面都定义一次,这样不仅写起来困难,维护起来更是困难,你想一下,假设稍微变点逻辑,你就需要翻阅好几个文件去改。 其实用法和局…

家用吸尘器的总体结构设计

目 录 摘 要 i Abstract ii 1 引言 1 2 家用吸尘器的历史及发展 2 2.1 家用吸尘器的历史 2 2.2 业界的发展情况 3 3 家用吸尘器的分类 5 3.1 卧式(Canister) 5 3.2 立式(Upright) 5 3.3 手持式 (Handy) 6 3…

ON1 NoNoise AI 2023:AI智能摄影降噪工具

ON1 NoNoise AI 2023中文版是一款强大的AI智能摄影降噪工具!使用 AI 驱动的 NoNoise AI 快速去除噪点并获得照片中最清晰的细节。 更快地获得绝对最佳结果! ON1 NoNoise 比其他领先的图像去噪产品快十倍,结果会让您大吃一惊! 基于…

HI3516DV300 图像输入

HI3516DV300 图像输入 易百纳的一个开发板,以及GC2053的摄像头。 硬件 海思 海思sensor接口如下,用的是差分信号,共4对数据线(或者说4条lane),两对差分时钟。 连接器 海思核心板和扩展板之间通过板件连…

小啊呜产品读书笔记001:《邱岳的产品手记-06》11讲 如何借鉴灵感 12讲 产品案例分析:LabRdr的设计实验

小啊呜产品读书笔记001:《邱岳的产品手记-06》11讲 如何借鉴灵感 & 12讲 产品案例分析:LabRdr的设计实验一、今日阅读计划二、泛读&知识摘录1、11讲 如何借鉴灵感?2、12讲 产品案例分析:LabRdr的设计实验三、头脑风暴叮嘟…

【计算机毕业设计】外卖点餐源码

一、系统截图(需要演示视频可以私聊) 摘 要 民以食为天,外卖点餐系统餐饮业一直是与人们日常生活息息相关的产业。传统的电话外卖点餐或者到店消费已经不能适应市场发展的需求。随着网络的迅速崛起,互联网日益成为提供信息的最佳…

电话机器人详解,电销机器人获客的正确姿势是什么?

电话机器人详解,电销机器人获客的正确姿势是什么? 相信很多没接触过电话机器人的人都会好奇。 首先是预设Q&A问答主流程 通过关键词辅助指导,终端在与客户互动时,会智能地获取相应的关键词库,逐一回答客户的问题…