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