AO开发包为我们提供了绘制平行线的工具 ControlsEditingSketchParallelCommand ,但是它必须宿主在编辑右键菜单上 ControlsEditingSketchContextMenu。对于熟悉ArcGIS Engine开发的朋友完全可以自己开发实现绘制平行线功能。本文为大家介绍实现平行线绘制的一些思路。

确定平行线绘制起点,选择参考的基准线

接下来绘制平行线时  大家发现鼠标画线已经被限定在与参考线平行那条线上

using System;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Collections.Generic;
using ESRI.ArcGIS.ADF.BaseClasses;
using ESRI.ArcGIS.ADF.CATIDs;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Display;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Geodatabase;
using ESRI.ArcGIS.esriSystem;
using System.Text.RegularExpressions;
using System.Windows.Forms;namespace Parallel
{/// /// Summary description for ParallelTool1./// [Guid("f4afe519-b3a0-454d-9615-e64f2b18ff53")][ClassInterface(ClassInterfaceType.None)][ProgId("demo.Parallel.ParallelTool1")]public sealed class ParallelTool1 : BaseTool{#region COM Registration Function(s)[ComRegisterFunction()][ComVisible(false)]static void RegisterFunction(Type registerType){// Required for ArcGIS Component Category Registrar supportArcGISCategoryRegistration(registerType);//// TODO: Add any COM registration code here//}[ComUnregisterFunction()][ComVisible(false)]static void UnregisterFunction(Type registerType){// Required for ArcGIS Component Category Registrar supportArcGISCategoryUnregistration(registerType);//// TODO: Add any COM unregistration code here//}#region ArcGIS Component Category Registrar generated code/// /// Required method for ArcGIS Component Category registration -/// Do not modify the contents of this method with the code editor./// private static void ArcGISCategoryRegistration(Type registerType){string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);ControlsCommands.Register(regKey);}/// /// Required method for ArcGIS Component Category unregistration -/// Do not modify the contents of this method with the code editor./// private static void ArcGISCategoryUnregistration(Type registerType){string regKey = string.Format("HKEY_CLASSES_ROOT\\CLSID\\{{{0}}}", registerType.GUID);ControlsCommands.Unregister(regKey);}#endregion#endregionprivate IHookHelper m_hookHelper;private IMapControl3 m_mapControl;//private IPolyline pPolyline = null;private IPolyline pPolyline_Parallel = null;private INewLineFeedback pDraglineFeedBack = null;private List AddPs = new List();private int Flag = 0;private double dis = 0;private double angle = 0;public ParallelTool1(){//// TODO: Define values for the public properties//base.m_category = ""; //localizable text base.m_caption = "";  //localizable text base.m_message = "";  //localizable textbase.m_toolTip = "";  //localizable textbase.m_name = "";   //unique id, non-localizable (e.g. "MyCategory_MyTool")try{//// TODO: change resource name if necessary//string bitmapResourceName = GetType().Name + ".bmp";base.m_bitmap = new Bitmap(GetType(), bitmapResourceName);base.m_cursor = new System.Windows.Forms.Cursor(GetType(), GetType().Name + ".cur");}catch (Exception ex){System.Diagnostics.Trace.WriteLine(ex.Message, "Invalid Bitmap");}}#region Overridden Class Methods/// /// Occurs when this tool is created/// /// Instance of the applicationpublic override void OnCreate(object hook){if (m_hookHelper == null)m_hookHelper = new HookHelperClass();m_hookHelper.Hook = hook;// TODO:  Add ParallelTool1.OnCreate implementationm_mapControl = hook as IMapControl3;}/// /// Occurs when this tool is clicked/// public override void OnClick(){// TODO: Add ParallelTool1.OnClick implementation}public override void OnMouseDown(int Button, int Shift, int X, int Y){// TODO:  Add ParallelTool1.OnMouseDown implementationtry{IPoint sStartPoint = m_mapControl.ToMapPoint(X, Y);if (pDraglineFeedBack == null){pDraglineFeedBack = new NewLineFeedback();}pDraglineFeedBack.Display = m_mapControl.ActiveView.ScreenDisplay;if (Flag == 0){pDraglineFeedBack.Start(sStartPoint);Flag += 1;}else{if (pPolyline_Parallel == null)CatchSel(m_mapControl.Map, X, Y);if (pPolyline_Parallel == null)pDraglineFeedBack.Start(sStartPoint);else{if (Flag == 2){}else{IPoint pPoint = SetMouseLocation(X, Y);pDraglineFeedBack.Start(pPoint);}}}}catch (Exception er){MessageBox.Show(er.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}}public override void OnMouseMove(int Button, int Shift, int X, int Y){// TODO:  Add ParallelTool1.OnMouseMove implementationtry{if (pDraglineFeedBack == null) return;if (pPolyline_Parallel == null){IPoint sPoint = m_mapControl.ToMapPoint(X, Y);pDraglineFeedBack.MoveTo(sPoint);}else{IPoint pPoint = SetMouseLocation(X, Y);pDraglineFeedBack.MoveTo(pPoint);}}catch { }}public override void OnMouseUp(int Button, int Shift, int X, int Y){// TODO:  Add ParallelTool1.OnMouseUp implementationtry{if (pDraglineFeedBack == null) return;IPoint sPoint = null;if(pPolyline_Parallel == null)sPoint = m_mapControl.ToMapPoint(X, Y);elsesPoint = SetMouseLocation(X, Y);if (Button == 1){if (Flag != 2){pDraglineFeedBack.AddPoint(sPoint);AddPs.Add(sPoint);if (AddPs.Count == 2){pPolyline_Parallel = pDraglineFeedBack.Stop();IFeatureLayer sFlyr = Publics.Functions.G_Funs.getFlyrByName(m_mapControl.Map, "燃气-管线");IDataset pDS = sFlyr.FeatureClass as IDataset;IWorkspaceEdit pWSEdit = pDS.Workspace as IWorkspaceEdit;pWSEdit.StartEditing(true);pWSEdit.StartEditOperation();IFeature pFea = sFlyr.FeatureClass.CreateFeature();pFea.Shape = pPolyline_Parallel;pFea.Store();pWSEdit.StopEditOperation();//m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, sFlyr, m_mapControl.Extent);pDraglineFeedBack = null;AddPs.Clear();Flag = 0;pPolyline_Parallel = null;//m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, m_mapControl.Extent);m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewAll, null, m_mapControl.Extent);}}else{Flag += 1;}}//else if (Button == 2)//{//    pDraglineFeedBack.Stop();//    pDraglineFeedBack = null;//    AddPs.Clear();//    Flag = 0;//    pPolyline_Parallel = null;//    m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGraphics, null, m_mapControl.Extent);//}}catch (Exception er){MessageBox.Show(er.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}}#endregionprivate void CatchSel(IMap sMap, int X, int Y){try{Publics.Functions.G_Funs.ClearSelection(m_mapControl);for (int i = 0; i < sMap.LayerCount; i++){//管线上加点ILayer pLayer = sMap.get_Layer(i);if (Regex.IsMatch(pLayer.Name, "-参考线", RegexOptions.IgnoreCase)){ESRI.ArcGIS.Geometry.IPoint pt = new ESRI.ArcGIS.Geometry.PointClass();pt = m_mapControl.ToMapPoint(X, Y);//点击处做缓冲区double dis = Publics.Functions.G_Funs.ConvertPixelsToMapUnits(m_mapControl, 20);ITopologicalOperator pTopo = pt as ITopologicalOperator;IGeometry geo = pTopo.Buffer(dis);esriGeometryType geoType = (pLayer as IFeatureLayer).FeatureClass.ShapeType;esriFeatureType FeatureType = (pLayer as IFeatureLayer).FeatureClass.FeatureType;//空间查询条件ISpatialFilter pSpatial = new SpatialFilterClass();pSpatial.Geometry = geo;pSpatial.SpatialRel = esriSpatialRelEnum.esriSpatialRelIntersects;if (geoType == esriGeometryType.esriGeometryPoint)pSpatial.SpatialRel = esriSpatialRelEnum.esriSpatialRelContains;IFeatureCursor pFeatureCursor = (pLayer as IFeatureLayer).FeatureClass.Search(pSpatial, false);if (pFeatureCursor != null){IFeature pFeature = pFeatureCursor.NextFeature();if (pFeature != null){IPolyline pPolyline = pFeature.ShapeCopy as IPolyline;计算管线上点IProximityOperator pProximityOperator = pFeature.ShapeCopy as IProximityOperator;//IPoint pNearsetPoint = new ESRI.ArcGIS.Geometry.PointClass();//pProximityOperator.QueryNearestPoint(pt, esriSegmentExtension.esriExtendEmbedded, pNearsetPoint);将管线上的点添加到临时图元//Publics.Functions.G_Funs.AddMarkerElement(m_mapControl.Map, pNearsetPoint);//pt = AddPs[AddPs.Count - 1];dis = pProximityOperator.ReturnDistance(AddPs[AddPs.Count - 1]);IPoint pNearsetPoint = new ESRI.ArcGIS.Geometry.PointClass();pProximityOperator.QueryNearestPoint(AddPs[AddPs.Count - 1], esriSegmentExtension.esriExtendEmbedded, pNearsetPoint);ILine pLine = new LineClass();//pLine.FromPoint = pPolyline.FromPoint;//pLine.ToPoint = pPolyline.ToPoint;//angle = pLine.Angle;//if (angle < 0)//{//    angle = angle +180*Math.PI/180;//}//double dx = dis / Math.Sin(angle);//double dy = dis / Math.Cos(angle);IClone pClone = pPolyline as IClone;ITransform2D pTransform2D = pClone.Clone() as ITransform2D;//pTransform2D.Move(dx, dy);pLine = new LineClass();pLine.FromPoint = pNearsetPoint;pLine.ToPoint = AddPs[AddPs.Count - 1];pTransform2D.MoveVector(pLine);pPolyline_Parallel = pTransform2D as IPolyline;//IFeatureLayer sFlyr = pLayer as IFeatureLayer;//IFeature pFea = sFlyr.FeatureClass.CreateFeature();//pFea.Shape = pPolyline_Parallel;//pFea.Store();//m_mapControl.ActiveView.PartialRefresh(esriViewDrawPhase.esriViewGeography, pLayer, m_mapControl.Extent);Flag = 2;return;}Publics.Functions.G_Funs.pReleaseObj(pFeatureCursor);pFeatureCursor = null;if (pFeature != null) return;}}}}catch (Exception er){MessageBox.Show(er.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);}}private IPoint SetMouseLocation(int X, int Y){try{IPoint pPoint = m_mapControl.ToMapPoint(X, Y);IProximityOperator pProximityOperator = pPolyline_Parallel as IProximityOperator;IPoint pNearsetPoint = new ESRI.ArcGIS.Geometry.PointClass();pProximityOperator.QueryNearestPoint(pPoint, esriSegmentExtension.esriExtendEmbedded, pNearsetPoint);return pNearsetPoint;}catch (Exception er){MessageBox.Show(er.Message, "提示", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);return null;}}}
}

