摘 要:實際生產(chǎn)數(shù)據(jù)管理中,DEM數(shù)據(jù)的接邊不一致非常普遍。然而DEM數(shù)據(jù)接邊檢查卻是一項繁重的任務(wù)。本文基于arcengine10新增的柵格數(shù)據(jù)接口實現(xiàn)DEM數(shù)據(jù)自動接邊檢查,并運到到實際生產(chǎn)過程中。極大的提高了工作效率。
關(guān)鍵詞:dem 數(shù)據(jù)接邊 arcengine10
中圖分類號:P2文獻標(biāo)識碼:A文章編號:1672-3791(2012)06(c)-0009-02
實際生產(chǎn)中,圖幅接邊是其中重要的一環(huán)。而dem(數(shù)字高程模型)數(shù)據(jù)與常用的點、線、面矢量數(shù)據(jù)不同,其采用柵格矩形格網(wǎng)形式表達(dá)。格網(wǎng)DEM的一個缺點是數(shù)據(jù)量過大,給數(shù)據(jù)管理帶來了不方便。日常管理中發(fā)現(xiàn),DEM數(shù)據(jù)接邊處不一樣問題很普遍。DEM接邊要求很嚴(yán)格,必須嚴(yán)格吻合既相同格網(wǎng)高程值必須一樣,不允許有限差,而且柵格格網(wǎng)個數(shù)特別多。這就使得在日常生產(chǎn)管理中,DEM數(shù)據(jù)的接邊及接邊檢查非常繁重。
1 ArcEngine10新增操作柵格數(shù)據(jù)接口
DEM數(shù)據(jù)為矩形格網(wǎng),其兩者相交區(qū)域也必然為矩形格網(wǎng)。要實現(xiàn)DEM數(shù)據(jù)的接邊檢查,就要查看2個相鄰DEM重疊格網(wǎng)信息,就要對重疊格網(wǎng)每一個單元進行讀取操作。在arcEngine10之前的版本中,對柵格數(shù)據(jù)的操作采用的是光標(biāo)法(rastercursor),其方法是將柵格數(shù)據(jù)自動分成幾個光標(biāo)塊,再將光標(biāo)塊當(dāng)成像素塊(PixelBlock)的集合,再操作像素塊集合從而操作每一個像素塊(也就的單元格網(wǎng))。該方法通過操作柵格數(shù)據(jù)中光標(biāo)塊內(nèi)部單元格網(wǎng),對其進行讀取、修改等操作,但是卻不能對指定單元格網(wǎng)(具體的某一個)進行讀取、修改等操作,其只能對某個光標(biāo)塊中的單元格網(wǎng)進行操作,而光標(biāo)塊大小在整個柵格中的具體位置很難判斷。從而得到不到某個單元格網(wǎng)的具體坐標(biāo)位置。在ArcGis10版本中新增加一個RawBlocks對象,并且實現(xiàn)IRawBlock接口,通過該接口可以得到某個單元格網(wǎng)(像素塊)的具體坐標(biāo)位置。該RawBlocks對象實現(xiàn)不通過以上光標(biāo)法對柵格數(shù)據(jù)進行操作,而是通過瓦片(tiling)方法進行操作。IRawBlocks接口實現(xiàn)5個成員如表1所示。
而RasterInfo方法得到一個RasterInfo對象,該對象同樣為arcengine10新增類。其主要用處為:獲得柵格數(shù)據(jù)的坐標(biāo)原點,柵格數(shù)據(jù)坐標(biāo)范圍,單元格網(wǎng)大小(x,y軸大小數(shù)值),單元格網(wǎng)的行數(shù)(BlockHeight),列數(shù)(BlockWidth)等。RawBlocks對象操作柵格數(shù)據(jù)的具體用法如以下幾點。
(1)將單波段柵格數(shù)據(jù)直接賦予Raw-Blocks對象,多波段的數(shù)據(jù)分波段賦予RawBlocks對象。(2)通過RasterInfo方法得到RasterInfo對象,得到各個具體瓦片。(3)在每個瓦片中,得到具體的單元格網(wǎng),從而對柵格格網(wǎng)進行操作。(4)通過瓦片坐標(biāo),瓦片中單元格網(wǎng)的位置,得到單元格網(wǎng)的具體坐標(biāo)。
2 Dem數(shù)據(jù)接邊檢查
分幅的DEM數(shù)據(jù)必須進行接邊。因為DEM數(shù)據(jù)是用柵格格網(wǎng)表達(dá),對其進行接邊就是要講兩兩相鄰數(shù)據(jù)重疊處的每個格網(wǎng)進行高程值的一致性處理。因為柵格格網(wǎng)個數(shù)特別多,其接邊首先要進行接邊處檢查,判斷具體格網(wǎng)高程值是否需要修改。對等待接邊檢查的DEM數(shù)據(jù)2幅DEM數(shù)據(jù)進行接邊檢查,其流程可以概括如圖1。
3 實驗
在vs2010環(huán)境,基于C#+ArcEngine10編程實現(xiàn)DEM數(shù)據(jù)自動接邊檢查程序。兩DEM數(shù)據(jù)相減后得到相交區(qū)域的矩形格網(wǎng)后,如果接邊一致,那么其單元格網(wǎng)應(yīng)該為0值。對格網(wǎng)內(nèi)部單元格網(wǎng)進行0值檢查為程序核心。程序核心操作為:對柵格數(shù)據(jù)由系統(tǒng)分得的瓦片逐一檢查,然后將瓦片中的具體格網(wǎng)的值進行非0判斷,為非0則記錄該格網(wǎng)的中心坐標(biāo)等信息。
部分的代碼如下:
for (int pbYcursor = startY; pbYcursor < endY; pbYcursor++)
{
for (int pbXcursor = startX; pbXcursor < endX; pbXcursor++)
{
rawBlocks.ReadBlock(pbXcursor, pbYcursor, 0, pb);
System.Array safeArray = (System.Array)pb.get_SafeArray(0);
for (int safeArrayHeight = 0; safeArrayHeight < pb.Height; safeArrayHeight++)
{
for (int safeArrayWidth = 0; safeArrayWidth < pb.Width; safeArrayWidth++)
{
object value = safeArray.GetValue(safeArrayWidth, safeArrayHeight);
double dVal = Convert.ToDouble(value);
if (!Math.Equals(dVal, 0.0) !Math.Equals(dVal, -3.4028234663852886E+38))
{
IPoint p_val = new ESRI.ArcGIS.Geometry.Point ();
p_val.X = rasInfo.Origin.X + (pbXcursor * rasInfo.BlockWidth + safeArrayWidth + 0.5) * rasInfo.CellSize.X;
p_val.Y = rasInfo.Origin.Y - ( rasInfo.BlockHeight * pbYcursor+safeArrayHeight + 0.5) * rasInfo.CellSize.Y;
}
}
}
}
}
我們對實際DEM數(shù)據(jù)進行了自動接邊檢查實驗。對同一度帶下1∶1萬的DEM數(shù)據(jù)共932幅進行接邊檢查,其中有兩兩相交后產(chǎn)生的新數(shù)據(jù)共3081個。有接邊問題的相交區(qū)域共204個,檢查出有非0值的高程不一致的格網(wǎng)個數(shù)共111282個,需要修改。運行耗時3小時07分鐘。
4 結(jié)語
本文介紹了arcengine10新增柵格數(shù)據(jù)操作對象RawBlocks對象及其IRawBlock接口,提出了對DEM數(shù)據(jù)自動接邊檢查流程,最后實現(xiàn)了DEM數(shù)據(jù)自動接邊檢查并運用到實際生產(chǎn)當(dāng)中。DEM數(shù)據(jù)接邊檢查任務(wù)繁雜,細(xì)致,通過基于arcengine的自動接邊檢查程序,提高了生產(chǎn)效率。今后的研究中將著力解決程序運行速度問題,將程序進行優(yōu)化,縮短運行時間,從而使得生產(chǎn)效率更高效。
參考文獻
[1]塢倫.地理信息系統(tǒng)原理、方法和應(yīng)用[M].科學(xué)出版社,2000.
[2]胡鵬,黃杏元,華一新,地理信息系統(tǒng)教程[M].武漢大學(xué)出版社,2002,2.