吳 璽,成建梅,常 敏
(中國(guó)地質(zhì)大學(xué)環(huán)境學(xué)院,武漢 430074)
MAPGIS軟件是武漢中地信息工程有限公司研制的具有自主版權(quán)的大型基礎(chǔ)地理信息系統(tǒng)軟件平臺(tái),是一個(gè)集當(dāng)代最先進(jìn)的圖形、圖像、地質(zhì)、地理、遙感、測(cè)繪、人工智能、計(jì)算機(jī)科學(xué)于一體的大型智能軟件,是集數(shù)字制圖、數(shù)據(jù)庫(kù)管理及空間分析為一體的空間信息系統(tǒng),是進(jìn)行現(xiàn)代化管理與決策的先進(jìn)工具。MAPGIS軟件已經(jīng)被廣泛應(yīng)用于各領(lǐng)域。其中,在土地、地籍、電信、管網(wǎng)、規(guī)劃等系統(tǒng)成為國(guó)家各部委向全國(guó)重點(diǎn)推廣的高科技產(chǎn)品,成為我國(guó)各領(lǐng)域進(jìn)行數(shù)字化建設(shè)的首選軟件。
MAPGIS的二次開發(fā)方式主要有 API函數(shù)、MFC類庫(kù)、組件開發(fā)、ActiveX控件四種方式,MAPGIS二次開發(fā)庫(kù)封裝在若干動(dòng)態(tài)鏈接庫(kù)(DLL文件)中。MAPGIS提供的二次開發(fā)方式采用的開發(fā)接口獨(dú)立于開發(fā)工具(MFC類庫(kù)開發(fā)方式除外),用戶無(wú)需學(xué)習(xí)新的開發(fā)工具就可以進(jìn)行 MAPGIS二次開發(fā),MAPGIS有四種二次開發(fā)方式:
(l)API函數(shù)開發(fā):MAPGIS的 API函數(shù)開發(fā)方式與 Windows的 API開發(fā)方式一樣[1]。
(2)MFC類庫(kù)開發(fā):MAPGIS類庫(kù)是基于 MFC庫(kù)的開發(fā)方式。用面向?qū)ο蟮乃枷氚岩恍?API功能進(jìn)行封裝,形成多個(gè)派生于 MFC中 CView類的可重用基類,用戶利用基于MFC的 MAPGIS類庫(kù),可構(gòu)建面向?qū)ο筌浖こ痰?MAPGIS應(yīng)用系統(tǒng)。類庫(kù)開發(fā)是針對(duì) C++的[1]。
(3)組件開發(fā):它是基于 COM(組件對(duì)象模型)標(biāo)準(zhǔn)的一種程序組件,能夠嵌入程序中運(yùn)行完成一定功能,在軟件開發(fā)中實(shí)現(xiàn)了功能重用。開發(fā)中只需簡(jiǎn)單調(diào)用功能接口就可以了。在使用可視化程度很高的開發(fā)工具 VC來(lái)開發(fā) MAPGIS應(yīng)用程序的過(guò)程中,最快速有效的方法就是使用 MAPGIS組件(控件)[1]。
(4)ActiveX控件是 MAPGIS完成組件化改造的成果之一,它使得二次開發(fā)更為快捷便利,代碼的可復(fù)用性更高[1]。
本文選擇了基于MFC類庫(kù)的開發(fā)。MAPGIS二次開發(fā)類庫(kù)是建立在 MAPGIS API之上的一個(gè)類庫(kù)層,用于支持基于MFC類庫(kù)的面向?qū)ο蟮?W indows程序設(shè)計(jì)。MAPGIS二次開發(fā)類庫(kù),提供了一套強(qiáng)有力的 C++類,它屏蔽了基于 MAPGIS API之上開發(fā)MAPGIS實(shí)用程序的許多復(fù)雜性,同時(shí)仍然允許有經(jīng)驗(yàn)的程序員使用底層的MAPGIS API功能。
煙臺(tái)市環(huán)境地質(zhì)信息管理系統(tǒng)具有數(shù)據(jù)管理、數(shù)據(jù)查詢、數(shù)據(jù)分析、報(bào)表分析、圖庫(kù)管理與編輯、災(zāi)害評(píng)價(jià)分析等功能的綜合性信息系統(tǒng),為今后預(yù)警預(yù)報(bào)系統(tǒng)的建立奠定基礎(chǔ)。整個(gè)系統(tǒng)的體系結(jié)構(gòu)圖如圖 1所示:
圖1 信息管理系統(tǒng)結(jié)構(gòu)框圖
系統(tǒng)最重要的內(nèi)容是數(shù)據(jù)的建設(shè),數(shù)據(jù)庫(kù)可分兩個(gè)部分,圖件資料和數(shù)據(jù)資料,本文采用兩者分離的方式進(jìn)行數(shù)據(jù)庫(kù)建設(shè)。
Visual C++6.0提供了各種各樣的數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)——ODBC API、MFC ODBC、DAO、OLE DB等 。這些技 術(shù)各有自己的特點(diǎn),具有簡(jiǎn)單、靈活、訪問(wèn)速度快、可擴(kuò)展性好的特點(diǎn)。
ODBC(Open Database Connectivity)[2]是客戶應(yīng)用程序訪問(wèn)關(guān)系數(shù)據(jù)庫(kù)時(shí)提供的一個(gè)統(tǒng)一接口,對(duì)于不同的數(shù)據(jù)庫(kù),ODBC提供了一套統(tǒng)一的 API,使用應(yīng)用程序可以應(yīng)用所提供的 API來(lái)訪問(wèn)任何提供了 ODBC驅(qū)動(dòng)程序的數(shù)據(jù)庫(kù),并且,ODBC已經(jīng)成為一種標(biāo)準(zhǔn),目前所有的關(guān)系數(shù)據(jù)庫(kù)[3]都提供了 ODBC驅(qū)動(dòng)程序,這使ODBC的應(yīng)用非常廣泛,基本上可用于所有的關(guān)系數(shù)據(jù)庫(kù)。
由于 ODBC是一種底層的訪問(wèn)技術(shù),因此,直接使用 ODBCAPI編寫應(yīng)用程序需要編寫大量代碼。Visual C++提供了MFC ODBC類,其中封裝了 ODBC API,因此,使用 MFC來(lái)創(chuàng)建 ODBC的應(yīng)用程序非常簡(jiǎn)便。
煙臺(tái)市海岸帶環(huán)境地質(zhì)問(wèn)題復(fù)雜,數(shù)據(jù)種類及數(shù)據(jù)量繁多,關(guān)系復(fù)雜。因此,研究選取了基于 MFC ODBC數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)來(lái)進(jìn)行開發(fā)。該系統(tǒng)集所有的數(shù)據(jù)管理、查詢、統(tǒng)計(jì)、分析報(bào)表功能于一體。采用該方法開發(fā)了管理系統(tǒng)中的基礎(chǔ)數(shù)據(jù)管理模塊,包括監(jiān)測(cè)點(diǎn)普查信息管理子系統(tǒng)、監(jiān)測(cè)點(diǎn)水位數(shù)據(jù)管理子系統(tǒng)、監(jiān)測(cè)點(diǎn)水量數(shù)據(jù)管理子系統(tǒng)、監(jiān)測(cè)點(diǎn)水溫?cái)?shù)據(jù)管理子系統(tǒng)、監(jiān)測(cè)點(diǎn)水質(zhì)數(shù)據(jù)管理子系統(tǒng)、野外調(diào)查點(diǎn)水質(zhì)數(shù)據(jù)管理子系統(tǒng)和降雨量數(shù)據(jù)管理子系統(tǒng)。
系統(tǒng)開發(fā)技術(shù)流程如圖 2所示。
圖2 基于 ODBC數(shù)據(jù)庫(kù)訪問(wèn)技術(shù)的數(shù)據(jù)管理系統(tǒng)開發(fā)技術(shù)路線圖
MAPGIS提供的類庫(kù)有基于 CView類派生的 CGisView類、CGisEditView和 CPrjEditView類。本研究選取采用繼承CGisEditView類和CPrjEditView類的方法,這樣可以同時(shí)使用CGisView、CGisEditView類及 VC++的 CView類所提供的所有功能。
其中繼承 CGisEditView類開發(fā)了圖形信息庫(kù)管理界面模塊程序 Prjmapsee.exe,繼而開發(fā)了基礎(chǔ)圖形庫(kù)管理系統(tǒng)(jctk.exe)、海水入侵危險(xiǎn)性評(píng)價(jià)系統(tǒng)(hsrq.exe)、海岸線變遷危險(xiǎn)性評(píng)價(jià)系統(tǒng)(axbq.exe)、地下水環(huán)境質(zhì)量評(píng)價(jià)系統(tǒng)(h jzl.exe)、地下水系統(tǒng)脆弱性評(píng)價(jià)系統(tǒng)(dscr.exe)、地下水資源潛力評(píng)價(jià)系統(tǒng)(zyq l.exe)、地下水庫(kù)建設(shè)可行性評(píng)價(jià)系統(tǒng)(sk js.exe)、海岸帶地質(zhì)環(huán)境質(zhì)量綜合評(píng)價(jià)系統(tǒng)(dzhj.exe)和海岸帶建設(shè)功能用地適宜性評(píng)價(jià)系統(tǒng)(hajs.exe)。開發(fā)流程圖如圖 3所示。
圖3 基于 MAPGIS類庫(kù)開發(fā)的圖庫(kù)管理與編輯系統(tǒng)開發(fā)流程圖
根據(jù)系統(tǒng)程序結(jié)構(gòu)的設(shè)計(jì),該系統(tǒng)主要有:顯示工程圖件、數(shù)據(jù)輸入、數(shù)據(jù)查詢、數(shù)據(jù)輸出[4]和數(shù)據(jù)備份功能模塊,從而實(shí)現(xiàn)對(duì)煙臺(tái)市海岸帶環(huán)境地質(zhì)相關(guān)數(shù)據(jù)的有效管理。
在基礎(chǔ)圖庫(kù)的菜單中,選擇任意一個(gè)圖件,將彈出顯示工程圖件的界面,界面的左側(cè)為樹視圖,選中圖件名稱前的方框,界面的右側(cè)將顯示該圖件,還可以對(duì)圖件進(jìn)行放大顯示、縮小顯示和復(fù)位顯示。該界面還具有添加 MAPGIS點(diǎn)文件、區(qū)文件、線文件和工程文件 MPJ的功能,在界面的右下角可以讀取光標(biāo)所在位置的坐標(biāo)。
在基礎(chǔ)信息庫(kù)管理系統(tǒng)中,初始化了監(jiān)測(cè)點(diǎn)普查信息、監(jiān)測(cè)點(diǎn)水位數(shù)據(jù)、監(jiān)測(cè)點(diǎn)水溫?cái)?shù)據(jù)、監(jiān)測(cè)點(diǎn)水量數(shù)據(jù)、監(jiān)測(cè)點(diǎn)水質(zhì)數(shù)據(jù)、野外調(diào)查點(diǎn)水質(zhì)數(shù)據(jù)和降雨量數(shù)據(jù),可以在相應(yīng)的界面下輸入需要更新的數(shù)據(jù)。
基礎(chǔ)信息庫(kù)管理系統(tǒng)具有分類查詢功能,可以選擇查詢
類別、查詢條件,可供選擇的有“大于、大于等于、等于、小于等于、等于”。點(diǎn)擊查詢即可從數(shù)據(jù)庫(kù)中查詢得到記錄。
點(diǎn)擊“報(bào)表”,系統(tǒng)提供了與Excel接口功能,查詢結(jié)果將以 Excel格式報(bào)表輸出,供用戶使用。報(bào)表將存在安裝目錄下的“YTDZ報(bào)表 ”目錄下。
在數(shù)據(jù)備份的界面中,選擇我們想要備份的圖件或其它格式的資料,并選擇希望保存的路徑,即可完成重要數(shù)據(jù)備份,非常方便。
系統(tǒng)采用 MAPGIS67SDK+VC模式編程,使用 MAPGIS67SDK顯示圖件資料和管理相關(guān)信息,使用 VC完成界面設(shè)計(jì)及數(shù)據(jù)庫(kù)顯示。以下是本系統(tǒng)基本功能實(shí)現(xiàn)的介紹。
調(diào)用_AppendArea(short ai)函數(shù),將要顯示的工作區(qū)添加到 CGisView類的顯示列表中,即可由 CGisView來(lái)自動(dòng)完成圖形的顯示,代碼如下:
shortCTryAttCtrlView::OpenLinFile()
{//打開線文件
m_Ai=_OpenLinArea(m_h Inst);//m_h Inst為打開的工作區(qū)實(shí)例
_LoadFile(m_Ai);
_AppendArea(m_Ai);
return 1;
}
放大功能:void_dsEnlargeMapDbs(HWND hWnd,DbsAI dbsAi);
縮小功能:void_dsDelargeMapDbs(HWND hWnd,DbsAI dbsAi);
復(fù)位顯示:_RestoreWindow();裝入點(diǎn)文件:LoadPoint();裝入線文件:LoadLine();
裝入?yún)^(qū)文件:LoadRegion();裝入工程文件:LoadProject()。
系統(tǒng)的數(shù)據(jù)庫(kù)通過(guò) access的關(guān)系模型建立起來(lái),VC將其連接并顯示出來(lái),代碼如下:
CString VSjxxset::GetDefaultConnect()//連接數(shù)據(jù)庫(kù)
{return_T("ODBC;DSN=y tdz");//ytdz是數(shù)據(jù)庫(kù)的名稱}
CString VSjxxset::GetDefaultSQL()
{return_T("[sw水溫]");//sw水溫是數(shù)據(jù)表的名稱}
數(shù)據(jù)輸入:m_time.GetW indowText(str);m_pset.m_time=str;
數(shù)據(jù)刪除:
if(m_list.GetItemState(i,LVIS_SELECTED)==LVIS_SELECTED)
{
str.Format(_T("確實(shí)要?jiǎng)h除第%d條記錄?"),i+1);
if(AfxMessageBox(str,MB_YESNO,0)==IDYES)
{
m_list.GetItem Text(i,0,ctemp,sizeof(char[20]));
m_list.DeleteItem(i);
VSjxxsetm_pset;
UpdateData(TRUE);
m_pset.Open(CRecordset::snapshot,NULL,CRecordset::none);
m_pset.m_strFilter.Format("ID=%d",atoi(ctemp));
m_pset.Requery();
m_pset.Delete();
if(m_pset.IsOpen())
{
m_pset.Close();
}}}
數(shù)據(jù)查詢:m_pSet->Close();
m_strfiter="...";//定義查詢條件
m_pSet->Open();
m_pSet->Requery();//來(lái)更新記錄集數(shù)據(jù)輸出:CSpreadSheet SS(szCurrentDir[0],"TestSheet");//新建 Excel文件名及路徑,TestSheet為內(nèi)部表名
samp leArray.RemoveAll();
samp leArray.Add("ID");//加入標(biāo)題
samp leArray.Add(m_list.GetItem Text(i,j));//加入數(shù)據(jù)
煙臺(tái)市海岸帶環(huán)境地質(zhì)問(wèn)題評(píng)價(jià)系統(tǒng)將煙臺(tái)市主要的環(huán)境地質(zhì)問(wèn)題的相關(guān)資料數(shù)據(jù)整理在一起,形成了規(guī)范的數(shù)據(jù)資料列表,解決了實(shí)際工作中,數(shù)據(jù)資料格式不統(tǒng)一和紙質(zhì)圖不易保存的問(wèn)題,對(duì)當(dāng)?shù)叵嚓P(guān)部門了解海岸帶的具體情況提供了很大的方便。
[1]中地軟件公司.MAPGIS二次開發(fā)培訓(xùn)教程.2001.10.
[2]施伯樂(lè),顧寧,劉國(guó)華 譯.數(shù)據(jù)庫(kù)處理——基礎(chǔ)、設(shè)計(jì)與實(shí)現(xiàn)(第七版)[M].北京:電子工業(yè)出版社,2001.3.
[3]張強(qiáng).巧學(xué)巧用 Access 2003數(shù)據(jù)庫(kù)應(yīng)用開發(fā)實(shí)例[M].北京:電子工業(yè)出版社,2007.1.
[4]楊志,郭福生,劉林清.基于 MAPGIS的江西省丹霞地貌信息系統(tǒng)設(shè)計(jì)與開發(fā)[J].測(cè)繪與空間地理信息,2006.2.