using System; using MbUnit.Framework; using System.IO; using Jayrock.Json; using GeoAPI.Geometries; using GisSharpBlog.NetTopologySuite.Features; using System.Collections.Generic; namespace GeoJSON { /// /// A for the class. /// [TestFixture] [TestsOn(typeof(GeoJSONReader))] public class GeoJSONReaderTest { #region Fields, SetUp and TearDown private GeoJSONReader target = null; /// /// Sets up the fixture /// [SetUp] public void SetUp() { this.target = new GeoJSONReader(); } /// /// Cleans up the fixture /// [TearDown] public void TearDown() { IDisposable disposable = this.target as IDisposable; if (disposable!=null) disposable.Dispose(); } #endregion #region Test cases [Test] public void GeoJSONReader_Coordinate_Read_Test() { StringWriter writer = new StringWriter(); ICoordinate point = new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(12, 34); GeoJSONWriter.Write(point, writer); string geoJSON = writer.ToString(); point = new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(); StringReader sr = new StringReader(geoJSON); GeoJSONReader.Read(ref point, sr); Assert.AreEqual(point.X, 12, "X values do not match"); Assert.AreEqual(point.Y, 34, "Y values do not match"); Assert.AreEqual(point.Z, double.NaN, "Z values do not match"); } [Test] public void GeoJSONReader_Coordinates_Read_Test() { StringWriter writer = new StringWriter(); ICoordinate[] coordinates = new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(12, 34), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(1, 2, 3 ) }; GeoJSONWriter.Write(coordinates, writer); string geoJSON = writer.ToString(); coordinates = new ICoordinate[] {}; StringReader sr = new StringReader(geoJSON); GeoJSONReader.Read(ref coordinates, sr); Assert.AreEqual(coordinates.Length, 2, "The length does not match"); Assert.AreEqual(coordinates[0].X, 12, "X values do not match"); Assert.AreEqual(coordinates[0].Y, 34, "Y values do not match"); Assert.AreEqual(coordinates[0].Z, double.NaN, "Z values do not match"); Assert.AreEqual(coordinates[1].X, 1, "X values do not match"); Assert.AreEqual(coordinates[1].Y, 2, "Y values do not match"); Assert.AreEqual(coordinates[1].Z, 3, "Z values do not match"); } [Test] public void GeoJSONReader_Point_Read_Test() { StringWriter writer = new StringWriter(); IPoint point = new GisSharpBlog.NetTopologySuite.Geometries.Point(12, 34); GeoJSONWriter.Write(point, writer); string geoJSON = writer.ToString(); point = new GisSharpBlog.NetTopologySuite.Geometries.Point(double.NaN, double.NaN, double.NaN); StringReader sr = new StringReader(geoJSON); point = (IPoint) GeoJSONReader.Read(sr); Assert.AreEqual(point.X, 12, "X values do not match"); Assert.AreEqual(point.Y, 34, "Y values do not match"); Assert.AreEqual(point.Z, double.NaN, "Z values do not match"); } [Test] public void GeoJSONReader_LineString_Read_Test() { StringWriter writer = new StringWriter(); ICoordinate[] coordinates = new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(12, 34), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(1, 2, 3) }; ILineString line = new GisSharpBlog.NetTopologySuite.Geometries.LineString(coordinates); GeoJSONWriter.Write(line, writer); string geoJSON = writer.ToString(); coordinates = new ICoordinate[] { }; line = new GisSharpBlog.NetTopologySuite.Geometries.LineString(coordinates); StringReader sr = new StringReader(geoJSON); line = (ILineString) GeoJSONReader.Read(sr); Assert.IsNotNull(line, "Unable to read line"); Assert.AreEqual(line.Coordinates.Length, 2, "The length does not match"); Assert.AreEqual(line.Coordinates[0].X, 12, "X values do not match"); Assert.AreEqual(line.Coordinates[0].Y, 34, "Y values do not match"); Assert.AreEqual(line.Coordinates[0].Z, double.NaN, "Z values do not match"); Assert.AreEqual(line.Coordinates[1].X, 1, "X values do not match"); Assert.AreEqual(line.Coordinates[1].Y, 2, "Y values do not match"); Assert.AreEqual(line.Coordinates[1].Z, 3, "Z values do not match"); } [Test] public void GeoJSONReader_Polygon_Read_Test() { StringWriter writer = new StringWriter(); ILinearRing ring1 = new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 1.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0) }); ILinearRing ring2 = new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.2), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.8, 0.2), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.8), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.2) }); IPolygon area = new GisSharpBlog.NetTopologySuite.Geometries.Polygon(ring1, new ILinearRing[] { ring2 }); GeoJSONWriter.Write(area, writer); string geoJSON = writer.ToString(); ring1 = new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { }); ring2 = new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { }); area = new GisSharpBlog.NetTopologySuite.Geometries.Polygon(ring1, new ILinearRing[] { ring2 }); StringReader sr = new StringReader(geoJSON); area = (IPolygon) GeoJSONReader.Read(sr); Assert.IsNotNull(area, "Unable to read polygon"); Assert.AreEqual(area.Shell.Coordinates.Length, 4, "Error reading outer shell"); Assert.AreEqual(area.Holes.Length, 1, "Number of holes not read properly"); Assert.AreEqual(area.Holes[0].Coordinates.Length, 4, "Error reading first hole."); } [Test] public void GeoJSONReader_MultiPoint_Read_Test() { StringWriter writer = new StringWriter(); IMultiPoint points = new GisSharpBlog.NetTopologySuite.Geometries.MultiPoint(new IPoint[] { new GisSharpBlog.NetTopologySuite.Geometries.Point(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Point(101.1, 1.0) }); GeoJSONWriter.Write(points, writer); string geoJSON = writer.ToString(); StringReader sr = new StringReader(geoJSON); points = new GisSharpBlog.NetTopologySuite.Geometries.MultiPoint(new IPoint[] { }); points = (IMultiPoint) GeoJSONReader.Read(sr); Assert.IsNotNull(points, "unable to read multi point"); Assert.AreEqual(points.Coordinates.Length, 2, "Length does not match"); } [Test] public void GeoJSONReader_MultiLineString_Read_Test() { StringWriter writer = new StringWriter(); ILineString line1 = new GisSharpBlog.NetTopologySuite.Geometries.LineString(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 1.0) }); ILineString line2 = new GisSharpBlog.NetTopologySuite.Geometries.LineString(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(102.0, 2.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(103.0, 3.0) }); IMultiLineString lines = new GisSharpBlog.NetTopologySuite.Geometries.MultiLineString(new ILineString[] { line1, line2 }); GeoJSONWriter.Write(lines, writer); string geoJSON = writer.ToString(); StringReader sr = new StringReader(geoJSON); lines = new GisSharpBlog.NetTopologySuite.Geometries.MultiLineString(new ILineString[] { }); lines = (IMultiLineString) GeoJSONReader.Read(sr); Assert.IsNotNull(lines, "unable to read multi linestring"); Assert.AreEqual(lines.Geometries.Length, 2, "Length does not match"); Assert.AreEqual(lines.Geometries[0].Coordinates.Length, 2, "Line 1 Length does not match"); Assert.AreEqual(lines.Geometries[1].Coordinates.Length, 2, "Line 2 Length does not match"); } [Test] public void GeoJSONReader_MultiPolygon_Read_Test() { StringWriter writer = new StringWriter(); IPolygon area1 = new GisSharpBlog.NetTopologySuite.Geometries.Polygon( new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(102.0, 2.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(103.0, 2.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(103.0, 3.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(102.0, 2.0) })); ILinearRing ring1 = new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 1.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0) }); ILinearRing ring2 = new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.2), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.8, 0.2), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.8), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.2) }); IPolygon area2 = new GisSharpBlog.NetTopologySuite.Geometries.Polygon(ring1, new ILinearRing[] { ring2 }); IMultiPolygon areas = new GisSharpBlog.NetTopologySuite.Geometries.MultiPolygon(new IPolygon[] { area1, area2 }); GeoJSONWriter.Write(areas, writer); string geoJSON = writer.ToString(); StringReader sr = new StringReader(geoJSON); areas = new GisSharpBlog.NetTopologySuite.Geometries.MultiPolygon(new IPolygon[] { }); areas = (IMultiPolygon) GeoJSONReader.Read(sr); Assert.IsNotNull(areas, "unable to read multi polygon"); Assert.AreEqual(areas.Geometries.Length, 2, "Polygon count does not match"); Assert.AreEqual(((IPolygon) areas.Geometries[0]).Shell.Coordinates.Length, 4, "First polygon shell length does not match"); Assert.AreEqual(((IPolygon) areas.Geometries[1]).Shell.Coordinates.Length, 4, "Second polygon shell length does not match"); Assert.AreEqual(((IPolygon) areas.Geometries[1]).Holes.Length, 1, "Second polygon holes do not match"); Assert.AreEqual(((IPolygon) areas.Geometries[1]).Holes[0].Coordinates.Length, 4, "Secong polygon first hole length does not match"); } [Test] public void GeoJSONReader_GeometryCollection_Read_Test() { StringWriter writer = new StringWriter(); IPoint point = new GisSharpBlog.NetTopologySuite.Geometries.Point(12, 34); IMultiPoint points = new GisSharpBlog.NetTopologySuite.Geometries.MultiPoint(new IPoint[] { new GisSharpBlog.NetTopologySuite.Geometries.Point(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Point(101.1, 1.0) }); ILineString line = new GisSharpBlog.NetTopologySuite.Geometries.LineString(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(0, 0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(1, 1) }); ILineString line1 = new GisSharpBlog.NetTopologySuite.Geometries.LineString(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 1.0) }); ILineString line2 = new GisSharpBlog.NetTopologySuite.Geometries.LineString(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(102.0, 2.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(103.0, 3.0) }); IMultiLineString lines = new GisSharpBlog.NetTopologySuite.Geometries.MultiLineString( new ILineString[] { line1, line2 }); ILinearRing ring1 = new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 1.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0) }); ILinearRing ring2 = new GisSharpBlog.NetTopologySuite.Geometries.LinearRing(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.2), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.8, 0.2), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.8), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.2, 0.2) }); IPolygon area = new GisSharpBlog.NetTopologySuite.Geometries.Polygon(ring1, new ILinearRing[] { ring2 }); IGeometryCollection target = new GisSharpBlog.NetTopologySuite.Geometries.GeometryCollection( new IGeometry[] { point, points, line, lines, area }); GeoJSONWriter.Write(target, writer); writer.Flush(); string geoJSON = writer.ToString(); StringReader sr = new StringReader(geoJSON); target = null; target = (IGeometryCollection) GeoJSONReader.Read(sr); Assert.IsNotNull(target, "Unable to read geomtery collection"); Assert.AreEqual(target.Geometries.Length, 5, "Geometry count does not match"); } [Test] public void GeoJSONReader_Feature_Read_Test() { StringWriter writer = new StringWriter(); IAttributesTable table = new AttributesTable(); table.AddAttribute("hey", "there"); table.AddAttribute("hello", "world"); ILineString line = new GisSharpBlog.NetTopologySuite.Geometries.LineString(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 1.0) }); Feature feature = new Feature(line, table); GeoJSONWriter.Write(feature, writer); writer.Flush(); string geoJSON = writer.ToString(); StringReader sr = new StringReader(geoJSON); feature = null; feature = GeoJSONReader.ReadFeature(sr); Assert.IsNotNull(feature, "Unable to read feature"); Assert.AreEqual(feature.Geometry.GetType(), typeof(GisSharpBlog.NetTopologySuite.Geometries.LineString), "Geometry types do not match."); Assert.AreEqual(feature.Attributes.Count, 2, "Attributes count do not match"); } [Test] public void GeoJSONReader_AttributeTable_Read_Test() { StringWriter writer = new StringWriter(); IAttributesTable table = new AttributesTable(); table.AddAttribute("hey", "there"); table.AddAttribute("hello", "world"); GeoJSONWriter.Write(table, writer); writer.Flush(); string geoJSON = writer.ToString(); StringReader sr = new StringReader(geoJSON); table = null; table = GeoJSONReader.ReadAttributesTable(sr); Assert.IsNotNull(table, "Unable to read attribute table"); Assert.AreEqual(table.Count, 2, "Attributes count do not match"); } [Test] public void GeoJSONReader_FeatureCollection_Read_Test() { StringWriter writer = new StringWriter(); IAttributesTable table1 = new AttributesTable(); table1.AddAttribute("hey", "there"); table1.AddAttribute("hello", "world"); ILineString line1 = new GisSharpBlog.NetTopologySuite.Geometries.LineString(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(100.0, 0.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 1.0) }); Feature feature1 = new Feature(line1, table1); IAttributesTable table2 = new AttributesTable(); table2.AddAttribute("jeff", "germain"); table2.AddAttribute("mike", "juniper"); ILineString line2 = new GisSharpBlog.NetTopologySuite.Geometries.LineString(new ICoordinate[] { new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(101.0, 4.0), new GisSharpBlog.NetTopologySuite.Geometries.Coordinate(106.0, 9.0) }); Feature feature2 = new Feature(line2, table2); List list = new List(); list.Add(feature1); list.Add(feature2); GeoJSONWriter.Write(list, writer); writer.Flush(); string geoJSON = writer.ToString(); StringReader sr = new StringReader(geoJSON); IEnumerable results = GeoJSONReader.ReadFeatureCollection(sr); Assert.IsNotNull(results, "Unable to read feature collection"); } #endregion } }