当我们需要将多段线【polyline】转为面【polygon】的时候,必须保证线是闭合的,不然是无法生成面的,如下图:
如果cad线段,可以在属性里将闭合选项设置为是,实现线的闭合:
但如果是在ArcGIS Pro里处理,则没有方便的方法(或许有但我没找到),于是便做了这个工具。
一、要实现的功能
如上图所示,选择一个线要素【需注意必须是数据库文件,不能是cad文件】,右键点击,在弹出的菜单中点击【线闭合】按钮即可。
执行结果如下:
可以看到,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<Coordinate2D> pts = new List<Coordinate2D>();
// 将第一个部分闭合
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文件直接安装。