批量將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
英文地址,請注明出處:http://en.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使…