裴光菊,唐德利,魏德照
(1.國家測繪地理信息局重慶測繪院,重慶 40001)
基于ArcGIS、Visual C++的DEM數(shù)據(jù)接邊檢驗(yàn)方法
裴光菊1,唐德利1,魏德照1
(1.國家測繪地理信息局重慶測繪院,重慶 40001)
為提高DEM數(shù)據(jù)接邊檢驗(yàn)的高效性、準(zhǔn)確性、可靠性,比較各種檢驗(yàn)方法后,本文結(jié)合ArcGIS組件,利用Visual C++開發(fā)平臺開發(fā)了一套DEM檢驗(yàn)軟件,并在實(shí)際檢驗(yàn)項(xiàng)目中驗(yàn)證了該軟件的使用效果。檢驗(yàn)結(jié)果表明,該軟件在DEM接邊檢驗(yàn)工作中高效、準(zhǔn)確、可靠。
數(shù)字高程模型(DEM);數(shù)據(jù)接邊;質(zhì)量檢驗(yàn)
數(shù)字高程模型(digital elevation model,DEM)是用一組有序數(shù)值陣列形式表示地面高程的一種實(shí)體地面模型,是數(shù)字地形模型(digital terrain model,DTM)的一個(gè)分支。DEM的建立方法和存儲格式有很多種,如 ARC ASCII Grid(*.asc)、ARC Info GRID(*.grd)、ESRI FLOAT BIL(*.bil *.hdr *.blw)、DEM GB(*.dem)、GRID GB(*.grd)、DEM VZ(*.dem)等,其數(shù)據(jù)內(nèi)容的表現(xiàn)形式有兩種:規(guī)則矩形格網(wǎng)和不規(guī)則三角網(wǎng)。由于DEM描述的是地面高程信息,在測繪、水文、氣象、地貌、地質(zhì)、土壤、工程建設(shè)、通訊、氣象、軍事等國民經(jīng)濟(jì)、國防建設(shè)以及人文和自然科學(xué)領(lǐng)域都有著廣泛的應(yīng)用[1-6]。因此,DEM產(chǎn)品質(zhì)量檢驗(yàn)的智能化和數(shù)據(jù)拼接質(zhì)量的檢驗(yàn)十分重要。
在地理信息數(shù)據(jù)中,DEM按國家標(biāo)準(zhǔn)經(jīng)緯度梯形分幅編號存放,其數(shù)據(jù)范圍由該梯形在高斯平面的最小外接矩形經(jīng)過一定外擴(kuò)來確定,相鄰圖幅間存在重疊區(qū)域,重疊區(qū)域的同名格網(wǎng)點(diǎn)高程要保持一致,這就要求對圖幅數(shù)據(jù)進(jìn)行接邊處理。DEM數(shù)據(jù)的質(zhì)量要素中接邊質(zhì)量要求尤為嚴(yán)格,最終成果均要求同名格網(wǎng)的高程值必須相同。生產(chǎn)過程數(shù)據(jù)接邊的同名格網(wǎng)點(diǎn)高程值較差不能超過兩倍高程中誤差,符合要求時(shí),以平均值確定格網(wǎng)點(diǎn)高程值,如不符合要求,則要查明原因并處理后再作接邊。DEM最終成果不允許相鄰圖幅同名點(diǎn)高程值存在差異[2]。
DEM接邊質(zhì)量檢驗(yàn)就是查看相鄰圖幅DEM數(shù)據(jù)重疊部分同名格網(wǎng)點(diǎn)的高程值是否能達(dá)到規(guī)定要求[7]。
在ArcGIS上打開相同投影帶中相鄰的兩幅DEM數(shù)據(jù),利用該軟件的DEM視圖功能,直接比較同名格網(wǎng)點(diǎn)灰度值,獲取同名格網(wǎng)點(diǎn)高程差值,也可以利用ArcGIS的柵格計(jì)算功能直接以同名格網(wǎng)點(diǎn)灰度差值顯示重疊部分視圖,以獲取同名格網(wǎng)點(diǎn)高程差值。若開發(fā)個(gè)人軟件實(shí)現(xiàn)接邊檢驗(yàn),則嵌入ArcGIS的COM組件同時(shí)加載相鄰兩幅DEM數(shù)據(jù),獲取重疊區(qū)域,并在重疊區(qū)域內(nèi)循環(huán)讀取同名格網(wǎng)點(diǎn)高程數(shù)據(jù)對,并計(jì)算較差,完成循環(huán)后計(jì)算接邊中誤差,最后輸出檢驗(yàn)報(bào)表。
跨投影帶圖幅數(shù)據(jù)接邊檢驗(yàn)不能依靠手工完成,只能開發(fā)專業(yè)軟件來實(shí)現(xiàn)。由于不同投影帶下的相鄰圖幅在拼接前需要將其中一幅數(shù)據(jù)進(jìn)行換帶處理,也就是需要按照很復(fù)雜的數(shù)學(xué)規(guī)則進(jìn)行計(jì)算,使兩幅數(shù)據(jù)處于同一投影帶下,手工方法是不可能實(shí)現(xiàn)的,必須借助計(jì)算機(jī)程序進(jìn)行批量處理。數(shù)據(jù)跨帶接邊檢驗(yàn)與相同帶接邊檢驗(yàn)不同,必須先把相鄰DEM數(shù)據(jù)投影到同一投影帶,然后再獲取同名格網(wǎng)點(diǎn)高程數(shù)據(jù)對,并計(jì)算較差,完成循環(huán)后計(jì)算接邊中誤差,最后輸出檢驗(yàn)報(bào)表。
現(xiàn)有的DEM數(shù)據(jù)接邊質(zhì)量檢驗(yàn)方法主要有:
1)在ArcGIS下,采用單點(diǎn)查詢方式檢查同名格網(wǎng)高程。
2)在ArcGIS下,利用其柵格計(jì)算功能手工逐個(gè)文件檢查同名格網(wǎng)高程。具體方法是首先加載相鄰兩幅DEM數(shù)據(jù),加載后圖幅鄰接處如圖1。然后在Spatial Anlyst工具欄下運(yùn)行Raster Calculator工具,如圖2。在彈出的對話框中選擇一個(gè)數(shù)據(jù)文件→點(diǎn)擊所需運(yùn)算符“<>”→選擇另一數(shù)據(jù)文件→點(diǎn)擊Evaluate按鈕。完成后,在圖層瀏覽窗口會自動產(chǎn)生一個(gè)新的柵格圖層Calculation,并在主窗口顯示該圖層,效果如圖3。圖中亮顯的星云狀部分即為灰度值為1的格網(wǎng)點(diǎn),表示這些格網(wǎng)點(diǎn)高程值不同。
圖1 相鄰DEM數(shù)據(jù)加載后鄰接處
圖2 DEM柵格疊加工具
圖3 DEM柵格疊加計(jì)算結(jié)果
3)在ArcGIS下,利用其卷簾功能,觀察同名格網(wǎng)點(diǎn)像素灰度值。
4)在ArcGIS下利用VB進(jìn)行內(nèi)嵌式編程檢查。
5)利用ArcGIS組件,在Visual C++/Visual Basic等開發(fā)平臺下,開發(fā)獨(dú)立運(yùn)行檢查軟件[3]。
前3種方法主要是基于手工方式,只能用于相同投影帶數(shù)據(jù)檢驗(yàn),不能用于跨帶數(shù)據(jù)接邊檢驗(yàn),且不能直接形成檢驗(yàn)結(jié)果統(tǒng)計(jì)報(bào)表。第4種方法可以實(shí)現(xiàn)自動,但其在運(yùn)行界面、運(yùn)行速度及用戶使用舒適性等方面均有一定的局限性。實(shí)際數(shù)據(jù)生產(chǎn)中,DEM數(shù)據(jù)的接邊不一致現(xiàn)象非常普遍。然而,一個(gè)圖幅范圍的DEM數(shù)據(jù)柵格有上百萬個(gè),數(shù)據(jù)量十分龐大,接邊檢驗(yàn)是一項(xiàng)十分繁重的任務(wù)。這種情況下,采用手工檢驗(yàn)方法是不切實(shí)際的。因此,本文探討了基于ArcEngine 9.3新增的柵格數(shù)據(jù)接口,在Visual C++6.0開發(fā)平臺下實(shí)現(xiàn)DEM數(shù)據(jù)的自動接邊檢驗(yàn),并運(yùn)用到實(shí)際生產(chǎn)過程中,以提高DEM接邊檢驗(yàn)的工作效率。
4.1 軟件功能要求
軟件設(shè)計(jì)以方便實(shí)用、高效準(zhǔn)確、界面友好、易于掌握為原則。這就要求軟件界面能設(shè)置用戶參數(shù)(如坐標(biāo)系統(tǒng)、高程系統(tǒng)),自動搜索指定路徑下的所有DEM數(shù)據(jù)文件,自動判斷鄰接圖幅DEM數(shù)據(jù)文件名及其存在性,判斷本圖幅與鄰接圖幅是否在同一投影帶下,進(jìn)行數(shù)據(jù)讀入并獲取同名格網(wǎng)點(diǎn)的高程值,統(tǒng)計(jì)同名格網(wǎng)點(diǎn)高程較差及其中誤差,輸出檢驗(yàn)報(bào)表。由于DEM數(shù)據(jù)量大,往往需要較長時(shí)間的數(shù)據(jù)處理,所以還需要設(shè)計(jì)適時(shí)刷新且不會卡死的進(jìn)度顯示條。
4.2 軟件界面設(shè)計(jì)
由于軟件要實(shí)現(xiàn)批量自動處理和結(jié)果輸出,所以,除主窗口菜單、工具條外,還需要選擇數(shù)據(jù)文件路徑界面、軟件運(yùn)行進(jìn)度界面、運(yùn)行結(jié)束提示界面和運(yùn)行結(jié)果顯示界面。
4.3 設(shè)計(jì)框圖
圖4 設(shè)計(jì)框圖
4.4 核心功能實(shí)現(xiàn)
4.4.1 導(dǎo)入所需ArcGIS組件
#import文件夾所在路徑+"/com/esriGeometry.olb" raw_interfaces_only raw_native_types no_namespace named_guids;其他所需的組件同樣導(dǎo)入。com組件導(dǎo)入后,ArcGIS對象及方法才能被正常使用。
4.4.2 自動搜索DEM文件
自動搜索指定文件夾下的按比例尺分幅存放的DEM數(shù)據(jù)(其文件名為標(biāo)準(zhǔn)圖幅編號),并將結(jié)果存放在CStringList列表對象中。實(shí)現(xiàn)模塊為GetFileByFolder,傳遞參數(shù)為文件擴(kuò)展名CString ContainFileEx,返回值為CStringList對象。關(guān)鍵代碼[5]:
ContainFileEx.MakeUpper(); CFileFind finder;
CString fileName,ls;
CStringList strList,strList0; strList.AddTail(BeginFolder);
POSITION ps=strList.GetHeadPosition();
while(ps)
{
CString strName=strList.GetNext(ps);
BOOL bWorking = finder.FindFile(strName+"\*.*");
while(bWorking)
{
bWorking = finder.FindNextFile( );
if (finder.IsDirectory()&&(!finder.IsDots()))//文件夾
……
}
}
4.4.3 計(jì)算并搜索鄰接DEM文件
循環(huán)讀取放在CStringList列表對象中的DEM文件,并獲取全部鄰接圖幅DEM文件名稱,驗(yàn)證其存在。實(shí)現(xiàn)模塊為GetRoundNum,傳遞參數(shù)為當(dāng)前DEM圖幅文件名CString strThisNum。由于不同比例尺圖幅的鄰接關(guān)系不一樣,所以編程過程中需要判斷DEM的分幅比例尺,按照國家標(biāo)準(zhǔn)分幅進(jìn)行判斷和計(jì)算。
4.4.4 加載DEM文件數(shù)據(jù)并讀取同名格網(wǎng)點(diǎn)高程
加載DEM數(shù)據(jù)需要用到ArcGIS的IRaster組件接口IRasterPtr、IrasterLayer的IrasterLayerPtr接口[3]。代碼為:
IRasterLayerPtr pRasterLayer(CLSID_RasterLayer);
pRasterLayer->CreateFromFilePath((CComBSTR)strPath);其中,strPath是包含DEM數(shù)據(jù)的文件路徑。由于DEM采用高斯投影平面坐標(biāo)系統(tǒng),涉及到投影分帶的問題,如果鄰接圖幅在不同投影帶,則需要對加載數(shù)據(jù)進(jìn)行投影換帶,以保證接邊檢驗(yàn)的鄰接數(shù)據(jù)在相同投影帶下。需要引入ArcGIS的ISpatialReferenceFactory3、ISpatialReference組建接口:ISpatialReferenceFactory3Ptr、ISpatialReferencePtr。代碼為:
ipSRFactory->CreateESRISpatialReferenceFromPRJFile(str PrjP,&ipPSR);
pRasterLayer ->putref_SpatialReference(ipPSR);
其中,strPrjP為高斯投影坐標(biāo)系統(tǒng)的定義文件(包含路徑)。注意,這里要先定義pRasterLayer的原坐標(biāo)系統(tǒng),再加載DEM數(shù)據(jù),之后重定義pRasterLayer的坐標(biāo)系統(tǒng)為目標(biāo)系統(tǒng),實(shí)現(xiàn)跨帶轉(zhuǎn)換。讀取格網(wǎng)點(diǎn)高程代碼為:
IRaster2Ptr ipRa2=ipRaster;// ipRaster為讀取的IRaster數(shù)據(jù)接口。
IRasterCursorPtr ipRaCur;
ipRa2->CreateCursorEx(ipPnt,&ipRaCur);// ipPnt相鄰圖幅重疊范圍IPnt接口。
IPixelBlockPtr ipPB;
ipRaCur->get_PixelBlock(&ipPB);
VARIANT vtValue;
ipPB->GetVal(0,m,n,&vtValue);//m,n為行列序號。
4.4.5 不同格網(wǎng)間距DEM的接邊檢驗(yàn)
由于格網(wǎng)間距不同,鄰接圖幅的重疊區(qū)域就沒有明確的同名格網(wǎng)點(diǎn),需要將其中一個(gè)文件的DEM數(shù)據(jù)進(jìn)行雙線性內(nèi)插,以求取同名點(diǎn)高程值進(jìn)行比較,確定拼接精度[4]。雙線性內(nèi)插數(shù)學(xué)模型為:設(shè)Q11、Q12、Q21、Q22分別為內(nèi)插點(diǎn)位最鄰近的4個(gè)格網(wǎng)點(diǎn),其點(diǎn)位坐標(biāo)分別為(X1,Y1) (X2,Y2)(X3,Y3)(X4,Y4),dx為橫坐標(biāo)差,內(nèi)插點(diǎn)坐標(biāo)為(xc,yc)。則插值如下。
其中,H為最終內(nèi)插值。
4.5 數(shù)據(jù)格式轉(zhuǎn)換
實(shí)際應(yīng)用中可能存在不同數(shù)據(jù)格式的DEM,這就需要將數(shù)據(jù)轉(zhuǎn)換為滿足程序運(yùn)行要求的目標(biāo)格式。在ArcMap下可以實(shí)現(xiàn)多數(shù)常用格式的轉(zhuǎn)換,也可以在VC++下進(jìn)行編程處理。
4.6 進(jìn)度條的實(shí)現(xiàn)
由于DEM數(shù)據(jù)文件較大、數(shù)量多,程序往往會運(yùn)行較長時(shí)間,需要設(shè)計(jì)進(jìn)度條來為用戶顯示程序處理的進(jìn)度情況,這就要求進(jìn)度條顯示更新與數(shù)據(jù)處理運(yùn)行在不同空間。因此,該程序把DEM數(shù)據(jù)處理放在線程去運(yùn)行,進(jìn)度條在主進(jìn)程中實(shí)時(shí)顯示刷新。代碼中用“static UINT DEMGCJD_Thread(LPVOID param)”語句申明線程,“UINT DEMJBJD_Thread(LPVOID param)”語句定義線程。所有DEM數(shù)據(jù)處理的代碼將在此線程中運(yùn)行,使進(jìn)度條在程序運(yùn)行期間始終處于活躍更新狀態(tài),避免了程序卡死的現(xiàn)象。
4.7 項(xiàng)目檢驗(yàn)應(yīng)用
該程序在國家基礎(chǔ)測繪1∶50 000和地方基礎(chǔ)測繪1∶10 000、1∶5 000等比例尺的DEM數(shù)據(jù)接邊檢驗(yàn)工作中得到了充分使用。例如,重慶1∶5 000數(shù)字地形測量項(xiàng)目中,其生產(chǎn)期持續(xù)三年多,成果包含數(shù)千幅分幅的DEM數(shù)據(jù),檢驗(yàn)工作量巨大,人工檢驗(yàn)不可能在期限內(nèi)完成。通過對該項(xiàng)目全部DEM數(shù)據(jù)進(jìn)行接邊檢驗(yàn)、裁切范圍檢驗(yàn),在0.5 h內(nèi)程序運(yùn)行結(jié)束,以100%的準(zhǔn)確率輸出全部數(shù)據(jù)檢驗(yàn)報(bào)表。
在諸多DEM數(shù)據(jù)接邊檢驗(yàn)的方法中,借助現(xiàn)行的工具軟件進(jìn)行手工操作的方式只能適應(yīng)極少量的數(shù)據(jù)。在面對大量數(shù)據(jù)時(shí),通過借助ArcGIS提供的組件,結(jié)合VC++(或者VB等)程序開發(fā)工具,編寫一套程序來完成大批量數(shù)據(jù)接邊檢驗(yàn)(也可以包括數(shù)據(jù)范圍檢驗(yàn)),快速、高效、準(zhǔn)確、可靠,是地理信息數(shù)據(jù)檢驗(yàn)必要的方法。
[1] 李志林,朱慶. 數(shù)字高程模型[M].武漢:武漢大學(xué)出版社,2001
[2] CH/T 1015.2-2007.基礎(chǔ)地理信息數(shù)字產(chǎn)品1∶10 000 1∶50 000生產(chǎn)技術(shù)規(guī)程 第二部分:數(shù)字高程模型(DEM)[S].
[3] 彭珊鸰,李軍,廖明,等.基于arcengine10的dem數(shù)據(jù)自動接邊檢查實(shí)現(xiàn)[J].科技資訊,2012,(18):9
[4] 王佩,呂志勇.DEM產(chǎn)品質(zhì)量檢查標(biāo)準(zhǔn)研究與實(shí)現(xiàn)[J].測繪與空間地理信息,2011,34(5):280-283
[5] 李書濤.C語言程序設(shè)計(jì)教程[M].北京:北京理工大學(xué)出版社,1993
[6] 楊秀伶.?dāng)?shù)字高程模型DEM的構(gòu)建與應(yīng)用[J].綠色科技,2014(5):315-316
[7] 劉錦軍,鈕利平,孫穎.1∶50 000數(shù)字高程模型(DEM)的質(zhì)量控制[J].東北測繪,2002,25(2):44
P208
B
1672-4623(2016)12-0084-03
10.3969/j.issn.1672-4623.2016.12.028
裴光菊,工程師,主要從事測繪地理信息產(chǎn)品檢驗(yàn)工作。
2015-12-15。