来自esri社区:地址忘了。。。见谅
using System;
/// <summary>/// Summary description for Class1/// </summary>public class Class1{ public Class1(){ } //找到点击点离要素最近的那个点(用于线边缘捕捉)private IPoint ReturnNearestPoint(IFeatureClass t_pBaseFeatureClass,IPoint t_pInPoint){ IFeatureClass pBaseFeatureClass=t_pBaseFeatureClass; IPoint pInPoint=t_pInPoint; IFeatureCursor pFeatureCursor; IFeature pFeature; IGeometry pGeometry; double dblDistance=10;//容差 IProximityOperator pProximityOperator; IPoint pNearestPoint=null; //MessageBox.Show("return2"); pFeatureCursor=pBaseFeatureClass.Search(null,false); pFeature=pFeatureCursor.NextFeature(); while (pFeature!=null) { //MessageBox.Show("return4"); pGeometry=pFeature.Shape; pProximityOperator=(IProximityOperator)pGeometry;if (dblDistance>pProximityOperator.ReturnDistance(pInPoint))
{ dblDistance=pProximityOperator.ReturnDistance(pInPoint); //MessageBox.Show("dblDistance"); pNearestPoint=pProximityOperator.ReturnNearestPoint(pInPoint,esriSegmentExtension.esriNoExtension); //MessageBox.Show("pNearestPoint"); } pFeature=pFeatureCursor.NextFeature(); } return pNearestPoint;} //打断线,用于在点击点处,打断该条线 private void SplitePolylineByHitPoint(IFeatureClass t_pLineFeatureClass,IPoint t_pPoint){ IFeatureClass pFeatureClass=t_pLineFeatureClass; IFeatureCursor pFeatureCursor; IFeature pFeature; pFeatureCursor=pFeatureClass.Search(null,false); pFeature=pFeatureCursor.NextFeature(); IRelationalOperator pRelationalOperator ; //遍历featureClass找到点中的那条线 while (pFeature!=null) { pRelationalOperator=(IRelationalOperator)pFeature.Shape; bool bHasCrosses=pRelationalOperator.Contains(t_pPoint); if (bHasCrosses) { //对那条线在点击点处,进行打断 IPolycurve pPolycurve=(IPolycurve)pFeature.Shape; bool HasSplitHappened ; int newPartIndex; int newSegmentIndex; //打断 pPolycurve.SplitAtPoint(t_pPoint,false,true,out HasSplitHappened,out newPartIndex,out newSegmentIndex); if (HasSplitHappened) { //从GeometryCollection中分离出打断后的要素,并生成新的要素,并赋于属性 IFeature pNewFeature; IGeometryCollection pGeometryCollection=(IGeometryCollection)pPolycurve;for (int i=0;i<pGeometryCollection.GeometryCount;i++)
{ //生成新的要素 m_pWorkspaceEdit.StartEditing(false); m_pWorkspaceEdit.StartEditOperation(); pNewFeature=pFeatureClass.CreateFeature(); IGeometryCollection pline=new PolylineClass(); IGeometry pGeo=pGeometryCollection.get_Geometry(i); pline.AddGeometries(1,ref pGeo); pNewFeature.Shape=(IPolyline)pline; pNewFeature.Store(); m_pWorkspaceEdit.StopEditOperation(); m_pWorkspaceEdit.StopEditing(true); IRow pRow =(IRow)pFeature; int intIndex=pRow.Fields.FindField("CRoadID"); //进行属性复制 for(int k=2;k<pRow.Fields.FieldCount-3;k++)//前后几个属性字段不添加 { if (pRow.Fields.get_Field(k).Name=="Shape_Length") { continue; } if (k!=intIndex) { if (!pRow.get_Value(k).ToString().Equals("")) { pNewFeature.set_Value(k,pRow.get_Value(k)); } } else { if (k==0) { if (!pRow.get_Value(k).ToString().Equals("")) { pNewFeature.set_Value(k,pRow.get_Value(k)); } } else { if (!pRow.get_Value(k).ToString().Equals("")) { int intNO=System.Convert.ToInt32(pRow.get_Value(k).ToString())+1000*i; pNewFeature.set_Value(k,intNO); } } } } pNewFeature.Store(); } pFeature.Delete(); } } pFeature=pFeatureCursor.NextFeature(); }}}