private IOgcGeometry ReadGeometry(WkbBinaryReader reader) { var type = reader.ReadUInt32(); var dimensions = WkbDimensions.XY; if (type > 1000) dimensions = WkbDimensions.XYZ; if (type > 2000) dimensions = WkbDimensions.XYM; if (type > 3000) dimensions = WkbDimensions.XYZM; var geometryType = (WkbGeometryType)((int)type % 1000); switch (geometryType) { case WkbGeometryType.Point: return ReadPoint(reader, dimensions); case WkbGeometryType.LineString: return ReadLineString(reader, dimensions); case WkbGeometryType.Triangle: return ReadTriangle(reader, dimensions); case WkbGeometryType.Polygon: return ReadPolygon(reader, dimensions); case WkbGeometryType.MultiPoint: return ReadMultiPoint(reader, dimensions); case WkbGeometryType.MultiLineString: return ReadMultiLineString(reader, dimensions); case WkbGeometryType.MultiPolygon: return ReadMultiPolygon(reader, dimensions); case WkbGeometryType.GeometryCollection: return ReadGeometryCollection(reader); default: throw new SerializationException("Unknown geometry type."); } }
private Polygon ReadTriangle(WkbBinaryReader reader, WkbDimensions dimensions) { var rings = ReadPolygonInner(reader, dimensions); if (rings.Count == 0) { return(new Triangle()); } return(new Triangle(rings.First(), rings.Skip(1))); }
private MultiLineString ReadMultiLineString(WkbBinaryReader reader, WkbDimensions dimensions) { var pointsCount = (int)reader.ReadUInt32(); var lineStrings = new List <LineString>(); for (var i = 0; i < pointsCount; i++) { lineStrings.Add(ReadLineString(reader, dimensions)); } return(new MultiLineString(lineStrings)); }
private List <LinearRing> ReadPolygonInner(WkbBinaryReader reader, WkbDimensions dimensions) { var result = new List <LinearRing>(); var ringsCount = (int)reader.ReadUInt32(); for (var i = 0; i < ringsCount; i++) { result.Add(new LinearRing(ReadCoordinates(reader, dimensions))); } return(result); }
private MultiPolygon ReadMultiPolygon(WkbBinaryReader reader, WkbDimensions dimensions) { var pointsCount = (int)reader.ReadUInt32(); var polygons = new List <Polygon>(); for (var i = 0; i < pointsCount; i++) { polygons.Add(ReadPolygon(reader, dimensions)); } return(new MultiPolygon(polygons)); }
private GeometryCollection ReadGeometryCollection(WkbBinaryReader reader) { var pointsCount = (int)reader.ReadUInt32(); var geometries = new List <IGeometry>(); for (var i = 0; i < pointsCount; i++) { geometries.Add(ReadGeometry(reader)); } return(new GeometryCollection(geometries)); }
private CoordinateSequence ReadCoordinates(WkbBinaryReader reader, WkbDimensions dimensions) { var pointCount = (int)reader.ReadUInt32(); var result = new List<Coordinate>(pointCount); for (var i = 0; i < pointCount; i++) { result.Add(ReadCoordinate(reader, dimensions)); } return new CoordinateSequence(result); }
private IGeometry ReadGeometry(WkbBinaryReader reader) { reader.ReadAndSetEncoding(); var type = reader.ReadUInt32(); var dimensions = WkbDimensions.XY; if (type > 1000) { dimensions = WkbDimensions.XYZ; } if (type > 2000) { dimensions = WkbDimensions.XYM; } if (type > 3000) { dimensions = WkbDimensions.XYZM; } var geometryType = (WkbGeometryType)((int)type % 1000); switch (geometryType) { case WkbGeometryType.Point: return(ReadPoint(reader, dimensions)); case WkbGeometryType.LineString: return(ReadLineString(reader, dimensions)); case WkbGeometryType.Triangle: return(ReadTriangle(reader, dimensions)); case WkbGeometryType.Polygon: return(ReadPolygon(reader, dimensions)); case WkbGeometryType.MultiPoint: return(ReadMultiPoint(reader, dimensions)); case WkbGeometryType.MultiLineString: return(ReadMultiLineString(reader, dimensions)); case WkbGeometryType.MultiPolygon: return(ReadMultiPolygon(reader, dimensions)); case WkbGeometryType.GeometryCollection: return(ReadGeometryCollection(reader)); default: throw new SerializationException("Unknown geometry type."); } }
private CoordinateSequence ReadCoordinates(WkbBinaryReader reader, WkbDimensions dimensions) { var pointCount = (int)reader.ReadUInt32(); var result = new List <Coordinate>(pointCount); for (var i = 0; i < pointCount; i++) { result.Add(ReadCoordinate(reader, dimensions)); } return(new CoordinateSequence(result)); }
private Coordinate ReadCoordinate(WkbBinaryReader reader, WkbDimensions dimensions) { var x = reader.ReadDouble(); var y = reader.ReadDouble(); var z = dimensions == WkbDimensions.XYZ || dimensions == WkbDimensions.XYZM ? reader.ReadDouble() : double.NaN; var m = dimensions == WkbDimensions.XYM || dimensions == WkbDimensions.XYZM ? reader.ReadDouble() : double.NaN; if (!double.IsNaN(z) && !double.IsNaN(m)) return new CoordinateZM(y, x, z, m); if (!double.IsNaN(z)) return new CoordinateZ(y, x, z); if (!double.IsNaN(m)) return new CoordinateM(y, x, m); return new Coordinate(y, x); }
private MultiPolygon ReadMultiPolygon(WkbBinaryReader reader, WkbDimensions dimensions) { var pointsCount = (int)reader.ReadUInt32(); var polygons = new List <Polygon>(); for (var i = 0; i < pointsCount; i++) { var polygon = ReadGeometry(reader) as Polygon; if (polygon != null) { polygons.Add(polygon); } else { throw new SerializationException("Geometry not a polygon."); } } return(new MultiPolygon(polygons)); }
private MultiLineString ReadMultiLineString(WkbBinaryReader reader, WkbDimensions dimensions) { var pointsCount = (int)reader.ReadUInt32(); var lineStrings = new List <LineString>(); for (var i = 0; i < pointsCount; i++) { var lineString = ReadGeometry(reader) as LineString; if (lineString != null) { lineStrings.Add(lineString); } else { throw new SerializationException("Geometry not a linestring."); } } return(new MultiLineString(lineStrings)); }
public IOgcGeometry Read(Stream stream) { if (stream == null) throw new ArgumentNullException("stream"); using (var reader = new WkbBinaryReader(stream)) { if (!reader.HasData) return null; try { return ReadGeometry(reader); } catch (EndOfStreamException) { throw new SerializationException("End of stream reached before end of valid WKB geometry."); } } }
private Coordinate ReadCoordinate(WkbBinaryReader reader, WkbDimensions dimensions) { var x = reader.ReadDouble(); var y = reader.ReadDouble(); var z = dimensions == WkbDimensions.XYZ || dimensions == WkbDimensions.XYZM ? reader.ReadDouble() : double.NaN; var m = dimensions == WkbDimensions.XYM || dimensions == WkbDimensions.XYZM ? reader.ReadDouble() : double.NaN; if (!double.IsNaN(z) && !double.IsNaN(m)) { return(new CoordinateZM(y, x, z, m)); } if (!double.IsNaN(z)) { return(new CoordinateZ(y, x, z)); } if (!double.IsNaN(m)) { return(new CoordinateM(y, x, m)); } return(new Coordinate(y, x)); }
public IOgcGeometry Read(Stream stream) { if (stream == null) { throw new ArgumentNullException("stream"); } using (var reader = new WkbBinaryReader(stream)) { if (!reader.HasData) { return(null); } try { return(ReadGeometry(reader)); } catch (EndOfStreamException) { throw new SerializationException("End of stream reached before end of valid WKB geometry."); } } }
private MultiLineString ReadMultiLineString(WkbBinaryReader reader, WkbDimensions dimensions) { var pointsCount = (int)reader.ReadUInt32(); var lineStrings = new List<LineString>(); for (var i = 0; i < pointsCount; i++) { var lineString = ReadGeometry(reader) as LineString; if (lineString != null) lineStrings.Add(lineString); else throw new SerializationException("Geometry not a linestring."); } return new MultiLineString(lineStrings); }
private GeometryCollection ReadGeometryCollection(WkbBinaryReader reader) { var pointsCount = (int)reader.ReadUInt32(); var geometries = new List<IGeometry>(); for (var i = 0; i < pointsCount; i++) geometries.Add(ReadGeometry(reader)); return new GeometryCollection(geometries); }
private LineString ReadLineString(WkbBinaryReader reader, WkbDimensions dimensions) { return new LineString(ReadCoordinates(reader, dimensions)); }
private MultiLineString ReadMultiLineString(WkbBinaryReader reader, WkbDimensions dimensions) { var pointsCount = (int)reader.ReadUInt32(); var lineStrings = new List<LineString>(); for (var i = 0; i < pointsCount; i++) lineStrings.Add(ReadLineString(reader, dimensions)); return new MultiLineString(lineStrings); }
private LineString ReadLineString(WkbBinaryReader reader, WkbDimensions dimensions) { return(new LineString(ReadCoordinates(reader, dimensions))); }
private Point ReadPoint(WkbBinaryReader reader, WkbDimensions dimensions) { return(new Point(ReadCoordinate(reader, dimensions))); }
private MultiPolygon ReadMultiPolygon(WkbBinaryReader reader, WkbDimensions dimensions) { var pointsCount = (int)reader.ReadUInt32(); var polygons = new List<Polygon>(); for (var i = 0; i < pointsCount; i++) polygons.Add(ReadPolygon(reader, dimensions)); return new MultiPolygon(polygons); }
private Point ReadPoint(WkbBinaryReader reader, WkbDimensions dimensions) { return new Point(ReadCoordinate(reader, dimensions)); }
private MultiPolygon ReadMultiPolygon(WkbBinaryReader reader, WkbDimensions dimensions) { var pointsCount = (int)reader.ReadUInt32(); var polygons = new List<Polygon>(); for (var i = 0; i < pointsCount; i++) { var polygon = ReadGeometry(reader) as Polygon; if (polygon != null) polygons.Add(polygon); else throw new SerializationException("Geometry not a polygon."); } return new MultiPolygon(polygons); }
private Polygon ReadTriangle(WkbBinaryReader reader, WkbDimensions dimensions) { var rings = ReadPolygonInner(reader, dimensions); if (rings.Count == 0) return new Triangle(); return new Triangle(rings.First(), rings.Skip(1)); }
private List<LinearRing> ReadPolygonInner(WkbBinaryReader reader, WkbDimensions dimensions) { var result = new List<LinearRing>(); var ringsCount = (int)reader.ReadUInt32(); for (var i = 0; i < ringsCount; i++) result.Add(new LinearRing(ReadCoordinates(reader, dimensions))); return result; }