-
-
Notifications
You must be signed in to change notification settings - Fork 17
Expand file tree
/
Copy pathPolygon.cs
More file actions
146 lines (128 loc) · 4.84 KB
/
Polygon.cs
File metadata and controls
146 lines (128 loc) · 4.84 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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
// Copyright © Joerg Battermann 2014, Matt Hunt 2017
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text.Json.Serialization;
using GeoJSON.Text.Converters;
namespace GeoJSON.Text.Geometry
{
/// <summary>
/// Defines the Polygon type.
/// Coordinates of a Polygon are a list of linear rings coordinate arrays. The first element in
/// the array represents the exterior ring. Any subsequent elements represent interior rings (or holes).
/// </summary>
/// <remarks>
/// See https://tools.ietf.org/html/rfc7946#section-3.1.6
/// </remarks>
public class Polygon : GeoJSONObject, IGeometryObject, IEqualityComparer<Polygon>, IEquatable<Polygon>
{
public Polygon()
{
}
/// <summary>
/// Initializes a new instance of the <see cref="Polygon" /> class.
/// </summary>
/// <param name="coordinates">
/// The linear rings with the first element in the array representing the exterior ring.
/// Any subsequent elements represent interior rings (or holes).
/// </param>
public Polygon(IEnumerable<LineString> coordinates)
{
Coordinates = new ReadOnlyCollection<LineString>(
coordinates?.ToArray() ?? throw new ArgumentNullException(nameof(coordinates)));
if (Coordinates.Any(linearRing => !linearRing.IsLinearRing()))
{
throw new ArgumentException("All elements must be closed LineStrings with 4 or more positions" +
" (see GeoJSON spec at 'https://tools.ietf.org/html/rfc7946#section-3.1.6').", nameof(coordinates));
}
}
/// <summary>
/// Initializes a new <see cref="Polygon" /> from a 3-d array of <see cref="double" />s
/// that matches the "coordinates" field in the JSON representation.
/// </summary>
//[JsonConstructor]
public Polygon(IEnumerable<IEnumerable<IEnumerable<double>>> coordinates)
: this(coordinates?.Select(line => new LineString(line))
?? throw new ArgumentNullException(nameof(coordinates)))
{
}
[JsonPropertyName("type")]
[JsonIgnore(Condition = JsonIgnoreCondition.Never)]
public override GeoJSONObjectType Type => GeoJSONObjectType.Polygon;
/// <summary>
/// Gets the list of linestrings defining this <see cref="Polygon" />.
/// </summary>
[JsonPropertyName("coordinates")]
[JsonConverter(typeof(LineStringEnumerableConverter))]
public ReadOnlyCollection<LineString> Coordinates { get; set; }
#region IEqualityComparer, IEquatable
/// <summary>
/// Determines whether the specified object is equal to the current object
/// </summary>
public override bool Equals(object obj)
{
return Equals(this, obj as Polygon);
}
/// <summary>
/// Determines whether the specified object is equal to the current object
/// </summary>
public bool Equals(Polygon other)
{
return Equals(this, other);
}
/// <summary>
/// Determines whether the specified object instances are considered equal
/// </summary>
public bool Equals(Polygon left, Polygon right)
{
if (base.Equals(left, right))
{
return left.Coordinates.SequenceEqual(right.Coordinates);
}
return false;
}
/// <summary>
/// Determines whether the specified object instances are considered equal
/// </summary>
public static bool operator ==(Polygon left, Polygon right)
{
if (ReferenceEquals(left, right))
{
return true;
}
if (ReferenceEquals(null, right))
{
return false;
}
return left != null && left.Equals(right);
}
/// <summary>
/// Determines whether the specified object instances are not considered equal
/// </summary>
public static bool operator !=(Polygon left, Polygon right)
{
return !(left == right);
}
/// <summary>
/// Returns the hash code for this instance
/// </summary>
public override int GetHashCode()
{
int hash = base.GetHashCode();
foreach (var item in Coordinates)
{
hash = (hash * 397) ^ item.GetHashCode();
}
return hash;
}
/// <summary>
/// Returns the hash code for the specified object
/// </summary>
public int GetHashCode(Polygon other)
{
return other.GetHashCode();
}
#endregion
}
}