批量将NC格式数据转换为TIF格式:解决转换后图像颠倒、镜像、翻转等问题

  本文介绍基于PythonGDAL模块,批量将大量.nc格式的栅格文件转换为.tif格式,并解决可能出现的转换后图像颠倒、镜像、翻转等问题。

  最近,需要批量将大量.nc格式的栅格文件转换为.tif格式。如下图所示,有多个待转换的.nc格式文件,且对于每一个.nc格式文件,其都含有多个时相的数据。

  其实,对于.nc格式转.tif格式,除了gdal库之外,还有其他非常多成熟、方便的Python库或R语言库可以实现,且这些库都比gdal库用起来方便——甚至安装过程也比gdal库方便;但是,我在一开始用这些其他库进行格式转换时发现:对于我的.nc格式数据,若用其他库进行转换,最终得到的.tif图像并不是正确的——其要么是行列数(也就是经纬度)都反了,要么是经度或纬度其中一个是反着的;包括PythonnetCDF4库、xarray库、rioxarray库,以及R语言的ncdf库等,都存在这个问题。

  如下图所示,这个就是我遇到的其中一种情况。可以看到,这个结果数据的经度倒是没错,但是纬度搞反了,所以全球的图像是反着来的,南极跑到北极去了。

  针对这种情况,我大致看了一下原本的.nc格式数据,感觉问题应该就是出在.nc数据上——比如可能对于一些学者自行生产的科学数据产品,其在数据生产完毕、封装为.nc格式时,经纬度是反着写的;而上述提及的那些成熟的.nc格式转.tif格式的库,他们默认是正着解析经度和纬度的,所以出现了上述问题。

  所以,为了解决这个问题,那就不太好用这些封装好的.nc格式转.tif格式库了,而是需要将.nc格式数据直接提取为类似于array格式的矩阵数据,然后手动进行矩阵变换,再将其导出为.tif——那这样的话,就只有gdal库符合要求了。

  本文所用代码如下。

import os
import numpy as np
import netCDF4 as nc
from osgeo import gdal
from osgeo import osrnc_folder = R"e:\LTDR\N07"
tif_folder = R"d:\99_Temp\NDVI\SPEI\TIFF"
data_name = "spei"
nodata = -9999
scale = 10000
res = 0.25if not os.path.exists(tif_folder):os.makedirs(tif_folder)driver = gdal.GetDriverByName('GTiff')for nc_file in os.listdir(nc_folder):if nc_file.endswith(".nc"):nc_file_path = os.path.join(nc_folder, nc_file)year = nc_file.split("_")[2]with nc.Dataset(nc_file_path) as file:data = np.array(file[data_name][:])times = np.array(file['time'][:])lats = np.array(file['lat'][:])lons = np.array(file['lon'][:])lat_min, lat_max = lats.min(), lats.max()lon_min, lon_max = lons.min(), lons.max()lat_num = len(lats)lon_num = len(lons)lat_res = reslon_res = reslat_origin = lat_max + lat_res / 2lon_origin = lon_min - lon_res / 2for time in range(len(times)):daily_data = data[time, :, :]# scale the data if necessary# daily_data = np.round(data[time, :, :] * scale).astype(np.int32)# Flip the data to match the expected orientation, here are three options:daily_data = np.flipud(daily_data.T)daily_data = np.flipud(daily_data)daily_data = daily_data.Toutput_tif_path = os.path.join(tif_folder,f"SPEI_{year}{str(time + 1).zfill(3)}.tif")outRaster = driver.Create(output_tif_path, lon_num, lat_num, 1, gdal.GDT_Float32)# outRaster = driver.Create(output_tif_path, lon_num, lat_num, 1, gdal.GDT_Int32)outRaster.SetGeoTransform([lon_origin, lon_res, 0, lat_origin, 0, -lat_res])sr = osr.SpatialReference()sr.SetWellKnownGeogCS('WGS84')outRaster.SetProjection(sr.ExportToWkt())band = outRaster.GetRasterBand(1)band.SetNoDataValue(nodata)# scale the data if necessary# band.SetNoDataValue(nodata * scale)band.WriteArray(daily_data)print(output_tif_path, ' finished')del outRaster

  其中,nc_folder就是.nc格式文件所在目录,tif_folder是输出.tif格式文件的目录,data_name是要提取的变量名,nodata表示填充值,scale是缩放系数(例如假设原本的.nc格式文件是浮点数,乘以10000并取整后,存为整数可节省空间),res则是空间分辨率。

  代码整体思路也很简单,主要就是需要关注daily_data = np.flipud(daily_data.T)这句代码以及其下方的2行代码。这里就是将原本.nc格式文件数据加以变换的地方,这里列出了3种变换方法,分别为先转置、后上下颠倒,以及直接上下颠倒,还有直接转置。这里之所以列出3种方法,是因为我当时要转换的.nc格式数据产品有很多种,为了方便就将不同种对我有效果的变换方法都写上了;大家使用代码时,需要注意选择自己适合的变换方法。还有一种情况,就是可能图像还会出现左右颠倒的问题,也就是纬度没问题、但经度反了——不过这种情况感觉一般不会遇到,所以当时就没写变换的代码;如果大家遇到了,那就需要额外对array进行左右变换。

  至此,大功告成。

