Skip to content

Commit 81c8630

Browse files
Adding Feature class that has typed Geometry property
1 parent 0d43f01 commit 81c8630

6 files changed

Lines changed: 129 additions & 15 deletions

File tree

src/GeoJSON.Net.Tests/Feature/FeatureTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@ public void Can_Deserialize_Point_Feature()
2424
Assert.IsTrue(feature.Properties.ContainsKey("name"));
2525
Assert.AreEqual(feature.Properties["name"], "Dinagat Islands");
2626

27-
Assert.AreEqual(feature.Id, "test-id");
27+
Assert.AreEqual("test-id", feature.Id);
2828

29-
Assert.AreEqual(feature.Geometry.Type, GeoJSONObjectType.Point);
29+
Assert.AreEqual(GeoJSONObjectType.Point, feature.Geometry.Type);
3030
}
3131

3232
[Test]
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
using System.Linq;
2+
using GeoJSON.Net.Geometry;
3+
using Newtonsoft.Json;
4+
using NUnit.Framework;
5+
6+
namespace GeoJSON.Net.Tests.Feature
7+
{
8+
[TestFixture]
9+
internal class GenericFeatureTests : TestBase
10+
{
11+
[Test]
12+
public void Can_Deserialize_Point_Feature()
13+
{
14+
var json = GetExpectedJson();
15+
16+
var feature = JsonConvert.DeserializeObject<Net.Feature.Feature<Point>>(json);
17+
18+
Assert.IsNotNull(feature);
19+
Assert.IsNotNull(feature.Properties);
20+
Assert.IsTrue(feature.Properties.Any());
21+
22+
Assert.IsTrue(feature.Properties.ContainsKey("name"));
23+
Assert.AreEqual("Dinagat Islands", feature.Properties["name"]);
24+
25+
Assert.AreEqual("test-id", feature.Id);
26+
27+
Assert.AreEqual(GeoJSONObjectType.Point, feature.Geometry.Type);
28+
Assert.AreEqual(125.6, feature.Geometry.Coordinates.Longitude);
29+
Assert.AreEqual(10.1, feature.Geometry.Coordinates.Latitude);
30+
Assert.AreEqual(456, feature.Geometry.Coordinates.Altitude);
31+
}
32+
33+
[Test]
34+
public void Can_Deserialize_LineString_Feature()
35+
{
36+
var json = GetExpectedJson();
37+
38+
var feature = JsonConvert.DeserializeObject<Net.Feature.Feature<LineString>>(json);
39+
40+
Assert.IsNotNull(feature);
41+
Assert.IsNotNull(feature.Properties);
42+
Assert.IsTrue(feature.Properties.Any());
43+
44+
Assert.IsTrue(feature.Properties.ContainsKey("name"));
45+
Assert.AreEqual("Dinagat Islands", feature.Properties["name"]);
46+
47+
Assert.AreEqual("test-id", feature.Id);
48+
49+
Assert.AreEqual(GeoJSONObjectType.LineString, feature.Geometry.Type);
50+
51+
Assert.AreEqual(4, feature.Geometry.Coordinates.Count);
52+
53+
//Assert.AreEqual(125.6, feature.Geometry.Coordinates.Longitude);
54+
//Assert.AreEqual(10.1, feature.Geometry.Coordinates.Latitude);
55+
//Assert.AreEqual(456, feature.Geometry.Coordinates.Altitude);
56+
}
57+
}
58+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"type": "Feature",
3+
"id": "test-id",
4+
"geometry": {
5+
"coordinates": [
6+
[ 4.8892593383789062, 52.370725881211314 ],
7+
[ 4.8952674865722656, 52.3711451105601 ],
8+
[ 4.8920917510986328, 52.369310952782627 ],
9+
[ 4.8892593383789062, 52.370725881211314 ]
10+
],
11+
"type": "LineString"
12+
},
13+
"properties": {
14+
"name": "Dinagat Islands"
15+
}
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
{
2+
"type": "Feature",
3+
"id" : "test-id",
4+
"geometry": {
5+
"type": "Point",
6+
"coordinates": [125.6, 10.1, 456]
7+
},
8+
"properties": {
9+
"name": "Dinagat Islands"
10+
}
11+
}

src/GeoJSON.Net.Tests/GeoJSON.Net.Tests.csproj

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@
5151
<Compile Include="CoordinateReferenceSystem\UnspecifiedCRSTests.cs" />
5252
<Compile Include="Feature\FeatureCollectionTests.cs" />
5353
<Compile Include="Feature\FeatureTests.cs" />
54+
<Compile Include="Feature\GenericFeatureTests.cs" />
5455
<Compile Include="Feature\TestFeatureEnum.cs" />
5556
<Compile Include="Feature\TestFeatureProperty.cs" />
5657
<Compile Include="Geometry\GeometryTests.cs" />
@@ -120,6 +121,12 @@
120121
<Content Include="Geometry\MultiPointTests_Can_Serialize.json">
121122
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
122123
</Content>
124+
<Content Include="Feature\GenericFeatureTests_Can_Deserialize_Point_Feature.json">
125+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
126+
</Content>
127+
<Content Include="Feature\GenericFeatureTests_Can_Deserialize_LineString_Feature.json">
128+
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
129+
</Content>
123130
<None Include="packages.config" />
124131
</ItemGroup>
125132
<ItemGroup>

src/GeoJSON.Net/Feature/Feature.cs

Lines changed: 35 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,37 @@ namespace GeoJSON.Net.Feature
1818
/// <remarks>
1919
/// See https://tools.ietf.org/html/rfc7946#section-3.2
2020
/// </remarks>
21-
public class Feature : GeoJSONObject, IEqualityComparer<Feature>, IEquatable<Feature>
21+
public class Feature : Feature<IGeometryObject>
2222
{
23+
[JsonConstructor]
24+
public Feature(IGeometryObject geometry, Dictionary<string, object> properties = null, string id = null)
25+
: base(geometry, properties, id)
26+
{
27+
}
28+
29+
public Feature(IGeometryObject geometry, object properties, string id = null)
30+
: base(geometry, properties, id)
31+
{
32+
}
33+
}
34+
35+
36+
/// <summary>
37+
/// Typed GeoJSON Feature class
38+
/// </summary>
39+
/// <remarks>Returns correctly typed Geometry property</remarks>
40+
/// <typeparam name="TGeometry"></typeparam>
41+
public class Feature<TGeometry> : GeoJSONObject, IEqualityComparer<Feature<TGeometry>>, IEquatable<Feature<TGeometry>> where TGeometry : IGeometryObject
42+
{
43+
2344
/// <summary>
2445
/// Initializes a new instance of the <see cref="Feature" /> class.
2546
/// </summary>
2647
/// <param name="geometry">The Geometry Object.</param>
2748
/// <param name="properties">The properties.</param>
2849
/// <param name="id">The (optional) identifier.</param>
2950
[JsonConstructor]
30-
public Feature(IGeometryObject geometry, Dictionary<string, object> properties = null, string id = null)
51+
public Feature(TGeometry geometry, Dictionary<string, object> properties = null, string id = null)
3152
{
3253
Geometry = geometry;
3354
Properties = properties ?? new Dictionary<string, object>();
@@ -45,7 +66,7 @@ public Feature(IGeometryObject geometry, Dictionary<string, object> properties =
4566
/// properties
4667
/// </param>
4768
/// <param name="id">The (optional) identifier.</param>
48-
public Feature(IGeometryObject geometry, object properties, string id = null)
69+
public Feature(TGeometry geometry, object properties, string id = null)
4970
{
5071
Geometry = geometry;
5172
Id = id;
@@ -79,7 +100,7 @@ public Feature(IGeometryObject geometry, object properties, string id = null)
79100
/// </value>
80101
[JsonProperty(PropertyName = "geometry", Required = Required.AllowNull)]
81102
[JsonConverter(typeof(GeometryConverter))]
82-
public IGeometryObject Geometry { get; private set; }
103+
public TGeometry Geometry { get; private set; }
83104

84105
/// <summary>
85106
/// Gets or sets the id.
@@ -95,40 +116,41 @@ public Feature(IGeometryObject geometry, object properties, string id = null)
95116
[JsonProperty(PropertyName = "properties", Required = Required.AllowNull)]
96117
public Dictionary<string, object> Properties { get; private set; }
97118

98-
#region IEqualityComparer, IEquatable
119+
120+
#region IEqualityComparer, IEquatable
99121

100122
/// <summary>
101123
/// Determines whether the specified object is equal to the current object
102124
/// </summary>
103125
public override bool Equals(object obj)
104126
{
105-
return Equals(this, obj as Feature);
127+
return Equals(this, obj as Feature<TGeometry>);
106128
}
107129

108130
/// <summary>
109131
/// Determines whether the specified object is equal to the current object
110132
/// </summary>
111-
public bool Equals(Feature other)
133+
public bool Equals(Feature<TGeometry> other)
112134
{
113135
return Equals(this, other);
114136
}
115137

116138
/// <summary>
117139
/// Determines whether the specified object instances are considered equal
118140
/// </summary>
119-
public bool Equals(Feature left, Feature right)
141+
public bool Equals(Feature<TGeometry> left, Feature<TGeometry> right)
120142
{
121143
if (base.Equals(left, right))
122144
{
123-
return GetHashCode(left) == GetHashCode(right);
145+
return GetHashCode(left) == GetHashCode(right);
124146
}
125147
return false;
126148
}
127149

128150
/// <summary>
129151
/// Determines whether the specified object instances are considered equal
130152
/// </summary>
131-
public static bool operator ==(Feature left, Feature right)
153+
public static bool operator ==(Feature<TGeometry> left, Feature<TGeometry> right)
132154
{
133155
if (ReferenceEquals(left, right))
134156
{
@@ -144,7 +166,7 @@ public bool Equals(Feature left, Feature right)
144166
/// <summary>
145167
/// Determines whether the specified object instances are not considered equal
146168
/// </summary>
147-
public static bool operator !=(Feature left, Feature right)
169+
public static bool operator !=(Feature<TGeometry> left, Feature<TGeometry> right)
148170
{
149171
return !(left == right);
150172
}
@@ -165,12 +187,12 @@ public override int GetHashCode()
165187
/// <summary>
166188
/// Returns the hash code for the specified object
167189
/// </summary>
168-
public int GetHashCode(Feature obj)
190+
public int GetHashCode(Feature<TGeometry> obj)
169191
{
170192
return obj.GetHashCode();
171193
}
172194

173-
#endregion
195+
#endregion
174196

175197
}
176198
}

0 commit comments

Comments
 (0)