在ArcGIS的开发中,我们经常需要将当前地图打印(或是转出)到图片文件中。将Map或Layout中的图象转出有两种方法,一种为通过
IActiveView的OutPut函数,另外一种是通过IExport接口来实现。第一种方法导出速度较快,实现也比较方便,但该方法对于图片的行或
列数超过10000左右时,导出经常会失败(具体原因未知),第二种方法导出速度较慢,但效果较好,且可以在导出过程中通过ITrackCancel来中
止导出操作。
通过IActiveView的方式导出是通过创建Graphics对象来实现,具体示例代码如下:
-
-
-
-
-
-
-
-
-
-
-
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
-
{
-
-
IActiveView pActiveView = (IActiveView)pMap;
-
-
Image image =
new
Bitmap(outRect.Width, outRect.Height);
-
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
;
-
}
-
}
/// <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,具体示例代码如下:
-
-
public
void
ExportMapExtent(IActiveView pView, Size outRect,string outPath)
-
{
-
try
-
{
-
-
if
pView ==
null
)
-
{
-
throw
new
Exception(
"输入参数错误,无法生成图片文件!"
);
-
}
-
-
ESRI.ArcGIS.Output.IExport export =
null
;
-
if
(outPath.EndsWith(
".jpg"
))
-
{
-
export =
new
ESRI.ArcGIS.Output.ExportJPEGClass();
-
}
-
else
if
(outPath.EndsWith(
".tiff"
))
-
{
-
export =
new
ESRI.ArcGIS.Output.ExportTIFFClass();
-
}
-
else
if
(outPath.EndsWith(
".bmp"
))
-
{
-
export =
new
ESRI.ArcGIS.Output.ExportBMPClass();
-
}
-
else
if
(outPath.EndsWith(
".emf"
))
-
{
-
export =
new
ESRI.ArcGIS.Output.ExportEMFClass();
-
}
-
else
if
(outPath.EndsWith(
".png"
))
-
{
-
export =
new
ESRI.ArcGIS.Output.ExportPNGClass();
-
}
-
else
if
(outPath.EndsWith(
".gif"
))
-
{
-
export =
new
ESRI.ArcGIS.Output.ExportGIFClass();
-
}
-
-
export.ExportFileName = outPath;
-
IEnvelope pEnvelope = pView.Extent;
-
-
export.Resolution =
300
;
-
tagRECT exportRect =
new
tagRECT();
-
exportRect.left = exportRect.top =
0
;
-
exportRect.right = outRect.Width;
-
exportRect.bottom = (
int
)(exportRect.right * pEnvelope.Height / pEnvelope.Width);
-
ESRI.ArcGIS.Geometry.IEnvelope envelope =
new
ESRI.ArcGIS.Geometry.EnvelopeClass();
-
-
envelope.PutCoords(exportRect.left, exportRect.top, exportRect.right, exportRect.bottom);
-
export.PixelBounds = envelope;
-
-
ITrackCancel pCancel =
new
CancelTrackerClass();
-
export.TrackCancel = pCancel;
-
pCancel.Reset();
-
-
pCancel.CancelOnKeyPress =
true
;
-
pCancel.CancelOnClick =
false
;
-
pCancel.ProcessMessages =
true
;
-
-
System.Int32 hDC = export.StartExporting();
-
-
pView.Output(hDC, (System.Int16)export.Resolution, ref exportRect, pEnvelope, pCancel);
-
bool bContinue = pCancel.Continue();
-
-
if
(bContinue)
-
{
-
export.FinishExporting();
-
export.Cleanup();
-
}
-
else
-
{
-
export.Cleanup();
-
}
-
bContinue = pCancel.Continue();
-
}
-
catch
(Exception excep)
-
{
-
-
}
-
}
分享到:
相关推荐
本文将深入探讨ArcGIS Engine 10.0的开发要点,旨在为开发者提供详尽的指导。 首先,ArcGIS Engine的核心在于它的组件模型,其中包括MapControl用于展示地图,SceneControl用于三维场景展现,以及Tool对象用于交互...
在GIS(地理信息系统)领域,叠加分析是一种常用的数据处理技术,用于将两个或多个地理数据层融合在一起,以便从这些层中提取新的信息。在本主题中,我们将深入探讨如何利用ArcGIS Engine来实现叠加分析,特别是通过...
本教程重点讲解如何在ArcGIS Engine中使用Geoprocessing工具,这是一种处理地理数据并执行复杂空间分析的方法。下面将详细阐述相关知识点。 1. **什么是Geoprocessing**: Geoprocessing是GIS中的一个核心概念,它...
查询功能是ArcGIS Engine的核心特性之一,它包括了两种主要类型的查询:空间查询和属性查询。空间查询是基于地理空间关系进行的,如“查找距离我最近的公园”或“找到位于特定形状内的所有建筑物”。属性查询则根据...
### ArcGIS Engine的开发及应用研究 #### 一、引言 ArcGIS是地理信息系统(GIS)领域的一个标志性产品,由ESRI公司开发。随着GIS技术的发展与普及,ArcGIS不断进行技术创新与整合,推出了全系列GIS平台。其中,...
教程涵盖了从基础的Map地图开发到较为复杂的三维场景(Scene)开发,旨在帮助读者掌握ArcGIS Engine开发技术,理解GIS开发的基本流程,并对ArcGIS Engine的主要库有深入认识。 在Map地图开发部分,教程详细介绍了...
ArcGIS Engine是一种用于创建定制化的GIS桌面应用程序的开发工具,它包含了构建ArcGIS产品的核心组件,如ArcView、ArcEditor、ArcInfo等。AE不仅能够创建独立的GIS应用程序,还能扩展现有应用程序的功能,为GIS和非...
ArcGIS是一个由ESRI公司推出的全面的GIS(地理信息系统)产品平台,它成功整合了数据库技术、软件工程、人工智能、...在这个环节中,需要将开发好的应用程序和相关依赖安装到目标机器上,并确保应用程序能够正常运行。
(B) B 描述相互关联的两种类型的数量或对象之间的关系。知识点:cardinality 和关系。 15. 在 ArcGIS 中元数据以哪种格式存储?(C) C XML。知识点:元数据存储格式。 16. 域可以为存储在 geodatabase 中的非地理表...
在ArcEngine中,自定义工具...总结,ArcEngine自定义工具的开发涵盖了地图标注、几何对象操作、属性值的传递和数据导出等多个方面。理解并熟练运用这些技术,可以帮助我们构建强大的GIS应用,满足各种复杂的业务需求。
其中,栅格图像输出是 ArcEngine 输出机制中的一种重要方式,能够将地图输出为栅格图像,方便用户对地图进行编辑、打印和分享。 知识点二:C# 在 ArcEngine 中的应用 C# 是一种流行的编程语言,广泛应用于 Arc...
ArcGIS是Esri公司开发的一款广泛应用于地理数据处理、空间分析和地图制作的专业工具。本教程由牟乃夏编写,采用PPT和PDF两种形式,提供了丰富的教学内容和视觉展示,便于学习者理解和实践。 首先,教程会介绍GIS的...
- 支持两种类型的地图视图:数据视图和布局视图。 - **数据编辑**: - 支持矢量数据的绘制、编辑和修改。 - 可以进行数据的符号化显示、分析和编辑。 - **常用操作**: - **数据加载**:将外部数据加载到...
随着技术的进步,未来这两个领域的融合将更加紧密,为各行各业带来更多的机遇和挑战。 #### CAD图件组成与行业应用 1. **组成**:CAD图件由几何元素、标注和符号等基本组成部分构成,通过层次结构组织信息。 2. **...
ArcGIS Server支持多种操作系统和数据库平台,提供RESTful和SOAP两种Web服务接口,增强了跨平台和跨应用的互操作性。 3. **SDE(Spatial Database Engine)**: SDE是Esri开发的空间数据库引擎,用于存储、管理和...
这些接口可能提供了将地图或场景数据导出为特定格式的方法,比如用于创建3D可视化或进行数据交换。`CoClassInterface`则涉及到COM(组件对象模型)编程,它是可以直接实例化的类,可以通过声明新的对象来创建实例。 ...
在地理信息系统(GIS)领域,数据格式的兼容性是一个重要的问题。MapGIS和ArcGIS都是广泛应用的GIS软件,但...无论是简单导出导入还是编写脚本,都需要充分理解两种软件的数据结构和特性,以确保转换的准确性和效率。
MapGIS和ArcGIS是两种广泛应用的GIS软件,它们各自有着不同的数据格式。MapGIS主要使用的是MIF、MID、DFC等格式,而ArcGIS则广泛支持ESRI的Shapefile(SHP)格式。在不同软件间进行数据交换时,我们需要进行文件转换...