吳 晶
(東北石油大學(xué),黑龍江 大慶 163318)
隨著數(shù)字化信息技術(shù)的飛速發(fā)展,矢量圖工具的使用日益廣泛。不論是在理論還是在應(yīng)用上,今天的GIS都處在一個日新月異的時期,并呈現(xiàn)出廣闊的應(yīng)用前景。利用其MFC類便開發(fā)出來的功能強(qiáng)大的矢量圖形系統(tǒng)在測繪、地質(zhì)等工程領(lǐng)域應(yīng)用已經(jīng)相當(dāng)廣泛,這個以VC++6.0為開發(fā)平臺的產(chǎn)品憑借其體積小、速度快等優(yōu)點,代表了GIS系統(tǒng)的發(fā)展潮流,實現(xiàn)繪制地圖功能,展現(xiàn)VC++編程的優(yōu)越性[1]。
矢量圖(Vector Graph)是根據(jù)一組指令集合來描述圖形的內(nèi)容,在數(shù)學(xué)上可定義為一系列由線連接的點,它由矢量定義的直線、曲線等組成,其包括圖形元素的位置、維數(shù)和形狀。矢量圖是以數(shù)學(xué)公式的方式記錄圖像信息的,這就使得矢量圖具有兩個優(yōu)點:一是圖像質(zhì)量與分辨率無關(guān),矢量圖任意放大或縮小也不會出現(xiàn)模糊或鋸齒現(xiàn)象,這是其與位圖最大的區(qū)別;二是矢量圖像文件數(shù)據(jù)量很小。
矢量圖常以像素方式顯示,根據(jù)輪廓的幾何特性進(jìn)行描述。矢量圖像的優(yōu)點不僅在于可以把矢量圖與位圖進(jìn)行集成,也可將矢量圖與矢量信息集成在一起從而產(chǎn)生更完美的圖像[2]。
不同領(lǐng)域所使用的GIS系統(tǒng),對矢量圖系統(tǒng)功能的要求也有所不同。一個基本的矢量圖模塊所應(yīng)具備的功能如下[3]:
(1)繪制完善的矢量圖并標(biāo)注文本;
(2)編輯完善的圖形;
(3)可進(jìn)行對矢量圖的修改、縮放等操作;
(4)可實現(xiàn)鼠標(biāo)選中、放棄選中、圖形刪除等功能。
(5)相對完善的圖形I/O與編輯功能
包括書本交互繪圖、編輯、數(shù)字化儀輸入、編輯,與其他流行GIS開發(fā)工具及相關(guān)軟件的圖形數(shù)據(jù)接口、繪圖功能等;
(6)圖層管理:按圖層進(jìn)行空間數(shù)據(jù)的管理,能夠設(shè)置層集合的可顯示、可選擇、可編輯等不同的工作狀態(tài);
(7)實現(xiàn)圖形參數(shù)的設(shè)置和多邊形區(qū)域渲染功能;
(8)較大的存儲容量;
(9)較強(qiáng)的容錯能力和可恢復(fù)性;
(10)較高的處理速度。
在矢量圖形系統(tǒng)中,功能上選擇了圖元組織對象,用ClassWizard增加一個新的類CDraw,作為圖形元素的基類,對直線(L)、連續(xù)直線(P)、多邊形區(qū)域(R)、圓(C)、圓形區(qū)域(C1)、圓弧(A)和標(biāo)注文本(T)分別組織建立。如圖1所示這個類的父類是CObject。
圖1 圖形元素的繼承關(guān)系圖
從圖1中可知:增加新類CDraw類作為基本圖形類,其父類是CObject,可用于存儲圖形的顏色、層等相關(guān)信息。然后分別創(chuàng)建一個管理直線的類Cline和管理一個圓的類圓類CCircle其基類均為CDraw。注意創(chuàng)建圓弧類CArc類時其基類是CCircle以及連續(xù)直線和多邊形區(qū)域類CPline和創(chuàng)建一個管理標(biāo)注文本的CText類,其基類均是CDraw。
在各個圖象元素中分別加入Draw函數(shù)的實現(xiàn)代碼,以直線為類,在CLine類的實現(xiàn)文件drawDOc.cpp中加入Draw函數(shù)的實現(xiàn)代碼為:
void CLine::Draw(CDC *pDC,int m_DrawMode,int m_DrawMode1,
short BackColor)
{
int x1,y1,x2,y2;
if(b_Delete)
return;
short LineType=m_LineType;
short LineWide=max(1,DLtoVL(m_LineWide));
short ColorPen=m_ColorPen;
if(m_DrawMode1==1)
{
if(m_LineType!=2)
LineType=2;
else
LineType++;
}
else if(m_DrawMode1==2)
ColorPen=BackColor;
CPen pen(LineType, m_LineWide,p_GraphPara->GetColor(ColorPen));
CPen* pOldPen=pDC->SelectObject(&pen);
if(m_DrawMode==0)
pDC->SetROP2(R2_COPYPEN);
else if(m_DrawMode==1)
pDC->SetROP2(R2_NOT);
DPtoVP(m_X1,m_Y1,&x1,&y1);
DPtoVP(m_X2,m_Y2,&x2,&y2);
pDC->MoveTo(x1,y1); pDC->LineTo(x2,y2);
pDC->SelectObject(pOldPen);//恢復(fù)畫筆
}
在矢量圖形系統(tǒng)中,圖形參數(shù)是集中存儲的。在CDrawDoc類前定義圖形參數(shù)類CGraphPara。用來管理諸如顏色、圖層等方面的信息。應(yīng)用程序Draw中,每個圖層的信息用數(shù)據(jù)結(jié)構(gòu)LayerStruct表示,在CGraphPara類前定義LayerStruct結(jié)構(gòu)。
每一個基于框架的MFC程序至少都可以由類派生對象,則由CDraw類派生的CObArray對象來管理圖形元素。文檔類CDrawDoc類是專門設(shè)計用來幫助應(yīng)用程序存儲和管理數(shù)據(jù)的,創(chuàng)建管理各類圖形元素對象指針的CObArray對象。每個圖形元素是圖形元素類創(chuàng)建的一個對象,在創(chuàng)建這個對象指針時得到這個對象的指針,建立一個對象指針數(shù)組來管理這些指針,以達(dá)到管理所有圖形元素的目的。為了管理圖形參數(shù),在文檔類CDrawDoc中定義一個CGraphPara對象,為了在各個圖形元素類以及一些對話框類使用這個圖形元素對象m_GraphPara,可以定義一個全局的GraphPara類指針,并把這個指針指向當(dāng)前文檔對象中的CGraphPara對象m_GraphPara[4]。
在GIS矢量成圖系統(tǒng)中,需要涉及到實際坐標(biāo)、邏輯坐標(biāo)和設(shè)備坐標(biāo)(物理坐標(biāo))三種坐標(biāo)系統(tǒng)。其中實際坐標(biāo)為測量所得地物測點的坐標(biāo),單位是m或km;Windows系統(tǒng)分為邏輯坐標(biāo)和設(shè)備坐標(biāo),其中邏輯坐標(biāo)指為實現(xiàn)設(shè)備無關(guān)性而提供的映射方式,不考慮設(shè)備的類型;設(shè)備坐標(biāo)分為屏幕坐標(biāo)系、窗口坐標(biāo)系和客戶區(qū)坐標(biāo)系,可用于圖形顯示設(shè)備或打印設(shè)備的坐標(biāo)系統(tǒng),單位為像素。
在矢量圖系統(tǒng)開發(fā)時,圖形繪制首先要將實際圖形通過一定的比例變換映射到邏輯坐標(biāo)系中(窗口Window 中),然后使用一種映射方式將邏輯坐標(biāo)映射到設(shè)備中(視口ViewportExt中),最后將實際的圖形顯示或打印出來[5]。
為了實現(xiàn)矢量圖系統(tǒng)中實際坐標(biāo)轉(zhuǎn)化為邏輯坐標(biāo),在視圖類中定義四個轉(zhuǎn)換參數(shù)。其中函數(shù)VPtoDP用來將邏輯坐標(biāo)轉(zhuǎn)換成實際坐標(biāo),函數(shù)LPtoDP用來將實際坐標(biāo)轉(zhuǎn)換成各種映像方式下的邏輯坐標(biāo)。函數(shù)VLtoDL用來將邏輯坐標(biāo)長度轉(zhuǎn)換為實際坐標(biāo)長度,函數(shù)DLtoVL用來將實際坐標(biāo)長度轉(zhuǎn)換為邏輯坐標(biāo)長度。
(1) 選擇文件菜單下的新建命令輸入工程名及保存其的文件夾;
(2) 在選擇Application Type時選多重文檔;
(3) 將設(shè)定數(shù)據(jù)庫支持;
(4) 將設(shè)定生成的標(biāo)準(zhǔn)程序中的文檔支持;
(5) 去掉打印預(yù)覽及打印支持;
(6) 將設(shè)定是否設(shè)置提示及怎樣使用MFC庫同時動態(tài)鏈接MFC庫;
(7) 將設(shè)定AppWizard生成的類。
3.2.1 建立繪圖菜單項
在資源視圖區(qū)中選擇Menu項,右擊選擇“插入Menu”菜單項,將出現(xiàn)的菜單屬性對話框中的ID號設(shè)置為IDR_DRAWTYPE。在應(yīng)用程序Draw的菜單資源IDR_DRAWTYPE,鼠標(biāo)左鍵雙擊出現(xiàn)視圖區(qū)右側(cè)的菜單內(nèi)容,將出現(xiàn)的虛框右擊出現(xiàn)活動菜單,選擇屬性,即可出現(xiàn)圖2所示對話框,鍵入相應(yīng)ID號和標(biāo)題,ID號和標(biāo)題如下1:
圖2 菜單屬性對話框
表1 ID號和標(biāo)題
3.2.2 加對應(yīng)菜單消息的響應(yīng)函數(shù)(增加命令消息處理函數(shù))
以增加直線的消息處理函數(shù)為例闡述操作流程:在菜單上右擊鼠標(biāo),選擇類向?qū)?,在出現(xiàn)對話框中選擇菜單消息響應(yīng)函數(shù)所在的類CDrawView,在Object IDs中選擇對應(yīng)ID_DRAW_LINE菜單項的,在選中command,在彈出對話框Add Member Function中單擊OK。
圖3 新建菜單項
(1) 在視圖類CDrawView中,加入了消息處理函數(shù)的定義代碼:
//{{AFX_MSG(CDrawView)
afx_msg void OnDrawLine();//繪制直線
//}}AFX_MSG
(2) 在類CDrawView的實現(xiàn)文件中,增加了函數(shù)的實現(xiàn)代碼:
//選中菜單“繪制直線”時被調(diào)用
void CDrawView::OnDrawLine()
{
PushNumb=0;
m_DrawCurrent=1;//標(biāo)識進(jìn)行直線繪制操作
}
(3) 在實現(xiàn)文件中,增加了消息映射機(jī)制:
BEGIN_MESSAGE_MAP(CDrawView, CView)
//{{AFX_MSG_MAP(CDrawView)
ON_COMMAND(ID_DRAW_LINE, OnDrawLine)//開始直線繪制/}}AFX_MSG_MAP
//Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CView::OnFilePrintPreview)
END_MESSAGE_MAP( )
本文描述GIS中矢量圖形系統(tǒng)的初步實現(xiàn),完全基于VC++開發(fā)的GIS系統(tǒng)。利用AppWizard生成的程序框架出發(fā),開發(fā)實現(xiàn)了矢量圖形系統(tǒng)。通過建立圖形元素基類CDraw又繼承于MFC類庫中的CObject類,這樣就可以方便使用MFC類庫中提供CObArray類對象存放圖形元素,可繪制矢量圖形同時可以提供矢量圖形編輯功能。通過創(chuàng)建畫筆對象將當(dāng)前制作的位圖添加為工具條,定制線型設(shè)置線寬。
圖4 程序主界面運行結(jié)果
應(yīng)用VC ++6.0是矢量圖形系統(tǒng)開發(fā)的一個廣泛使用的工具,本文所設(shè)計的圖形對象是合理的,主要進(jìn)行集成測試,檢查各項功能:
(1) 小型矢量系統(tǒng)矢量圖形繪制:可繪制直線、多邊形、圓、圓弧和標(biāo)注文本,檢查是否正常;
(2) 編輯和操作矢量圖形:從繪制的若干圖形中分別進(jìn)行重畫、移動、全圖顯示、選中、刪除,檢查是否正常。
對于目前正有廣泛需求的地理信息系統(tǒng)二次開發(fā)而言,應(yīng)用VC++實現(xiàn)的矢量圖形系統(tǒng)有著積極的意義,其潛在的應(yīng)用前景十分廣闊。本文以VC++6.0為編譯平臺開發(fā)了小型GIS矢量圖形系統(tǒng),應(yīng)用計算機(jī)圖形學(xué)、計算機(jī)地圖制圖等有關(guān)知識,包含了基本的圖形元素類庫,實現(xiàn)矢量圖形的繪制、圖形操作等功能。該小型矢量圖形系統(tǒng)可以實現(xiàn)空間數(shù)據(jù)的有效表達(dá)與組織,通過預(yù)先定義好的圖形元素庫來提高繪圖效率,對有關(guān)技術(shù)問題的解決方案是正確的、可行的,具有重要的推廣應(yīng)用價值。該系統(tǒng)的實現(xiàn)有助于圖形的繪制、編輯等系統(tǒng)功能,交互繪制點、線、面。在此基礎(chǔ)上還可以進(jìn)行功能模塊的擴(kuò)展,以后進(jìn)一步深化系統(tǒng)成圖功能應(yīng)用于測繪數(shù)據(jù)處理中。