/// <summary> /// Read a shapefile record. /// </summary> /// <param name="stream">Input stream.</param> public ShapeFileRecord ReadShapeFileRecord(Stream stream) { ShapeFileRecord record = new ShapeFileRecord(); // Record Header. record.RecordNumber = ShapeFile.ReadInt32_BE(stream); record.ContentLength = ShapeFile.ReadInt32_BE(stream); // Shape Type. record.ShapeType = ShapeFile.ReadInt32_LE(stream); // Read the shape geometry, depending on its type. switch (record.ShapeType) { case ( int )ShapeType.NullShape: // Do nothing. break; case ( int )ShapeType.Point: ShapeFile.ReadPoint(stream, record); break; case ( int )ShapeType.PolyLine: // PolyLine has exact same structure as Polygon in shapefile. ShapeFile.ReadPolygon(stream, record); break; case ( int )ShapeType.Polygon: ShapeFile.ReadPolygon(stream, record); break; case ( int )ShapeType.Multipoint: ShapeFile.ReadMultipoint(stream, record); break; default: { string msg = String.Format(System.Globalization.CultureInfo.InvariantCulture, "ShapeType {0} is not supported.", ( int )record.ShapeType); throw new NotSupportedException(msg); } } // Add the record to our internal list. this.records.Add(record); return(record); }
/// <summary> /// Read a shapefile MultiPoint record. /// </summary> /// <param name="stream">Input stream.</param> /// <param name="record">Shapefile record to be updated.</param> private static void ReadMultipoint(Stream stream, ShapeFileRecord record) { // Bounding Box. record.XMin = ShapeFile.ReadDouble64_LE(stream); record.YMin = ShapeFile.ReadDouble64_LE(stream); record.XMax = ShapeFile.ReadDouble64_LE(stream); record.YMax = ShapeFile.ReadDouble64_LE(stream); // Num Points. int numPoints = ShapeFile.ReadInt32_LE(stream); // Points. for (int i = 0; i < numPoints; i++) { PointF p = new PointF(); p.X = (float)ShapeFile.ReadDouble64_LE(stream); p.Y = (float)ShapeFile.ReadDouble64_LE(stream); record.Points.Add(p); } }
/// <summary> /// Read a shapefile Polygon record. /// </summary> /// <param name="stream">Input stream.</param> /// <param name="record">Shapefile record to be updated.</param> private static void ReadPolygon( Stream stream, ShapeFileRecord record ) { // Bounding Box. record.XMin = ShapeFile.ReadDouble64_LE( stream ); record.YMin = ShapeFile.ReadDouble64_LE( stream ); record.XMax = ShapeFile.ReadDouble64_LE( stream ); record.YMax = ShapeFile.ReadDouble64_LE( stream ); // Num Parts and Points. int numParts = ShapeFile.ReadInt32_LE( stream ); int numPoints = ShapeFile.ReadInt32_LE( stream ); // Parts. for( int i = 0; i < numParts; i++ ) { record.Parts.Add( ShapeFile.ReadInt32_LE( stream ) ); } // Points. for( int i = 0; i < numPoints; i++ ) { Point p = new Point(); p.X = ShapeFile.ReadDouble64_LE( stream ); p.Y = ShapeFile.ReadDouble64_LE( stream ); record.Points.Add( p ); } }
/// <summary> /// Read a shapefile Point record. /// </summary> /// <param name="stream">Input stream.</param> /// <param name="record">Shapefile record to be updated.</param> private static void ReadPoint( Stream stream, ShapeFileRecord record ) { // Points - add a single point. Point p = new System.Windows.Point(); p.X = ShapeFile.ReadDouble64_LE( stream ); p.Y = ShapeFile.ReadDouble64_LE( stream ); record.Points.Add( p ); // Bounding Box. record.XMin = p.X; record.YMin = p.Y; record.XMax = record.XMin; record.YMax = record.YMin; }
/// <summary> /// Read a shapefile record. /// </summary> /// <param name="stream">Input stream.</param> public ShapeFileRecord ReadShapeFileRecord( Stream stream ) { ShapeFileRecord record = new ShapeFileRecord(); // Record Header. record.RecordNumber = ShapeFile.ReadInt32_BE( stream ); record.ContentLength = ShapeFile.ReadInt32_BE( stream ); // Shape Type. record.ShapeType = ShapeFile.ReadInt32_LE( stream ); // Read the shape geometry, depending on its type. switch( record.ShapeType ) { case ( int ) ShapeType.NullShape: // Do nothing. break; case ( int ) ShapeType.Point: ShapeFile.ReadPoint( stream, record ); break; case ( int ) ShapeType.PolyLine: // PolyLine has exact same structure as Polygon in shapefile. ShapeFile.ReadPolygon( stream, record ); break; case ( int ) ShapeType.Polygon: ShapeFile.ReadPolygon( stream, record ); break; case ( int ) ShapeType.Multipoint: ShapeFile.ReadMultipoint( stream, record ); break; default: { string msg = String.Format( System.Globalization.CultureInfo.InvariantCulture, "ShapeType {0} is not supported.", ( int ) record.ShapeType ); throw new NotSupportedException( msg ); } } // Add the record to our internal list. this.records.Add( record ); return record; }