`
Fangrn
  • 浏览: 818249 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ArcGIS Engine开发系列:将地图导出为图片的两种方法

 
阅读更多

    在ArcGIS的开发中,我们经常需要将当前地图打印(或是转出)到图片文件中。将Map或Layout中的图象转出有两种方法,一种为通过
IActiveView的OutPut函数,另外一种是通过IExport接口来实现。第一种方法导出速度较快,实现也比较方便,但该方法对于图片的行或
列数超过10000左右时,导出经常会失败(具体原因未知),第二种方法导出速度较慢,但效果较好,且可以在导出过程中通过ITrackCancel来中
止导出操作。
      通过IActiveView的方式导出是通过创建Graphics对象来实现,具体示例代码如下:

Java代码 复制代码
  1. /// <summary>   
  2.   
  3. /// 将Map上指定范围(该范围为规则区域)内的内容输出到Image,注意,当图片的行数或列数超过10000左右时,出现原因示知的失败   
  4.   
  5. /// </summary>   
  6.   
  7. /// <param name="pMap">需转出的MAP</param>   
  8. /// <param name="outRect">输出的图片大小</param>   
  9. /// <param name="pEnvelope">指定的输出范围(为Envelope类型)</param>   
  10. /// <returns>输出的Image 具体需要保存为什么格式,可通过Image对象来实现</returns>   
  11. public   static  Image SaveCurrentToImage(IMap pMap, Size outRect, IEnvelope pEnvelope)   
  12.  {   
  13.        //赋值   
  14.       tagRECT rect =  new  tagRECT();   
  15.       rect.left = rect.top =  0 ;   
  16.       rect.right = outRect.Width;   
  17.       rect.bottom = outRect.Height;   
  18.        try   
  19.       {                   
  20.            //转换成activeView,若为ILayout,则将Layout转换为IActiveView   
  21.           IActiveView pActiveView = (IActiveView)pMap;   
  22.            // 创建图像,为24位色   
  23.           Image image =  new  Bitmap(outRect.Width, outRect.Height);  //, System.Drawing.Imaging.PixelFormat.Format24bppRgb);   
  24.           System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);   
  25.   
  26.            // 填充背景色(白色)   
  27.           g.FillRectangle(Brushes.White,  0 0 , outRect.Width, outRect.Height);   
  28.   
  29.            int  dpi = ( int )(outRect.Width / pEnvelope.Width);   
  30.   
  31.           pActiveView.Output(g.GetHdc().ToInt32(), dpi, ref rect, pEnvelope,  null );   
  32.   
  33.           g.ReleaseHdc();               
  34.   
  35.            return  image;   
  36.      }   
  37.   
  38.       catch  (Exception excp)   
  39.      {   
  40.         MessageBox.Show(excp.Message +  "将当前地图转出出错,原因未知" "出错提示" , MessageBoxButtons.OK, MessageBoxIcon.Error);   
  41.   
  42.            return   null ;   
  43.       }   
  44.  }  
/// <summary>

/// 将Map上指定范围(该范围为规则区域)内的内容输出到Image,注意,当图片的行数或列数超过10000左右时,出现原因示知的失败

/// </summary>

/// <param name="pMap">需转出的MAP</param>
/// <param name="outRect">输出的图片大小</param>
/// <param name="pEnvelope">指定的输出范围(为Envelope类型)</param>
/// <returns>输出的Image 具体需要保存为什么格式,可通过Image对象来实现</returns>
public static Image SaveCurrentToImage(IMap pMap, Size outRect, IEnvelope pEnvelope)
 {
      //赋值
      tagRECT rect = new tagRECT();
      rect.left = rect.top = 0;
      rect.right = outRect.Width;
      rect.bottom = outRect.Height;
      try
      {                
          //转换成activeView,若为ILayout,则将Layout转换为IActiveView
          IActiveView pActiveView = (IActiveView)pMap;
          // 创建图像,为24位色
          Image image = new Bitmap(outRect.Width, outRect.Height); //, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
          System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(image);

          // 填充背景色(白色)
          g.FillRectangle(Brushes.White, 0, 0, outRect.Width, outRect.Height);

          int dpi = (int)(outRect.Width / pEnvelope.Width);

          pActiveView.Output(g.GetHdc().ToInt32(), dpi, ref rect, pEnvelope, null);

          g.ReleaseHdc();            

          return image;
     }

     catch (Exception excp)
     {
        MessageBox.Show(excp.Message + "将当前地图转出出错,原因未知", "出错提示", MessageBoxButtons.OK, MessageBoxIcon.Error);

          return null;
      }
 }


   通过IExport接口实现的导出,也需要通过IActiveView的OutPut来实现,但其转出句柄为IExport的StartExporting函数返回的DC,具体示例代码如下:

Java代码 复制代码
  1. //输出当前地图至指定的文件       
  2. public   void  ExportMapExtent(IActiveView pView, Size outRect,string outPath)   
  3. {              
  4.      try   
  5.     {   
  6.          //参数检查   
  7.          if  pView ==  null  )   
  8.         {   
  9.              throw   new  Exception( "输入参数错误,无法生成图片文件!" );   
  10.         }     
  11.          //根据给定的文件扩展名,来决定生成不同类型的对象   
  12.         ESRI.ArcGIS.Output.IExport export =  null ;   
  13.          if  (outPath.EndsWith( ".jpg" ))   
  14.         {   
  15.             export =  new  ESRI.ArcGIS.Output.ExportJPEGClass();   
  16.         }   
  17.          else   if  (outPath.EndsWith( ".tiff" ))   
  18.         {   
  19.             export =  new  ESRI.ArcGIS.Output.ExportTIFFClass();   
  20.         }   
  21.          else   if  (outPath.EndsWith( ".bmp" ))   
  22.         {   
  23.             export =  new  ESRI.ArcGIS.Output.ExportBMPClass();   
  24.         }   
  25.          else   if  (outPath.EndsWith( ".emf" ))   
  26.         {   
  27.             export =  new  ESRI.ArcGIS.Output.ExportEMFClass();   
  28.         }   
  29.          else   if  (outPath.EndsWith( ".png" ))   
  30.         {   
  31.             export =  new  ESRI.ArcGIS.Output.ExportPNGClass();   
  32.         }   
  33.          else   if  (outPath.EndsWith( ".gif" ))   
  34.         {   
  35.             export =  new  ESRI.ArcGIS.Output.ExportGIFClass();   
  36.         }   
  37.   
  38.         export.ExportFileName = outPath;   
  39.         IEnvelope pEnvelope = pView.Extent;   
  40.          //导出参数              
  41.         export.Resolution =  300 ;   
  42.         tagRECT exportRect =  new  tagRECT();   
  43.         exportRect.left = exportRect.top =  0 ;   
  44.         exportRect.right = outRect.Width;   
  45.         exportRect.bottom = ( int )(exportRect.right * pEnvelope.Height / pEnvelope.Width);   
  46.         ESRI.ArcGIS.Geometry.IEnvelope envelope =  new  ESRI.ArcGIS.Geometry.EnvelopeClass();   
  47.          //输出范围   
  48.         envelope.PutCoords(exportRect.left, exportRect.top, exportRect.right, exportRect.bottom);   
  49.         export.PixelBounds = envelope;   
  50.          //可用于取消操作   
  51.         ITrackCancel pCancel =  new  CancelTrackerClass();   
  52.         export.TrackCancel = pCancel;   
  53.         pCancel.Reset();   
  54.          //点击ESC键时,中止转出   
  55.         pCancel.CancelOnKeyPress =  true ;   
  56.         pCancel.CancelOnClick =  false ;   
  57.         pCancel.ProcessMessages =  true ;   
  58.          //获取handle   
  59.         System.Int32 hDC = export.StartExporting();   
  60.          //开始转出   
  61.         pView.Output(hDC, (System.Int16)export.Resolution, ref exportRect, pEnvelope, pCancel);   
  62.         bool bContinue = pCancel.Continue();   
  63.          //捕获是否继续   
  64.          if  (bContinue)   
  65.         {                                 
  66.             export.FinishExporting();   
  67.             export.Cleanup();   
  68.         }   
  69.          else   
  70.         {                     
  71.             export.Cleanup();   
  72.         }   
  73.         bContinue = pCancel.Continue();                  
  74.     }   
  75.      catch  (Exception excep)   
  76.     {   
  77.          //错误信息提示   
  78.     }   

分享到:
评论

相关推荐

    ArcGIS Engine10.0的开发

    本文将深入探讨ArcGIS Engine 10.0的开发要点,旨在为开发者提供详尽的指导。 首先,ArcGIS Engine的核心在于它的组件模型,其中包括MapControl用于展示地图,SceneControl用于三维场景展现,以及Tool对象用于交互...

    arcgis engine实现叠加分析

    在GIS(地理信息系统)领域,叠加分析是一种常用的数据处理技术,用于将两个或多个地理数据层融合在一起,以便从这些层中提取新的信息。在本主题中,我们将深入探讨如何利用ArcGIS Engine来实现叠加分析,特别是通过...

    ArcGIS Engine使用 Geoprocessing工具方法

    本教程重点讲解如何在ArcGIS Engine中使用Geoprocessing工具,这是一种处理地理数据并执行复杂空间分析的方法。下面将详细阐述相关知识点。 1. **什么是Geoprocessing**: Geoprocessing是GIS中的一个核心概念,它...

    arcgis engine开发-查询功能实验报告_arcgis engine

    查询功能是ArcGIS Engine的核心特性之一,它包括了两种主要类型的查询:空间查询和属性查询。空间查询是基于地理空间关系进行的,如“查找距离我最近的公园”或“找到位于特定形状内的所有建筑物”。属性查询则根据...

    ArcGIS Engine的开发及应用研究.pdf

    ### ArcGIS Engine的开发及应用研究 #### 一、引言 ArcGIS是地理信息系统(GIS)领域的一个标志性产品,由ESRI公司开发。随着GIS技术的发展与普及,ArcGIS不断进行技术创新与整合,推出了全系列GIS平台。其中,...

    最新力作——ArcGIS Engine开发实例教程 下载

    教程涵盖了从基础的Map地图开发到较为复杂的三维场景(Scene)开发,旨在帮助读者掌握ArcGIS Engine开发技术,理解GIS开发的基本流程,并对ArcGIS Engine的主要库有深入认识。 在Map地图开发部分,教程详细介绍了...

    ArcGIS Engine的开发及应用研究

    ArcGIS Engine是一种用于创建定制化的GIS桌面应用程序的开发工具,它包含了构建ArcGIS产品的核心组件,如ArcView、ArcEditor、ArcInfo等。AE不仅能够创建独立的GIS应用程序,还能扩展现有应用程序的功能,为GIS和非...

    ArcGIS_Engine_10_开发

    ArcGIS是一个由ESRI公司推出的全面的GIS(地理信息系统)产品平台,它成功整合了数据库技术、软件工程、人工智能、...在这个环节中,需要将开发好的应用程序和相关依赖安装到目标机器上,并确保应用程序能够正常运行。

    ArcGISEngine题库.pdf

    (B) B 描述相互关联的两种类型的数量或对象之间的关系。知识点:cardinality 和关系。 15. 在 ArcGIS 中元数据以哪种格式存储?(C) C XML。知识点:元数据存储格式。 16. 域可以为存储在 geodatabase 中的非地理表...

    arcengine 自定义工具(标注,按面积修整图斑,相交取面积最大者赋值属性,属性表导出excel)

    在ArcEngine中,自定义工具...总结,ArcEngine自定义工具的开发涵盖了地图标注、几何对象操作、属性值的传递和数据导出等多个方面。理解并熟练运用这些技术,可以帮助我们构建强大的GIS应用,满足各种复杂的业务需求。

    C#+ArcEngine 自定义范围输出为栅格图像

    其中,栅格图像输出是 ArcEngine 输出机制中的一种重要方式,能够将地图输出为栅格图像,方便用户对地图进行编辑、打印和分享。 知识点二:C# 在 ArcEngine 中的应用 C# 是一种流行的编程语言,广泛应用于 Arc...

    牟乃夏 ArcGIS10地理信息系统教程从初学到精通---ppt/pdf

    ArcGIS是Esri公司开发的一款广泛应用于地理数据处理、空间分析和地图制作的专业工具。本教程由牟乃夏编写,采用PPT和PDF两种形式,提供了丰富的教学内容和视觉展示,便于学习者理解和实践。 首先,教程会介绍GIS的...

    ArcGIS操作使用.pptx

    - 支持两种类型的地图视图:数据视图和布局视图。 - **数据编辑**: - 支持矢量数据的绘制、编辑和修改。 - 可以进行数据的符号化显示、分析和编辑。 - **常用操作**: - **数据加载**:将外部数据加载到...

    ArcGIS与CAD的一体化应用

    随着技术的进步,未来这两个领域的融合将更加紧密,为各行各业带来更多的机遇和挑战。 #### CAD图件组成与行业应用 1. **组成**:CAD图件由几何元素、标注和符号等基本组成部分构成,通过层次结构组织信息。 2. **...

    ArcGIS 10.2全套下载,包括desktop server sde

    ArcGIS Server支持多种操作系统和数据库平台,提供RESTful和SOAP两种Web服务接口,增强了跨平台和跨应用的互操作性。 3. **SDE(Spatial Database Engine)**: SDE是Esri开发的空间数据库引擎,用于存储、管理和...

    ArcGISAO_OMD_10.2.2.pdf

    这些接口可能提供了将地图或场景数据导出为特定格式的方法,比如用于创建3D可视化或进行数据交换。`CoClassInterface`则涉及到COM(组件对象模型)编程,它是可以直接实例化的类,可以通过声明新的对象来创建实例。 ...

    浅谈MapGIS文件到ArcGIS文件的转换方法(转载)

    在地理信息系统(GIS)领域,数据格式的兼容性是一个重要的问题。MapGIS和ArcGIS都是广泛应用的GIS软件,但...无论是简单导出导入还是编写脚本,都需要充分理解两种软件的数据结构和特性,以确保转换的准确性和效率。

    Mapgis文件转换为Arcgis支持的SHP文件的方法总结

    MapGIS和ArcGIS是两种广泛应用的GIS软件,它们各自有着不同的数据格式。MapGIS主要使用的是MIF、MID、DFC等格式,而ArcGIS则广泛支持ESRI的Shapefile(SHP)格式。在不同软件间进行数据交换时,我们需要进行文件转换...

Global site tag (gtag.js) - Google Analytics