using System;
using System.IO;
using GisSharpBlog.NetTopologySuite.Geometries;
namespace GisSharpBlog.NetTopologySuite.IO
{
///
/// A class for writing shapefiles data.
///
[Obsolete("Use ShapefileWriter instead")]
public class MyShapeFileWriter
{
private int recordCounter = 0;
///
///
///
protected ShapeWriter shapeWriter = null;
///
/// Default empty constructor
///
public MyShapeFileWriter()
{
shapeWriter = new ShapeWriter();
}
///
/// Writes an homogeneus GometryCollection into a binary shapefile.
///
/// If geometries are not of the same type throws System.ArgumentException.
/// Path of the shapefile to create: will be created a new file using the given path.
/// if file exists throws System.IO.IOException.
public void Write(GeometryCollection geometries, string shapepath)
{
using (Stream stream = new FileStream(shapepath, FileMode.CreateNew, FileAccess.Write, FileShare.None))
{
Write(geometries, stream);
}
}
///
/// Writes an homogeneus GometryCollection into a binary stream.
///
///
///
protected void Write(GeometryCollection geometries, Stream stream)
{
if (!geometries.IsHomogeneous)
throw new ArgumentException("Shapefile does contain only geometries of th esame type!");
// Init counter
recordCounter = 0;
using (BigEndianBinaryWriter beWriter = new BigEndianBinaryWriter(stream))
{
using (BinaryWriter leWriter = new BinaryWriter(stream))
{
// Evaluate stream length
int fileLength = 0;
foreach (Geometry geometry in geometries.Geometries)
fileLength += (shapeWriter.GetBytesLength(geometry) + 8); // 12 is the length of record header
fileLength += 100; // Add main header
WriteHeaderFile(geometries, leWriter, beWriter, (int)(fileLength / 2)); // Write length in 16 bit words!
foreach (Geometry geometry in geometries.Geometries)
Write(geometry, leWriter, beWriter);
}
}
}
///
///
///
///
///
///
protected void Write(Geometry geometry, BinaryWriter leWriter, BigEndianBinaryWriter beWriter)
{
WriteFeatureHeader(geometry, beWriter);
if (geometry is Point)
shapeWriter.Write(geometry as Point, leWriter);
else if (geometry is LineString)
shapeWriter.Write(geometry as LineString, leWriter);
else if (geometry is Polygon)
shapeWriter.Write(geometry as Polygon, leWriter);
else if (geometry is MultiPoint)
shapeWriter.Write(geometry as MultiPoint, leWriter);
else if (geometry is MultiLineString)
shapeWriter.Write(geometry as MultiLineString, leWriter);
else if (geometry is MultiPolygon)
shapeWriter.Write(geometry as MultiPolygon, leWriter);
else throw new NotSupportedException("Unsupported Geometry implementation:" + geometry.GetType());
}
///
///
///
///
///
protected ShapeGeometryType GetShapeType(Geometry geometry)
{
if (geometry is Point)
return ShapeGeometryType.Point;
else if (geometry is LinearRing)
return ShapeGeometryType.LineString;
else if (geometry is LineString)
return ShapeGeometryType.LineString;
else if (geometry is Polygon)
return ShapeGeometryType.Polygon;
else if (geometry is MultiPoint)
return ShapeGeometryType.MultiPoint;
else if (geometry is MultiLineString)
return ShapeGeometryType.LineString;
else if (geometry is MultiPolygon)
return ShapeGeometryType.Polygon;
else throw new NotSupportedException("Unsupported Geometry implementation:" + geometry.GetType());
}
///
///
///
///
/// Big Endian Writer
/// Little Endian Endian Writer
///
protected void WriteHeaderFile(GeometryCollection geometries, BinaryWriter leWriter, BigEndianBinaryWriter beWriter, int streamLength)
{
// Write stub value for FileCode (big endian)
beWriter.WriteIntBE((int) 9994);
// Write stub values for unused (big endian)
beWriter.WriteIntBE((int) 0);
beWriter.WriteIntBE((int) 0);
beWriter.WriteIntBE((int) 0);
beWriter.WriteIntBE((int) 0);
beWriter.WriteIntBE((int) 0);
// Write stub value for Length (big endian)
beWriter.WriteIntBE((int) streamLength);
// Write version
leWriter.Write((int) 1000);
// Write ShapeTipe
leWriter.Write((int) GetShapeType((Geometry) geometries.Geometries[0]));
// Write values for boundingbox
Envelope envelope = (Envelope) geometries.EnvelopeInternal;
leWriter.Write((double) envelope.MinX);
leWriter.Write((double) envelope.MinY);
leWriter.Write((double) envelope.MaxX);
leWriter.Write((double) envelope.MaxY);
leWriter.Write((double) 0);
leWriter.Write((double) 0);
leWriter.Write((double) 0);
leWriter.Write((double) 0);
}
///
///
///
///
///
protected void WriteFeatureHeader(Geometry geometry, BigEndianBinaryWriter beWriter)
{
// Write record number (big endian)
beWriter.WriteIntBE((int)++recordCounter);
// Write content length (big endian)
int contentLength = shapeWriter.GetBytesLength(geometry);
beWriter.WriteIntBE((int)(contentLength / 2)); // Write length in 16 bit words!
}
}
}