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
}
}