예제 #1
0
 public ForceMultiGeometryTrue()
 {
     _sut = new GeometryGeoJsonConverter(new GeoJsonSerializerSettings
     {
         ForceMultiGeometry = true
     });
 }
        public void PolygonReturnsPolygon(GeometryGeoJsonConverter sut, ILine line, IPoint point, ISpatialReference spatialReference)
        {
            var polygon = (IGeometry) new PolygonClass();

            polygon.SpatialReference = spatialReference;

            var ring = (IPointCollection) new RingClass();

            ring.AddPoint(line.FromPoint);
            ring.AddPoint(line.ToPoint);
            ring.AddPoint(point);
            ring.AddPoint(line.FromPoint);

            ((IGeometryCollection)polygon).AddGeometry((IGeometry)ring);

            var actual   = JsonConvert.SerializeObject(polygon, Formatting.Indented, sut);
            var expected = $@"{{
  ""type"": ""Polygon"",
  ""coordinates"": [
    [{line.FromPoint.X.ToJsonString()}, {line.FromPoint.Y.ToJsonString()}],
    [{line.ToPoint.X.ToJsonString()}, {line.ToPoint.Y.ToJsonString()}],
    [{point.X.ToJsonString()}, {point.Y.ToJsonString()}],
    [{line.FromPoint.X.ToJsonString()}, {line.FromPoint.Y.ToJsonString()}]
  ]
}}";

            JsonAssert.Equal(expected, actual);
        }
예제 #3
0
        public void LineReturnsLineString(GeometryGeoJsonConverter sut, ILine line, ISpatialReference spatialReference)
        {
            var polyline = (IGeometry) new PolylineClass();

            polyline.SpatialReference = spatialReference;

            var path = (ISegmentCollection) new PathClass();

            path.AddSegment((ISegment)line);

            ((IGeometryCollection)polyline).AddGeometry((IGeometry)path);

            var actual   = JsonConvert.SerializeObject(polyline, Formatting.Indented, sut);
            var expected = $@"{{
  ""type"": ""LineString"",
  ""coordinates"": [
    [
      {line.FromPoint.X.ToJsonString()},
      {line.FromPoint.Y.ToJsonString()}
    ],
    [
      {line.ToPoint.X.ToJsonString()},
      {line.ToPoint.Y.ToJsonString()}
    ]
  ]
}}";

            JsonAssert.Equal(expected, actual);
        }
        public void EmptyPointsAreRemoved(GeometryGeoJsonConverter sut, IMultipoint multiPoint, IPoint point1, IPoint point2, IPoint emptyPoint)
        {
            emptyPoint.SetEmpty();
            multiPoint.SetEmpty();
            ((IPointCollection)multiPoint).AddPoint(emptyPoint);
            ((IPointCollection)multiPoint).AddPoint(point1);
            ((IPointCollection)multiPoint).AddPoint(emptyPoint);
            ((IPointCollection)multiPoint).AddPoint(point2);
            ((IPointCollection)multiPoint).AddPoint(emptyPoint);

            var actual   = JsonConvert.SerializeObject(multiPoint, sut);
            var expected = $@"{{
  ""type"": ""MultiPoint"",
  ""coordinates"": [
    [
      {point1.X.ToJsonString()},
      {point1.Y.ToJsonString()}
    ],
    [
      {point2.X.ToJsonString()},
      {point2.Y.ToJsonString()}
    ]
  ]
}}";

            JsonAssert.Equal(expected, actual);
        }
예제 #5
0
        public void LineString3DReturnsPolyline3D(Type type, GeoJsonSerializerSettings serializerSettings, double x1, double y1, double z1, double x2, double y2, double z2)
        {
            serializerSettings.Dimensions = DimensionHandling.XYZ;
            var sut = new GeometryGeoJsonConverter(serializerSettings);

            var geoJson = $@"{{
  ""type"": ""LineString"",
  ""coordinates"": [
    [{x1.ToJsonString()}, {y1.ToJsonString()}, {z1.ToJsonString()}],
    [{x2.ToJsonString()}, {y2.ToJsonString()}, {z2.ToJsonString()}]
  ]
}}";

            var actual = (IPolyline)JsonConvert.DeserializeObject(geoJson, type, sut);

            Assert.Equal(x1, actual.FromPoint.X);
            Assert.Equal(y1, actual.FromPoint.Y);
            Assert.Equal(z1, actual.FromPoint.Z);

            Assert.Equal(x2, actual.ToPoint.X);
            Assert.Equal(y2, actual.ToPoint.Y);
            Assert.Equal(z2, actual.ToPoint.Z);

            Assert.True(((IZAware)actual).ZAware);
        }
