據(jù)處理與繪圖自動(dòng)化:GMT+Shell+Matlab工具鏈實(shí)戰(zhàn)指南)
1. 項(xiàng)目概述InSAR數(shù)據(jù)處理與繪圖的“瑞士軍刀”集如果你正在處理合成孔徑雷達(dá)干涉測(cè)量InSAR數(shù)據(jù)無(wú)論是做形變監(jiān)測(cè)、沉降分析還是地質(zhì)災(zāi)害評(píng)估那你一定對(duì)從原始數(shù)據(jù)到最終出版級(jí)圖件這個(gè)漫長(zhǎng)流程中的“工具切換”深有體會(huì)。SARscape、GMTSAR、ISCE這些專業(yè)軟件包固然強(qiáng)大但它們往往在數(shù)據(jù)格式轉(zhuǎn)換、批量處理、以及最終成果圖的精細(xì)美化環(huán)節(jié)留下空白。這時(shí)一套得心應(yīng)手的命令行工具和腳本就成了連接各個(gè)孤島、提升效率的關(guān)鍵。這個(gè)項(xiàng)目或者說(shuō)這份經(jīng)驗(yàn)總結(jié)就是關(guān)于如何將GMTGeneric Mapping Tools、bash/csh腳本以及Matlab組合起來(lái)構(gòu)建一個(gè)高效、可復(fù)現(xiàn)的InSAR數(shù)據(jù)處理與繪圖流水線。簡(jiǎn)單來(lái)說(shuō)它解決的核心痛點(diǎn)是自動(dòng)化與靈活性。GMT負(fù)責(zé)產(chǎn)出地理投影正確、美觀專業(yè)的矢量地圖底圖bash或csh腳本取決于你的系統(tǒng)偏好像膠水一樣把數(shù)據(jù)預(yù)處理、格式轉(zhuǎn)換、調(diào)用GMT命令、調(diào)用Matlab進(jìn)行數(shù)值分析等步驟串聯(lián)起來(lái)而Matlab則擅長(zhǎng)處理矩陣運(yùn)算、相位解纏結(jié)果的后續(xù)分析、或者生成一些GMT不那么擅長(zhǎng)的復(fù)雜統(tǒng)計(jì)圖表。這套組合拳打下來(lái)你就能從一個(gè)只會(huì)點(diǎn)擊圖形界面的操作員進(jìn)化成能精準(zhǔn)控制每一個(gè)處理步驟、一鍵生成從原始干涉圖到最終形變序列圖所有中間產(chǎn)品的“流水線工程師”。無(wú)論是處理單對(duì)影像還是時(shí)序InSAR如SBAS、PSI的大量數(shù)據(jù)棧這套方法都能顯著提升你的工作效率和結(jié)果的可重復(fù)性。2. 核心工具鏈選型與協(xié)同邏輯為什么是GMT Shell Matlab這個(gè)組合這背后是基于每個(gè)工具的核心優(yōu)勢(shì)和在InSAR流程中的自然分工。2.1 GMT地圖繪制的“定海神針”GMT并非一個(gè)GIS軟件而是一個(gè)由近百個(gè)命令行工具組成的集合專門(mén)用于處理地理數(shù)據(jù)并生成高質(zhì)量的PostScript或現(xiàn)代格式如PDF, PNG圖件。在InSAR繪圖中它的不可替代性體現(xiàn)在投影精確InSAR結(jié)果本質(zhì)是地理編碼后的柵格數(shù)據(jù)如geotiff。GMT原生支持UTM、地理坐標(biāo)等多種投影能確保你的形變圖與行政邊界、地形底圖完美套合這是很多科學(xué)繪圖軟件或Matlab自帶繪圖函數(shù)難以媲美的。出版級(jí)質(zhì)量GMT生成的矢量圖如PS、PDF線條平滑、字體清晰完全滿足學(xué)術(shù)期刊對(duì)圖件分辨率的要求。你可以精細(xì)控制顏色條cpt、圖例、比例尺、指北針等所有地圖元素。批處理友好所有繪圖參數(shù)都通過(guò)命令行選項(xiàng)指定極易嵌入腳本實(shí)現(xiàn)自動(dòng)化成圖。2.2 Bash/Csh流程自動(dòng)化的“中樞神經(jīng)”Shell腳本是整個(gè)流水線的大腦負(fù)責(zé)調(diào)度和文件管理。Bash在Linux/macOS或Windows的Git Bash、WSL中幾乎是標(biāo)配語(yǔ)法功能強(qiáng)大社區(qū)資源豐富是大多數(shù)人的首選。Csh/Tcsh在某些歷史較久的地球物理或超算環(huán)境中仍有使用其語(yǔ)法如set變量、foreach循環(huán)對(duì)某些用戶來(lái)說(shuō)更直觀。選擇哪一個(gè)取決于你的工作環(huán)境和團(tuán)隊(duì)習(xí)慣。本項(xiàng)目會(huì)兼顧兩者給出關(guān)鍵語(yǔ)法對(duì)照。核心任務(wù)腳本負(fù)責(zé)遍歷數(shù)據(jù)文件夾、批量轉(zhuǎn)換格式例如用gdal_translate將h5或二進(jìn)制文件轉(zhuǎn)為GMT可讀的netCDF或grd、構(gòu)建并執(zhí)行復(fù)雜的GMT繪圖命令鏈、調(diào)用Matlab處理中間數(shù)據(jù)并管理臨時(shí)文件。2.3 Matlab數(shù)值分析與特色圖件的“專業(yè)顧問(wèn)”Matlab在這個(gè)鏈條中扮演兩個(gè)角色數(shù)據(jù)處理器對(duì)于相位解纏后需要進(jìn)行的時(shí)空濾波、相位到形變的轉(zhuǎn)換、時(shí)間序列分析、模型擬合如線性速率、季節(jié)性信號(hào)提取等涉及矩陣運(yùn)算和復(fù)雜算法的步驟Matlab腳本比Shell更合適。補(bǔ)充繪圖器當(dāng)需要繪制非地圖類圖表如某個(gè)點(diǎn)的時(shí)間序列圖、形變剖線圖、統(tǒng)計(jì)直方圖、相關(guān)性散點(diǎn)圖時(shí)用Matlab可以快速實(shí)現(xiàn)并保持與數(shù)據(jù)處理部分一致的代碼環(huán)境。2.4 協(xié)同工作流示例一個(gè)典型的時(shí)序InSAR成果圖生成流程可能是Bash腳本啟動(dòng)遍歷所有解纏后的相位文件.unw。格式轉(zhuǎn)換在Bash中調(diào)用GDAL將.unw文件通常是二進(jìn)制頭文件轉(zhuǎn)換為GMT的grd格式。GMT繪圖Bash腳本調(diào)用gmt grdimage繪制每一幅干涉圖的相位圖并統(tǒng)一添加比例尺、顏色條。Matlab介入Bash腳本將一系列g(shù)rd文件路徑傳遞給Matlab腳本。Matlab讀取這些柵格進(jìn)行時(shí)序反演如SBAS計(jì)算平均形變速率和時(shí)序位移。結(jié)果回傳Matlab將計(jì)算得到的速率圖grd格式和指定點(diǎn)的時(shí)序數(shù)據(jù)文本格式輸出。GMT最終成圖Bash腳本再次調(diào)用GMT用速率圖grd繪制主圖并用gmt plot將Matlab生成的時(shí)序數(shù)據(jù)文本繪制成小圖插入主圖角落。 整個(gè)流程通過(guò)一個(gè)主控腳本可能是Bash來(lái)調(diào)度實(shí)現(xiàn)從原始數(shù)據(jù)到包含形變速率和典型點(diǎn)時(shí)間序列的復(fù)合出版圖件的全自動(dòng)生成。3. 關(guān)鍵命令與語(yǔ)法實(shí)例詳解下面我們進(jìn)入實(shí)戰(zhàn)環(huán)節(jié)拆解每個(gè)工具在InSAR流程中的關(guān)鍵命令和腳本寫(xiě)法。3.1 GMT常用命令模塊GMT命令繁多但用于InSAR繪圖的核心模塊集中在以下幾個(gè)gmt grdconvert/gdal_translate數(shù)據(jù)輸入橋梁。雖然GMT有g(shù)rdconvert但處理復(fù)雜的SAR數(shù)據(jù)格式如ISCE輸出的Erdas .img格式、ROI_PAC的.rsc.unw格式時(shí)GDAL庫(kù)的gdal_translate命令往往更可靠。例如將ISCE生成的.geo.unw.geotiff轉(zhuǎn)換為GMT的grd# Bash示例 gdal_translate -of NetCDF input.geo.unw.geo.tif phase.grd注意確保GMT編譯時(shí)支持NetCDF并且GDAL版本與數(shù)據(jù)格式兼容。轉(zhuǎn)換后務(wù)必用gmt grdinfo phase.grd檢查網(wǎng)格范圍、像素尺寸和單位是否正確。gmt grdimage繪制干涉相位或形變柵格圖的核心命令。關(guān)鍵參數(shù)包括gmt grdimage phase.grd -R113.5/114.5/22.0/23.0 -JM15c -Cphase.cpt -Baf -BWSen -Ia15nt0.5 -P output.ps-R指定區(qū)域經(jīng)度/緯度。務(wù)必與你的數(shù)據(jù)區(qū)域嚴(yán)格一致可以從.grd文件的頭信息中獲取。-JM設(shè)置墨卡托投影和地圖寬度。-C指定顏色表.cpt文件。InSAR相位圖常用循環(huán)色系如polar形變圖常用線性色系如vik??梢允褂胓mt makecpt自定義。-I添加光照效果山體陰影-a15是方位角nt0.5是透明度能讓地形起伏感更強(qiáng)突出干涉條紋。-B繪制地圖邊框、刻度及注釋。-Baf是自動(dòng)添加主要和次要刻度-BWSen表示在西邊和南邊繪制邊框和刻度。gmt pscoast疊加海岸線、國(guó)界、河流等地理要素。這是讓InSAR圖具有地理參考意義的關(guān)鍵一步。gmt pscoast -R -J -Df -W0.5p,black -Glightgray -N1/0.5p,red -Lg115/22c22w50kfu -O -K output.ps-Df使用全分辨率海岸線數(shù)據(jù)需提前下載GMT的GSHHG數(shù)據(jù)。-W繪制海岸線。-G陸地填充色。-N1繪制國(guó)界線注意數(shù)據(jù)源的敏感性和繪圖用途學(xué)術(shù)出版需謹(jǐn)慎。-L添加比例尺。這個(gè)參數(shù)非常實(shí)用能自動(dòng)計(jì)算并標(biāo)注比例尺長(zhǎng)度和單位。gmt psscale添加顏色條。顏色條是科學(xué)圖件的靈魂必須清晰準(zhǔn)確。gmt psscale -Cphase.cpt -Dx15c/5cw12c/0.5ch -BxaflPhase (rad) -BylCycles -O output.ps-D精確定位顏色條。x15c/5c表示顏色條左下角位于頁(yè)面坐標(biāo)(15cm, 5cm)處w12c是寬度h表示水平放置默認(rèn)為垂直v。-B設(shè)置顏色條刻度注釋。l參數(shù)用于添加標(biāo)簽。3.2 Bash腳本編程要點(diǎn)Bash腳本用于串聯(lián)上述GMT命令并處理文件。循環(huán)處理批量文件#!/bin/bash # 遍歷當(dāng)前目錄下所有 .unw.grd 文件 for grd_file in *.unw.grd; do # 提取文件名不含后綴 base_name$(basename $grd_file .unw.grd) # 構(gòu)建輸出文件名 ps_file${base_name}.ps # 執(zhí)行GMT繪圖命令 gmt begin $base_name ps gmt grdimage $grd_file -R... -J... -C... gmt pscoast -R -J -Df -W... gmt psscale -C... -D... gmt end # 將PS轉(zhuǎn)換為PDF gmt psconvert $ps_file -A -Tf echo 已完成: $base_name done實(shí)操心得在循環(huán)體內(nèi)使用變量替換命令參數(shù)時(shí)務(wù)必用雙引號(hào)包裹變量如$grd_file以防止文件名中含有空格時(shí)腳本報(bào)錯(cuò)。這是新手常踩的坑。參數(shù)化與配置文件對(duì)于固定的研究區(qū)可以將-R, -J等參數(shù)定義為變量甚至寫(xiě)入一個(gè)單獨(dú)的配置文件config.sh用source config.sh引入提高腳本的可維護(hù)性。# config.sh REGION113.5/114.5/22.0/23.0 PROJECTIONM15c CPT_FILEmy_deformation.cpt# main.sh source config.sh gmt grdimage data.grd -R$REGION -J$PROJECTION -C$CPT_FILE ...3.3 Csh腳本語(yǔ)法對(duì)照Csh的語(yǔ)法與Bash差異較大主要注意變量設(shè)置和循環(huán)。變量設(shè)置與引用#!/bin/csh set region 113.5/114.5/22.0/23.0 set projection M15c gmt grdimage input.grd -R$region -J$projection ... # 注意變量賦值用 set引用時(shí)直接使用 $變量名循環(huán)處理foreach grd_file (*.unw.grd) set base_name basename $grd_file .unw.grd # 使用反引號(hào)執(zhí)行命令并賦值 gmt begin $base_name ps # ... GMT命令 gmt end gmt psconvert $base_name.ps -A -Tf echo 已完成: $base_name end3.4 Matlab數(shù)據(jù)處理與銜接Matlab在這里主要做兩件事讀GMT的grd文件進(jìn)行分析以及輸出GMT可讀的文本或grd文件。讀取GMT grd文件GMT的grdNetCDF格式可以用Matlab的ncread函數(shù)直接讀取。% 讀取形變速率grd文件 filename velocity.grd; % 注意GMT grd文件可能使用‘x’, ‘y’, ‘z’作為變量名也可能用‘lon’, ‘lat’, ‘z’ try x ncread(filename, x); % 或 lon y ncread(filename, y); % 或 lat vel ncread(filename, z); catch % 如果變量名不對(duì)嘗試讀取所有變量信息 info ncinfo(filename); disp(info.Variables); end % 將x, y網(wǎng)格化為矩陣格式便于繪圖和分析 [X, Y] meshgrid(x, y); % 注意vel矩陣的方向可能與Matlab的meshgrid預(yù)期不一致有時(shí)需要轉(zhuǎn)置(transpose)或翻轉(zhuǎn)(flipud)注意事項(xiàng)GMT和Matlab對(duì)矩陣的行列存儲(chǔ)順序行優(yōu)先 vs 列優(yōu)先和坐標(biāo)系左上角原點(diǎn) vs 左下角原點(diǎn)定義可能不同。這會(huì)導(dǎo)致讀入的矩陣圖像“倒置”或“鏡像”。一個(gè)常見(jiàn)的解決方法是在Matlab中讀取后使用vel flipud(vel);或類似操作進(jìn)行校正。務(wù)必用imagesc(x, y, vel)初步顯示與GMT原圖對(duì)比驗(yàn)證。輸出文本供GMT繪圖將某個(gè)點(diǎn)的時(shí)序形變數(shù)據(jù)輸出為GMT的plot命令可讀的文本。% 假設(shè)有時(shí)間和形變數(shù)據(jù) time [2018.0, 2018.5, 2019.0, ...]; % 十進(jìn)制年 deformation [0, 5.2, -3.1, ...]; % 毫米 % 保存為兩列文本 data_out [time(:), deformation(:)]; save(time_series.txt, data_out, -ascii); % 在Bash腳本中后續(xù)可以用 gmt plot time_series.txt -R... -B... -W2p,red 來(lái)繪制曲線輸出grd文件將Matlab計(jì)算出的新柵格如濾波后的形變場(chǎng)寫(xiě)回為GMT可讀的grd。% 假設(shè)有新的網(wǎng)格數(shù)據(jù) new_vel以及對(duì)應(yīng)的xvec, yvec向量 % 創(chuàng)建NetCDF文件 ncid netcdf.create(filtered_velocity.grd, CLOBBER); % 定義維度 dimid_x netcdf.defDim(ncid, x, length(xvec)); dimid_y netcdf.defDim(ncid, y, length(yvec)); % 定義變量 varid_x netcdf.defVar(ncid, x, double, dimid_x); varid_y netcdf.defVar(ncid, y, double, dimid_y); varid_z netcdf.defVar(ncid, z, double, [dimid_x, dimid_y]); netcdf.endDef(ncid); % 寫(xiě)入數(shù)據(jù) netcdf.putVar(ncid, varid_x, xvec); netcdf.putVar(ncid, varid_y, yvec); netcdf.putVar(ncid, varid_z, new_vel); % 注意轉(zhuǎn)置Matlab是列優(yōu)先NetCDF通常是行優(yōu)先。 netcdf.close(ncid);這個(gè)過(guò)程較為繁瑣。更簡(jiǎn)單的方法是使用第三方工具箱如gmtmexGMT官方提供的Matlab接口或export_fig社區(qū)中的一些輔助函數(shù)。但掌握原生NetCDF寫(xiě)入有助于理解數(shù)據(jù)交換的本質(zhì)。4. 完整實(shí)操案例從干涉圖到形變速率剖面圖我們通過(guò)一個(gè)完整案例將上述所有知識(shí)點(diǎn)串聯(lián)起來(lái)。目標(biāo)處理一個(gè)干涉對(duì)生成的形變柵格los_disp.grd單位米繪制帶有地理背景的形變填色圖并在圖上畫(huà)一條剖面線AB提取并繪制該剖面的形變曲線。4.1 步驟一準(zhǔn)備環(huán)境與數(shù)據(jù)假設(shè)我們已在Bash環(huán)境下?lián)碛幸韵挛募os_disp.grd視線向形變柵格文件。config.sh配置文件定義了區(qū)域、投影等。profile_coords.txt文本文件包含剖面線起點(diǎn)A和終點(diǎn)B的經(jīng)緯度每行一個(gè)點(diǎn)經(jīng)度 緯度。113.6 22.2 114.2 22.84.2 步驟二主繪圖Bash腳本plot_deformation.sh#!/bin/bash # 加載配置 source config.sh # 1. 啟動(dòng)GMT現(xiàn)代模式會(huì)話直接生成PDF gmt begin deformation_map pdf # 2. 繪制形變柵格圖使用viridis色系 gmt grdimage los_disp.grd -R$REGION -J$PROJECTION -Cviridis -Ia15nt0.2 # 3. 疊加高分辨率海岸線 gmt coast -R -J -Df -W0.8p,black -G240/240/240 -N1/0.5p,50/50/50 # 4. 添加顏色條 gmt colorbar -Cviridis -Dx15c/-1cw12c/0.5ch -Bxa0.1f0.02lLOS Displacement (m) -Byl # 5. 繪制剖面線位置 gmt plot profile_coords.txt -R -J -W2p,red,solid -lProfile A-B # 6. 在起點(diǎn)和終點(diǎn)添加標(biāo)記 gmt plot -R -J -Sc0.3c -Gred -W0.5p,black EOF 113.6 22.2 114.2 22.8 EOF # 7. 添加比例尺和指北針 gmt basemap -R -J -Lg113.7/22.1c22w20kfu -Tdg114.3/22.9w1cf2l gmt end echo 主形變圖繪制完成deformation_map.pdf # 8. 提取剖面數(shù)據(jù) # 使用gmt grdtrack沿剖面線采樣 gmt grdtrack profile_coords.txt -Glos_disp.grd profile_data.txt # profile_data.txt 格式經(jīng)度 緯度 距離(從起點(diǎn)算起,km) 形變量(m) # 9. 繪制剖面圖 gmt begin profile pdf # 設(shè)置繪圖區(qū)域X軸為距離(0-最大距離)Y軸為形變值(自動(dòng)調(diào)整) # 先獲取形變值的范圍用于設(shè)置Y軸范圍 min_max$(gmt info profile_data.txt -C -o5,6) # 獲取第5列(距離)和6列(形變)的min/max # 拆分為變量 (假設(shè)info輸出為xmin xmax ymin ymax) read xmin xmax ymin ymax $(echo $min_max) # 繪制剖面曲線距離單位轉(zhuǎn)換為km形變單位轉(zhuǎn)換為mm gmt plot profile_data.txt -i2,5 -R0/$xmax/$ymin/$ymax -JX15c/8c -W2p,blue -BxaflDistance along profile (km) -ByafglLOS Displacement (m) -BWSen # 可選填充曲線與零線之間的區(qū)域 gmt plot profile_data.txt -i2,5 -R -J -Glightblue50 -t50 gmt end echo 剖面圖繪制完成profile.pdf實(shí)操心得gmt grdtrack是提取剖面數(shù)據(jù)的利器。-i選項(xiàng)在gmt plot中用于指定輸入數(shù)據(jù)的列索引從0開(kāi)始。在腳本中通過(guò)gmt info和命令替換$()動(dòng)態(tài)獲取數(shù)據(jù)范圍來(lái)設(shè)置-R參數(shù)能使腳本適應(yīng)不同的數(shù)據(jù)更加通用。4.3 步驟三使用Matlab進(jìn)行剖面數(shù)據(jù)的平滑與擬合有時(shí)直接從柵格中提取的剖面數(shù)據(jù)噪聲較大我們需要在Matlab中進(jìn)行平滑或多項(xiàng)式擬合。% profile_analysis.m data load(profile_data.txt); distance_km data(:, 3); % 第3列是距離(km) disp_m data(:, 4); % 第4列是形變(m) % 1. 移動(dòng)平均平滑 window_size 5; % 5個(gè)點(diǎn)的窗口 smoothed_disp movmean(disp_m, window_size); % 2. 線性擬合假設(shè)形變是距離的線性函數(shù) p polyfit(distance_km, disp_m, 1); fit_disp polyval(p, distance_km); % 3. 將平滑和擬合后的數(shù)據(jù)保存為新文件供GMT繪制 output_data [distance_km, disp_m*1000, smoothed_disp*1000, fit_disp*1000]; % 轉(zhuǎn)換為毫米 header Distance(km) Original(mm) Smoothed(mm) LinearFit(mm); fid fopen(profile_processed.txt, w); fprintf(fid, %s\n, header); fclose(fid); dlmwrite(profile_processed.txt, output_data, -append, delimiter, \t, precision, %.4f); % 4. 也可以在Matlab中直接繪圖對(duì)比 figure; plot(distance_km, disp_m*1000, k., MarkerSize, 8); hold on; plot(distance_km, smoothed_disp*1000, b-, LineWidth, 2); plot(distance_km, fit_disp*1000, r--, LineWidth, 2); xlabel(Distance along profile (km)); ylabel(LOS Displacement (mm)); legend(Original, [Smoothed (win, num2str(window_size), )], Linear Fit); grid on;然后可以在Bash腳本中調(diào)用Matlab處理數(shù)據(jù)再使用GMT繪制更精美的剖面圖。# 在plot_deformation.sh末尾添加 matlab -batch profile_analysis -nosplash -nodesktop # 使用GMT繪制處理后的剖面 gmt begin enhanced_profile pdf gmt plot profile_processed.txt -i0,1 -R... -J... -W1p,gray -lOriginal gmt plot profile_processed.txt -i0,2 -R... -J... -W2p,blue -lSmoothed gmt plot profile_processed.txt -i0,3 -R... -J... -W2p,red,- -lLinear Fit gmt legend -DjTRo0.2c -Fgwhitep0.5p gmt end5. 常見(jiàn)問(wèn)題、調(diào)試技巧與避坑指南在實(shí)際操作中你會(huì)遇到各種報(bào)錯(cuò)和意外情況。這里記錄了一些典型問(wèn)題及其解決方法。5.1 GMT相關(guān)報(bào)錯(cuò)與解決錯(cuò)誤grdimage: Warning: 1 (of 1) grid file [xxx.grd] doesnt have a recognized grid format原因GMT無(wú)法識(shí)別網(wǎng)格文件格式。最常見(jiàn)原因是grd文件不是真正的NetCDF格式或者內(nèi)部維度、變量名不符合GMT預(yù)期。排查用ncdump -h xxx.grd查看文件頭信息。檢查是否存在x,y,z或lon,lat,z變量。用gdalinfo xxx.grd查看是否能被GDAL識(shí)別。如果不能說(shuō)明文件可能已損壞或格式特殊。解決使用gdal_translate進(jìn)行格式轉(zhuǎn)換是更穩(wěn)妥的入口。確保輸出格式為-of NetCDF。錯(cuò)誤繪圖區(qū)域-R與數(shù)據(jù)區(qū)域不匹配導(dǎo)致空白圖或部分顯示。原因-R參數(shù)設(shè)置錯(cuò)誤或者數(shù)據(jù)本身的坐標(biāo)范圍用gmt grdinfo查看與預(yù)期不符。解決在腳本中使用命令替換自動(dòng)獲取數(shù)據(jù)范圍region$(gmt grdinfo input.grd -I-) gmt grdimage input.grd -R$region -J...-I-選項(xiàng)會(huì)輸出-R所需的min/max格式字符串。問(wèn)題生成的PS/PDF文件顏色條或圖例位置不理想。解決-D參數(shù)用于精確定位。理解其語(yǔ)法-D[g|j|J|n|x]refpointwwidth[/height][jjustify][odx[/dy]]是關(guān)鍵。g使用地圖坐標(biāo)定位需在-R -J之后。j/J使用相對(duì)定位如JMR表示地圖內(nèi)右下角。x使用頁(yè)面坐標(biāo)單位cm/inch。多調(diào)試幾次找到最適合你圖件布局的位置??梢韵犬?huà)一個(gè)簡(jiǎn)單的圖確定參考點(diǎn)坐標(biāo)。5.2 Shell腳本調(diào)試技巧腳本執(zhí)行權(quán)限bash: ./script.sh: Permission denied解決chmod x script.sh變量未定義或命令未找到在腳本開(kāi)頭添加set -euxo pipefail。-e有錯(cuò)誤立即退出-u使用未定義變量時(shí)報(bào)錯(cuò)-x打印執(zhí)行的命令便于追蹤-o pipefail管道中任何命令失敗則整個(gè)管道失敗。對(duì)于命令未找到檢查命令是否在PATH中或使用絕對(duì)路徑。路徑中包含空格這是Shell腳本的經(jīng)典陷阱。始終用雙引號(hào)包裹變量。# 錯(cuò)誤 gmt grdimage $input_file ... # 正確 gmt grdimage $input_file ...5.3 Matlab與GMT數(shù)據(jù)交換的“方向”陷阱這是最隱蔽的問(wèn)題之一。Matlab的meshgrid生成的X, Y矩陣與GMT保存的grd數(shù)據(jù)在內(nèi)存中的排列方式可能正好轉(zhuǎn)置或翻轉(zhuǎn)。癥狀在Matlab中imagesc(lon, lat, data)顯示的圖像與GMT用grdimage繪制的圖像上下或左右顛倒。診斷與解決在Matlab中讀取grd后同時(shí)顯示size(data)和[length(lon), length(lat)]看維度是否匹配應(yīng)該是[length(lat), length(lon)]。嘗試不同的組合data,flipud(data),fliplr(data),flipud(data)。并與GMT原圖對(duì)比。最可靠的方法在Matlab中用ncdisp(file.grd)查看變量詳情注意是否有direction或order相關(guān)的屬性。有時(shí)數(shù)據(jù)是按“行優(yōu)先”存儲(chǔ)的而Matlab是“列優(yōu)先”。建立一個(gè)已知的小型測(cè)試網(wǎng)格例如5x5分別用GMT和Matlab生成、讀取、顯示來(lái)摸清轉(zhuǎn)換規(guī)律。5.4 性能優(yōu)化建議對(duì)于大批量繪圖避免在循環(huán)中反復(fù)啟動(dòng)和關(guān)閉GMT會(huì)話。使用GMT現(xiàn)代模式的gmt begin和gmt end將一系列繪圖命令包裹起來(lái)效率更高。減少文件I/O如果Matlab只是進(jìn)行簡(jiǎn)單的矩陣運(yùn)算考慮使用GMT自帶的gmt grdmath進(jìn)行網(wǎng)格計(jì)算如加減乘除、濾波這比在Matlab和GMT之間來(lái)回讀寫(xiě)文件要快得多。并行處理如果處理成百上千個(gè)干涉圖可以利用Shell的并行工具如GNU parallel或xargs -P來(lái)并行運(yùn)行多個(gè)GMT繪圖進(jìn)程充分利用多核CPU。這套工具鏈的學(xué)習(xí)曲線初期可能有些陡峭尤其是需要同時(shí)熟悉GMT的數(shù)百個(gè)命令選項(xiàng)、Shell腳本的語(yǔ)法以及Matlab與外部數(shù)據(jù)的交互。但一旦掌握你將獲得無(wú)與倫比的靈活性和自動(dòng)化能力能夠應(yīng)對(duì)各種復(fù)雜的InSAR數(shù)據(jù)處理與可視化需求從重復(fù)勞動(dòng)中解放出來(lái)更專注于科學(xué)問(wèn)題本身。我的經(jīng)驗(yàn)是從一個(gè)具體的小目標(biāo)開(kāi)始比如“自動(dòng)畫(huà)出我這幅干涉圖”邊做邊學(xué)積累自己的代碼片段庫(kù)逐漸就能搭建起強(qiáng)大的個(gè)人分析流水線。