ArcGIS Engine 绘制平行线相关推荐

  1. 【ArcGIS微课1000例】0029:ArcGIS绘制平行线(构造平行公路)

    在实际工作中,有时需要绘制平行线,比如道路两边的边界线,可以使用"平行复制"功能快速绘制平行线,本文介绍如何使用"平行复制"功能快速绘制平行线. 1. 加载公路 ...

  2. ArcGIS Engine中的Symbols详解

    转自原文 ArcGIS Engine中的Symbols详解 本文由本人翻译ESRI官方帮助文档.尊重劳动成果,转载请注明来源. Symbols ArcObjects用了三种类型的Symbol(符号样式 ...

  3. arcgis engine二次开发python-使用C#配合ArcGIS Engine进行地理信息系统开发

    简单的地图读取.展示终于到暑假了...开始认真整理整理相关学习的心得体会咯~ 先把很久之前挖的关于C# 二次开发的坑给填上好了~ 这次先计划用一个月把C# ArcEngine 10.0相关开发的学习心 ...

  4. 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用

    Dixon 原文  用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方 ...

  5. ArcGIS Engine基础开发教程(转)

    ArcGIS Engine基础开发教程(0)--目录 <ArcEngine9.3 基础开发教程>是面向初中级开发者的一份简单易用,功能全面的学习资料及参考文档.教程首先从如何来创建一个Ar ...

  6. ArcGIS Engine开发之旅02--ArcGIS Engine中的类库

    原文 ArcGIS Engine开发之旅02--ArcGIS Engine中的类库 System类库 System类库是ArcGIS体系结构中最底层的类库.System类库包含给构成ArcGIS的其他 ...

  7. ArcGIS Engine开发:框架/结构+对象库

    ArcGIS Engine开发:框架/结构+对象库 框架/结构: ArcGIS Engine 开发人员有权使用一系列的控制器,这些控制器 准许很多属性.事件和方法的使用.尽管一个简单的应用软件 仅仅通 ...

  8. ArcGIS Engine开发基础总结(一)

    标准Engine功能 地图浏览    地图制作 数据查询 数据分析 及 所有的开发控件 -MapControl, PageLayout, Toolbar, TOC, ArcReader 对所有矢量和栅 ...

  9. C#,ArcGIS Engine开发入门教程

    利用ArcGIS Engine.VS .NET和Windows控件开发GIS应用 Dixon整理 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法 ...

最新文章

  1. C++内存管理变革(6):通用型垃圾回收器 - ScopeAlloc
  2. 数学界的高冷之王,N次拒绝巨额奖金:我穷,但是我不缺钱。。。
  3. 解决idea中xml文件报红问题
  4. pytorch学习——构建多元线性回归的网络结构
  5. java war包混淆_使用proguard混淆java web项目代码
  6. 特征金字塔 Feature Pyramid Networks for Object Detection
  7. Java 如何查询硬盘所有文件
  8. gradle学习(19)-log系统
  9. POJ 2480 Longge#39;s problem 积性函数
  10. matlab (.m)文件生成 windows 可执行(.exe)文件
  11. 做SEO优化第七步:如何选择网站程序模版?
  12. n个元素的所有子集(递归+非递归 +不去重)
  13. 用户运营:5步学会用户留存数据分析
  14. 大数据在互联网时代的意义!
  15. 仿钉钉时事通讯IM客户端
  16. python命令行无法使用退格键、方向键
  17. 前端插件swiper基础使用详解含部分常用API
  18. Rockchip RK3588 kernel dts解析之电源模块
  19. 英文原著582本分享和新东方雅思培训视频资料(和学为贵雅思资料)
  20. HTML5开发手机项目-个人总结

热门文章

  1. 免费的小程序商城依靠什么实现盈利
  2. docker之自定义镜像上传阿里云
  3. java pojo 是什么_POJO是什么,javabean是什么,以及POJO与javabean的区别
  4. 6.1Kettle多数据源合并
  5. H5前端页面实现分享到微信、qq、新浪功能。微信分享(完整demo)nativeShare.js
  6. 《乱世三国挂机游戏》隐私政策
  7. python numba class_Numba jitclass不能使用python Lis
  8. Pandas读/写PG数据库
  9. (防火墙辅助工具)EasyFirewall v3.2.8 中文便携版
  10. 基于javaweb的开源数据库资源网站设计