張建永,梁春利,石海崗,張春雷
(1.核工業航測遙感中心,河北 石家莊 050002)
基于ArcGIS Engine的柵格數據批量處理方法
張建永1,梁春利1,石海崗1,張春雷1
(1.核工業航測遙感中心,河北 石家莊 050002)

基于ArcGIS 的二次開發工具包ArcGIS Engine,從柵格數據檢查、坐標系統定義、投影轉換、范圍裁切等方面,介紹了對柵格數據各類信息讀寫和調用ArcGIS工具的批量處理方法,并在實踐中取得了很好的效果,為實際應用及擴展提供了技術基礎。
柵格數據;批處理;ArcGIS Engine;Dot NET
在常用的遙感數據格式中,ERDAS軟件的Image文件是一種較為常見的格式,具有可存儲多種類型數據(圖像數據、統計數據、直方圖、專題圖等)、存儲信息豐富(傳感器、投影、地理、分層、分塊等)、讀寫方便、圖像算法易實現等特點,是柵格數據的常用格式。在國內外多種遙感、地理信息軟件平臺中,對該格式都有較好的支持。本文基于ArcGIS軟件的開發工具包(ArcGIS Engine),探討海量ERDAS Image格式文件的批量處理方法,通過搭建流程化的處理框架,為快速、高效、準確完成柵格數據處理工作提供思路。
1.1 ArcGIS批處理模式
ArcGIS平臺中的各類圖像處理工具本身具有批量處理的功能。在工具上點擊右鍵,選擇“Batch”,即可彈出批量處理對話框。該模式為ArcGIS平臺批量處理的通用模式,但每次只能執行一個工具,對需要進行處理的數據和處理后數據的存放目錄、文件命名都有一定要求,限制較多。而日常的數據處理工作大都不滿足這樣的條件。
1.2 空間建模
ArcGIS平臺帶有Model Builder模型構建器,可以將一系列處理工具串聯在一起構成工作流。模型的構建包括數據處理工具和數據源,以流程圖的形式表示,相當于一種圖形化編程。通過建立模型,對技術人員的要求大大降低,能夠重復使用,減少重復性的工作。但迭代器的使用有較大限制,且僅能調用ArcGIS自身的工具,在實際應用中靈活性不足。
1.3 二次開發
ArcGIS提供了二次開發組件函數,支持Python、 Perl、Java、Dot NET(C#、VB)等多種開發語言,能夠方便實現各類數據處理功能。從各種開發語言功能強弱、實現的難易程度、兼容性、可擴展性等方面綜合考慮,基于ArcGIS Engine + Dot NET的開發是解決海量數據批處理行之有效的方法。在開發的過程中,還可以依據用戶實際需求,靈活實現對數據的條件選擇、多個工具之間組合處理、質量檢查、錯誤判斷、進度控制等功能。
ArcGIS Engine 是 ESRI ArcGIS軟件中推出的一組完備的嵌入式 GIS 組件庫和工具庫,供開發人員創建新的或擴展已有的桌面應用程序。與ArcObjects相比,ArcGIS Engine 的結構合理靈活,具有更為強大的開發功能和獨立性。
ArcGIS Engine的開發包包括了控件、工具命令集和對象庫3個部分,涉及了低層次的API和高層次的控件。同時通過GeoProcessor可以方便調用ArcGIS自身工具包。基于這些優點,開發者能將ArcGIS功能快速集成到GIS 解決方案中,開發出功能強大、適應各種需求的 GIS 程序和系統,給開發人員帶來了極大的靈活性和便利。
本文以Visual Studio.NET 2010為開發平臺,采用VB可視化編程語言,建立基于 ArcGIS Engine 10組件的柵格數據批量檢查處理模塊,主要實現對柵格數據的文件完整性檢查、坐標系統檢查、坐標系統定義、投影轉換、范圍裁切、屬性統計等功能,如圖1。
文件完整性檢查用于檢查柵格文件是否創建了金字塔,影像文件是否損壞,文件行列數、像素類型、像素深度、波段數、像元大小等信息與元數據是否一致。
坐標系統檢查用于判斷柵格文件是否存在空間參照坐標系統。如果存在,檢查影像范圍是否滿足空間參照的坐標范圍區間;如果不存在,則獲取影像的坐標范圍區間,為設置該影像的坐標系統提供參考。
坐標系統定義用于影像文件丟失空間參照的情況。判斷影像文件坐標范圍是否為地理坐標區間或含帶號的投影坐標區間,是則利用ArcGIS工具設定其坐標系統;不是則將該文件編號寫入文件記錄,后續人工進行檢驗。

圖1 程序體系結構圖
投影轉換是將影像的地理坐標系統或投影坐標系統轉換為目標文件投影的過程。依據轉換前后不同的坐標類型,轉換中使用的計算模型也不同。
范圍裁切是根據目標范圍,對柵格影像進行裁切的過程。目標范圍可以是矩形,也可以是不規則形狀的矢量文件。
信息統計是對裁切后的成果文件進行統計,包括建立金字塔,獲取影像的坐標范圍、行列數、波段數等信息并寫入到元數據文件中。
4.1 柵格數據檢查
在柵格數據的存儲轉換中,由于文件尺寸較大,可能存在數據缺失或損壞的情況。因此在數據數據處理前,要先判斷數據是否完整。通過創建柵格數據集的方式打開文件,并讀取文件的屬性信息,來檢查文件的完整性。通過IWorkspaceFactory、IRasterWorkspace、IRasterDataset、Iraster等接口打開柵格文件,利用 IRasterDataset、IRaster、IRasterBandCollection、IRawBlocks、IRasterInfo、IRasterPorps、IRasterPyramid等接口獲取柵格文件的波段信息、像元尺寸、行列數、坐標范圍、數據類型、文件格式等屬性信息,檢查是否與數據自身的元數據一致。
打開文件的主要功能如下:
pRasterWorkSpace = pWorkSpaceFactory.OpenFrom File(FolderName, 0)
//利用柵格數據的工作空間工廠和柵格數據工作空間,訪問柵格數據文件夾
pRasterDataset =pRasterWorkSpace.OpenRaster Dataset(FileName)
//利用柵格工作空間,打開柵格文件,返回值是柵格數據集
Dim pRaster As IRaster = pRasterDataset2.CreateFullRaster
/
/在內存中創建柵格數據的實例,獲取柵格數據的具體內容
獲取柵格文件屬性信息的主要功能如下:
Dim pRasterBandCollection As IRasterBandCollection = pRasterDataset
//定義柵格波段集合的變量,用于訪問柵格文件的各個波段
Dim pRawBlocks As IRawBlocks = pRasterBandCollection. Item(0)
//定義數據塊變量,用于讀取柵格數據
Dim pRasterInfo As IRasterInfo = pRawBlocks.RasterInfo
//定義柵格文件信息變量,用于訪問各類詳細的柵格文件信息
利用IRasterInfo接口的CellSize、Extent、Height、Width、Format、PixelType等屬性獲取柵格文件的對應信息。
4.2 坐標系統檢查
柵格文件的坐標系統信息能夠表明柵格文件的空間位置,是其重要的組成部分。數據處理過程中,需要通過影像的坐標系統信息來判斷該文件是否處于數據處理的范圍內。坐標系統的檢查分為兩步,首先判斷影像是否存在坐標系統,其次判斷坐標系統是否準確。
通過獲取影像的空間坐標參照信息,判斷是否存在坐標系統:
Dim pRasterProps As IRasterProps = pRaster
//定義柵格文件屬性變量,用于訪問柵格文件的屬性
Dim pRasterSPR As ISpatialReference = pRasterProps. SpatialReference
//定義空間參照變量,用戶檢查柵格數據的坐標系統是否正確
如果柵格影像的坐標參照為空,則pRasterSPR的Abbreviation、Alias、Remarks等屬性值為空;Name屬性值為"Unknown"。
如果柵格影像的坐標參照不為空,則判斷其類型是地理坐標系統或者投影坐標系統。同時檢查柵格文件的坐標范圍是否與相應的坐標系統值域范圍匹配,以便進行后續坐標轉換工作。
4.3 調用ArcGIS工具
柵格數據的數據處理工作如投影轉換、范圍裁切等可以直接調用ArcGIS軟件的工具進行。ArcGIS Engine中可以利用ESRI.ArcGIS.Geoprocessor類中的Geoprocessor接口來調用ArcGIS自帶的工具。調用時首先設置工具的各項參數,然后通過Geoprocessor接口的Execute方法執行工具,利用GetMessage方法返回工具執行過程中的狀態信息。

4.4 定義文件坐標系統
如果柵格文件缺失坐標信息,需要設定其坐標系統。通過檢查影像文件的坐標范圍,判斷采用的坐標系統類型及對應的橢球體等參數來進行坐標系統的設定。如為投影坐標系統還需通過影像的坐標范圍判斷柵格文件的中央經度,確定投影參數。設定坐標系統的過程主要利用ESRI.ArcGIS.DataManagementTools類中的DefineProjection接口進行,通過設定2個參數,即需要處理的文件和對應的坐標系統,可完成該功能。
Dim pDefineProjection As ESRI.ArcGIS.DataManagement Tools.DefineProjection = New DefineProjection
//定義一個投影設置工具,用于設置柵格數據的坐標信息,下面為相應的參數設置
pDefineProjection.in_dataset = pCurrentRasterFile
pDefineProjection.coor_system = strProj
GP.Execute(pDefineProjection, Nothing)
4.5 投影轉換
若現有文件的坐標系統與要求不同,則需進行投影轉換。投影轉換功能可以將地理坐標系統或投影坐標系統轉換為投影坐標系統。投影轉換功能主要利用ESRI.ArcGIS.DataManagementTools類中的ProjectRaster接口來實現,通過設定該接口的輸入柵格、輸出柵格、輸出坐標系統3項參數來進行投影轉換。同時可以利用像元尺寸(cell_size)、重采樣方式(resampling_ type)2個屬性參數對輸出柵格的影像進行調整。如果坐標轉換前后的坐標系統涉及2個橢球體,則需要設定橢球之間的轉換模型,即geographic_transform參數。如1954年北京坐標系與WGS84之間的轉換,不同的地理位置選用不同的轉換模型,如Beijing_1954_To_ WGS_1984_1、Beijing_1954_To_WGS_1984_2等。
Dim ProjectRasterDataset As ProjectRaster = New ProjectRaster
//定義一個投影轉換工具,下面為相應的參數設置
ProjectRasterDataset.in_raster = pCurrentRasterFile
ProjectRasterDataset.out_raster = pReprojectOutRasterFile
ProjectRasterDataset.out_coor_system = pProjectFeature ClassSPR
4.6 范圍裁切
柵格數據范圍裁切是截取所需要的一定坐標范圍內的柵格數據的功能。柵格范圍裁切可以利用空間分析工具(ESRI.ArcGIS.SpatialAnalyst)中的IExtractionOp接口、數據管理工具(ESRI.ArcGIS. DataManagementTools)中的Clip接口來實現,但二者應用的情形不同。IExtractionOp接口可以基于多邊形要素對柵格文件進行裁切,Clip接口是基于坐標范圍進行裁切。本文的裁切范圍主要是基于標準圖幅范圍外擴,所以利用Clip接口更為方便快捷。設定Clip接口的輸入柵格、輸出柵格及輸出范圍3個參數,即可實現該操作。
Dim pDataManagementClip As Clip = New Clip
//定義一個裁切工具,用于對柵格數據進行范圍裁切,下面為相應的參數設置
pDataManagementClip.in_raster = inRaster
pDataManagementClip.out_raster = pTempOutFileName
pDataManagementClip.rectangle = XMin & " " & YMin & " " & XMax & " " & YMax
依據上述思路,作者編寫了柵格數據批量處理的模塊,界面如圖2所示。經過實驗,利用該模塊進行數據處理不僅能保證數據的準確性和精度,且處理效率有很大提高,能夠進行大批量的自動處理,有效節約人員成本,縮短處理時間。
P208
B
1672-4623(2016)10-0043-03
10.3969/j.issn.1672-4623.2016.10.012
2016-01-18。
項目來源:中國地質調查局國產衛星數據質量改進與地礦綜合應用示范項目(1212011220158)。