第七章 地圖輸出
地圖輸出分兩種類型,一種是地圖的打印輸出;
另一種是地圖的轉換輸出,即把地圖的某一范圍輸出轉換為不同的文件格式:如Jpeg,pdf,svg,tiff以及Adobe AI 等柵格或矢量圖形文件
7.2 Printer類
AE中對於地圖打印使用的是Printer類的抽象類,
它有三個子類:EmfPrinter,ArcPressPrinter和PsPrinter,這三種類對象都支持各自類型的硬拷貝設備,開發者選擇需要的打印對象,而不是隨意決定的而是取決於程序使用的打印設備類型和驅動程序的類型。
它們都實現了IPrinter接口,IPrinter接口定義了所有打印對象的一般方法和屬性。
如IPrinter的Paper屬性用於初始化與系統關聯的打印機。
IPrinter的StartPrint方法,用於返回一個打印設備的hDc,Irinter的FinishPrinting用於清除打印機后的緩存對象
Paper對象 是Printer對象的一個關鍵屬性,它主要的作用是維持Printer對象使用的打印機和打印紙張的聯系。
程序啟動的時候,一個Paper對象就自動產生,創建的是基於系統缺省打印機。
如果要使用另一台打印機就需要產生另一個新的Paper對象,並將它的PrinterName設置為打印機名。
Paper類主要實現了IPaper接口,它主要用了對打印紙張的設置,例如IPaper的Orientation屬性用於獲取打印的方向屬性值,1為縱向,2為橫向
7.3 在控件中打印輸出
7.3.1 PageLayoutControl控件打印出圖
在GIS系統打印模塊中,一般使用PageLayoutControl控件,使用IPageLayoutControl接口的PrintPageLayout方法可以打印PageLayoutControl控件中視圖。他與控件的Page對象相關。在使用IpageLayoutControl的PrintPageLayout方法前,對Page對象進行設置,通過IPage接口的PageToPrinterMapping可以設置頁面和打印紙張的匹配,例如如果打印的頁面的寬度大於紙張的寬度,可以選定是伸縮地圖還是切割地圖。
使用PageLayoutControl控件打印地圖的代碼片段如下:
1 /// <summary> 2 /// 打印PageLayout 3 /// </summary> 4 /// <param name="pPageLayout">PageLayout對象</param> 5 public void PrintPageLayout(AxPageLayoutControl pPageLayout) 6 { 7 try 8 { 9 if (pPageLayout.Printer != null) 10 { 11 IPrinter pPrinter = pPageLayout.Printer; 12 if (pPrinter.Paper.Orientation != pPageLayout.Page.Orientation) 13 { 14 pPrinter.Paper.Orientation = pPageLayout.Page.Orientation; 15 } 16 pPageLayout.PrintPageLayout(1, 0, 0); 17 } 18 } 19 catch (Exception) 20 { 21 22 throw; 23 } 24 }
7.3.2 地圖轉換輸出
地圖輸出分為兩大類:1、基於柵格格式的文件輸出,如:JPG,BMP,PGN等;2、基於矢量格式的輸出,如:SVG、AI等。
柵格格式(AG影像文件格式)輸出的缺省分辨率為96dpi
矢量格式的地圖輸出缺省分辨率為300dip。
Exporter類 使所有轉換輸出類的父類,它是一個抽象類,實現了IExport接口,Iexport接口用於定義地圖輸出的一般方法和屬性,部分屬性和方法如下:
Name: Exporter的名稱
ExportFileName: 輸出文件名稱
PixelBounds: 確定輸出范圍
Resolution: 分辨率
Priority: 優先次序
Cleanup: 清除臨時文件,釋放內存等
StartExporting: 初始化Exporter
FinishExporting: 關閉Exporter
7.3.2.1 柵格格式文件輸出
ExportImage 類用於將地圖輸出為柵格格式文件的對象,它是Export的一個子類,它也是一個抽象類,實現了IExportImage接口,它定義了所有操作柵格格式文件的一般方法和屬性,部分方法和屬性如下:
BackgroundColor: 輸出柵格文件的背景色
Height 影像的高度 Width 影像的寬度
ImageType: 輸出圖片類型 1 位 單色掩模圖 1位黑白圖 8位灰度圖 24位真彩色
ExportImage的子類有:ExportBMP,ExportJPEG,ExportPNG,ExportTIFF,ExportGIF,通過這幾個對象可以分別將地圖數據生成對應格式的圖形文件。
7.3.2.2 矢量格式文件輸出
ExoprtVector類,用於地圖數據轉換輸出為矢量格式的文件。ExoprtVector是一個抽象類,它實現了多個設置輸出矢量的格式文件設置的接口。
他有五個子類:ExportEMF,ExportAI,ExportPDF,ExportPS,和ExportSVG ,它們分別用於生成5中不同格式的矢量數據文件
以下代碼段,演示如何把地圖數據輸出為柵格或矢量文件:
1 /// <summary> 2 /// pageLayout輸出圖片 3 /// </summary> 4 /// <param name="pageLyaoutCtrl">地圖布局控件</param> 5 /// <returns></returns> 6 private bool ExportMapToImage(PageLayoutControl pageLyaoutCtrl) 7 { 8 try 9 { 10 SaveFileDialog pSaveDialog = new SaveFileDialog(); 11 pSaveDialog.FileName = ""; 12 pSaveDialog.Filter = "JGP圖片(*.jpg)|*.jpg|tif圖片(*.tif)|*.tif|PDF文檔(*.pdf)|*.pdf"; 13 if (pSaveDialog.ShowDialog() == DialogResult.OK) 14 { 15 // 獲取布局視圖屏幕分辨率,用於設置輸出分辨率 16 double iScreenDispalyResolution = pageLyaoutCtrl.ActiveView.ScreenDisplay.DisplayTransformation.Resolution; 17 // 根據用戶選擇保存的文件類型,來創建不同的輸出類 18 IExport pExport = null; 19 if (pSaveDialog.FilterIndex == 0) 20 { 21 pExport = new JpegExporterClass() as IExport; 22 } 23 else if (pSaveDialog.FilterIndex == 1) 24 { 25 pExport = new TiffExporterClass() as IExport; 26 } 27 else if (pSaveDialog.FilterIndex == 2) 28 { 29 pExport = new PDFExporterClass() as IExport; 30 } 31 // 設置輸出文件名,為用戶在保存窗口設置的文件名 32 pExport.ExportFileName = pSaveDialog.FileName; 33 // 設置輸出分辨率 34 pExport.Resolution = (short)iScreenDispalyResolution; 35 // 獲取輸出范圍?? 獲取視圖框架對象,進而得到視圖范圍 36 tagRECT deviceRect = pageLyaoutCtrl.ActiveView.ScreenDisplay.DisplayTransformation.get_DeviceFrame(); 37 38 IEnvelope pDeviceEnvelop = new EnvelopeClass(); 39 // 設置一個邊框范圍 40 pDeviceEnvelop.PutCoords(deviceRect.left, deviceRect.bottom, deviceRect.right, deviceRect.top); 41 // 將打印像素范圍 設置給輸出對象 42 pExport.PixelBounds = pDeviceEnvelop; 43 // 設置跟蹤取消對象 44 ITrackCancel pCancle = new CancelTrackerClass(); 45 // 進行視圖控件的視圖輸出操作,設置對應參數 46 pageLyaoutCtrl.ActiveView.Output(pExport.StartExporting(),
(int)pExport.Resolution, ref deviceRect, pageLyaoutCtrl.ActiveView.Extent, pCancle); 47 Application.DoEvents();// 啟動應用程序 48 pExport.FinishExporting();//完成輸出 49 return true; 50 } 51 else 52 { 53 return false; 54 } 55 } 56 catch (Exception) 57 { 58 return false; 59 } 60 }
自此,整本書完結,從頭看下來收貨不小,加上之前看的那本書,如果再往深里學,我覺得就要從項目靈活運用了;再之后的深入那是后話了。
希望學習AE開發的初學者,能夠從這個系列中獲得幫助。