Exemple #1
0
        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.");
            }
        }
Exemple #2
0
        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)));
        }
Exemple #3
0
        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));
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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));
        }
Exemple #6
0
        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));
        }
Exemple #7
0
        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);
        }
Exemple #8
0
        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.");
            }
        }
Exemple #9
0
        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));
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        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));
        }
Exemple #12
0
        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));
        }
Exemple #13
0
        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.");
                }
            }
        }
Exemple #14
0
        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));
        }
Exemple #15
0
        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.");
                }
            }
        }
Exemple #16
0
 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);
 }
Exemple #17
0
 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);
 }
Exemple #18
0
 private LineString ReadLineString(WkbBinaryReader reader, WkbDimensions dimensions)
 {
     return new LineString(ReadCoordinates(reader, dimensions));
 }
Exemple #19
0
 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);
 }
Exemple #20
0
 private LineString ReadLineString(WkbBinaryReader reader, WkbDimensions dimensions)
 {
     return(new LineString(ReadCoordinates(reader, dimensions)));
 }
Exemple #21
0
 private Point ReadPoint(WkbBinaryReader reader, WkbDimensions dimensions)
 {
     return(new Point(ReadCoordinate(reader, dimensions)));
 }
Exemple #22
0
 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);
 }
Exemple #23
0
 private Point ReadPoint(WkbBinaryReader reader, WkbDimensions dimensions)
 {
     return new Point(ReadCoordinate(reader, dimensions));
 }
Exemple #24
0
 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);
 }
Exemple #25
0
 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));
 }
Exemple #26
0
 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;
 }