ArcGIS Engine二次开发VS2013使用MuneStirp控件实现两点距离测量

时间: 2023-07-11 07:04:23 浏览: 59
下面是实现两点距离测量的步骤: 1. 在 ArcGIS Engine 项目中添加 MuneStirp 控件,该控件用于显示测量结果。 2. 在菜单栏中添加“测量距离”按钮,单击该按钮后,进入测量模式。 3. 在地图上单击两个点,计算它们之间的距离,并将结果显示在 MuneStirp 控件中。 下面是具体实现方法: 1. 添加 MuneStirp 控件 在 Visual Studio 中打开 ArcGIS Engine 项目,右键单击工具箱中的“常规”选项卡,选择“选择项”,在“COM 组件”选项卡中选中“MapControl Tools 1.0 Type Library”和“MapControl 1.0 Type Library”,单击“确定”按钮,将 MuneStirp 控件添加到工具箱中。 在窗体设计器中,将 MuneStirp 控件拖放到窗体上,调整其大小和位置。 2. 添加测量按钮 在窗体设计器中,右键单击菜单栏,选择“添加新项”,创建一个名为“测量距离”的按钮。 在按钮的 Click 事件中,添加以下代码: ```csharp private void btnMeasureDistance_Click(object sender, EventArgs e) { // 进入测量模式 axMapControl1.CurrentTool = null; axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair; axMapControl1.MouseDownEvent += new IMapControlEvents2_Ax_OnMouseDownEventHandler(axMapControl1_MouseDownEvent); } ``` 3. 实现测量距离功能 在 axMapControl1_MouseDownEvent 事件中,获取鼠标单击的坐标,并计算两点之间的距离。将距离显示在 MuneStirp 控件中。 ```csharp private void axMapControl1_MouseDownEvent(object sender, IMapControlEvents2_OnMouseDownEvent e) { if (e.button == 1) // 左键单击 { if (axMapControl1.CurrentTool == null) // 如果不在测量模式中 { // 进入测量模式 axMapControl1.MousePointer = esriControlsMousePointer.esriPointerCrosshair; double x1 = e.mapX; double y1 = e.mapY; IPoint point1 = new PointClass(); point1.PutCoords(x1, y1); IGraphicsContainer graphicsContainer = axMapControl1.ActiveView as IGraphicsContainer; IElement element1 = GetPointElement(point1); graphicsContainer.AddElement(element1, 0); axMapControl1.Refresh(esriViewDrawPhase.esriViewGraphics, null, null); axMapControl1.MouseDownEvent -= new IMapControlEvents2_Ax_OnMouseDownEventHandler(axMapControl1_MouseDownEvent); axMapControl1.MouseDownEvent += new IMapControlEvents2_Ax_OnMouseDownEventHandler(axMapControl1_MouseDownEvent2); } } } private void axMapControl1_MouseDownEvent2(object sender, IMapControlEvents2_OnMouseDownEvent e) { if (e.button == 1) // 左键单击 { double x2 = e.mapX; double y2 = e.mapY; IPoint point2 = new PointClass(); point2.PutCoords(x2, y2); IGraphicsContainer graphicsContainer = axMapControl1.ActiveView as IGraphicsContainer; IElement element2 = GetPointElement(point2); graphicsContainer.AddElement(element2, 0); axMapControl1.Refresh(esriViewDrawPhase.esriViewGraphics, null, null); // 计算距离 double distance = GetDistance(point1, point2); IFormattedTextSymbol symbol = new TextSymbolClass(); symbol.Background = GetColor(255, 255, 255); symbol.Border = true; symbol.Color = GetColor(0, 0, 0); symbol.HorizontalAlignment = esriTextHorizontalAlignment.esriTHACenter; symbol.VerticalAlignment = esriTextVerticalAlignment.esriTVABottom; symbol.Angle = GetAngle(point1, point2); ITextElement textElement = new TextElementClass(); textElement.Symbol = symbol; textElement.Text = string.Format("{0:0.00} 米", distance); textElement.ScaleText = true; IElement element3 = textElement as IElement; element3.Geometry = GetMidPoint(point1, point2); graphicsContainer.AddElement(element3, 0); axMapControl1.Refresh(esriViewDrawPhase.esriViewGraphics, null, null); // 显示结果 muneStrip.Items.Clear(); muneStrip.Items.Add(string.Format("距离:{0:0.00} 米", distance)); muneStrip.Visible = true; // 退出测量模式 axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault; axMapControl1.MouseDownEvent -= new IMapControlEvents2_Ax_OnMouseDownEventHandler(axMapControl1_MouseDownEvent2); axMapControl1.MouseDownEvent += new IMapControlEvents2_Ax_OnMouseDownEventHandler(axMapControl1_MouseDownEvent); } } private IElement GetPointElement(IPoint point) { ISimpleMarkerSymbol symbol = new SimpleMarkerSymbolClass(); symbol.Style = esriSimpleMarkerStyle.esriSMSCircle; symbol.Color = GetColor(255, 0, 0); symbol.Size = 6; ISimpleMarkerSymbol symbol2 = new SimpleMarkerSymbolClass(); symbol2.Style = esriSimpleMarkerStyle.esriSMSCircle; symbol2.Color = GetColor(255, 255, 255); symbol2.Size = 4; IMultiLayerMarkerSymbol multiLayerMarkerSymbol = new MultiLayerMarkerSymbolClass(); multiLayerMarkerSymbol.AddLayer(symbol); multiLayerMarkerSymbol.AddLayer(symbol2); IMarkerElement markerElement = new MarkerElementClass(); markerElement.Symbol = multiLayerMarkerSymbol as IMarkerSymbol; IElement element = markerElement as IElement; element.Geometry = point; return element; } private double GetDistance(IPoint point1, IPoint point2) { IProximityOperator proximityOperator = point1 as IProximityOperator; return proximityOperator.ReturnDistance(point2); } private double GetAngle(IPoint point1, IPoint point2) { double dx = point2.X - point1.X; double dy = point2.Y - point1.Y; double angle = Math.Atan2(dy, dx) * 180 / Math.PI; return angle; } private IPoint GetMidPoint(IPoint point1, IPoint point2) { IPoint midPoint = new PointClass(); midPoint.X = (point1.X + point2.X) / 2; midPoint.Y = (point1.Y + point2.Y) / 2; return midPoint; } private IColor GetColor(int red, int green, int blue) { IRgbColor color = new RgbColorClass(); color.Red = red; color.Green = green; color.Blue = blue; return color; } ``` 以上代码中,GetPointElement 方法用于创建点元素;GetDistance 方法用于计算两点之间的距离;GetAngle 方法用于计算两点之间的夹角;GetMidPoint 方法用于计算两点之间的中点;GetColor 方法用于创建颜色对象。