예제 #6
0
        public void OnlyCurvesAreGeneralized(GeometryGeoJsonConverter sut, IPolyline polyline, ILine line, ILine otherLine, IPoint extensionPoint, IBezierCurve bezier)
        {
            // Create {otherLine} that is an extension to {line}.
            // This segment must not be simplified during the serialization.
            line.QueryPoint(esriSegmentExtension.esriExtendAtTo, line.Length + line.Length / 2, false, extensionPoint);
            otherLine.PutCoords(line.ToPoint, extensionPoint);

            // Prepare the actual test value.
            polyline.SetEmpty();

            var segments1 = (ISegmentCollection) new PathClass();

            segments1.AddSegment((ISegment)line);
            segments1.AddSegment((ISegment)otherLine);

            var segments2 = (ISegmentCollection) new PathClass();

            segments2.AddSegment((ISegment)bezier);

            ((IGeometryCollection)polyline).AddGeometry((IGeometry)segments1);
            ((IGeometryCollection)polyline).AddGeometry((IGeometry)segments2);

            var actual = JsonConvert.SerializeObject(polyline, Formatting.Indented, sut);

            // It must contain the "mid" point between line.FromPoint and otherLine.ToPoint.
            // If it is missing, the serialization merged the two segments even tho Simplify=false.
            JsonAssert.Contains($@"
[
  {otherLine.FromPoint.X.ToJsonString()},
  {otherLine.FromPoint.Y.ToJsonString()}
]", actual);
        }
예제 #7
0
 public SimplifyTrue()
 {
     _sut = new GeometryGeoJsonConverter(new GeoJsonSerializerSettings
     {
         Simplify = true
     });
 }
        public void EmptyReturnsNull(IPoint point, GeometryGeoJsonConverter sut)
        {
            point.SetEmpty();

            var actual = JsonConvert.SerializeObject(point, sut);

            Assert.Equal("null", actual);
        }
        public void NanYReturnsNull(IPoint point, GeometryGeoJsonConverter sut)
        {
            point.Y = double.NaN;

            var actual = JsonConvert.SerializeObject(point, sut);

            Assert.Equal("null", actual);
        }
예제 #10
0
        public void InvalidCoordinatesThrows(GeometryGeoJsonConverter sut)
        {
            var geoJson = @"{
  ""type"": ""Point"",
  ""coordinates"": ""wrong thing here""
}";

            Assert.Throws <JsonReaderException>(() => JsonConvert.DeserializeObject <IPoint>(geoJson, sut));
        }
예제 #11
0
        public void EmptyReturnsNull(GeometryGeoJsonConverter sut)
        {
            var polyline = (IPolyline) new PolylineClass();

            polyline.SetEmpty();

            var actual = JsonConvert.SerializeObject(polyline, sut);

            Assert.Equal("null", actual);
        }
예제 #12
0
        public void PathWithSinglePointReturnsNull(GeometryGeoJsonConverter sut, IPoint point)
        {
            var polylineWithoutToPoint = (IPolyline) new PolylineClass();

            polylineWithoutToPoint.FromPoint = point;

            var actual = JsonConvert.SerializeObject(polylineWithoutToPoint, Formatting.Indented, sut);

            JsonAssert.Equal("null", actual);
        }
        public void InfinityCoordsReturnsNull(IPoint point)
        {
            var sut = new GeometryGeoJsonConverter();

            point.Y = double.PositiveInfinity;

            var actual = JsonConvert.SerializeObject(point, sut);

            JsonAssert.Equal("null", actual);
        }
예제 #14
0
        public void BooleanCoordinatesValueReturns(string geoJson, GeometryGeoJsonConverter sut)
        {
            // Not sure what to do with boolean values.
            // --
            // The test is only there to document the current behavior.
            // If it breaks in the futur, we'll think how to manage it, but
            // it really is a dark and pretty limited edge case.
            var point = JsonConvert.DeserializeObject <IPoint>(geoJson, sut);

            Assert.Equal(1, point.X);
            Assert.Equal(0, point.Y);
        }