欢迎关注:疯狂学习GIS

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

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

相关文章

《论三生原理》重构数学哲学基础语义场‌?

AI辅助创作:《论三生原理》通过算法化转译传统文化符号、重构数学对象本体论及创新术语体系,系统性重构数学哲学基础语义场,其核心路径如下:🔍 一、哲学符号的数学实体化‌阴阳范畴的数理转译‌将《周易》“阴/阳”抽象…

适用于在线3D测量和检测的3D激光轮廓仪

Z-Trak™ Express 1K5 系列是Z-Trak系列中的最新创新成果,专为实现经济高效的在线3D测量和检测而设计,在整个测量范围内可实现每秒最多 5,000 个轮廓的测量速率,具有高速检测能力和实时处理性能。Z-Trak™ Express 1K5系列 3D激光轮廓仪Z-Tra…

主播生活模拟器2|主播人生模拟器2 (Streamer Life Simulator 2)免安装中文版

网盘链接: 七主播生活模拟器2|主播人生模拟器2 名称:七主播生活模拟器2|主播人生模拟器2 (Streamer Life Simulator 2)免安装中文版 描述:《主播人生模拟器》是一款从零开始,努力成为一名受欢迎的网络主…

解决React白板应用中的画布内容丢失问题

解决React白板应用中的画布内容丢失问题 在开发基于React的在线白板应用时,我们遇到了一个棘手问题:当用户滚动到底部自动扩展画布时,原有绘制内容会神秘消失。经过系统排查,最终通过Canvas API的巧妙运用解决了这个问题。以下是完…

韩国宝蓝集团与Alpha World、非小号Alpha正式达成战略合作

2025年8月1日,Boram Group(宝蓝集团)旗下Boram Sangjo特销团队正式宣布,已与全球Web3平台 Alpha World 以及加密数据平台 非小号Alpha(FXH Alpha)达成三方战略合作。始于1991–1992年创立的 Boram Sangjo Development隶属于Boram …

手动开发一个TCP服务器调试工具(二):无界面 TCP 通信服最小实现

本篇将讲解如何使用 Qt 构建一个简单但完整的TCP 服务端,无需图形界面。✦ 程序功能概览 启动一个监听本地 12345 端口的 TCP 服务;有客户端连接时输出信息;每秒向客户端发送一次当前时间;支持接收客户端数据;客户端断…

​​大语言模型(LLM)实战应用:从微调到部署全流程​​

摘要​​ 大语言模型(LLM)已成为AI落地的核心驱动力,但其从预训练状态到生产环境的转化仍面临技术复杂度高、资源消耗大等挑战。本文系统梳理LLM实战全流程,涵盖​​微调策略选择​​、​​量化压缩技术​​、​​部署优化方案​​…

基于Web的交互式坐标系变换矩阵计算工具

基于Web的交互式坐标系变换矩阵计算工具一、什么是坐标系变换矩阵?二、为什么需要这个工具?三、效果四、功能介绍1、坐标系定义2、交互控制3、变换矩阵计算五、如何使用这个工具六、完整代码七、总结一、什么是坐标系变换矩阵? 在三维空间中…

【C++】类和对象--类中6个默认成员函数(2) --运算符重载

目录 问题引入 1. 运算符重载 问题引入 在C中,我们之前讲过了,一个类中什么都没有,我们将其称作空类。但是我们之前提到过,就算我们在类中什么也不定义,编译器会自动生成6个默认的成员函数:构造函数、析构…