相关推荐

最新推荐

recommend-type

ArcGIS Engine二次开发——提高篇

ArcGIS Engine二次开发提高资料,适合有一定基础,希望深入学习二次开发技术的学者。
recommend-type

ArcGIS Engine二次开发——基础篇

1ArcGIS Engine二次开发——基础篇 1.1第一个简单的ArcGIS Engine地图显示程序 这个例子将引导您创建第一个简单的地图显示程序,并添加基本的缩放和漫游功能。如果您之前没有接触过ArcGIS Engine的开发,那么这个...
recommend-type

ArcGIS_Engine二次开发(新手必看的教材)

讲解的很详细,对于一个学arcgis开发的人来说是不可或缺的教材,已修复积分情况,方便下载。祝大家学习顺利
recommend-type

arcgis二次开发复习资料

arcgis二次开发复习资料,个人上课总结,非常齐全~ 利用ArcGIS Engine,开发者可以将ArcGIS功能集成到一些应用软件中,也可以为用户提供针对GIS解决方案的定制应用。
recommend-type

利用ArcGIS Engine c# 的二次开发

利用视窗控件建立应用程序的目标是演示并使你熟悉在微软Visual Studio .NET API中使用标准ArcGIS控件开发和部署GIS应用所需的步聚。本节中使用了Visual Studio .NET开发环境中的MapControl、 PageLayoutControl、...
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

机器学习怎么将excel转为csv文件

机器学习是一种利用计算机算法和统计数据的方法来训练计算机来进行自动学习的科学,无法直接将excel文件转为csv文件。但是可以使用Python编程语言来读取Excel文件内容并将其保存为CSV文件。您可以使用Pandas库来读取Excel文件,并使用to_csv()函数将其保存为CSV格式。以下是代码示例: ```python import pandas as pd # 读取 Excel 文件 excel_data = pd.read_excel('example.xlsx') # 将数据保存为 CSV 文件 excel_data.to_csv('example.csv', index=
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。