예제 #15
0
        public void Throws(GeometryGeoJsonConverter sut)
        {
            var geoJson = @"{
  ""type"": ""LineString"",
  ""coordinates"": [
    [100.0, 0.0],
    [101.0, 1.0]
  ]
}";

            Assert.Throws <JsonReaderException>(() => JsonConvert.DeserializeObject <IPoint>(geoJson, sut));
        }
예제 #16
0
        public void PointReturnsPoint(Type type, GeometryGeoJsonConverter sut, double x, double y)
        {
            var geoJson = $@"{{
  ""type"": ""Point"",
  ""coordinates"": [{x.ToJsonString()}, {y.ToJsonString()}]
}}";

            var actual = (IPoint)JsonConvert.DeserializeObject(geoJson, type, sut);

            Assert.Equal(x, actual.X);
            Assert.Equal(y, actual.Y);
        }
예제 #17
0
        public void TouchingPathsReturnsMultiLineString(GeometryGeoJsonConverter sut, ILine line, IPoint point, ISpatialReference spatialReference)
        {
            var path1 = (ISegmentCollection) new PathClass();

            path1.AddSegment((ISegment)line);

            var otherLine = (ILine) new LineClass();

            otherLine.FromPoint = line.ToPoint;
            otherLine.ToPoint   = point;

            var path2 = (ISegmentCollection) new PathClass();

            path2.AddSegment((ISegment)otherLine);

            var polyline = (IGeometryCollection) new PolylineClass();

            polyline.AddGeometry((IGeometry)path1);
            polyline.AddGeometry((IGeometry)path2);

            ((IGeometry)polyline).SpatialReference = spatialReference;

            var actual   = JsonConvert.SerializeObject(polyline, Formatting.Indented, sut);
            var expected = $@"{{
  ""type"": ""MultiLineString"",
  ""coordinates"": [
    [
      [
        {line.FromPoint.X.ToJsonString()},
        {line.FromPoint.Y.ToJsonString()}
      ],
      [
        {line.ToPoint.X.ToJsonString()},
        {line.ToPoint.Y.ToJsonString()}
      ]
    ],
    [
      [
        {otherLine.FromPoint.X.ToJsonString()},
        {otherLine.FromPoint.Y.ToJsonString()}
      ],
      [
        {otherLine.ToPoint.X.ToJsonString()},
        {otherLine.ToPoint.Y.ToJsonString()}
      ]
    ]
  ]
}}";

            JsonAssert.Equal(expected, actual);
        }
예제 #18
0
        public void SinglePositionArrayReturnsIncompletePolyline(GeometryGeoJsonConverter sut, double x1, double y1)
        {
            var geoJson = $@"{{
  ""type"": ""LineString"",
  ""coordinates"": [
    [{x1.ToJsonString()}, {y1.ToJsonString()}]
  ]
}}";

            var actual = JsonConvert.DeserializeObject <IPolyline>(geoJson, sut);

            Assert.False(actual.IsEmpty);
            Assert.Equal(1, ((IPointCollection)actual).PointCount);
        }
예제 #19
0
            public void PointReturnsEmpty(GeoJsonSerializerSettings serializerSettings, double x, double y)
            {
                serializerSettings.Simplify = true;
                var sut = new GeometryGeoJsonConverter(serializerSettings);

                var geoJson = $@"{{
  ""type"": ""Point"",
  ""coordinates"": [{x.ToJsonString()}, {y.ToJsonString()}]
}}";

                var actual = JsonConvert.DeserializeObject <IPolygon>(geoJson, sut);

                Assert.True(actual.IsEmpty);
            }
예제 #20
0
            public void NullToPointReturnsNull(GeoJsonSerializerSettings serializerSettings, IPoint point)
            {
                serializerSettings.Simplify = true;

                var sut = new GeometryGeoJsonConverter(serializerSettings);

                var invalidPolyline = (IPolyline) new PolylineClass();

                invalidPolyline.FromPoint = point;

                var actual = JsonConvert.SerializeObject(invalidPolyline, Formatting.Indented, sut);

                Assert.Equal("null", actual);
            }
