◎ 黃選威
廣西地圖院,廣西 南寧 530023
目前,多時(shí)相柵格數(shù)據(jù)已廣泛應(yīng)用于生態(tài)環(huán)境和氣候變化領(lǐng)域。時(shí)間分辨率為小時(shí)或天的柵格數(shù)據(jù)往往需要處理成月均或年均柵格數(shù)據(jù),才能實(shí)現(xiàn)進(jìn)一步分析。對于跨度數(shù)十年的單時(shí)或日均數(shù)據(jù),單項(xiàng)數(shù)據(jù)處理的工作量大、耗時(shí)多、效率低。此次研究筆者針對IMERG全球2001 年—2020 年約7 300 幅降水量單日NetCDF 文件展開數(shù)據(jù)研究,利用ArcGIS ModelBuilder 可視化編程開發(fā)語言進(jìn)行集成開發(fā)處理,獲取廣西2001 年—2020 年月均降水量和年均降水量柵格數(shù)據(jù)集,從而實(shí)現(xiàn)快速獲取降水量基礎(chǔ)研究數(shù)據(jù)。
NetCDF(Network Common Data Form)網(wǎng)絡(luò)通用數(shù)據(jù)格式是一種面向數(shù)組型并適于網(wǎng)絡(luò)共享數(shù)據(jù)的描述和編碼標(biāo)準(zhǔn)[1]。在ArcGIS 中,可以通過NetCDF 文件創(chuàng)建TIF柵格數(shù)據(jù)集,用一個維度來顯示所有柵格數(shù)據(jù)的單元值。對于具有相同屬性的多個柵格數(shù)據(jù),要合成一個更大時(shí)間分辨率的柵格數(shù)據(jù)集,通常采用鑲嵌至新柵格的方法,求取單個柵格像元上的平均值來實(shí)現(xiàn),公式可以表示為:
式(1)中,Vmean為更大時(shí)間分辨率柵格數(shù)據(jù)集的像元值;Vij表示第i行第j列的像元位置的數(shù)值;n表示鑲嵌原始柵格的數(shù)量。
ArcGIS ModelBuilder 是一種可視化的編程語言,用于構(gòu)建地理處理工作流。ArcGIS ModelBuilder 能夠?qū)⒁幌盗蠥rcToolbox 現(xiàn)有工具和ArcPy 語言通過輸入輸出的方式串聯(lián)起來進(jìn)行數(shù)據(jù)處理[2]。這種處理方式節(jié)省人機(jī)交互的中間過程,并且能夠迭代具有相同屬性樣式的數(shù)據(jù),實(shí)現(xiàn)數(shù)據(jù)的自動化或半自動化批量處理。趙強(qiáng)等人通過MATLAB 等程序語言進(jìn)行NetCDF 數(shù)據(jù)的批量讀寫操作,但該讀寫方式設(shè)計(jì)需要在特定環(huán)境下進(jìn)行,且MATLAB 可視化表達(dá)效果較為單一[3]。溫樹棟、昝建春等人基于ArcGIS ModelBuilder 單一計(jì)算和解析路徑的方式來實(shí)現(xiàn)地理數(shù)據(jù)庫按區(qū)域自動批量的裁剪輸出,但輸入輸出位置是固定的,不具有遷移重復(fù)使用的靈活性[4-5]。
常用的ModelBuilder 由變量、工具和連接符組成(見圖1)。
圖1 ArcGIS ModelBuilder 工作流程示意圖
常用的ArcGIS ModelBuilder 結(jié)構(gòu)單元主要組成部分如表1 所示。
表1 ArcGIS ModelBuilder 結(jié)構(gòu)單元主要組成部分表
此次研究的數(shù)據(jù)源自2001 年1 月1 日至2020 年12 月31 日約7 300 幅全球降水量GPM IMERG 數(shù)據(jù)。通過訪問美國NASA 地球科學(xué)數(shù)據(jù)和信息服務(wù)中心(Goddard Earth Sciences Data and InformationServices Center,GES DISC)的網(wǎng)站(https://disc.gsfc.nasa.gov)可以下載到數(shù)據(jù)格式為NetCDF 的全球日均降水量數(shù)據(jù)。該數(shù)據(jù)的空間分辨率為0.1°,單個NetCDF 數(shù)據(jù)大小約30 M。
筆者針對數(shù)據(jù)量巨大的NetCDF 日均降水量數(shù)據(jù),此次研究首先使用ArcGIS ModelBuilder中的柵格數(shù)據(jù)迭代器進(jìn)行循環(huán)讀取,獲得的文件名通過ArcPy 中的截取函數(shù)截取特定字段,用于創(chuàng)建特定文件夾,使用工具將NetCDF 數(shù)據(jù)轉(zhuǎn)換為TIF 數(shù)據(jù),生成的TIF 文件放入特定文件夾中。然后,將單個文件夾內(nèi)的數(shù)據(jù)以收集多值的方式作為單一數(shù)據(jù)整體輸入,在迭代循環(huán)文件夾的基礎(chǔ)上,迭代文件夾內(nèi)部的TIF數(shù)據(jù)。最后,通過鑲嵌至新柵格的方式生成某一時(shí)間段月均降水量或年均降水量柵格數(shù)據(jù)。數(shù)據(jù)處理過程如圖2 所示。
圖2 數(shù)據(jù)處理過程示意圖
(1)字段獲取與匹配。獲取的原始日均降水量數(shù)據(jù)的文件名稱較長,如3B—DAY.MS.MRG.3IMERG.20200101—S000000—E235959.V06.nc4。此次研究通過ArcPy 中的ArcPy.Split()函數(shù)進(jìn)行日期字符的獲取,再利用獲取的特定字段創(chuàng)建文件夾和TIF 數(shù)據(jù)文件名,通過“\%文件名%\%柵格數(shù)據(jù)%.tif”地址組合的方式進(jìn)行數(shù)據(jù)特定文件夾下的自動保存。其中,“%文件名%”和“%柵格數(shù)據(jù)%”為自定義變量,通過連接的方式組合地址路徑,便于靈活選擇輸出地址。
(2)循環(huán)迭代和嵌套。將NetCDF 文件轉(zhuǎn)化為按月保存的TIF 文件,要先迭代文件夾內(nèi)的日均柵格數(shù)據(jù)作為收集值整體輸入,再迭代該文件夾進(jìn)行多年數(shù)據(jù)處理,這里需要對文件夾和文件夾內(nèi)的數(shù)據(jù)都進(jìn)行迭代讀取。由于ModelBuilder 同一模型下不能出現(xiàn)2 個或2 個以上的迭代器,因此需要把其中一個迭代模型作為新工具嵌入到另一個模型中進(jìn)行2 次以上的迭代計(jì)算。這種模型嵌套的方式能夠有效解決多個迭代器在同一個模型進(jìn)程中共同計(jì)算的問題。
(3)多值合一輸入輸出。由于迭代器每次只能讀取1 個數(shù)據(jù),但計(jì)算數(shù)據(jù)平均值要讀取多個數(shù)據(jù),因此需要通過迭代的方式讀取所有柵格數(shù)據(jù),直到讀完文件夾內(nèi)所有數(shù)據(jù)為止,之后將其作為一個數(shù)據(jù)整體進(jìn)行輸入。這種方式可以避免迭代一個數(shù)據(jù)就進(jìn)行鑲嵌,或者迭代未完成就計(jì)算的問題。
(4)遷移重復(fù)使用。模型中的輸入輸出變量可分為帶固定參數(shù)變量和不帶參數(shù)變量2種。帶參數(shù)的變量通過輸入固定的路徑、數(shù)據(jù)直接進(jìn)行計(jì)算,每次計(jì)算都要重新設(shè)置新的參數(shù),不利于遷移多次使用。對于不帶參數(shù)的變量,將其設(shè)為空值,并作為開源變量,可以由使用者自行輸入,進(jìn)行參數(shù)調(diào)整。此次研究筆者將必要參數(shù)作為不帶參數(shù)的變量,均做開放處理,便于計(jì)算模型重復(fù)使用和調(diào)整。圖3 中的所有變量右上角帶p 標(biāo)志的均為不帶參數(shù)的變量。
以日均數(shù)據(jù)生成月均數(shù)據(jù)為例,模型設(shè)計(jì)主要包括按月創(chuàng)建文件夾、NetCDF 數(shù)據(jù)轉(zhuǎn)換為TIF、按月鑲嵌平均計(jì)算3 部分(見圖3)。
(1)按月創(chuàng)建文件夾。考慮到原始數(shù)據(jù)的文件名讀取、存儲不方便,需要生成月份的文件夾來存儲對應(yīng)月份的單日數(shù)據(jù)。在圖3(a)中,“原始數(shù)據(jù)文件夾”用于輸入原始日均數(shù)據(jù)位置,“文件夾位置”用于輸出生成月份文件夾的位置。此次研究筆者使用計(jì)算值工具,利用截取函數(shù)ArcPy.Split()按照關(guān)鍵字符位置進(jìn)行讀取月份如“202001”6 位,其他字符舍去,即可生成名稱為“202001”的文件夾。
(2)NetCDF 數(shù)據(jù)轉(zhuǎn)換為TIF。由于NetCDF數(shù)據(jù)格式不是GIS 常用數(shù)據(jù)類型,因此需要先進(jìn)行數(shù)據(jù)轉(zhuǎn)換。此次研究筆者通過ArcGIS 工具箱中的創(chuàng)建NetCDF 柵格圖層、復(fù)制柵格、按掩膜裁剪的工具進(jìn)行處理。將對應(yīng)轉(zhuǎn)換后的日均TIF 柵格數(shù)據(jù)存入到相應(yīng)月份文件夾中。在圖3(b)中,“文件夾”為原始數(shù)據(jù)位置;“通配符”和“文件擴(kuò)展名”分別對應(yīng)文件名的關(guān)鍵字和文件類型;NetCDF 數(shù)據(jù)的變量參數(shù)HQprecipitation、Lon、Lat 可以自行輸入,也可以作為默認(rèn)變量填入?yún)?shù);“裁剪矢量數(shù)據(jù)”為進(jìn)行掩膜裁剪的研究區(qū)范圍;“輸出文件位置”為月份文件夾所在的上一層文件夾。
(3)迭代按月鑲嵌計(jì)算。將圖3(b)過程生成的TIF 柵格數(shù)據(jù)作為一個整體輸入,再進(jìn)行鑲嵌計(jì)算。需要注意的是,不能只把收集值作為一個簡單的變量放入模型中,需要將其設(shè)置為帶p 標(biāo)志的參數(shù)變量,否則就會以下面這種方式進(jìn)行計(jì)算:
式(2)顯然與式(1)的計(jì)算結(jié)果不同,這不是此次研究需要的結(jié)果。
(4)迭代文件夾進(jìn)行月均計(jì)算。將圖3(c)的模型作為一個整體嵌套到圖3(d)中,圖3(c)是迭代循環(huán)月份文件夾中的日均TIF 柵格數(shù)據(jù),圖3(d)是迭代循環(huán)不同的文件夾,嵌套的方式可以進(jìn)行多次循環(huán)。圖3(d)中,“中間數(shù)據(jù)文件夾”為月份文件夾所在的上一層文件夾位置,“輸出位置”為生成月均數(shù)據(jù)的存放位置。
圖3 月均降水量數(shù)據(jù)批量處理模型圖
批量處理模型設(shè)計(jì)完成之后,選取2020 年12 個月366 份的全年NetCDF 日均數(shù)據(jù),分別通過常規(guī)人工方法和批量處理模型工具法進(jìn)行處理,比較數(shù)據(jù)處理花費(fèi)的時(shí)間(見圖4)。
圖4 常規(guī)人工方法和批量處理模型工具法耗時(shí)對比圖
實(shí)驗(yàn)結(jié)果表明,將日均降水量數(shù)據(jù)處理成月均降水量柵格數(shù)據(jù),批量處理模型工具法用時(shí)約為5 min/月,常規(guī)人工方法用時(shí)約為48 min/月,批量處理模型工具法在數(shù)據(jù)處理時(shí)間上較常規(guī)人工方法縮短8 了倍以上。由此可見,批量處理模型工具法能大幅提高多時(shí)相柵格數(shù)據(jù)處理的效率,能有效克服常規(guī)人工方法效率低、用時(shí)長、容易出錯等問題,并且可以使用ArcGIS 中的地理處理結(jié)果,將其作為計(jì)算包整體運(yùn)算,減少設(shè)置參數(shù)的時(shí)間。
與MATLAB 方法相比,此次研究不需要進(jìn)行復(fù)雜的編程計(jì)算,使用模塊化的封裝工具即可實(shí)現(xiàn)搭積木式計(jì)算處理,并且ArcGIS 支持二次開發(fā),可不依靠環(huán)境進(jìn)行運(yùn)行計(jì)算,對于零基礎(chǔ)的使用者來說較為友好。通常情況下,在數(shù)據(jù)輸入輸出路徑上,很多模型工具往往都是固定的,即輸入數(shù)據(jù)的路徑也是輸出路徑,不能自行設(shè)置,不具有靈活性。此次研究筆者將輸入輸出位置作為不帶路徑參數(shù)的變量開放出來,提供給使用者自行輸入,大大增強(qiáng)了批量處理模型工具的遷徙性和提高了重復(fù)使用水平。同時(shí),批量處理模型工具法不局限于單一的裁剪計(jì)算,而是把名稱修改、數(shù)據(jù)轉(zhuǎn)換、裁剪提取、加權(quán)計(jì)算、數(shù)據(jù)生成等柵格數(shù)據(jù)處理的常見流程進(jìn)行綜合設(shè)計(jì),對于其他具有不同需求的柵格數(shù)據(jù)處理來說,具有很強(qiáng)的借鑒和指導(dǎo)意義。
此次研究中,筆者基于ArcGIS Model-Builder 可視化編程開發(fā)環(huán)境,集成ArcToolbox 現(xiàn)有工具和ArcPy 語言處理,開發(fā)實(shí)現(xiàn)多時(shí)相柵格數(shù)據(jù)批量處理模型工具。研究中,對于輸入輸出變量,采用空參數(shù)的形式,能滿足和實(shí)現(xiàn)批量處理模型工具的可遷移性和重復(fù)使用。同時(shí),使用ArcGIS 臨時(shí)數(shù)據(jù)庫ScratchGDB,避免了大量中間數(shù)據(jù)的出現(xiàn),節(jié)省了內(nèi)存。下一步,應(yīng)對不常使用的輸入輸出變量直接填充相應(yīng)參數(shù),減少批量處理模型工具使用過程中變量交互的次數(shù);擴(kuò)展模型工具的數(shù)量和模塊選項(xiàng),使用者在做修改調(diào)整后,即可對其他相似類型的柵格數(shù)據(jù)進(jìn)行批量處理。