ArcGIS Pro SDK (九)几何 13 多部件

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();
}
相关推荐
行走的GISer35 分钟前
三维场景数据接入清单:六类数据、两条来源
gis·三维可视化·倾斜摄影·3dtiles·天地图
web3d5204 小时前
打包后地图资源 404?publicPath 与静态路径排查
前端框架·gis
阿松爱学习5 小时前
【Unity开发】局部区域截图功能实现
unity·c#
zhanghaha13145 小时前
C# 系列教程_1 基础语法篇(面向新手系统教程)
开发语言·c#
昂好的day6 小时前
固高运动控制卡实战(下):点位运动与直线/圆弧插补 API 详解
开发语言·c#
淡海水10 小时前
08-02-优化-LINQ与函数式编程的GC代价
unity·c#·.netcore·linq·gc
sali-tec11 小时前
C# 基于OpenCv的视觉工作流-章114-视觉与http通讯
图像处理·人工智能·opencv·计算机视觉·c#
波力海苔夹心脆67511 小时前
C# 委托与事件详解:委托声明、Action/Func、多播、event 与 EventHandler 入门教程
开发语言·c#·.net·上位机·委托·事件
GISBox1 天前
倾斜摄影Web端落地全攻略:从OSGB格式到3DTiles的完整转换路径
gis·格式转换·倾斜摄影·3dtiles·osgb·gisbox·顶点压缩
He BianGu1 天前
【笔记】C# 中BindingFlags的详细作用
笔记·c#