예제 #21
0
            public void SinglePositionArrayReturnsEmpty(GeoJsonSerializerSettings serializerSettings, double x1, double y1)
            {
                serializerSettings.Simplify = true;
                var sut = new GeometryGeoJsonConverter(serializerSettings);

                var geoJson = $@"{{
  ""type"": ""LineString"",
  ""coordinates"": [
    [{x1.ToJsonString()}, {y1.ToJsonString()}]
  ]
}}";

                var actual = JsonConvert.DeserializeObject <IPolyline>(geoJson, sut);

                Assert.True(actual.IsEmpty);
            }
            public void PointReturnsMultipoint(GeoJsonSerializerSettings serializerSettings, double x, double y)
            {
                serializerSettings.Simplify = true;
                var sut = new GeometryGeoJsonConverter(serializerSettings);

                var geoJson = $@"{{
  ""type"": ""Point"",
  ""coordinates"": [{x.ToJsonString()}, {y.ToJsonString()}]
}}";

                var actual = (IPointCollection)JsonConvert.DeserializeObject <IMultipoint>(geoJson, sut);

                Assert.Equal(1, actual.PointCount);
                Assert.Equal(x, actual.Point[0].X);
                Assert.Equal(y, actual.Point[0].Y);
            }
        public void SinglePointReturnsPoint(GeometryGeoJsonConverter sut, IMultipoint multiPoint, IPoint point)
        {
            multiPoint.SetEmpty();
            ((IPointCollection)multiPoint).AddPoint(point);

            var actual   = JsonConvert.SerializeObject(multiPoint, sut);
            var expected = $@"{{
  ""type"": ""Point"",
  ""coordinates"": [
    {point.X.ToJsonString()},
    {point.Y.ToJsonString()}
  ]
}}";

            JsonAssert.Equal(expected, actual);
        }
예제 #24
0
            public void OverlappedSegmentIsRemoved(GeoJsonSerializerSettings serializerSettings, ILine line,
                                                   IPoint midPoint, IPoint extensionPoint, ISpatialReference spatialReference)
            {
                serializerSettings.Simplify = true;

                var sut = new GeometryGeoJsonConverter(serializerSettings);

                // Find the midpoint to create the FromPoint of the overlapped segment.
                line.QueryPoint(esriSegmentExtension.esriNoExtension, 0.5, true, midPoint);

                // Extend pass the endpoint to create to ToPoint of the overlapped segment.
                line.QueryPoint(esriSegmentExtension.esriExtendAtTo, line.Length + line.Length / 2, false,
                                extensionPoint);

                var overlappedLine = (ILine) new LineClass();

                overlappedLine.FromPoint = midPoint;
                overlappedLine.ToPoint   = extensionPoint;

                var path = (ISegmentCollection) new PathClass();

                path.AddSegment((ISegment)line);
                path.AddSegment((ISegment)overlappedLine);

                var polyline = (IGeometryCollection) new PolylineClass();

                polyline.AddGeometry((IGeometry)path);

                ((IGeometry)polyline).SpatialReference = spatialReference;

                var actual   = JsonConvert.SerializeObject(polyline, Formatting.Indented, sut);
                var expected = $@"{{
  ""type"": ""LineString"",
  ""coordinates"": [
    [
      {line.FromPoint.X.ToJsonString()},
      {line.FromPoint.Y.ToJsonString()}
    ],
    [
      {extensionPoint.X.ToJsonString()},
      {extensionPoint.Y.ToJsonString()}
    ]
  ]
}}";

                JsonAssert.Equal(expected, actual);
            }
        public void Point2DReturnsJson(IPoint point)
        {
            ((IZAware)point).ZAware = false;

            var sut = new GeometryGeoJsonConverter();

            var actual   = JsonConvert.SerializeObject(point, Formatting.Indented, sut);
            var expected = $@"{{
  ""type"": ""Point"",
  ""coordinates"": [
    {point.X.ToJsonString()},
    {point.Y.ToJsonString()}
  ]
}}";

            JsonAssert.Equal(expected, actual);
        }
