<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      編程 & 生活 -- 西西吹雪

      開心工作,快樂生活 (原創(chuàng)文章,轉(zhuǎn)載請注明出處)

      導(dǎo)航

      MO開發(fā)小技巧(三)-- 出圖

      這一篇講如何用MO出圖

      一、先看一下我完成的程序的界面:     


      圖一、按國家標(biāo)準(zhǔn)設(shè)置的面狀地類層的符號化效果

       
      圖二、按廣東省國土資源廳標(biāo)準(zhǔn)完成的土地利用現(xiàn)狀圖出圖界面


      可以看到,出圖界面有一點(diǎn)模仿ArcGis的意思。

      二、出圖實(shí)現(xiàn)在基本思路
      1、難題。
          MO對出圖的支持有三個函數(shù):PrintMap、OutputMap和OutputMap2。三個函數(shù)的原型是:
        PrintMap docName, outputFile, landscape  
        OutputMap hDC
        OutputMap2 hDC, x, y, width, height, [drawFlags]
        其中PrintMap的功能非常弱,只能地圖可見部分直接輸出到打印機(jī)上。OutputMap2很明顯是OutputMap的加強(qiáng)版本,可以將地圖顯示的內(nèi)容輸出到指定的hdc的指定矩形區(qū)域中。

           雖然如此,但這離我們現(xiàn)實(shí)的出圖要求還相差很遠(yuǎn)。體現(xiàn)在以下幾點(diǎn):
             (1)實(shí)際出圖一般要求按指定比例尺出圖,故存在一個比例尺的控制的問題;
        (2)實(shí)際出圖往往帶有整飾性的內(nèi)容,而且不同的出圖類型,整飾的內(nèi)容也不同。
             (3)實(shí)際出圖往往并不是簡單對當(dāng)前地圖控件的拷貝。例如當(dāng)前地圖的長寬比例與出圖要求可能并不相符;每出一次圖就要調(diào)整一次顯示內(nèi)容也是不可接受的。
              鑒于此,需要對出圖模塊在架構(gòu)上進(jìn)行較好的設(shè)計,以應(yīng)付多變的出圖要求。

      2、設(shè)計思路
           為了滿足各種出圖要求,原則上要求可以進(jìn)行打印定制,即通過參數(shù)設(shè)置來定義不同的打印類型,從而實(shí)現(xiàn)不同的出圖效果。
           但這些參數(shù)有哪些呢?我將它們分為以下幾類:    
          >圖層控制類:需要哪些圖層數(shù)據(jù),以各個圖層的顯示效果;
          >地圖注記類:需要哪些種類的注記,以及各種注記的字體;
          >地圖布局及裝飾類:如出圖大小,地圖以外的文字,圖例,指北針等。
       有了這些分類之后,就可以定義各個分類所需的參數(shù)了,然后將其形成模板,就可以自定義各種打印類型了。

      三、出圖模塊編寫碰到的問題
        1、面狀填充出圖時繪圖儀設(shè)備的特殊性      
               對于顯示器和普通打印機(jī),用圖片進(jìn)行面狀填充均可正常進(jìn)行。但對于繪圖儀設(shè)備,用同樣的方式進(jìn)行面狀填充,會發(fā)現(xiàn)符號非常的小,這是由于分辨率的差別的緣故。故在填充前,可以先判斷設(shè)備是否是繪圖儀,如果不是,則正常處理;如果是,則進(jìn)行相應(yīng)的縮放,縮放的比例就是繪圖儀的分辨率與屏幕分辨率之比,縮放的放法是使用StretchBlt函數(shù)即可。經(jīng)過這樣的處理,面狀填充就可以達(dá)到顯示與出圖完全一致的效果。
            判斷一個設(shè)備是否是繪圖儀:GetDeviceCaps(hdc, TECHNOLOGY) = DT_PLOTTER     
           2、出圖線粗的問題
         MO的OuputMap2方法有一個特性(還是Bug?),就是將其輸出到打印機(jī)上時,其線條的粗細(xì)比屏幕顯示要細(xì)得多。所以出圖為了得到較粗的線,要將線狀圖層的線粗設(shè)置得特別大,看起來極不美觀。
              究其原因,又是由于打印機(jī)分辨率比屏幕分辨屏要高的緣故。我想到了一個簡單的辦法來解決這個問題,就是在輸出到打印機(jī)前,將所有的線寬進(jìn)行加粗,輸出完畢后立即改回來,這樣就保證了顯示與出圖線寬的一致。 
              3、宗地圖界址點(diǎn)過濾的問題
             按照廣東省國土資源廳的出圖標(biāo)準(zhǔn),出宗地圖時,要顯示宗地的界址點(diǎn)編號及界址線長度等信息。對于國有宗地,其圖形往往很復(fù)雜,界址點(diǎn)個數(shù)動輒達(dá)到三四千個。這個多個界址點(diǎn)要全部顯示出來,整個圖會變成亂糟糟的一團(tuán)。為了改善出圖效果,必須對宗地界址點(diǎn)進(jìn)行過濾,過濾的原則就是保留“關(guān)鍵點(diǎn)”,舍棄無關(guān)緊要的點(diǎn)。由于關(guān)鍵點(diǎn)這個標(biāo)準(zhǔn)比較主觀,所以程序必須可接受人工干預(yù)。當(dāng)然關(guān)鍵點(diǎn)也不是毫無標(biāo)準(zhǔn),我們可以通過曲線擬合的算法來找出這些關(guān)鍵點(diǎn)。算法如下:
          > 首先找到一個起始點(diǎn),這個起始點(diǎn)按標(biāo)準(zhǔn)為西北角點(diǎn);
           >然后在多邊形所有的點(diǎn)集合中,找到距這個點(diǎn)最遠(yuǎn)的另一個點(diǎn),現(xiàn)在得到了兩個關(guān)鍵點(diǎn);這兩個點(diǎn)將多邊形分成了兩段弧;
        >分別處理這兩段弧,處理辦法是在弧上找到距離弦最遠(yuǎn)的一點(diǎn),如果該距離大于某一預(yù)設(shè)值,就加入到關(guān)鍵點(diǎn)中。這個點(diǎn)與弧的兩個端點(diǎn)又分別構(gòu)成了一段弧,用遞歸處法處理它;
           這樣就得到了一個關(guān)鍵點(diǎn)的集合。然后再取得界址線長,這中間算法要精心處理。  
              4、注記位置的問題。
              注記是出圖中非常重要的內(nèi)容。注記內(nèi)容一般是各個圖層中的某些屬性字段,所以處理注記最簡單的辦法就是通過LabelRenderer對象來進(jìn)行顯示這些屬性的內(nèi)容。但這樣做有一個致命的弱點(diǎn):就是不能隨便移動注記位置,圖層標(biāo)注的位置默認(rèn)位于圖形中心點(diǎn)的位置,要移動注記就要移動圖形,因?yàn)橐鰣D而移動圖形是不可能的。我的辦法是出圖前將所需要的注記輸出到一個Shape文件中(范圍之外的注記不要生成),通過Text字段保存注記內(nèi)容,然后用LabelRenerer來進(jìn)行顯示。這樣做在一定程序上影響了速度,但從根本上解決了注記顯示位置的問題。
        5、其它要注意的問題
             出圖是一件很復(fù)雜的工作,編寫程序的過程中學(xué)會碰到其它各種各樣的問題,下面再簡單列舉一下:
        >多邊形中心點(diǎn)不在多邊形范圍內(nèi)的問題
            >注記的字體大小及縮放問題
        >中小比例尺分幅不是矩形的問題
           .......
            以上問題本人已經(jīng)比較妥善解決,請朋友們自己思考方法。如有興趣,可以用郵件進(jìn)行交流。shyhs@21cn.com

      四、打印及符號化組件一覽
          為了重用方便,我將所有的出圖功能封裝到幾個COM組件中,下面列出了我設(shè)計的出圖模塊所包含的組件及其功能。 
        

      組件文件名 組件功能 開發(fā)工具
      mohelper.dll 這是符號化用到的一個組件,來自于MO所帶的CustomSym例子中。其功能是將一系列的點(diǎn)集合進(jìn)行分解組合,形成自定義線對象,方便進(jìn)行處理。  
      GrphList.ocx 這是一個自定義控件,用來繪制任意圖形列表。用于實(shí)現(xiàn)符號化面板,符號選擇等與圖形列表相關(guān)的功能。能容納十萬條以上的記錄,顯示時速度不受影響,與數(shù)十條記錄無異。 VB
      Theme2.dll 這是符號化核心組件,封裝了符號化的實(shí)現(xiàn),界面以及符號庫的編輯等功能 VB+MO
      MapPrint2.ocx 這是一個用來設(shè)計和保存打印布局模板的控件。 VC++
      Hw_Vb.dll 這是一個用Dephi開發(fā)的通用函數(shù)庫,主要提供了符號化用需要用到的一些高級函數(shù)。 Delphi
      HwPrint.dll 這是打印功能的核心模塊,封裝了打印配置定義及調(diào)用,出圖界面等功能。 VB+MO

      posted on 2005-04-04 19:52  西西吹雪  閱讀(2952)  評論(6)    收藏  舉報

      主站蜘蛛池模板: 国产福利深夜在线播放| 精品无码成人片一区二区98| 东方av四虎在线观看| 黑人巨大亚洲一区二区久| 亚洲精品自拍区在线观看| 一区二区中文字幕久久| 国产精品视频一区二区噜| 久久精品免费观看国产| 秋霞电影网| 亚洲成亚洲成网中文字幕| 4480yy亚洲午夜私人影院剧情| 国产av无码专区亚洲草草| 二区中文字幕在线观看| 亚洲精品久久国产高清| 国产在线亚州精品内射| 亚洲一区中文字幕人妻| 定兴县| 亚洲大尺度无码无码专线| 国产亚洲999精品AA片在线爽| 亚洲国产精品成人无码区| 激情综合网激情综合| 国产精品一区二区久久精品无码| 日韩有码中文在线观看| 欧洲亚洲成av人片天堂网| 日韩av无码中文无码电影| 成年无码av片完整版| 亚洲AV国产福利精品在现观看| 眉山市| 国产精品白浆免费视频| 一个人免费观看WWW在线视频| 欧美性猛交xxxx乱大交极品| 小嫩模无套内谢第一次| 中国大陆高清aⅴ毛片| 最新午夜男女福利片视频| 97免费在线观看视频| 国产精品久久久久鬼色| 日韩精品中文字幕亚洲| 中国孕妇变态孕交xxxx| 国产 浪潮av性色四虎| 国产农村老太xxxxhdxx| 午夜福利影院不卡影院|