阿里云OSS vs 腾讯云COS深度对比:如何为网站静态资源选择最佳对象存储?

你的服务器,是不是感觉越来越“累”了?最开始,你只是在上面跑一个简单的博客,它健步如飞。后来,你的网站内容越来越丰富,图片越来越多,主题越来越炫酷,你慢慢发现,网站的…

排序知识总结

排序的概念及引用排序是使一串记录,按照某个关键字的大小,递增或递减排列起来的操作稳定性:相同关键字排序前后相对顺序不变内部排序:数据元素全部放在内存中排序外部排序:数据太多不能同时放到内存中,根据…

rebase 和pull的通俗区别是什么

目录 Git中rebase与pull的通俗区别 简单比喻 主要区别 使用场景 通俗例子 git rebase 使用例子 🎯 目标 🧪 场景设定 🧰 操作步骤 1️⃣ 你切换到 feature 分支 2️⃣ 更新远程代码 3️⃣ 进行 rebase 操作 🔄 变化后…

微信小程序功能 表单密码强度验证

一、页面展示与交互功能表单提交与验证&#xff08;含密码强度验证&#xff09;实现带密码强度验证的表单提交功能&#xff0c;使用正则表达式检查密码复杂度&#xff1a;<form bindsubmit"submitForm"><input name"username" placeholder"请…

【谷歌 SEO】排查页面未索引问题:原因与解决方案

你在谷歌网站SEO优化时是否遇到以下情况&#xff1f; 为什么&#xff0c;即使我已经正确地编写了站点地图并将其链接到客户的网站&#xff0c;并且我已经检查了所有内容&#xff0c;但我是否在某些文章&#xff08;不是所有文章&#xff09;上遇到索引问题&#xff0c;即使在向…

Android 系统的基本安全属性

Android 系统的“基本安全属性”可概括为 “设备可信、应用隔离、权限最小、数据加密、持续更新” 五大类。下面从 硬件 → 系统 → 应用 → 数据 → 运维 五个层面&#xff0c;用一句话一句话的方式帮你快速掌握&#xff1a;1. 硬件层&#xff1a;信任根&#xff08;Root of T…

【数据结构初阶】--栈与队列(栈)

&#x1f618;个人主页&#xff1a;Cx330❀ &#x1f440;个人简介&#xff1a;一个正在努力奋斗逆天改命的二本觉悟生 &#x1f4d6;个人专栏&#xff1a;《C语言》《LeetCode刷题集》《数据结构-初阶》 前言&#xff1a;在之前几篇博客中&#xff0c;我们学习了顺序表和链表&…

分布式微服务--GateWay的断言以及如何自定义一个断言

&#x1f4cc; 一、什么是 Gateway 的断言&#xff08;Predicates&#xff09;&#xff1f;Predicates&#xff08;断言&#xff09; 是 Spring Cloud Gateway 中用于匹配请求的条件。只有请求满足断言条件&#xff0c;路由才会生效&#xff0c;转发到下游服务。&#x1f3af; …

图片识别表格工具v3.0绿色版,PNG/JPG秒变可编辑Excel

[软件名称]: 图片识别表格工具v3.0绿色版 [软件大小]: 4.3 GB [软件大小]: 夸克网盘 | 迅雷网盘 软件介绍 表格快捕手 v3.0 绿色单文件版&#xff0c;无需安装&#xff0c;双击即可运行。支持 PNG、JPG 等常见图片格式&#xff0c;可精准识别其中的有线或无线表格&#xff…

线程池分析与设计

线程池 基本功能接口 C11 及以后的标准中&#xff0c;std::packaged_task和std::future是并发编程中用于任务封装和结果获取的重要组件&#xff0c;它们通常与线程配合使用&#xff0c;实现异步操作。 std::packaged_task std::packaged_task&#xff1a;封装可调用对象为异步任…

机器学习:线性回归

线性回归&#xff1a;研究自变量和因变量之间的关系。对于特征x(x1,x2,x3....)与对应的标签y&#xff0c;线性回归假设二者之间存在线性映射。f(x)w1xw2x(平方)w3x(三次方)...&#xff0c;权重w表示每个特征变量的重要程度。越大表示越重要。线性回归目标&#xff1a;求解w和b使…