博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ArcEngine环境下合并断开的线要素(根据属性)
阅读量:5305 次
发布时间:2019-06-14

本文共 6676 字,大约阅读时间需要 22 分钟。

     1.遇到的问题:

 最近遇到在线要素(矢量数据)中,一条完整的道路、河流等往往是断开的,如下图1所示:

 

     2.思路:

      在ArcGIS Desktop中没有相关的工具可以将这些断开的线要素进行自动合并,今天自己写了一个Arcmap上的一个插件,实现当点击插件按钮后,对地图窗口中断开的线要素进行合并。合并的依据是具有相同NAME属性(如长沙-张家界高速)的Polyline要素进行合并,然后存储在另一个线要素图层中。

     3.程序的实现和结果:

      程序运行的结果如下,这样本来属于同一段道路的多个Polyline就合并成一条Polyline:

      

      

     4.程序源代码:

1 using System;  2 using System.Collections;  3 using System.Collections.Generic;  4 using System.Text;  5 using System.IO;  6 using System.Windows.Forms;  7 using ESRI.ArcGIS.ArcMapUI;  8 using ESRI.ArcGIS.Carto;  9 using ESRI.ArcGIS.Geodatabase; 10 using ESRI.ArcGIS.Geometry; 11  12 namespace MergeDisconnectPolylineAddin 13 { 14     public class MergePolyline : ESRI.ArcGIS.Desktop.AddIns.Button 15     { 16          17         IMap map = null; 18         IActiveView pActiveView = null; 19         //private List
DisconnPolylineList = new List
(); 20 21 public MergePolyline() 22 { 23 IMxDocument mxDoc = ArcMap.Application.Document as IMxDocument; 24 map = mxDoc.FocusMap; 25 pActiveView = mxDoc.ActivatedView; 26 } 27 28 protected override void OnClick() 29 { 30 // 31 // TODO: Sample code showing how to access button host 32 // 33 ArcMap.Application.CurrentTool = null; 34 35 //计算程序耗时 36 DateTime beforDT = System.DateTime.Now; 37 38 List
distinctString = getDistinctNAMEValue(); 39 MergePloyline(distinctString); 40 41 DateTime afterDT = System.DateTime.Now; 42 TimeSpan ts = afterDT.Subtract(beforDT); 43 MessageBox.Show("线要素合并结束,运行程序共耗时约:"+ ts.Minutes+"分钟"); 44 } 45 46 public List
getDistinctNAMEValue() 47 { 48 IFeatureLayer featureLayer = map.get_Layer(0) as IFeatureLayer; 49 IFeatureClass featureClass = featureLayer.FeatureClass; 50 IQueryFilter queryFilter = new QueryFilterClass(); 51 queryFilter.WhereClause = ""; 52 IFeatureCursor pFeatCursor = featureClass.Search(queryFilter, false); 53 IFeature pFeature = pFeatCursor.NextFeature(); 54 ArrayList fieldArray = new ArrayList(); 55 List
distinctString = new List
(); 56 while (pFeature != null) 57 { 58 if (featureClass.ShapeType == esriGeometryType.esriGeometryPolyline) 59 { 60 IFields fields = pFeatCursor.Fields; 61 int fieldIndex = fields.FindField("NAME"); 62 string field_NAME = (string)pFeature.get_Value(fieldIndex); 63 fieldArray.Add(field_NAME); 64 } 65 pFeature = pFeatCursor.NextFeature(); 66 } 67 distinctString = removeSameString(fieldArray); 68 return distinctString; 69 } 70 71 public void MergePloyline(List
DistinctNameValue) 72 { 73 IFeatureLayer featureLayer = map.get_Layer(0) as IFeatureLayer; 74 IFeatureClass featureClass = featureLayer.FeatureClass; 75 76 //IDataset dataset = featureClass as IDataset; 77 //IWorkspaceEdit workspaceEdit = dataset.Workspace as IWorkspaceEdit; 78 //Type.Missing指的是空类型,因为有些方法你传null给它会出错的,必须要用Type.Missing. 79 object Missing = Type.Missing; 80 //workspaceEdit.StartEditing(true); 81 //workspaceEdit.StartEditOperation(); 82 //string field_NAME = ""; 83 84 for (int i = 0; i < DistinctNameValue.Count; i++) 85 { 86 IQueryFilter queryFilter = new QueryFilterClass(); 87 queryFilter.WhereClause = ""; 88 IFeatureCursor pFeatCursor = featureClass.Search(queryFilter, false); 89 IFeature pFeature = pFeatCursor.NextFeature(); 90 91 IFeature pFeatureFirst = pFeature; 92 //List
toMergePolylineList = new List
(); 93 94 IGeometryCollection Geometrybag = new GeometryBagClass(); 95 ITopologicalOperator2 pTopOperatorFirst = null; 96 IGeometry geometrySecond = null; 97 IGeometry pGeometryFirst = null; 98 bool bSwitch = true; 99 while (pFeature != null)100 {101 map.SelectFeature(featureLayer, pFeature);102 if (featureClass.ShapeType == esriGeometryType.esriGeometryPolyline)103 { 104 //IPolyline polyline = geometry as IPolyline;105 IFields fields = pFeatCursor.Fields;106 int fieldIndex = fields.FindField("NAME");107 string field_NAME = (string)pFeature.get_Value(fieldIndex);108 109 if (field_NAME == DistinctNameValue[i])110 {111 if (bSwitch)112 {113 //将当前name字段相同的feature中的第一个feature传给pFeatureFirst114 pFeatureFirst = pFeature;115 pGeometryFirst = pFeature.Shape;116 pTopOperatorFirst = (ITopologicalOperator2) pGeometryFirst;117 pTopOperatorFirst.IsKnownSimple_2 = false;118 pTopOperatorFirst.Simplify();119 pGeometryFirst.SnapToSpatialReference();120 bSwitch = false;121 //break;122 }123 else124 {125 //geometrySecond = pFeature.ShapeCopy;126 geometrySecond = pFeature.Shape;127 Geometrybag.AddGeometry(geometrySecond, ref Missing, ref Missing);128 //toMergePolylineList.Add(polyline);129 } 130 }131 //DisconnPolylineList.Add(polyline);132 }133 pFeature = pFeatCursor.NextFeature();134 }135 IEnumGeometry tEnumGeometry = (IEnumGeometry)Geometrybag;136 //IGeometry mergeGeomery = null;137 pTopOperatorFirst.ConstructUnion(tEnumGeometry);138 139 pTopOperatorFirst.IsKnownSimple_2 = false;140 pTopOperatorFirst.Simplify();141 pFeatureFirst.Shape = pGeometryFirst;142 //pFeatureFirst.Store();143 IFeatureLayer featureLayer2 = map.get_Layer(1) as IFeatureLayer;144 IFeatureClass featureClass2 = featureLayer2.FeatureClass;145 AddPolyline(featureClass2, pGeometryFirst);146 }147 //workspaceEdit.StopEditOperation();148 //workspaceEdit.StopEditing(true); 149 }150 private void AddPolyline(IFeatureClass pFeatureClass, IGeometry polyline)151 {152 IFeatureBuffer featureBuffer = pFeatureClass.CreateFeatureBuffer();153 IFeatureCursor featureCursor;154 featureCursor = pFeatureClass.Insert(true);155 featureBuffer.Shape = polyline;156 featureCursor.InsertFeature(featureBuffer);157 featureCursor.Flush();158 System.Runtime.InteropServices.Marshal.ReleaseComObject(featureCursor);159 }160 public List
removeSameString(ArrayList stringArray)161 {162 //List用于存储从数组里取出来的不相同的元素163 List
distinctString = new List
();164 foreach (string eachString in stringArray)165 {166 if (!distinctString.Contains(eachString))167 distinctString.Add(eachString);168 }169 return distinctString;170 }171 172 protected override void OnUpdate()173 {174 Enabled = ArcMap.Application != null;175 }176 }177 178 }

    5.总结

      这个插件还有一些不足的地方,如不是从线要素首尾点相邻的角度寻找相邻点(这种方法存在判断三条线要素交叉而形成的节点的判断和是否进行合并的问题和难点),在下一篇随笔里面会介绍从纯几何学的角度实现线要素的连接的实现。

-------------------------------------------------------------------------------------------------------------------------

 本文系作者原创文章,欢迎转载,但必须注明出处,否则将追究相关法律责任!

 

转载于:https://www.cnblogs.com/GISQZC/p/5285372.html

你可能感兴趣的文章
AC自动机
查看>>
LCA算法解析-Tarjan&倍增&RMQ
查看>>
BZOJ4241 历史研究 莫队 堆
查看>>
BZOJ1191 [HNOI2006]超级英雄Hero 二分图匹配
查看>>
进制转换2016/3/5
查看>>
片段缓存
查看>>
【转】浅谈JavaScript中forEach与each
查看>>
linux指定目录安装软件后,程序找不到共享库问题
查看>>
php连接、操作mysql数据库
查看>>
hello world!
查看>>
hdu1246
查看>>
android开发中如何结束所有的activity
查看>>
面向对象的一个例子
查看>>
公交线路查询接口文档
查看>>
一个类似抖音 APP 拍摄按钮效果的控件
查看>>
SRM 582 Div II Level One: SemiPerfectSquare
查看>>
Matlab,Visio等生成的图片的字体嵌入问题解决方法
查看>>
hdu 2896 病毒侵袭 AC自动机 基础题
查看>>
新版博客专家实名制处理结果公示:未提供实名的专家将取消专家称号
查看>>
CEF3研究(二)
查看>>