ArcEngine C# 二次开发 PolyLine 多次打断操作

一条线(Polyline)被另外一条线多次(Polyline)切割,也就是说打断的点有多个,而AE中的IFeatureEdit.Split()只能是一个点一个点的处理,这样就涉及到了循环操作,现在将本人自己写具体的操作函数附上,大家一同学习。

  1   public void LineSplit(IFeature feature, IGeometry other)
  2         {
  3             try
  4             {
  5                 ITopologicalOperator shape = feature.Shape as ITopologicalOperator;
  6                 IPoint point = new PointClass();
  7                 IGeometry geometry2 = shape.Intersect(other, esriGeometryDimension.esriGeometry0Dimension);
  8                 if (!geometry2.IsEmpty)
  9                 {
 10                     IPointCollection points2 = geometry2 as IPointCollection;
 11                     for(int i = 0; i < points2.PointCount; i++)
 12                     {
 13                         point = points2.get_Point(i);
 14                         ISet set = (feature as IFeatureEdit).Split(point);
 15                         set.Reset();
 16                         for (IFeature feature2 = set.Next() as IFeature; feature2 != null; feature2 = set.Next() as IFeature)
 17                         {
 18                             if (!IsSplitOk(feature2,other))
 19                             {
 20                                 feature = feature2;
 21                             }
 22                             else
 23                             {
 24                                 ISimpleLineSymbol symbol = new SimpleLineSymbolClass();
 25                                 IRgbColor color = new RgbColorClass
 26                                 {
 27                                     RGB = Color.FromArgb(0xff, 0, 0).ToArgb()
 28                                 };
 29                                 symbol.Color = color;
 30                                 symbol.Width = 2.0;
 31                                 this.pMapControl.FlashShape(feature2.Shape, 1, 450, symbol as ISymbol);
 32                                 pMapControl.ActiveView.FocusMap.SelectFeature(pCurrentLayer, feature2);
 33                             }
 34
 35                         }
 36
 37                     }
 38                 }
 39             }
 40             catch (Exception)
 41             {
 42                 return ;
 43             }
 44
 45         }
 46
 47         public bool IsSplitOk(IFeature feature, IGeometry splitLine)
 48         {
 49             bool ok = false;
 50             try
 51             {
 52                 ITopologicalOperator shape = feature.Shape as ITopologicalOperator;
 53                 IGeometry geometry = shape.Intersect(splitLine, esriGeometryDimension.esriGeometry0Dimension);
 54                 if (!geometry.IsEmpty)
 55                 {
 56                     IPointCollection points = geometry as IPointCollection;
 57                     if(points.PointCount==1)
 58                     {
 59                         IPoint point = points.get_Point(0);
 60                         if (IsLineStartEndPoint(feature,point))
 61                         {
 62                             ok = true;
 63                         }
 64
 65                     }
 66                     else if (points.PointCount == 2)
 67                     {
 68                         IPoint point1 = points.get_Point(0);
 69                         IPoint point2 = points.get_Point(1);
 70                         if (IsLineStartEndPoint(feature, point1) && IsLineStartEndPoint(feature, point2))
 71                         {
 72                             ok = true;
 73                         }
 74                     }
 75
 76                 }
 77                 return ok;
 78             }
 79             catch (Exception)
 80             {
 81                 return false;
 82             }
 83         }
 84
 85
 86         public bool IsLineStartEndPoint(IFeature feature,IPoint point)
 87         {
 88             bool yes = false;
 89             try
 90             {
 91                 IPolyline line = feature.Shape as IPolyline;
 92                 double len = line.Length;
 93                 IPoint pStart = line.FromPoint;
 94                 if (Math.Abs(pStart.X - point.X) < 0.1 && Math.Abs(pStart.Y - point.Y) < 0.1)
 95                 {
 96                      yes = true;
 97                 }
 98                 else
 99                 {
100                     IPoint pEnd = line.ToPoint;
101                     if (Math.Abs(pEnd.X - point.X) < 0.1 && Math.Abs(pEnd.Y - point.Y) < 0.1)
102                     {
103                         yes = true;
104                     }
105                 }
106                 return yes;
107             }
108             catch (Exception)
109             {
110                 return false;
111             }
112         }
时间: 2024-11-08 20:58:46

ArcEngine C# 二次开发 PolyLine 多次打断操作的相关文章

【ArcEngine 10 二次开发】ITOCControl添加鼠标右键菜单

