在矢量圖形程序開發過程中,需要顯示每個矢量對象的註記,比如地圖中各個城市的名稱、道路的名稱等;而通常圖形數據都是按多層來進行組織的,也就是說,在屏幕上看到的電子地圖,可能是分別由行政區多邊形層、道路線層、城市點層等迭加而成。如果不加限制地顯示註記(直接把每個地物的註記文本TextOut出來),有可能會造成文本相互間的重疊,影響顯示效果,這與專業地圖生產的整飾要求是相違背的。大家可以去翻看任何一本正規地圖冊,上面所有的註記都是不相互遮蓋的,所以,電子地圖的生成,也必須要滿足這個要求。
一般專業的GIS軟件都提供了相應的接口,如MapInfo和ArcInfo都提供了類似“註記優化”等的選項,而在自主開發圖形引擎的應用中,就必須自己來編寫代碼解決這個問題。
我的實現思路是在畫每一層圖形地物時,圖形先畫在DC上,而註記不要先直接畫出來(否則後畫的圖層會影響先畫的註記;註記必須是在圖形都畫完後,才能在上面一起生成),而是經過空間計算,看看註記點附近的上下左右8個位置是否有其他註記的包絡矩形佔據,如果有,則按照1-8的順序依次計算新位置,如果找到一個空位,就把這個包絡矩形連同註記文本放在一個鏈表中保存,如果找不到空位,則放棄;下一個地物的註記,再同這個鏈表中的矩形進行計算...這樣,當圖形畫完後,也就得到一個最優註記的鏈表,然後再將這個鏈表中的註記畫在生成圖形的DC上。如下就是優化註記的算法示意圖。
------------------------
| 1 | 2 | 3 |
------------------------
| 8 | 地物 | 4 |
-----------------------
| 7 | 6 | 5 |
-----------------------
我目前生成的最優註記算法有以下功能:
1、支持點、折線和多邊形註記
2、註記位置可以在原註記點附近九個位置(左,左上,上,右上,右,右下,下,左下,居中)動態移動;
3、長於某個數字(如8個字)的註記自動折行;
4、線狀地物可以沿線自動調整
圖形如下所示: