ArcEngine 9.3 学习笔记(十一):地图输出(Printer类,PageLayoutControl控件打印出图,栅格格式文件输出,矢量格式文件输出)

第七章  地图输出

  地图输出分两种类型,一种是地图的打印输出;
  另一种是地图的转换输出,即把地图的某一范围输出转换为不同的文件格式:如Jpeg,pdf,svg,tiff以及Adobe AI 等栅格或矢量图形文件

7.2 Printer类

  AE中对于地图打印使用的是Printer类的抽象类,
  它有三个子类:EmfPrinter,ArcPressPrinterPsPrinter这三种类对象都支持各自类型的硬拷贝设备,开发者选择需要的打印对象,而不是随意决定的而是取决于程序使用的打印设备类型和驱动程序的类型。
  它们都实现了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开发的初学者,能够从这个系列中获得帮助。

posted @ 2013-06-04 23:03  铁手三郎  阅读(5208)  评论(5编辑  收藏  举报