PolygonConverter.cs
1.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
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()));
}
}
}