□ 袁紅 張文朗
(國(guó)家測(cè)繪地理信息局第四地形測(cè)量隊(duì),黑龍江哈爾濱150025)
地理國(guó)情監(jiān)測(cè)項(xiàng)目,產(chǎn)品成果數(shù)據(jù)較以前測(cè)繪項(xiàng)目種類較多,主要是數(shù)據(jù)庫(kù)格式的。過(guò)程生產(chǎn)根據(jù)工藝的要求,需要按分幅或在單景正射影像鑲嵌線范圍內(nèi)來(lái)制作生產(chǎn),最終成果數(shù)據(jù)以行政單元匯總提交,這就帶來(lái)了成果數(shù)據(jù)庫(kù)的拼合、裁切、數(shù)據(jù)庫(kù)格式的來(lái)回轉(zhuǎn)換。處理這些類似的問(wèn)題一般的操作是將原始數(shù)據(jù)的每一個(gè)層的要素通過(guò)ArcMap加載,利用ArcToolBoxd工具在編輯狀態(tài)下進(jìn)行要素的復(fù)制與粘貼、裁切,包括數(shù)據(jù)庫(kù)格式的轉(zhuǎn)換也是逐層完成的。地理國(guó)情監(jiān)測(cè)項(xiàng)目每一個(gè)成果數(shù)據(jù)庫(kù)都有幾十個(gè)層,通過(guò)手工操作實(shí)現(xiàn),帶來(lái)很大的工作量,且容易出現(xiàn)漏錯(cuò)。然而通過(guò)計(jì)算機(jī)語(yǔ)言,開發(fā)應(yīng)用程序,可以將這些一系列機(jī)械性的重復(fù)工作,以托管的方式,交給計(jì)算機(jī)處理,既省時(shí)、又省力,提高準(zhǔn)確度。因此需要探討與研究在數(shù)據(jù)庫(kù)處理方面應(yīng)用程序的開發(fā)與應(yīng)用。
為了全面掌握我國(guó)地理國(guó)情現(xiàn)狀,滿足經(jīng)濟(jì)社會(huì)發(fā)展和生態(tài)文明建設(shè)的需要,提高測(cè)繪地理信息服務(wù)保障能力,更好地服務(wù)于我國(guó)經(jīng)濟(jì)建設(shè)工作,國(guó)務(wù)院下發(fā)通知,決定開展地理國(guó)情監(jiān)測(cè)項(xiàng)目。該項(xiàng)目綜合運(yùn)用多種現(xiàn)代高新技術(shù),包括衛(wèi)星定位系統(tǒng)(GNSS)、航空航天遙感技術(shù)(RS)、地理信息系統(tǒng)技術(shù)(GIS)。主要成果數(shù)據(jù),包括國(guó)情要素?cái)?shù)據(jù)、地表覆蓋數(shù)據(jù)內(nèi)業(yè)都是在高分正射遙感影像上采集的,成果數(shù)據(jù)多且主要是數(shù)據(jù)庫(kù)形式,整個(gè)生產(chǎn)過(guò)程都需要借助計(jì)算機(jī)來(lái)完成。計(jì)算機(jī)軟件利用的程度決定著生產(chǎn)的進(jìn)度,因此迫切需要開發(fā)出一些應(yīng)用程序,對(duì)一些重復(fù)性的、繁瑣的、有規(guī)律可循的人工操作讓計(jì)算機(jī)來(lái)自動(dòng)來(lái)完成。比如開發(fā)衛(wèi)星遙感影像自動(dòng)解譯軟件可以快速完成地表覆蓋分類;開發(fā)一些質(zhì)量監(jiān)督檢查軟件,可有效的控制產(chǎn)品質(zhì)量。
對(duì)于一些數(shù)據(jù)重復(fù)、批量處理的工序,純手工操作,無(wú)疑是一個(gè)技術(shù)含量低、耗時(shí)量大的任務(wù),當(dāng)我們能利用一些其他手段,能快速、準(zhǔn)確的解決問(wèn)題,毫無(wú)疑問(wèn)在質(zhì)和量上都能提高一定的高度,減少一些不必要的重復(fù)工作量。
在地理國(guó)情監(jiān)測(cè)項(xiàng)目中,由于遙感影像需要二次糾正,我們需要將按圖幅號(hào)劃分的數(shù)據(jù)庫(kù)統(tǒng)一進(jìn)行合并,并將其按鑲嵌線的面元裁成對(duì)應(yīng)景號(hào)的各個(gè)子庫(kù)。當(dāng)我們需將大批量的數(shù)據(jù)進(jìn)行合并時(shí),通常需要逐一將每一個(gè)子庫(kù)的對(duì)應(yīng)層進(jìn)行合并,一般情況下,我們可以通過(guò)ArcMap的追加工具,或者通過(guò)加載數(shù)據(jù)逐一層的復(fù)制粘貼數(shù)據(jù),這樣必然使得工作繁瑣、工作量大。
按景號(hào)裁庫(kù)主要是將合并的大庫(kù),按每一個(gè)鑲嵌線面元的范圍裁成對(duì)應(yīng)的小庫(kù),一般情況下,我們需要按照景號(hào)建立對(duì)應(yīng)的數(shù)據(jù)庫(kù),并將該景號(hào)范圍的要素裁剪到對(duì)應(yīng)的要素層。針對(duì)影像二次糾正的數(shù)據(jù)準(zhǔn)備,若以手工方式操作,投入較大,而且容易出錯(cuò)。涉及到數(shù)據(jù)結(jié)構(gòu)的變化,在各個(gè)工序生產(chǎn)過(guò)程中,由于軟件的不兼容性,對(duì)讀取的數(shù)據(jù)格式有限制,經(jīng)常需要對(duì)MDB格式的數(shù)據(jù)庫(kù)和GDB格式的數(shù)據(jù)庫(kù)進(jìn)行轉(zhuǎn)換。對(duì)于大的行政單元,要實(shí)現(xiàn)數(shù)據(jù)格式的互換,通過(guò)程序設(shè)計(jì)達(dá)到批量處理既快速又準(zhǔn)確。
程序主要是以VS2010為平臺(tái),VB.NET為基本編程語(yǔ)言,C#為輔助編程語(yǔ)言?;贏rcObject的二次開發(fā),對(duì)以開發(fā)語(yǔ)言的選擇,正常C#最優(yōu),但由于初學(xué)C#,主語(yǔ)言主要以VB.NET為主。
通過(guò)分析問(wèn)題,找出解決問(wèn)題的辦法,設(shè)計(jì)程序算法。在保證質(zhì)量的前提下,尋找合適的解決方法,并在一定的程度上進(jìn)行代碼優(yōu)化,提高程序的穩(wěn)定性,以及程序的運(yùn)行速率。
批量合庫(kù)程序的設(shè)計(jì),主要是在VB.NET+AO環(huán)境下設(shè)計(jì)。由于合并的數(shù)據(jù)庫(kù)數(shù)量多,為了保證合并過(guò)程中要素類中不丟要素,以及要素不丟屬性信息,設(shè)計(jì)思路主要是將文件夾下的所有數(shù)據(jù)庫(kù)往排序第一的數(shù)據(jù)庫(kù)中,以要素重構(gòu)的方式合并到第一個(gè)庫(kù)中;為了提高程序運(yùn)行的速率,以遍歷第一個(gè)庫(kù)下的要素類的方式,將其他庫(kù)中同名的要素類中的要素在第一個(gè)庫(kù)中的要素類中重構(gòu)。
要素重構(gòu)的主要代碼如下:
WhileNotpFeatCopyIsNothing
DimpFeatZTAsIFeature=pFeatureClass.
CreateFeature
pFeatZT.Shape=pFeatCopy.Shape
Forj=0TopFeatZT.Fields.FieldCount-1
DimpFieldNAsString=pFeatZT.Fields.
Field(j).AliasName
IfpFieldN<>“OBJECTID”AndpFieldN<>
“SHAPE”AndpFieldN<>“SHAPE_Length”
AndpFieldN<>“SHAPE_Area”Then
Fork=0TopFeatCopy.Fields.FieldCount-1
DimpFCNAsString=pFeatCopy.Fields.
Field(k).AliasName
IfpFCN=pFieldNThen
pFeatZT.Value(j)=pFeatCopy.Value(k)
ExitFor
EndIf
Next
EndIf
按景號(hào)裁庫(kù)程序設(shè)計(jì)的思路是通過(guò)遍歷所使用的鑲嵌線圖層中的要素,根據(jù)該要素的景號(hào)字段值,建立裁切后的子庫(kù),然后將要素復(fù)制到裁切后子庫(kù)中的CQ層,調(diào)用C#編譯的ClipDo.dll的裁切函數(shù),以CQ為裁切范圍,將大庫(kù)每一層要素裁切到子庫(kù)中,最后刪除子庫(kù)中的CQ層。
Dim pXKY AsString=System.Windows.Forms.Application.StartupPath+“”&pDH&“.gdb”
DimpNameAsString
DimpXKAsString=“”
Fori=0TopFeature.Fields.FieldCount-1
IfpFeature.Fields.Field(i).AliasName=“景號(hào)”Then
pName=pFeature.Value(i)
pXK=pPathXk+“”&pName&“.gdb”
DimpChFoldAsFileSystemObject=New FileSystemObject
IfpChFold.FolderExists(pXK)=TrueThen
pChFold.DeleteFolder(pXK)
EndIf
DimpFileOAsFileSystemObject=New FileSystemObject
DimpSfoAsScripting.Folder=pFileO.GetFolder(pXKY)
DimpSflAsScripting.File
ForEachpSflInpSfo.Files
DimpOldAsString=pXKY+“”&pSfl.Name
DimpNewAsString=pXK+“”&pSfl.Name
My.Computer.FileSystem.CopyFile(pOld,pNew,F(xiàn)ileIO.UIOption.AllDialogs,F(xiàn)ileIO.UICancelOption.DoNothing)
裁庫(kù)主要通過(guò)調(diào)用C#編寫的ClipDO.Dll。
數(shù)據(jù)轉(zhuǎn)換的設(shè)計(jì)思路是將需轉(zhuǎn)格式數(shù)據(jù)庫(kù)的要素在另一種格式的數(shù)據(jù)庫(kù)中以重構(gòu)的方式轉(zhuǎn)換,通過(guò)數(shù)據(jù)屬性一一對(duì)應(yīng)寫入要素屬性表,避免了由于數(shù)據(jù)結(jié)構(gòu)變化導(dǎo)致的丟屬性的現(xiàn)象。
在VS2010平臺(tái)下,運(yùn)用內(nèi)置打包發(fā)布工具,把設(shè)計(jì)的代碼生成可安裝的窗體交互式應(yīng)用程序,這種二次開發(fā)的應(yīng)用程序優(yōu)點(diǎn)在于提高程序的可讀性、可移植性和可維護(hù)性。操作界面簡(jiǎn)單,運(yùn)行時(shí)點(diǎn)擊窗口命令按鈕即可,使得程序簡(jiǎn)單易操作;在合庫(kù)程序界面,只需按照提示信息選擇需要合并的庫(kù)所在的文件夾,然后點(diǎn)擊運(yùn)行即可;在按景號(hào)裁庫(kù)的程序界面,根據(jù)命令按鈕提示信息,選擇要裁切的大庫(kù)、鑲嵌線文件、中央經(jīng)線、以及放子庫(kù)的文件夾即可;在GDB轉(zhuǎn)MDB格式的數(shù)據(jù)庫(kù)相互轉(zhuǎn)換的程序中,只需將要進(jìn)行轉(zhuǎn)換的數(shù)據(jù)庫(kù)放入對(duì)應(yīng)的文件夾中,然后分別選擇需要進(jìn)行轉(zhuǎn)換的數(shù)據(jù)庫(kù)所在的文件夾和放入轉(zhuǎn)換后數(shù)據(jù)庫(kù)的文件夾。
硬件方面,當(dāng)前市場(chǎng)上常用的計(jì)算機(jī)硬件配置都能滿足所需要的運(yùn)行環(huán)境;系統(tǒng)方面,對(duì)于XP以上的操作系統(tǒng)都可以運(yùn)行。較高的計(jì)算機(jī)配置,程序運(yùn)行速度相對(duì)較快,對(duì)于面積較大的行政單元數(shù)據(jù)庫(kù)不用分批次操作,一次性可讀取,完成對(duì)成果數(shù)據(jù)庫(kù)的合并、裁切、數(shù)據(jù)庫(kù)格式的轉(zhuǎn)換。在DELL系列,7010型配置的計(jì)算機(jī)上批量合庫(kù)程序可一次性讀取300個(gè)文件(以5萬(wàn)圖幅為單位),能正常運(yùn)行,30分鐘執(zhí)行完畢。裁庫(kù)程序可對(duì)一個(gè)行政單元的數(shù)據(jù)庫(kù)一次性裁切出400個(gè)子庫(kù),需要運(yùn)行近2個(gè)小時(shí)。對(duì)于不同格式的數(shù)據(jù)庫(kù)進(jìn)行轉(zhuǎn)換處理起來(lái)較快,一般一個(gè)行政單元的數(shù)據(jù)庫(kù)(按圖幅計(jì)算)幾分鐘就運(yùn)行完畢。
按照工序的要求,前期國(guó)情數(shù)據(jù)采集和地表覆蓋分類都是在初糾正的影像上進(jìn)行的,外業(yè)獲取像控點(diǎn)成果后,對(duì)遙感影像進(jìn)行了二次糾正。這就需要對(duì)前期生產(chǎn)的矢量數(shù)據(jù)套合正射攝影進(jìn)行二次糾正。這就需要利用合庫(kù)程序先把子數(shù)據(jù)庫(kù)(一般一幅5萬(wàn)圖為一個(gè)數(shù)據(jù)庫(kù))拼合到一起,利用裁庫(kù)程序以遙感影像鑲嵌線為范圍創(chuàng)建一個(gè)面元,按其景號(hào)字段值建立數(shù)據(jù)庫(kù),然后利用面元范圍裁切大庫(kù)。在成果提交時(shí),是按行政單元,也可以利用合庫(kù)程序把所有子庫(kù)合并成一個(gè)數(shù)據(jù)庫(kù)。包括中間數(shù)據(jù)庫(kù)格式的反復(fù)轉(zhuǎn)換都可以使用轉(zhuǎn)換程序來(lái)實(shí)現(xiàn)。目前,新開發(fā)的這幾個(gè)程序,在新疆測(cè)區(qū)、內(nèi)蒙測(cè)區(qū)、西藏測(cè)區(qū)已經(jīng)推廣使用。經(jīng)過(guò)實(shí)踐證明,和人工操作對(duì)比,大大節(jié)省時(shí)間,提高數(shù)十倍的效率。
基于ArcObject開發(fā)的批量合庫(kù)、裁庫(kù)、數(shù)據(jù)庫(kù)格式轉(zhuǎn)換應(yīng)用程序在幾個(gè)測(cè)區(qū)中的應(yīng)用,既省時(shí)又省力,準(zhǔn)確無(wú)誤地完成了對(duì)3個(gè)測(cè)區(qū)海量數(shù)據(jù)的處理。在生產(chǎn)過(guò)程中針對(duì)某些問(wèn)題,尤其在后期質(zhì)量控制檢查方面,要多開發(fā)應(yīng)用程序,能夠提高工作效率,解決時(shí)間緊、任務(wù)重的問(wèn)題。地理國(guó)情監(jiān)測(cè)項(xiàng)目的成果數(shù)據(jù)較多,且都是數(shù)據(jù)庫(kù)形式的,因此多開發(fā)一些數(shù)據(jù)庫(kù)方面的應(yīng)用程序尤為重要。
【1】地理信息系統(tǒng)開發(fā)—ArcObjects方法[M].武漢大學(xué)出版.
【2】GIS程序設(shè)計(jì).基于ArcEngine的C#開發(fā)實(shí)例.浙江大學(xué)出版社.
【3】基于遙感與GIS的城市總體規(guī)劃信息工程[J].測(cè)繪學(xué)報(bào).
【4】地理信息系統(tǒng)理論與應(yīng)用叢書.ArcGIS開發(fā)寶典.科學(xué)出版社.
【5】張富強(qiáng).GIS中多維點(diǎn)數(shù)據(jù)的誤差區(qū)間分析法研究[J].測(cè)繪與空間地理信息,2010,33(2):65-68.