ArcGIS Pro SDK (九)几何 13 多部件
文章目录
- [ArcGIS Pro SDK (九)几何 13 多部件](#ArcGIS Pro SDK (九)几何 13 多部件)
-
- [1 获取多部分要素的各个部分](#1 获取多部分要素的各个部分)
- [2 获取多边形的最外层环](#2 获取多边形的最外层环)
环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0
1 获取多部分要素的各个部分
csharp
public IEnumerable<Geometry> MultipartToSinglePart(Geometry inputGeometry)
{
// 保存输入几何的部分的列表
List<Geometry> singleParts = new List<Geometry>();
// 检查输入是否为空指针或几何是否为空
if (inputGeometry == null || inputGeometry.IsEmpty)
return singleParts;
// 根据几何类型,将各个部分/点单独添加到列表中
switch (inputGeometry.GeometryType)
{
case GeometryType.Envelope:
singleParts.Add(inputGeometry.Clone() as Envelope);
break;
case GeometryType.Multipatch:
singleParts.Add(inputGeometry.Clone() as Multipatch);
break;
case GeometryType.Multipoint:
var multiPoint = inputGeometry as Multipoint;
foreach (var point in multiPoint.Points)
{
// 将集合中的每个点作为独立的点添加到列表中
singleParts.Add(point);
}
break;
case GeometryType.Point:
singleParts.Add(inputGeometry.Clone() as MapPoint);
break;
case GeometryType.Polygon:
var polygon = inputGeometry as Polygon;
foreach (var polygonPart in polygon.Parts)
{
// 使用PolygonBuilderEx将线段转换为独立的多边形实例
singleParts.Add(PolygonBuilderEx.CreatePolygon(polygonPart));
}
break;
case GeometryType.Polyline:
var polyline = inputGeometry as Polyline;
foreach (var polylinePart in polyline.Parts)
{
// 使用PolylineBuilderEx将线段转换为独立的折线实例
singleParts.Add(PolylineBuilderEx.CreatePolyline(polylinePart));
}
break;
case GeometryType.Unknown:
break;
default:
break;
}
return singleParts;
}
2 获取多边形的最外层环
csharp
public Polygon GetOutermostRings(Polygon inputPolygon)
{
if (inputPolygon == null || inputPolygon.IsEmpty)
return null;
List<Polygon> internalRings = new List<Polygon>();
// 将多边形的各个部分分解成单独的几何列表
// 请参阅 "获取多部分要素的各个部分" 代码段中的 MultipartToSinglePart
var parts = MultipartToSinglePart(inputPolygon);
// 获取按面积排序的顺时针几何(面积 > 0)的枚举
var clockwiseParts = parts.Where(geom => ((Polygon)geom).Area > 0)
.OrderByDescending(geom => ((Polygon)geom).Area);
// 对于每个外环
foreach (var part in clockwiseParts)
{
// 将第一个(最大的)环添加到内部集合中
if (internalRings.Count == 0)
internalRings.Add(part as Polygon);
// 使用标志指示当前部分是否在已经选择的多边形内
bool isWithin = false;
foreach (var item in internalRings)
{
if (GeometryEngine.Instance.Within(part, item))
isWithin = true;
}
// 如果当前多边形不在内部集合的任何多边形内
// 则它是分离的,需要被添加
if (isWithin == false)
internalRings.Add(part as Polygon);
}
PolygonBuilderEx outerRings = new PolygonBuilderEx();
// 现在基于内部多边形集合组装一个新的多边形几何
foreach (var ring in internalRings)
{
outerRings.AddParts(ring.Parts);
}
// 返回最终的外环几何
return outerRings.ToGeometry();
}