1 用contextMenuScript 首先,在ITOCControl控件中添加contextMenuScript控件, 设置好右键菜单中的Items 然后,加入如下的代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using

【ArcEngine 10 二次开发】DataGridView显示Layer中的属性表

显示图层Layer中的属性表 新建一个Form窗口 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using ESRI.ArcGIS.Controls; using ESRI.A

[ArcEngine二次开发]为Feature的属性赋值

在创建FeatureClass之后,需要为FeatureClass添加Features,在为Feature的字段赋值时,代码大致如下: 在这里赋值的时候,出现了一个错误: The operation was attempted on an empty geometry. 因为有一个字段类型为esriFieldTypeOID,它是类似与SQL Server或者其他关系型数据库中的主键,是会自动增加的,因此这里判断如果字段类型是esriFieldTypeOID的话,就跳过,不为其赋值. 最终成功为F

Arcengine 二次开发添加右键菜单

最近在搞arcengine 二次开发,遇到了好多问题,也通过网上查资料试着慢慢解决了,把解决的步骤记录下来,有需要帮助的可以看一下,也欢迎各位来批评指正. 想给自己的map application在图层上添加右键菜单,谷歌了一下,找到了解决的方法,原文的地址edndoc.esri.com/arcobjects/9.2/NET/1ED14BF2-A0E3-4e56-A70D-B9A7F7EC7880.htm.然后我根据这个添加了自己的右键菜单,又有一些改动. 效果如图所示(有点简陋),仅仅是简单的

AE二次开发中几个功能速成归纳(符号设计器、创建要素、图形编辑、属性表编辑、缓冲区分析)

/* * 实习课上讲进阶功能所用文档,因为赶时间从网上抄抄改改,凑合能用,记录一下以备个人后用. * * ------------------------------------------------------------------- * * 使用前提:已搭建好AE的GIS基本框架,包括TOC.mapcontrol.toolbar拖控件,mxd.shp文件载入显示,查看图层属性表等 * * --------------------------------------------------

基于Java的Arc Engine二次开发的环境的配置

1.软件准备 ArcGIS for Desktop 10.2, Arc engine, jdk-7u60-windows-i586,Eclipse Mar2 2.软件的安装 2.1 ArcGIS for Desktop 10.2的安装 软件的下载:ArcGIS for Desktop 10.3全套的下载:http://pan.baidu.com/s/1o7F4yue,附带破解方法 本文使用的是10.2,其下载路径与安装破解方法如:http://jingyan.baidu.com/article/

visual studio2010中C#生成的,ArcGIS二次开发的basetool的dll,注册为COM组件tlb文件,并在arcmap中加载使用

写了个标题好长啊~~~~ 这两天又认识了一个新玩意,记录一下下,啦啦啦~~~~~ 话说,认识arcgis快十年了,从桌面版到engine的二次开发,其实不过才认识到它的冰山一角, 它总是能带来很多还未知的东西,实话说,就是如此的热爱着它,因为从来都觉得遨游其中,没有边界~~~~~ arcengine二次开发,这个玩意现在已经不流行了,但是其奥妙和乐趣依然无穷~~~~ 言归: 一. 之前写的basetool,basecommand等类都是在独立的系统中运行的,没有单独注册成过组件在桌面版arcma

Civil3D二次开发常见问题总结

Civil3D二次开发常见问题总结 AutoCAD命令提示"未知命令**--"的原因:在Initialize方法内报出异常就会导致这种情况.O__O"-(或是少加了dll引用)还有一种情况就是CommandClass特性位置写错了,它必须放在命名空间上面,否则在CAD 2010中就会出现"未知命令"的情况,CAD 2014没有这种情况 Civil 3D 工具空间(Toolspace)不见了怎么办?在命令行上输入ShowTS. 3.使用netload命令加载

微控工具xp模块-开发版[微信(wechat)二次开发模块]

http://repo.xposed.info/module/com.easy.wtool 微控工具xp模块-开发版[微信(wechat)二次开发模块] 基于xposed框架的微信二次开发模块,方便开发者用微信做一些扩展功能(如微信群发.多群直播等...) 目前支持功能: 发文本消息 发图片消息 发语音消息 发视频消息 获取微信好友列表 群列表 支持群发消息 支持消息转发(目前支持文本.图片.语音.视频.图文消息转发) 群管理功能(建群.加人.踢人.设置公告.改群名.退群.解散群) [注:本模块