矢量圖形開發中的動態註記實現

在矢量圖形程序開發過程中,需要顯示每個矢量對象的註記,比如地圖中各個城市的名稱、道路的名稱等;而通常圖形數據都是按多層來進行組織的,也就是說,在屏幕上看到的電子地圖,可能是分別由行政區多邊形層、道路線層、城市點層等迭加而成。如果不加限制地顯示註記(直接把每個地物的註記文本TextOut出來),有可能會造成文本相互間的重疊,影響顯示效果,這與專業地圖生產的整飾要求是相違背的。大家可以去翻看任何一本正規地圖冊,上面所有的註記都是不相互遮蓋的,所以,電子地圖的生成,也必須要滿足這個要求。

    一般專業的GIS軟件都提供了相應的接口,如MapInfo和ArcInfo都提供了類似“註記優化”等的選項,而在自主開發圖形引擎的應用中,就必須自己來編寫代碼解決這個問題。

    我的實現思路是在畫每一層圖形地物時,圖形先畫在DC上,而註記不要先直接畫出來(否則後畫的圖層會影響先畫的註記;註記必須是在圖形都畫完後,才能在上面一起生成),而是經過空間計算,看看註記點附近的上下左右8個位置是否有其他註記的包絡矩形佔據,如果有,則按照1-8的順序依次計算新位置,如果找到一個空位,就把這個包絡矩形連同註記文本放在一個鏈表中保存,如果找不到空位,則放棄;下一個地物的註記,再同這個鏈表中的矩形進行計算...這樣,當圖形畫完後,也就得到一個最優註記的鏈表,然後再將這個鏈表中的註記畫在生成圖形的DC上。如下就是優化註記的算法示意圖。

------------------------
|    1  |   2    |    3   |
------------------------
|   8  | 地物 |   4    |
-----------------------
|   7  |    6    |   5    |
-----------------------

我目前生成的最優註記算法有以下功能:

1、支持點、折線和多邊形註記
2、註記位置可以在原註記點附近九個位置(左,左上,上,右上,右,右下,下,左下,居中)動態移動;
3、長於某個數字(如8個字)的註記自動折行;
4、線狀地物可以沿線自動調整  

圖形如下所示:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章