예제 #26
0
        public void OneCompletePathWithManyIncompletePathsReturnLinestring(GeometryGeoJsonConverter sut, IPolyline polyline, ILine line, IPoint fromPoint)
        {
            var emptyPath = (IPath) new PathClass();

            var incompleteLine = (ILine) new LineClass();

            incompleteLine.FromPoint = fromPoint;
            var incompletePath = (IPath) new PathClass();

            ((ISegmentCollection)incompletePath).AddSegment((ISegment)incompleteLine);

            // Add some incomplete lines.
            polyline.SetEmpty();
            var pathCol = (IGeometryCollection)polyline;

            pathCol.AddGeometry(emptyPath);
            pathCol.AddGeometry(incompletePath);

            // Add a complete line.
            var completePath = (IPath) new PathClass();

            ((ISegmentCollection)completePath).AddSegment((ISegment)line);
            pathCol.AddGeometry(completePath);

            // Add some more incomplete lines.
            pathCol.AddGeometry((IGeometry)((IClone)emptyPath).Clone());
            pathCol.AddGeometry((IGeometry)((IClone)incompletePath).Clone());

            var actual   = JsonConvert.SerializeObject(polyline, Formatting.Indented, sut);
            var expected = $@"{{
  ""type"": ""LineString"",
  ""coordinates"": [
    [
      {line.FromPoint.X.ToJsonString()},
      {line.FromPoint.Y.ToJsonString()}
    ],
    [
      {line.ToPoint.X.ToJsonString()},
      {line.ToPoint.Y.ToJsonString()}
    ]
  ]
}}
";

            JsonAssert.Equal(expected, actual);
        }
예제 #27
0
        public void LineStringReturnsPolyline(Type type, GeometryGeoJsonConverter sut, double x1, double y1, double x2, double y2)
        {
            var geoJson = $@"{{
  ""type"": ""LineString"",
  ""coordinates"": [
    [{x1.ToJsonString()}, {y1.ToJsonString()}],
    [{x2.ToJsonString()}, {y2.ToJsonString()}]
  ]
}}";

            var actual = (IPolyline)JsonConvert.DeserializeObject(geoJson, type, sut);

            Assert.Equal(x1, actual.FromPoint.X);
            Assert.Equal(y1, actual.FromPoint.Y);

            Assert.Equal(x2, actual.ToPoint.X);
            Assert.Equal(y2, actual.ToPoint.Y);
        }
예제 #28
0
        public void ManyPathWithSinglePointsReturnsMultiPoint(GeometryGeoJsonConverter sut, IPolyline polyline, IPoint[] points)
        {
            polyline.SetEmpty();

            var collection = (IGeometryCollection)polyline;

            foreach (var point in points)
            {
                var path = (IPointCollection) new PathClass();
                path.AddPoint(point);

                collection.AddGeometry((IGeometry)path);
            }

            var actual   = JsonConvert.SerializeObject(polyline, Formatting.Indented, sut);
            var expected = "null";

            JsonAssert.Equal(expected, actual);
        }
        public void Point3DReturnsMultipoint3D(Type type, GeoJsonSerializerSettings serializerSettings, double x, double y, double z)
        {
            serializerSettings.Dimensions = DimensionHandling.XYZ;
            var sut = new GeometryGeoJsonConverter(serializerSettings);

            var geoJson = $@"{{
  ""type"": ""Point"",
  ""coordinates"": [{x.ToJsonString()}, {y.ToJsonString()}, {z.ToJsonString()}]
}}";

            var actual = (IPointCollection)JsonConvert.DeserializeObject(geoJson, type, sut);

            Assert.Equal(1, actual.PointCount);
            Assert.Equal(x, actual.Point[0].X);
            Assert.Equal(y, actual.Point[0].Y);
            Assert.Equal(z, actual.Point[0].Z);

            Assert.True(((IZAware)actual).ZAware);
        }
예제 #30
0
        public void PointReturnsDefaultZValue(Type type, double x, double y, double defaultZValue)
        {
            var sut = new GeometryGeoJsonConverter(new GeoJsonSerializerSettings
            {
                DefaultZValue = defaultZValue,
                Dimensions    = DimensionHandling.XYZ
            });

            var geoJson = $@"{{
  ""type"": ""Point"",
  ""coordinates"": [{x.ToJsonString()}, {y.ToJsonString()}]
}}";

            var actual = (IPoint)JsonConvert.DeserializeObject(geoJson, type, sut);

            Assert.Equal(x, actual.X);
            Assert.Equal(y, actual.Y);
            Assert.Equal(defaultZValue, actual.Z);
            Assert.True(((IZAware)actual).ZAware);
        }