星.he5文件并提取TSS濃度數(shù)據(jù)的方法)
如果你手頭剛好有一批GOCI衛(wèi)星的水色產(chǎn)品文件后綴是.he5需要一次性讀進(jìn)來(lái)、提取里面的總懸浮物質(zhì)濃度TSS數(shù)據(jù)再按時(shí)間順序畫(huà)成變化過(guò)程圖那這篇內(nèi)容應(yīng)該可以幫你省不少摸索時(shí)間。我用Matlab處理GOCI數(shù)據(jù)有幾年了從最初單文件手動(dòng)調(diào)到后來(lái)批量跑幾十個(gè)時(shí)相中間踩過(guò)的坑基本集中在文件結(jié)構(gòu)不熟、批量組織混亂、比例因子忘乘這三大類(lèi)。這篇文章把整套流程拆開(kāi)講清楚包括如何用h5info定位TSS數(shù)據(jù)、如何寫(xiě)批量循環(huán)、如何做掩膜和配色最后也會(huì)給一份可以直接改路徑拿去跑的Matlab代碼。適合剛接觸水色遙感的同學(xué)也適合已經(jīng)被.he5文件結(jié)構(gòu)折磨了一陣子的從業(yè)者。1. 動(dòng)手之前先搞清楚GOCI和TSS是什么1.1 GOCI數(shù)據(jù)到底特別在哪GOCI是搭載在通信、海洋、氣象衛(wèi)星上的靜止軌道海洋水色成像儀它跟極軌衛(wèi)星最大的區(qū)別是能“盯著一個(gè)地方看”。極軌衛(wèi)星一天過(guò)境一兩次而GOCI可以在白天對(duì)同一海域進(jìn)行多次觀測(cè)時(shí)間分辨率能到小時(shí)級(jí)。這意味著什么呢如果你做的是潮周期內(nèi)的懸浮泥沙變化、突發(fā)污染擴(kuò)散、或者近岸水體短期演變分析GOCI的時(shí)間密度是很大的優(yōu)勢(shì)。TSSTotal Suspended Solids即總懸浮物質(zhì)濃度反映的是水體內(nèi)懸浮顆粒物的含量單位通常是g/m3或mg/L。近岸水質(zhì)評(píng)價(jià)、河口泥沙輸運(yùn)、赤潮跟蹤TSS都是一個(gè)硬指標(biāo)。我所接觸的GOCI L2產(chǎn)品里TSS并不是原始遙感反射比而是已經(jīng)經(jīng)過(guò)大氣校正和反演算法處理的二級(jí)產(chǎn)品。你拿到文件之后不需要自己從頭算只需要把產(chǎn)品變量讀取出來(lái)處理好比例因子和無(wú)效值然后做空間展示或時(shí)間序列分析就好。當(dāng)然前提是你得知道怎么把這個(gè).he5文件讀進(jìn)來(lái)這就是接下來(lái)的重頭戲。1.2 TSS產(chǎn)品的數(shù)據(jù)鏈路GOCI數(shù)據(jù)處理系統(tǒng)GDPS是官方提供的數(shù)據(jù)處理平臺(tái)用戶從數(shù)據(jù)共享平臺(tái)拿到的一般是L1原始數(shù)據(jù)L1經(jīng)過(guò)GDPS處理之后輸出L2產(chǎn)品其中就包含TSS、葉綠素a濃度、有色溶解有機(jī)物、總吸收系數(shù)等若干波段。輸出文件通常以HDF5格式存儲(chǔ)而GDPS有個(gè)習(xí)慣文件后綴用的是.he5而不是.h5。這個(gè)細(xì)節(jié)很關(guān)鍵因?yàn)楹芏嗳嗽谖募g覽器里看到.he5第一反應(yīng)是“這什么格式”其實(shí)它就是HDF5Matlab的h5系列函數(shù)完全可以直接讀。以我實(shí)際接觸過(guò)的產(chǎn)品為例文件內(nèi)部結(jié)構(gòu)通常走HDF-EOS規(guī)范。所謂HDF-EOS可以理解為NASA對(duì)HDF5做了一套面向地球觀測(cè)的結(jié)構(gòu)約定把數(shù)據(jù)組織成“Swath”或“Grid”Swath內(nèi)部再分成數(shù)據(jù)場(chǎng)、地理定位場(chǎng)、屬性等節(jié)點(diǎn)。打開(kāi)之后你經(jīng)常能看到類(lèi)似這樣的路徑/HDFEOS/SWATH/GOCI/Data Fields/TSS/HDFEOS/SWATH/GOCI/Data Fields/CHL/HDFEOS/SWATH/GOCI/Geolocation Fields/Longitude/HDFEOS/SWATH/GOCI/Geolocation Fields/Latitude并不是所有產(chǎn)品都完全一致不同處理版本內(nèi)部路徑可能略有差別所以最穩(wěn)妥的做法不是憑記憶硬編碼路徑而是先用h5info看一遍文件結(jié)構(gòu)。我在后面會(huì)專(zhuān)門(mén)演示這一步。了解清楚這個(gè)結(jié)構(gòu)后續(xù)批量處理才不心虛。2. 環(huán)境準(zhǔn)備與批量讀取方案2.1 Matlab讀HDF5的工具與準(zhǔn)備Matlab對(duì)HDF5的支持相當(dāng)完善不需要額外裝氣象或海洋工具包只需要基礎(chǔ)版就能調(diào)用h5info、h5read、h5disp這幾個(gè)核心函數(shù)。h5info用來(lái)查看文件結(jié)構(gòu)返回一個(gè)結(jié)構(gòu)體里面包含Groups、Datasets、Attributes等字段h5read用來(lái)按路徑讀取數(shù)據(jù)h5disp則是把文件結(jié)構(gòu)直接打印到命令行適合快速掃一眼。有一點(diǎn)需要提醒舊版本Matlab比如2015年前后對(duì)HDF5的某些壓縮算法支持不是很好如果讀取寫(xiě)到一半報(bào)錯(cuò)提示“filter”相關(guān)優(yōu)先考慮升級(jí)Matlab版本或改用其他讀取工具。另外文件名路徑里不要帶中文和特殊符號(hào)個(gè)別版本在Windows下對(duì)中文路徑敏感讀不出來(lái)的時(shí)候先把路徑改成純英文試一次。除了基礎(chǔ)環(huán)境我建議在腳本開(kāi)頭固定設(shè)置這樣一段clear; clc; close all; warning(off, all); % 關(guān)閉非關(guān)鍵警告但不建議全程關(guān)閉批處理時(shí)warning太多會(huì)嚴(yán)重拖慢速度我一般在調(diào)試階段不開(kāi)這條跑批量的時(shí)候才關(guān)掉。2.2 批量讀取.he5文件的兩個(gè)核心套路批量讀取的核心就是把目錄下所有.he5文件找出來(lái)再逐個(gè)循環(huán)。最常用的方法有兩種第一種是用dir加通配符第二種是用文件夾篩選函數(shù)。實(shí)測(cè)算起來(lái)dir配合fullfile最穩(wěn)跨電腦也不會(huì)因?yàn)樾备芊较虺鰡?wèn)題。下面這段代碼就是批量讀取的骨架你可以直接當(dāng)成模板fileDir D:/GOCI/TSS/20230731; fileList dir(fullfile(fileDir, *.he5)); fileList fileList(~[fileList.isdir]); % 排除文件夾 fprintf(共找到 %d 個(gè)文件\n, numel(fileList)); for k 1:numel(fileList) fileName fullfile(fileDir, fileList(k).name); fprintf([%02d] %s\n, k, fileList(k).name); % 這里寫(xiě)你的讀取與處理邏輯后面會(huì)補(bǔ)全 % tss h5read(fileName, tssPath); end這里有個(gè)容易被忽略的點(diǎn)dir返回的結(jié)構(gòu)體里第一個(gè)元素有時(shí)候是當(dāng)前目錄虛擬項(xiàng)isdir為true如果你用通配符’*.he5’這種情況通常不會(huì)出現(xiàn)但加上排除文件夾那行可以防御性避免出錯(cuò)。2.3 文件名里的時(shí)間信息怎么利用GOCI的文件名一般長(zhǎng)這樣例如“COSI_GOCI_L2_20160731024700.he5”中間那串?dāng)?shù)字就是觀測(cè)的UTC時(shí)間年、月、日、時(shí)、分、秒基本都齊了。畫(huà)TSS變化過(guò)程最關(guān)鍵的一步就是把這個(gè)時(shí)間解析出來(lái)并用它來(lái)給數(shù)據(jù)排序和作為橫軸。我自己常用的解析方法是正則加datestrtokens regexp(fileList(k).name, \d{14}, match); if ~isempty(tokens) timeStr tokens{1}; timeNum datenum(timeStr, yyyymmddHHMMSS); timeVec(k) timeNum; end注意GOCI文件里記錄的時(shí)間是UTC如果海域位于東八區(qū)實(shí)際當(dāng)?shù)貢r(shí)間需要加8小時(shí)。要不要當(dāng)?shù)貢r(shí)取決于你的應(yīng)用場(chǎng)景但如果做潮汐相關(guān)的分析時(shí)間基準(zhǔn)必須統(tǒng)一否則相位會(huì)差八小時(shí)結(jié)論可能完全相反。還有個(gè)小技巧預(yù)處理階段就把所有文件路徑和時(shí)間戳寫(xiě)進(jìn)一個(gè)表格結(jié)構(gòu)體后面讀數(shù)據(jù)時(shí)按時(shí)間排序。這個(gè)習(xí)慣能讓你在處理幾十上百個(gè)文件時(shí)思路清晰meta struct(name, {}, path, {}, timeNum, {}); for k 1:numel(fileList) ... meta(k).name fileList(k).name; meta(k).path fullfile(fileDir, fileList(k).name); meta(k).timeNum datenum(tokens{1}, yyyymmddHHMMSS); end [~, idx] sort([meta.timeNum]); meta meta(idx);3. 提取TSS數(shù)據(jù)并做預(yù)處理3.1 找到TSS數(shù)據(jù)的真實(shí)路徑這一步是整個(gè)流程里最容易出岔子的地方。一個(gè)優(yōu)質(zhì)的TSS產(chǎn)品文件里除了TSS之外通常還有葉綠素、CDOM、云掩膜、質(zhì)量標(biāo)記等一大堆字段路徑結(jié)構(gòu)也分好幾層。你要是靠回憶去找往往看了半天也沒(méi)找到。我的習(xí)慣是拿到一個(gè)陌生文件后第一件事就是跑h5disp把結(jié)構(gòu)打印出來(lái)然后從輸出里直接搜TSS關(guān)鍵字。比如這樣info h5info(D:/GOCI/TSS/20230731/COSI_GOCI_L2_20230731224700.he5); disp(info);然后命令行里會(huì)顯示出整個(gè)樹(shù)形結(jié)構(gòu)。找到類(lèi)似‘/HDFEOS/SWATH/GOCI/Data Fields/TSS’這樣的路徑后我建議把路徑寫(xiě)成一個(gè)變量放在腳本頂部不要散落在各處硬編碼tssPath /HDFEOS/SWATH/GOCI/Data Fields/TSS; lonPath /HDFEOS/SWATH/GOCI/Geolocation Fields/Longitude; latPath /HDFEOS/SWATH/GOCI/Geolocation Fields/Latitude;如果你用我上面提到的方法查看多個(gè)文件發(fā)現(xiàn)不同產(chǎn)品的路徑有差異最快的辦法是先寫(xiě)一個(gè)通用函數(shù)自動(dòng)掃描文件內(nèi)所有含TSS的數(shù)據(jù)集路徑。雖然這次你可能不需要但等到你換一個(gè)版本的數(shù)據(jù)源時(shí)能省去重復(fù)人工排查的功夫。3.2 比例因子、有效范圍和FillValue處理HDF5產(chǎn)品里的數(shù)據(jù)為了壓縮體積存儲(chǔ)時(shí)通常不是浮點(diǎn)數(shù)而是int16或uint16的整型。這意味著直接讀出來(lái)的數(shù)值并不是物理量本身需要根據(jù)文件屬性里的ScaleFactor和Offset做轉(zhuǎn)換。GDPS產(chǎn)品常見(jiàn)的比例因子可能是0.1或0.01具體值取決于變量和版本千萬(wàn)別想當(dāng)然。我調(diào)試時(shí)遇到過(guò)一個(gè)很典型的情況讀出來(lái)的TSS矩陣?yán)飻?shù)值從0到60000多隨手一畫(huà)圖就黑漆漆一片后來(lái)仔細(xì)翻了屬性才看到單位是“0.1 g/m3”也就是說(shuō)實(shí)際濃度是存儲(chǔ)值乘以0.1。這一步?jīng)]做對(duì)后續(xù)所有分析全部白搭。推薦的轉(zhuǎn)換代碼如下% 讀取原始整型數(shù)據(jù) tss_raw h5read(fileName, tssPath); % 讀取屬性里的比例因子和偏移量 scale h5readatt(fileName, tssPath, scale_factor); offset h5readatt(fileName, tssPath, offset); fillValue h5readatt(fileName, tssPath, _FillValue); % 轉(zhuǎn)成浮點(diǎn)并應(yīng)用比例因子與偏移量 tss_double double(tss_raw) * scale offset; % 把填充值和負(fù)值統(tǒng)一替換為NaN tss_double(tss_raw fillValue | tss_double 0) NaN;屬性名不一定百分百固定有的文件里寫(xiě)的是ScaleFactor有的寫(xiě)的是Slope有的干脆沒(méi)有offset。穩(wěn)妥做法是用try-catch讀屬性讀不到就默認(rèn)scale為1、offset為0。這個(gè)處理邏輯在批量循環(huán)里特別重要因?yàn)閭€(gè)別文件可能屬性缺失不做保護(hù)整個(gè)循環(huán)就會(huì)中斷。3.3 陸地、云與無(wú)效像元的掩膜提取出有效濃度后還需要把不想顯示的像素蓋掉。第一類(lèi)是陸地像元水色產(chǎn)品的范圍往往已經(jīng)裁到海區(qū)但近岸處仍可能包含陸地第二類(lèi)是云像元GOCI產(chǎn)品里通常有質(zhì)量標(biāo)記或云掩膜變量第三類(lèi)就是前面說(shuō)的填充值。如果不做掩膜圖上一片陸地反射值會(huì)被當(dāng)成高濃度水體配色比例尺會(huì)被拉得很離譜。如果你能找到云掩膜變量讀取后把非水體像元設(shè)為NaNmask h5read(fileName, maskPath); validMask (mask 1); % 具體有效編碼需看屬性 tss_double(~validMask) NaN;如果產(chǎn)品里沒(méi)有云掩膜也可以用簡(jiǎn)單的閾值法TSS濃度超出合理范圍比如小于0或大于某個(gè)上限的像元直接置為NaN。雖然粗獷但很多L2產(chǎn)品本身就做過(guò)質(zhì)量控制這一步只是兜底。經(jīng)緯度和數(shù)據(jù)矩陣的維度關(guān)系也值得留意。GOCI Swath數(shù)據(jù)常見(jiàn)排列是列行或者行列讀出來(lái)之后如果后續(xù)畫(huà)圖發(fā)現(xiàn)經(jīng)緯網(wǎng)和濃度矩陣對(duì)不上很可能就是行列方向或者轉(zhuǎn)置的問(wèn)題??梢栽趩挝募{(diào)試階段就把size打出來(lái)對(duì)比確認(rèn)不要等到批量出圖才發(fā)現(xiàn)。4. 繪制TSS變化過(guò)程的實(shí)操4.1 單片快速預(yù)覽與colormap選擇TSS濃度圖的核心是快速評(píng)估空間分布所以第一步先是單片渲染。我推薦pcolor加shading interp或者imagesc配合經(jīng)緯度坐標(biāo)。二者區(qū)別在于pcolor適合非均勻網(wǎng)格imagesc更輕快但坐標(biāo)軸會(huì)整成網(wǎng)格索引需要額外處理。對(duì)于GOCI的標(biāo)準(zhǔn)產(chǎn)品經(jīng)緯度網(wǎng)格通常是規(guī)則矩形用pcolor就行figure(Color, w); pcolor(lon, lat, tss_double); shading interp; axis image; colormap parula; caxis([0 200]); % 根據(jù)你的海區(qū)實(shí)際情況調(diào)整 colorbar; title([TSS , datestr(timeNum, yyyy-mm-dd HH:MM), (UTC)]);配色上需要注意TSS和葉綠素的呈現(xiàn)習(xí)慣完全不同。葉綠素常用深藍(lán)到紅光的多段漸變而TSS更適合用棕黃色系或土黃色調(diào)因?yàn)閼腋∧嗌潮旧砭徒o人一種“黃水”的直覺(jué)。Matlab自帶的熱色系colormap其實(shí)表現(xiàn)力一般我平時(shí)會(huì)用一個(gè)自定義的色帶白色或淺藍(lán)底代表低值黃色過(guò)渡棕紅色代表高濃度。這樣近岸高值區(qū)一眼就能看出來(lái)。4.2 多時(shí)相變化過(guò)程的拼圖與動(dòng)畫(huà)表現(xiàn)GOCI一天內(nèi)多個(gè)時(shí)相最簡(jiǎn)單的變化過(guò)程展示方式就是拼圖。把同一天內(nèi)按時(shí)間順序排列的多幅圖放進(jìn)一個(gè)大figure里每幅圖顯示時(shí)間標(biāo)注這樣讀者能直觀看到潮周期內(nèi)泥沙舌的推拉和擴(kuò)散。拼圖的核心是歸一化。所有子圖必須共用同一個(gè)顏色比例尺比如caxis固定為[0 200]否則不同時(shí)相濃度差異會(huì)被顏色拉伸掩蓋。也不需要每張圖都畫(huà)colorbar只在第一張或最后一張保留即可避免視覺(jué)噪聲。下面是一個(gè)典型的批量拼圖骨架figure(Position, [50 50 1600 900]); for k 1:N subplot(3, 4, k); pcolor(lon, lat, tss_double); shading interp; axis image off; caxis([0 200]); colormap(map); title(datestr(meta(k).timeNum, HH:MM), FontSize, 10); end如果時(shí)相數(shù)超過(guò)十幾個(gè)拼圖排不下我會(huì)把圖保存成序列幀再合成為GIF或視頻。Matlab里用imwrite寫(xiě)GIF幀很常規(guī)但要注意每次都寫(xiě)緩存和延時(shí)參數(shù)我這里有一段常用的保存腳本figure; for k 1:N % ... 繪圖代碼 ... frame getframe(gcf); [A, map] rgb2ind(frame.cdata, 256); if k 1 imwrite(A, map, TSS_animation.gif, gif, Loopcount, inf, DelayTime, 0.5); else imwrite(A, map, TSS_animation.gif, gif, WriteMode, append, DelayTime, 0.5); end end這種方式做匯報(bào)演示非常好用領(lǐng)導(dǎo)或合作方不需要從頭看十幾張小圖一個(gè)動(dòng)圖就懂了。4.3 特定點(diǎn)位與斷面的時(shí)間序列曲線空間圖解決“分布長(zhǎng)什么樣”的問(wèn)題但很多人真正關(guān)心的是“某一個(gè)站位的TSS隨時(shí)間怎么變”。這就需要從每個(gè)時(shí)相文件中提取對(duì)應(yīng)像元的值再按時(shí)間排序畫(huà)曲線。第一步是確定目標(biāo)像元的行列索引。如果你能拿到目標(biāo)站點(diǎn)的經(jīng)緯度就用經(jīng)緯度匹配targetLon 122.5; targetLat 37.0; [~, colIdx] min(abs(lon(1, :, :) - targetLon)); % 具體按矩陣維度調(diào)整 [~, rowIdx] min(abs(lat(:, 1) - targetLat));匹配時(shí)需要注意如果網(wǎng)格是列行結(jié)構(gòu)索引順序別搞反。還有一種辦法是直接用鼠標(biāo)在圖上點(diǎn)選用ginput獲取經(jīng)緯度再回到批量循環(huán)里對(duì)應(yīng)提取。第二步就是循環(huán)讀取所有文件的TSS提取該像元的值tssSeries NaN(numel(meta), 1); for k 1:numel(meta) tss h5read(meta(k).path, tssPath); tssDouble double(tss) * scale offset; tssDouble(tss fillValue) NaN; tssSeries(k) tssDouble(rowIdx, colIdx); end figure; plot([meta.timeNum], tssSeries, -o); datetick(x, HH:MM); ylabel(TSS (g/m^3)); grid on;曲線出來(lái)之后配合前后潮汐數(shù)據(jù)或流向數(shù)據(jù)做交叉分析可以回答很多有意思的問(wèn)題。比如漲潮期TSS是不是明顯降低、落潮期是不是泥沙峰值出現(xiàn)、臺(tái)風(fēng)過(guò)境之后高濃度帶有沒(méi)有向遠(yuǎn)海擴(kuò)散。5. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄5.1 打不開(kāi)文件或讀取失敗的幾個(gè)誘因批量處理時(shí)最討厭的就是循環(huán)到一半突然報(bào)錯(cuò)。我遇到過(guò)的第一類(lèi)問(wèn)題是h5read打不開(kāi)文件報(bào)錯(cuò)信息五花八門(mén)但根源往往是文件本身不完整或者上傳過(guò)程中損壞。這時(shí)可以用h5info單獨(dú)測(cè)一下如果連h5info都失敗基本就是文件壞了。第二類(lèi)問(wèn)題是路徑太長(zhǎng)導(dǎo)致Windows API拒絕訪問(wèn)。GOCI產(chǎn)品本身文件名就長(zhǎng)再套上幾層分類(lèi)目錄很容易超過(guò)路徑長(zhǎng)度限制。對(duì)策是把文件平鋪在一個(gè)短路徑目錄下或者用“8.3短文件名”方式引用。第三類(lèi)問(wèn)題比較隱蔽文件句柄不釋放。在循環(huán)里反復(fù)打開(kāi)關(guān)閉是正常操作但如果你中途用h5create或h5write出了異常沒(méi)能關(guān)閉句柄后續(xù)文件就可能一直被占用讀取會(huì)報(bào)拒絕訪問(wèn)。調(diào)試期養(yǎng)成每讀完一個(gè)文件就手動(dòng)h5close.all的習(xí)慣能少掉一半莫名其妙的錯(cuò)誤。5.2 數(shù)值異常與圖像全黑全白圖像全黑最常見(jiàn)的原因是沒(méi)有把FillValue轉(zhuǎn)成NaN直接拿整數(shù)最小值或哨兵值去畫(huà)圖整幅圖的動(dòng)態(tài)范圍都被它拽走了。處理方式前面已經(jīng)寫(xiě)了先根據(jù)屬性把填充值替換成NaN再用isnan把無(wú)效區(qū)域蓋成白色或透明背景。另一個(gè)常見(jiàn)問(wèn)題是忘了乘比例因子。你如果發(fā)現(xiàn)圖上的數(shù)值分布在“0到1”之間但實(shí)際量級(jí)應(yīng)該在幾十到幾百那多半就是scale沒(méi)乘。還有一種情況是數(shù)值分布正常但圖面很花噪點(diǎn)很多這時(shí)要確認(rèn)是否做了平滑。pcolor的shading interp有插值平滑作用但如果數(shù)據(jù)有異常的孤立小值平滑后周?chē)鷷?huì)被拉出一片“墨漬”這時(shí)候要考慮對(duì)異常像元做中值濾波。5.3 坐標(biāo)錯(cuò)位與顯示變形經(jīng)緯度矩陣和數(shù)據(jù)矩陣維度不一致是剛上手時(shí)最容易出的錯(cuò)。GOCI網(wǎng)格有時(shí)返回的是二維矩陣有時(shí)是三維含時(shí)間維的單幀如果你直接取lon(:,:,1)再和其他變量拼接維度就對(duì)不上。建議讀取后立刻檢查size(lon) size(tss_double)如果長(zhǎng)寬剛好相反用permute或transpose處理不要用flipud硬翻因?yàn)榻?jīng)緯度和數(shù)據(jù)的方向關(guān)系在不同產(chǎn)品里并不一致。顯示變形往往是不等經(jīng)緯投影導(dǎo)致的。如果你直接plot經(jīng)緯度數(shù)據(jù)而不設(shè)定axis equal近岸區(qū)域看起來(lái)會(huì)被拉伸。加上axis image或axis equal后能明顯改善。需要的話還可以用m_map或自寫(xiě)墨卡托投影但基礎(chǔ)分析階段不需要過(guò)度投影直接坐標(biāo)顯示就夠了。5.4 批量處理太慢怎么辦大范圍TSS數(shù)據(jù)動(dòng)輒幾千乘幾千像元如果每天八個(gè)時(shí)相全讀、全畫(huà)Matlab很容易卡到懷疑人生。優(yōu)化方向有幾個(gè)按性價(jià)比排序第一只裁剪目標(biāo)區(qū)域通過(guò)經(jīng)緯度索引取出一個(gè)子矩陣再處理第二用parfor并行讀取但要注意parfor里不變量的定義方式第三代碼層面用matlabFunction或者預(yù)分配數(shù)組避免循環(huán)里動(dòng)態(tài)增長(zhǎng)。裁剪這招最粗暴也最高效。比如我只關(guān)心某海域一塊區(qū)域先把經(jīng)緯度范圍的roi索引計(jì)算出來(lái)再在循環(huán)里只讀那一塊rowRange find(lat(:,1) minLat lat(:,1) maxLat); colRange find(lon(1,:) minLon lon(1,:) maxLon); tss_roi tssDouble(rowRange, colRange);注意裁剪必須在乘比例因子之前做這樣處理的數(shù)據(jù)量直接小一個(gè)量級(jí)速度提升非常明顯。6. 一些實(shí)操心得批量讀取.he5這件事技術(shù)難度其實(shí)不算高真正吃時(shí)間的是跟產(chǎn)品結(jié)構(gòu)較勁。我的經(jīng)驗(yàn)是永遠(yuǎn)不要讓腳本假設(shè)文件內(nèi)部結(jié)構(gòu)一成不變每一個(gè)新數(shù)據(jù)源到手第一件事就是跑一遍h5info。寧可多花五分鐘看結(jié)構(gòu)也好過(guò)后面輸出一堆錯(cuò)誤圖再回頭追查。另外TSS變化過(guò)程圖的配色和比例尺一定要統(tǒng)一。很多人第一張圖畫(huà)得驚艷第二張圖換了數(shù)據(jù)之后色標(biāo)自動(dòng)變了兩張圖放一起對(duì)比就完全失真。我在腳本里會(huì)把caxis寫(xiě)成一個(gè)全局變量所有時(shí)相都引用它從源頭上避免這個(gè)問(wèn)題。最后再分享一個(gè)小技巧GOCI產(chǎn)品里的經(jīng)緯度矩陣和數(shù)據(jù)矩陣在對(duì)齊之后建議保存成一份.mat緩存文件。下次再讀同一個(gè)時(shí)間段的數(shù)據(jù)直接load比逐文件h5read快得多。如果數(shù)據(jù)量比較大還可以只緩存ROI區(qū)域處理速度提升明顯。這個(gè)習(xí)慣幫我度過(guò)了很多次deadline之前的批量重跑。