張建永,梁春利,石海崗,張春雷
(1.核工業(yè)航測遙感中心,河北 石家莊 050002)
基于ArcGIS Engine的柵格數(shù)據(jù)批量處理方法
張建永1,梁春利1,石海崗1,張春雷1
(1.核工業(yè)航測遙感中心,河北 石家莊 050002)
基于ArcGIS 的二次開發(fā)工具包ArcGIS Engine,從柵格數(shù)據(jù)檢查、坐標(biāo)系統(tǒng)定義、投影轉(zhuǎn)換、范圍裁切等方面,介紹了對柵格數(shù)據(jù)各類信息讀寫和調(diào)用ArcGIS工具的批量處理方法,并在實踐中取得了很好的效果,為實際應(yīng)用及擴展提供了技術(shù)基礎(chǔ)。
柵格數(shù)據(jù);批處理;ArcGIS Engine;Dot NET
在常用的遙感數(shù)據(jù)格式中,ERDAS軟件的Image文件是一種較為常見的格式,具有可存儲多種類型數(shù)據(jù)(圖像數(shù)據(jù)、統(tǒng)計數(shù)據(jù)、直方圖、專題圖等)、存儲信息豐富(傳感器、投影、地理、分層、分塊等)、讀寫方便、圖像算法易實現(xiàn)等特點,是柵格數(shù)據(jù)的常用格式。在國內(nèi)外多種遙感、地理信息軟件平臺中,對該格式都有較好的支持。本文基于ArcGIS軟件的開發(fā)工具包(ArcGIS Engine),探討海量ERDAS Image格式文件的批量處理方法,通過搭建流程化的處理框架,為快速、高效、準(zhǔn)確完成柵格數(shù)據(jù)處理工作提供思路。
1.1 ArcGIS批處理模式
ArcGIS平臺中的各類圖像處理工具本身具有批量處理的功能。在工具上點擊右鍵,選擇“Batch”,即可彈出批量處理對話框。該模式為ArcGIS平臺批量處理的通用模式,但每次只能執(zhí)行一個工具,對需要進行處理的數(shù)據(jù)和處理后數(shù)據(jù)的存放目錄、文件命名都有一定要求,限制較多。而日常的數(shù)據(jù)處理工作大都不滿足這樣的條件。
1.2 空間建模
ArcGIS平臺帶有Model Builder模型構(gòu)建器,可以將一系列處理工具串聯(lián)在一起構(gòu)成工作流。模型的構(gòu)建包括數(shù)據(jù)處理工具和數(shù)據(jù)源,以流程圖的形式表示,相當(dāng)于一種圖形化編程。通過建立模型,對技術(shù)人員的要求大大降低,能夠重復(fù)使用,減少重復(fù)性的工作。但迭代器的使用有較大限制,且僅能調(diào)用ArcGIS自身的工具,在實際應(yīng)用中靈活性不足。
1.3 二次開發(fā)
ArcGIS提供了二次開發(fā)組件函數(shù),支持Python、 Perl、Java、Dot NET(C#、VB)等多種開發(fā)語言,能夠方便實現(xiàn)各類數(shù)據(jù)處理功能。從各種開發(fā)語言功能強弱、實現(xiàn)的難易程度、兼容性、可擴展性等方面綜合考慮,基于ArcGIS Engine + Dot NET的開發(fā)是解決海量數(shù)據(jù)批處理行之有效的方法。在開發(fā)的過程中,還可以依據(jù)用戶實際需求,靈活實現(xiàn)對數(shù)據(jù)的條件選擇、多個工具之間組合處理、質(zhì)量檢查、錯誤判斷、進度控制等功能。
ArcGIS Engine 是 ESRI ArcGIS軟件中推出的一組完備的嵌入式 GIS 組件庫和工具庫,供開發(fā)人員創(chuàng)建新的或擴展已有的桌面應(yīng)用程序。與ArcObjects相比,ArcGIS Engine 的結(jié)構(gòu)合理靈活,具有更為強大的開發(fā)功能和獨立性。
ArcGIS Engine的開發(fā)包包括了控件、工具命令集和對象庫3個部分,涉及了低層次的API和高層次的控件。同時通過GeoProcessor可以方便調(diào)用ArcGIS自身工具包?;谶@些優(yōu)點,開發(fā)者能將ArcGIS功能快速集成到GIS 解決方案中,開發(fā)出功能強大、適應(yīng)各種需求的 GIS 程序和系統(tǒng),給開發(fā)人員帶來了極大的靈活性和便利。
本文以Visual Studio.NET 2010為開發(fā)平臺,采用VB可視化編程語言,建立基于 ArcGIS Engine 10組件的柵格數(shù)據(jù)批量檢查處理模塊,主要實現(xiàn)對柵格數(shù)據(jù)的文件完整性檢查、坐標(biāo)系統(tǒng)檢查、坐標(biāo)系統(tǒng)定義、投影轉(zhuǎn)換、范圍裁切、屬性統(tǒng)計等功能,如圖1。
文件完整性檢查用于檢查柵格文件是否創(chuàng)建了金字塔,影像文件是否損壞,文件行列數(shù)、像素類型、像素深度、波段數(shù)、像元大小等信息與元數(shù)據(jù)是否一致。
坐標(biāo)系統(tǒng)檢查用于判斷柵格文件是否存在空間參照坐標(biāo)系統(tǒng)。如果存在,檢查影像范圍是否滿足空間參照的坐標(biāo)范圍區(qū)間;如果不存在,則獲取影像的坐標(biāo)范圍區(qū)間,為設(shè)置該影像的坐標(biāo)系統(tǒng)提供參考。
坐標(biāo)系統(tǒng)定義用于影像文件丟失空間參照的情況。判斷影像文件坐標(biāo)范圍是否為地理坐標(biāo)區(qū)間或含帶號的投影坐標(biāo)區(qū)間,是則利用ArcGIS工具設(shè)定其坐標(biāo)系統(tǒng);不是則將該文件編號寫入文件記錄,后續(xù)人工進行檢驗。
圖1 程序體系結(jié)構(gòu)圖
投影轉(zhuǎn)換是將影像的地理坐標(biāo)系統(tǒng)或投影坐標(biāo)系統(tǒng)轉(zhuǎn)換為目標(biāo)文件投影的過程。依據(jù)轉(zhuǎn)換前后不同的坐標(biāo)類型,轉(zhuǎn)換中使用的計算模型也不同。
范圍裁切是根據(jù)目標(biāo)范圍,對柵格影像進行裁切的過程。目標(biāo)范圍可以是矩形,也可以是不規(guī)則形狀的矢量文件。
信息統(tǒng)計是對裁切后的成果文件進行統(tǒng)計,包括建立金字塔,獲取影像的坐標(biāo)范圍、行列數(shù)、波段數(shù)等信息并寫入到元數(shù)據(jù)文件中。
4.1 柵格數(shù)據(jù)檢查
在柵格數(shù)據(jù)的存儲轉(zhuǎn)換中,由于文件尺寸較大,可能存在數(shù)據(jù)缺失或損壞的情況。因此在數(shù)據(jù)數(shù)據(jù)處理前,要先判斷數(shù)據(jù)是否完整。通過創(chuàng)建柵格數(shù)據(jù)集的方式打開文件,并讀取文件的屬性信息,來檢查文件的完整性。通過IWorkspaceFactory、IRasterWorkspace、IRasterDataset、Iraster等接口打開柵格文件,利用 IRasterDataset、IRaster、IRasterBandCollection、IRawBlocks、IRasterInfo、IRasterPorps、IRasterPyramid等接口獲取柵格文件的波段信息、像元尺寸、行列數(shù)、坐標(biāo)范圍、數(shù)據(jù)類型、文件格式等屬性信息,檢查是否與數(shù)據(jù)自身的元數(shù)據(jù)一致。
打開文件的主要功能如下:
pRasterWorkSpace = pWorkSpaceFactory.OpenFrom File(FolderName, 0)
//利用柵格數(shù)據(jù)的工作空間工廠和柵格數(shù)據(jù)工作空間,訪問柵格數(shù)據(jù)文件夾
pRasterDataset =pRasterWorkSpace.OpenRaster Dataset(FileName)
//利用柵格工作空間,打開柵格文件,返回值是柵格數(shù)據(jù)集
Dim pRaster As IRaster = pRasterDataset2.CreateFullRaster
/
/在內(nèi)存中創(chuàng)建柵格數(shù)據(jù)的實例,獲取柵格數(shù)據(jù)的具體內(nèi)容
獲取柵格文件屬性信息的主要功能如下:
Dim pRasterBandCollection As IRasterBandCollection = pRasterDataset
//定義柵格波段集合的變量,用于訪問柵格文件的各個波段
Dim pRawBlocks As IRawBlocks = pRasterBandCollection. Item(0)
//定義數(shù)據(jù)塊變量,用于讀取柵格數(shù)據(jù)
Dim pRasterInfo As IRasterInfo = pRawBlocks.RasterInfo
//定義柵格文件信息變量,用于訪問各類詳細的柵格文件信息
利用IRasterInfo接口的CellSize、Extent、Height、Width、Format、PixelType等屬性獲取柵格文件的對應(yīng)信息。
4.2 坐標(biāo)系統(tǒng)檢查
柵格文件的坐標(biāo)系統(tǒng)信息能夠表明柵格文件的空間位置,是其重要的組成部分。數(shù)據(jù)處理過程中,需要通過影像的坐標(biāo)系統(tǒng)信息來判斷該文件是否處于數(shù)據(jù)處理的范圍內(nèi)。坐標(biāo)系統(tǒng)的檢查分為兩步,首先判斷影像是否存在坐標(biāo)系統(tǒng),其次判斷坐標(biāo)系統(tǒng)是否準(zhǔn)確。
通過獲取影像的空間坐標(biāo)參照信息,判斷是否存在坐標(biāo)系統(tǒng):
Dim pRasterProps As IRasterProps = pRaster
//定義柵格文件屬性變量,用于訪問柵格文件的屬性
Dim pRasterSPR As ISpatialReference = pRasterProps. SpatialReference
//定義空間參照變量,用戶檢查柵格數(shù)據(jù)的坐標(biāo)系統(tǒng)是否正確
如果柵格影像的坐標(biāo)參照為空,則pRasterSPR的Abbreviation、Alias、Remarks等屬性值為空;Name屬性值為"Unknown"。
如果柵格影像的坐標(biāo)參照不為空,則判斷其類型是地理坐標(biāo)系統(tǒng)或者投影坐標(biāo)系統(tǒng)。同時檢查柵格文件的坐標(biāo)范圍是否與相應(yīng)的坐標(biāo)系統(tǒng)值域范圍匹配,以便進行后續(xù)坐標(biāo)轉(zhuǎn)換工作。
4.3 調(diào)用ArcGIS工具
柵格數(shù)據(jù)的數(shù)據(jù)處理工作如投影轉(zhuǎn)換、范圍裁切等可以直接調(diào)用ArcGIS軟件的工具進行。ArcGIS Engine中可以利用ESRI.ArcGIS.Geoprocessor類中的Geoprocessor接口來調(diào)用ArcGIS自帶的工具。調(diào)用時首先設(shè)置工具的各項參數(shù),然后通過Geoprocessor接口的Execute方法執(zhí)行工具,利用GetMessage方法返回工具執(zhí)行過程中的狀態(tài)信息。
4.4 定義文件坐標(biāo)系統(tǒng)
如果柵格文件缺失坐標(biāo)信息,需要設(shè)定其坐標(biāo)系統(tǒng)。通過檢查影像文件的坐標(biāo)范圍,判斷采用的坐標(biāo)系統(tǒng)類型及對應(yīng)的橢球體等參數(shù)來進行坐標(biāo)系統(tǒng)的設(shè)定。如為投影坐標(biāo)系統(tǒng)還需通過影像的坐標(biāo)范圍判斷柵格文件的中央經(jīng)度,確定投影參數(shù)。設(shè)定坐標(biāo)系統(tǒng)的過程主要利用ESRI.ArcGIS.DataManagementTools類中的DefineProjection接口進行,通過設(shè)定2個參數(shù),即需要處理的文件和對應(yīng)的坐標(biāo)系統(tǒng),可完成該功能。
Dim pDefineProjection As ESRI.ArcGIS.DataManagement Tools.DefineProjection = New DefineProjection
//定義一個投影設(shè)置工具,用于設(shè)置柵格數(shù)據(jù)的坐標(biāo)信息,下面為相應(yīng)的參數(shù)設(shè)置
pDefineProjection.in_dataset = pCurrentRasterFile
pDefineProjection.coor_system = strProj
GP.Execute(pDefineProjection, Nothing)
4.5 投影轉(zhuǎn)換
若現(xiàn)有文件的坐標(biāo)系統(tǒng)與要求不同,則需進行投影轉(zhuǎn)換。投影轉(zhuǎn)換功能可以將地理坐標(biāo)系統(tǒng)或投影坐標(biāo)系統(tǒng)轉(zhuǎn)換為投影坐標(biāo)系統(tǒng)。投影轉(zhuǎn)換功能主要利用ESRI.ArcGIS.DataManagementTools類中的ProjectRaster接口來實現(xiàn),通過設(shè)定該接口的輸入柵格、輸出柵格、輸出坐標(biāo)系統(tǒng)3項參數(shù)來進行投影轉(zhuǎn)換。同時可以利用像元尺寸(cell_size)、重采樣方式(resampling_ type)2個屬性參數(shù)對輸出柵格的影像進行調(diào)整。如果坐標(biāo)轉(zhuǎn)換前后的坐標(biāo)系統(tǒng)涉及2個橢球體,則需要設(shè)定橢球之間的轉(zhuǎn)換模型,即geographic_transform參數(shù)。如1954年北京坐標(biāo)系與WGS84之間的轉(zhuǎn)換,不同的地理位置選用不同的轉(zhuǎn)換模型,如Beijing_1954_To_ WGS_1984_1、Beijing_1954_To_WGS_1984_2等。
Dim ProjectRasterDataset As ProjectRaster = New ProjectRaster
//定義一個投影轉(zhuǎn)換工具,下面為相應(yīng)的參數(shù)設(shè)置
ProjectRasterDataset.in_raster = pCurrentRasterFile
ProjectRasterDataset.out_raster = pReprojectOutRasterFile
ProjectRasterDataset.out_coor_system = pProjectFeature ClassSPR
4.6 范圍裁切
柵格數(shù)據(jù)范圍裁切是截取所需要的一定坐標(biāo)范圍內(nèi)的柵格數(shù)據(jù)的功能。柵格范圍裁切可以利用空間分析工具(ESRI.ArcGIS.SpatialAnalyst)中的IExtractionOp接口、數(shù)據(jù)管理工具(ESRI.ArcGIS. DataManagementTools)中的Clip接口來實現(xiàn),但二者應(yīng)用的情形不同。IExtractionOp接口可以基于多邊形要素對柵格文件進行裁切,Clip接口是基于坐標(biāo)范圍進行裁切。本文的裁切范圍主要是基于標(biāo)準(zhǔn)圖幅范圍外擴,所以利用Clip接口更為方便快捷。設(shè)定Clip接口的輸入柵格、輸出柵格及輸出范圍3個參數(shù),即可實現(xiàn)該操作。
Dim pDataManagementClip As Clip = New Clip
//定義一個裁切工具,用于對柵格數(shù)據(jù)進行范圍裁切,下面為相應(yīng)的參數(shù)設(shè)置
pDataManagementClip.in_raster = inRaster
pDataManagementClip.out_raster = pTempOutFileName
pDataManagementClip.rectangle = XMin & " " & YMin & " " & XMax & " " & YMax
依據(jù)上述思路,作者編寫了柵格數(shù)據(jù)批量處理的模塊,界面如圖2所示。經(jīng)過實驗,利用該模塊進行數(shù)據(jù)處理不僅能保證數(shù)據(jù)的準(zhǔn)確性和精度,且處理效率有很大提高,能夠進行大批量的自動處理,有效節(jié)約人員成本,縮短處理時間。
P208
B
1672-4623(2016)10-0043-03
10.3969/j.issn.1672-4623.2016.10.012
2016-01-18。
項目來源:中國地質(zhì)調(diào)查局國產(chǎn)衛(wèi)星數(shù)據(jù)質(zhì)量改進與地礦綜合應(yīng)用示范項目(1212011220158)。