PolygonConverter.cs 1.91 KB
using NetTopologySuite.Geometries;

namespace Rcs.Shared.Utils
{
    /// <summary>
    /// Polygon 与坐标点列表互转工具类
    /// @author zzy
    /// </summary>
    public static class PolygonConverter
    {
        /// <summary>
        /// Polygon 转坐标点列表
        /// </summary>
        public static List<(double X, double Y)>? ToPointList(Polygon? polygon)
        {
            if (polygon == null) return null;
            return polygon.ExteriorRing.Coordinates
                .Select(c => (c.X, c.Y))
                .ToList();
        }

        /// <summary>
        /// 坐标点列表转 Polygon(用于 AutoMapper 表达式树)
        /// </summary>
        public static Polygon? ToPolygonFromXY(IEnumerable<double[]>? points)
        {
            if (points == null) return null;
            var list = points.ToList();
            if (list.Count < 3) return null;

            var coords = list.Select(p => new Coordinate(p[0], p[1])).ToList();
            // 确保多边形闭合
            if (coords.First().X != coords.Last().X || coords.First().Y != coords.Last().Y)
                coords.Add(new Coordinate(coords.First().X, coords.First().Y));
            return new Polygon(new LinearRing(coords.ToArray()));
        }

        /// <summary>
        /// 坐标点列表转 Polygon
        /// </summary>
        public static Polygon? ToPolygon(IEnumerable<(double X, double Y)>? points)
        {
            if (points == null) return null;
            var list = points.ToList();
            if (list.Count < 3) return null;

            var coords = list.Select(p => new Coordinate(p.X, p.Y)).ToList();
            // 确保多边形闭合
            if (coords.First().X != coords.Last().X || coords.First().Y != coords.Last().Y)
                coords.Add(new Coordinate(coords.First().X, coords.First().Y));
            return new Polygon(new LinearRing(coords.ToArray()));
        }
    }
}