ArcGIS Engine开发之地图导出
2016-09-25 19:17
337 查看
关于地图导出的方法有很多,但是核心技术就那么一点。下面是从项目实战中总结的一部分地图导出的方法:(以全域导出和区域导出为例)
1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成类(ExportMap类):用到的主要接口为:IActiveView(活动视图接口)、IGeometry(几何接口)、IRgbColor(颜色接口)、IElement(要素接口)等。
具体的封装代码如下:
2.添加输出设置窗体,分别有,输出图片的高、宽、分辨率、输出保存路径、导出按钮。
View Code
3.在main窗体中进行实例化输出窗体:private ExportMapForm frmExpMap = null;
4.在MainMap Control_OnMouseDown中进行写入case:(只适合区域导出,单击选择边框)
5.全域导出和区域导出按钮的单击事件代码:
1.由于地图导出用到的函数和方法容易重复,增加了工作量故首先将其进行封装成类(ExportMap类):用到的主要接口为:IActiveView(活动视图接口)、IGeometry(几何接口)、IRgbColor(颜色接口)、IElement(要素接口)等。
具体的封装代码如下:
class ExportMap { #region 输出视图 public static void ExportView(IActiveView view, IGeometry pGeo, int Outputresoultion, int Width, int Height, string ExpPath, bool bRegion) { IExport pExport = null; tagRECT exportrect = new tagRECT(); IEnvelope pEnvelop = pGeo.Envelope; string sType = System.IO.Path.GetExtension(ExpPath); switch (sType) { case ".jpg": pExport = new ExportJPEGClass(); break; case ".bmp": pExport = new ExportBMPClass(); break; case ".gif": pExport = new ExportGIFClass(); break; case ".tif": pExport = new ExportTIFFClass(); break; case ".png": pExport = new ExportPNGClass(); break; case ".pdf": pExport = new ExportPDFClass(); break; default: MessageBox.Show("没有输出格式,默认JPEG"); pExport = new ExportJPEGClass(); break; } pExport.ExportFileName = ExpPath; exportrect.left = 0; exportrect.top = 0; exportrect.right = Width; exportrect.bottom = Height; if (bRegion) { view.GraphicsContainer.DeleteAllElements(); view.Refresh(); } IEnvelope envelop = new EnvelopeClass(); envelop.PutCoords((double)exportrect.left, (double)exportrect.top, (double)exportrect.right, (double)exportrect.bottom); pExport.PixelBounds = envelop; view.Output(pExport.StartExporting(), Outputresoultion, ref exportrect, pEnvelop, null); pExport.FinishExporting(); pExport.Cleanup(); } #endregion #region 获取RGB颜色 private static IRgbColor GetRgbColor(int intR,int intG,int intB) { IRgbColor pRgbColor=null; if(intR<0||intR>255||intG<0||intG>255||intB<0||intB>255) { return pRgbColor; } pRgbColor=new RgbColorClass(); pRgbColor.Red=intR; pRgbColor.Green=intG; pRgbColor.Blue=intB; return pRgbColor; } #endregion #region 创建图形元素 /// <summary> /// /// </summary> /// <param name="pGeomentry">几何图形</param> /// <param name="lineColor">边框颜色</param> /// <param name="fillColor">填充颜色</param> /// <returns></returns> public static IElement CreateElement(IGeometry pGeomentry, IRgbColor lineColor, IRgbColor fillColor) { if (pGeomentry == null || lineColor == null || fillColor == null) { return null; } IElement pElem = null; try { if (pGeomentry is IEnvelope) pElem = new RectangleElementClass(); else if (pGeomentry is IPolygon) pElem = new PolygonElementClass(); else if (pGeomentry is ICircularArc) { ISegment pSegCircle = pGeomentry as ISegment; ISegmentCollection pSegColl = new PolygonClass(); object o = Type.Missing; pSegColl.AddSegment(pSegCircle, ref o, ref o); IPolygon pPolygon = pSegCircle as IPolygon; pGeomentry = pPolygon as IGeometry; pElem = new CircleElementClass(); } else if (pGeomentry is IPolyline) pElem = new LineElementClass(); if (pElem == null) return null; pElem.Geometry = pGeomentry; IFillShapeElement pFElem = pElem as IFillShapeElement; ISimpleFillSymbol pSymbol = new SimpleFillSymbolClass(); pSymbol.Color=fillColor ; pSymbol.Outline.Color=lineColor; pSymbol.Style = esriSimpleFillStyle.esriSFSCross;//图形元素的样式 if (pSymbol == null) { return null; } pFElem.Symbol = pSymbol; } catch(Exception ex) { MessageBox.Show(ex.Message ); } return pElem; } #endregion #region 视图窗口绘制几何图形元素 /// <summary> /// /// </summary> /// <param name="pGeometry">几何图形</param> /// <param name="activeView">活动视图</param> public static void AddElement(IGeometry pGeometry,IActiveView activeView) { IRgbColor fillColor=GetRgbColor(204,175,235); IRgbColor lineColor=GetRgbColor(0,0,0); IElement pEle=CreateElement(pGeometry,lineColor,fillColor );//调用图形元素的函数 IGraphicsContainer pGC = activeView.GraphicsContainer; if (pGC != null) { pGC.AddElement(pEle, 0); activeView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, pEle, null); } } #endregion #region 全域导出 /// <summary> /// 全域导出 /// </summary> /// <param name="OutputResolution">输出分辨率</param> /// <param name="ExpPath">输出路径</param> /// <param name="view">视图</param> public static void ExportActiveView(int OutputResolution, string ExpPath, IActiveView view) { IExport pExport = null; tagRECT exportRect; IEnvelope envelop2 = view.Extent; int num = (int)Math.Round(view.ScreenDisplay.DisplayTransformation.Resolution); string sType = System.IO.Path.GetExtension(ExpPath); switch (sType) { case ".jgp": pExport = new ExportJPEGClass(); break; case ".bmp": pExport = new ExportBMPClass(); break; case ".gif": pExport = new ExportGIFClass(); break; case ".tif": pExport = new ExportTIFFClass(); break; case ".png": pExport = new ExportPNGClass(); break; case ".pdf": pExport = new ExportPDFClass(); break; default: MessageBox.Show("No Export Foemat,the default format is JPEG!"); pExport = new ExportJPEGClass(); break; } pExport.ExportFileName = ExpPath; exportRect.left = 0; exportRect.top = 0; exportRect.right = (int)Math.Round((double)(view.ExportFrame.right * (((double)OutputResolution) / ((double)num)))); exportRect.bottom = (int)Math.Round((double)(view.ExportFrame.bottom * (((double)OutputResolution) / ((double)num)))); IEnvelope envelop = new EnvelopeClass(); envelop.PutCoords((double)exportRect.left, (double)exportRect.top, (double)exportRect.right, (double)exportRect.bottom); pExport.PixelBounds = envelop; view.Output(pExport.StartExporting(), OutputResolution, ref exportRect, envelop2, null); pExport.FinishExporting(); pExport.Cleanup(); } #endregion #region 区域导出 /// <summary> /// 区域导出 /// </summary> /// <param name="pGeo">输出的图形</param> /// <param name="OutputResolution">输出的范围</param> /// <param name="ExpPath">输出路径</param> /// <param name="view">视图</param> public static void ExportRegion(IGeometry pGeo, int OutputResolution, string ExpPath, IActiveView view) { IExport export = null; IWorldFileSettings setting = null; IEnvelope envelope2 = pGeo.Envelope; string str = ExpPath.Substring(ExpPath.Length - 3, 3).ToUpper(); switch (str) { case "JPG": setting = new ExportJPEGClass(); export = new ExportJPEGClass(); setting = export as IWorldFileSettings; setting.MapExtent = envelope2; setting.OutputWorldFile = false; break; case "BMP": setting = new ExportBMPClass(); export = new ExportBMPClass(); setting = export as IWorldFileSettings; setting.MapExtent = envelope2; setting.OutputWorldFile = false; break; case "TIF": setting = new ExportTIFFClass(); export = new ExportTIFFClass(); setting = export as IWorldFileSettings; setting.MapExtent = envelope2; setting.OutputWorldFile = false; break; case "PNG": setting = new ExportPNGClass(); export = new ExportPNGClass(); setting = export as IWorldFileSettings; setting.MapExtent = envelope2; setting.OutputWorldFile = false; break; default: break; } if (setting == null) { export.ExportFileName = ExpPath; int num = (int)Math.Round(view.ScreenDisplay.DisplayTransformation.Resolution); tagRECT grect2 = new tagRECT();//实例化矩形 IEnvelope envelop3 = new EnvelopeClass(); view.ScreenDisplay.DisplayTransformation.TransformRect(envelope2, ref grect2, 9); grect2.left = 0; grect2.top = 0; grect2.right = (int)Math.Round((double)(grect2.right - grect2.left) * (((double)OutputResolution) / ((double)num))); grect2.bottom = (int)Math.Round((double)((grect2.bottom - grect2.top) * (((double)OutputResolution) / ((double)num)))); envelop3.PutCoords((double)grect2.left, (double)grect2.top, (double)grect2.right, (double)grect2.bottom); export.PixelBounds = envelop3; view.GraphicsContainer.DeleteAllElements(); view.Output(export.StartExporting(), OutputResolution, ref grect2, envelope2, null); export.FinishExporting(); export.Cleanup(); AddElement(pGeo, view); } } #endregion }
2.添加输出设置窗体,分别有,输出图片的高、宽、分辨率、输出保存路径、导出按钮。
public partial class ExportMapForm : DevExpress.XtraEditors.XtraForm { //定义全局变量 private string pSavePath = ""; private IActiveView pActiveView; private IGeometry pGeometry = null; #region 只读属性,地图导出空间图形 public IGeometry GetGeometry { set { pGeometry = value; } } private bool bRegion = true; #endregion /// <summary> /// 只读属性,是全域导出还是区域导出 /// </summary> public bool IsRegion { set { bRegion = value; } } //获取主窗口的MapControl控件 public ExportMapForm(AxMapControl mainAxMapControl) { InitializeComponent(); pActiveView = mainAxMapControl.ActiveView; } private void ExportMapForm_Load(object sender, EventArgs e) { } #region 输入窗口的大小 private void InitFormSize() { cboResoultion.Text = pActiveView.ScreenDisplay.DisplayTransformation.Resolution.ToString(); cboResoultion.Items.Add(cboResoultion.Text); if (bRegion) { IEnvelope pEnvelop = pGeometry.Envelope; tagRECT pRECT = new tagRECT(); pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnvelop, ref pRECT,15); if (cboResoultion.Text != "") { txtWidth.Text = pRECT.right.ToString(); txtHeight.Text = pRECT.bottom.ToString(); } } else { if (cboResoultion.Text != "") { txtWidth.Text = pActiveView.ExportFrame.right.ToString(); txtHeight.Text = pActiveView.ExportFrame.bottom.ToString(); } } } #endregion #region combox的ChangeIndex事件 private void cboResoultion_SelectedIndexChanged(object sender, EventArgs e) { double num = (int)Math.Round(pActiveView.ScreenDisplay.DisplayTransformation.Resolution); if (cboResoultion.Text == "") { txtWidth.Text = ""; txtHeight.Text = ""; return; } if (bRegion) { IEnvelope pEnvelop = pGeometry.Envelope; tagRECT pRECT = new tagRECT(); pActiveView.ScreenDisplay.DisplayTransformation.TransformRect(pEnvelop, ref pRECT,15); if (cboResoultion.Text != "") { txtWidth.Text = Math.Round((double)(pRECT.right * (double.Parse(cboResoultion.Text) / (double)num))).ToString(); } } else { txtWidth.Text = Math.Round((double)(pActiveView.ExportFrame.right * (double.Parse(cboResoultion.Text) / (double)num))).ToString(); txtHeight.Text = Math.Round((double)(pActiveView.ExportFrame.bottom * (double.Parse(cboResoultion.Text) / (double)num))).ToString(); } } #endregion #region 保存按钮的单击事件 private void btnExPath_Click(object sender, EventArgs e) { SaveFileDialog sfdExportMap = new SaveFileDialog(); sfdExportMap.DefaultExt = "jpg|bmp|gif|tif|png|pdf"; sfdExportMap.Filter = "JPGE 文件(*.jpg)|*.jpg|BMP 文件(*.bmp)|*.bmp|GIF 文件(*.gif)|*.gif|TIF 文件(*.tif)|*.tif|PNG 文件(*.png)|*.png|PDF 文件(*.pdf)|*.pdf"; sfdExportMap.OverwritePrompt = true;//重复写入时提示错误 sfdExportMap.Title = "保存为"; txtExPath.Text = ""; if (sfdExportMap.ShowDialog() != DialogResult.Cancel) { pSavePath = sfdExportMap.FileName; txtExPath.Text = sfdExportMap.FileName; } } #endregion #region 导出按钮单击事件 private void btnExPort_Click(object sender, EventArgs e) { if (txtExPath.Text == "") { MessageBox.Show("请先确定导出路径!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } else if (cboResoultion.Text == "") { if (txtExPath.Text == "") { MessageBox.Show("请输入分辨率!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } } else if (Convert.ToInt16(cboResoultion.Text) == 0) { MessageBox.Show("请正确输入分辨率!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); return; } else { try { int resoultion = int.Parse(cboResoultion.Text);//输出图片的分辨率 int width = int.Parse(cboResoultion.Text);//输出图片的宽度 int height = int.Parse(cboResoultion.Text);//输出图片的高度 ExportMap.ExportView(pActiveView, pGeometry, resoultion, width, height, pSavePath, bRegion); pActiveView.GraphicsContainer.DeleteAllElements(); pActiveView.Refresh(); MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } catch (Exception) { MessageBox.Show("导出失败!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } } } #endregion #region 取消按钮的单击事件 private void btnCancel_Click(object sender, EventArgs e) { //局部导出时没有导出图像就退出 pActiveView.GraphicsContainer.DeleteAllElements(); pActiveView.Refresh(); Dispose(); } #endregion #region 图片导出窗口Close事件 private void ExportMapForm_FormClosed(object sender, FormClosedEventArgs e) { //局部导出时没有导出图像就关闭 pActiveView.GraphicsContainer.DeleteAllElements(); pActiveView.Refresh(); Dispose(); } #endregion
View Code
3.在main窗体中进行实例化输出窗体:private ExportMapForm frmExpMap = null;
4.在MainMap Control_OnMouseDown中进行写入case:(只适合区域导出,单击选择边框)
#region 地图的区域导出 case "ExportRegion": //删除视图中的数据 mainMapControl.ActiveView.GraphicsContainer.DeleteAllElements(); mainMapControl.ActiveView.Refresh(); IPolygon pPolygon = DrawPolygon(mainMapControl); if (pPolygon == null) return; ExportMap.AddElement(pPolygon, mainMapControl.ActiveView); if (frmExpMap == null || frmExpMap.IsDisposed) { frmExpMap = new ExportMapForm(mainMapControl); } frmExpMap.IsRegion = true; frmExpMap.GetGeometry = pPolygon as IGeometry; frmExpMap.Show(); frmExpMap.Activate(); break; #endregion
5.全域导出和区域导出按钮的单击事件代码:
#region 地图导出之全域导出 private void btnExportMap_ItemClick(object sender, ItemClickEventArgs e) { if (frmExpMap == null || frmExpMap.IsDisposed) { frmExpMap = new ExportMapForm(mainMapControl); } frmExpMap.IsRegion = false; frmExpMap.GetGeometry = mainMapControl.ActiveView.Extent; frmExpMap.Show(); frmExpMap.Activate(); } #endregion #region 地图导出之区域导出 private void btnExportRegionMap_ItemClick(object sender, ItemClickEventArgs e) { mainMapControl.CurrentTool = null; mainMapControl.MousePointer = esriControlsMousePointer.esriPointerCrosshair; pMouseOperate = "ExportRegion"; } #endregion
相关文章推荐
- ArcGIS Engine开发系列:将地图导出为图片的两种方法(ZZ)
- ArcGIS Engine开发系列:将地图导出为图片的两种方法
- ArcGIS Engine开发系列:将地图导出为图片的两种方法
- ArcGIS Engine开发系列:将地图导出为图片的两种方法
- ArcGIS Engine开发之地图浏览
- ArcGIS Engine 系统开发设计(一):简单的地图读取、展示
- ArcGIS Engine基础开发教程之地图查询
- ArcEngine开发日志_导出地图
- ArcGIS Engine基础开发教程之地图查询
- ArcGIS Engine开发之地图基本操作(4)
- 使用XAML在WPF项目中承载ArcGIS Engine地图控件开发
- ArcGIS Engine基础开发教程之地图查询
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十六)地图自定义切片与导出
- ArcGIS Engine开发:地图标注(C#)
- ArcGIS Engine开发之地图基本操作(1)
- ArcGIS Engine开发之地图基本操作(2)
- ArcGIS Engine 系统开发设计(二):打开地图文档、鹰眼图的制作
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十六)地图自定义切片与导出
- ArcEngine开发之导出地图(C#)
- C#开发WPF/Silverlight动画及游戏系列教程(Game Tutorial):(三十六)地图自定义切片与导出