【ArcGIS Pro二次开发】(43):线闭合

当我们需要将多段线【polyline】转为面【polygon】的时候,必须保证线是闭合的,不然是无法生成面的,如下图:

【ArcGIS Pro二次开发】(43):线闭合_第1张图片

如果cad线段,可以在属性里将闭合选项设置为是,实现线的闭合:

【ArcGIS Pro二次开发】(43):线闭合_第2张图片

但如果是在ArcGIS Pro里处理,则没有方便的方法(或许有但我没找到),于是便做了这个工具。


一、要实现的功能

【ArcGIS Pro二次开发】(43):线闭合_第3张图片

如上图所示,选择一个线要素【需注意必须是数据库文件,不能是cad文件】,右键点击,在弹出的菜单中点击【线闭合】按钮即可。

执行结果如下:

【ArcGIS Pro二次开发】(43):线闭合_第4张图片

可以看到,3个未封闭的线已经闭合了,后续可以用【要素转面】工具将其转为面。


二、实现流程

涉及要素编辑,就按流程建立编辑操作,并打开要素图层,逐行遍历,获取要素,这些都是常规操作。

            // 获取要素图层的编辑操作
            var editOperation = new EditOperation();
            using (RowCursor rowCursor = featureLayer.Search())
            {
                while (rowCursor.MoveNext())
                {
                    using (Feature feature = rowCursor.Current as Feature)      // 获取要素
                    {
                        // TODO…………
                    }
                }
            }
            // 执行编辑
            editOperation.Execute();

重点是上面【TODO】里的内容。

首先要判断线要素是否闭合,已闭合的就不再处理,只处理没闭合的。

这里通过提取线的首末点,如果首末点的坐标一致,则说明是闭合的,否则就是不闭合。

// 获取要素的几何对象
Polyline polyline = feature.GetShape() as Polyline;
// 获取线要素的起点和终点
MapPoint start_point = polyline.Points.First();
MapPoint end_point = polyline.Points.Last();
// 如果起始点和终止点的坐标不同,即线不闭合,则进行线闭合操作
if (!start_point.Coordinate2D.Equals(end_point.Coordinate2D))
{
  // TODO
}

找出未闭合的线后,将它的点集合提取出来,将第一个点复制到点集合的末尾,这样点集合就形成一个闭环,然后重新创建要素即可。

List pts = new List();
// 将第一个部分闭合
foreach (var part in polyline.Points)
{
    pts.Add(part.Coordinate2D);
}
pts.Add(start_point.Coordinate2D);
// 创建 PolylineBuilder 对象并闭合线要素
var builder = new PolylineBuilder(pts);
// 获取闭合后的几何
var closedGeometry = builder.ToGeometry();
// 设置要素的几何
feature.SetShape(closedGeometry);

以上便实现了此工具的功能。


三、工程文件分享

 最后,放上工程文件的链接:

CloseLinehttps://pan.baidu.com/s/1x-EI_vNKgt4M9wZ8y9FEDg?pwd=iqp2

PS:可以直接点击...bin\Debug\net6.0-windows\下的.esriAddinX文件直接安装。

 

你可能感兴趣的:(ArcGIS,Pro,SDK,ArcGIS,c#,二次开发,arcgis,pro,sdk,arcgis,线闭合)