/// <summary> /// Writes a geometry to a byte array using the specified encoding. /// </summary> /// <param name="g">The geometry to write</param> /// <param name="wkbByteOrder">Byte order</param> /// <returns>WKB representation of the geometry</returns> public static byte[] Write(RGeos.Geometries.Geometry g, WkbByteOrder wkbByteOrder) { MemoryStream ms = new MemoryStream(); BinaryWriter bw = new BinaryWriter(ms); //Write the byteorder format. bw.Write((byte)wkbByteOrder); //Write the type of this geometry WriteType(g, bw, wkbByteOrder); //Write the geometry WriteGeometry(g, bw, wkbByteOrder); return(ms.ToArray()); }
/// <summary> /// Writes the type number for this geometry. /// </summary> /// <param name="geometry">The geometry to determine the type of.</param> /// <param name="bWriter">Binary Writer</param> /// <param name="byteorder">Byte order</param> private static void WriteType(RGeos.Geometries.Geometry geometry, BinaryWriter bWriter, WkbByteOrder byteorder) { //Determine the type of the geometry. switch (geometry.GetType().FullName) { //Points are type 1. case "RGeos.Geometries.Point": WriteUInt32((uint)WKBGeometryType.wkbPoint, bWriter, byteorder); break; //Linestrings are type 2. case "RGeos.Geometries.LineString": WriteUInt32((uint)WKBGeometryType.wkbLineString, bWriter, byteorder); break; //Polygons are type 3. case "RGeos.Geometries.Polygon": WriteUInt32((uint)WKBGeometryType.wkbPolygon, bWriter, byteorder); break; //Mulitpoints are type 4. case "RGeos.Geometries.MultiPoint": WriteUInt32((uint)WKBGeometryType.wkbMultiPoint, bWriter, byteorder); break; //Multilinestrings are type 5. case "RGeos.Geometries.MultiLineString": WriteUInt32((uint)WKBGeometryType.wkbMultiLineString, bWriter, byteorder); break; //Multipolygons are type 6. case "RGeos.Geometries.MultiPolygon": WriteUInt32((uint)WKBGeometryType.wkbMultiPolygon, bWriter, byteorder); break; //Geometrycollections are type 7. case "RGeos.Geometries.GeometryCollection": WriteUInt32((uint)WKBGeometryType.wkbGeometryCollection, bWriter, byteorder); break; //If the type is not of the above 7 throw an exception. default: throw new ArgumentException("Invalid Geometry Type"); } }
/// <summary> /// Writes the geometry to the binary writer. /// </summary> /// <param name="geometry">The geometry to be written.</param> /// <param name="bWriter"></param> /// <param name="byteorder">Byte order</param> private static void WriteGeometry(RGeos.Geometries.Geometry geometry, BinaryWriter bWriter, WkbByteOrder byteorder) { switch (geometry.GetType().FullName) { //Write the point. case "RGeos.Geometries.Point": WritePoint((RgPoint)geometry, bWriter, byteorder); break; case "RGeos.Geometries.LineString": LineString ls = (LineString)geometry; WriteLineString(ls, bWriter, byteorder); break; case "RGeos.Geometries.Polygon": WritePolygon((Polygon)geometry, bWriter, byteorder); break; //Write the Multipoint. case "RGeos.Geometries.MultiPoint": WriteMultiPoint((MultiPoint)geometry, bWriter, byteorder); break; //Write the Multilinestring. case "RGeos.Geometries.MultiLineString": WriteMultiLineString((MultiLineString)geometry, bWriter, byteorder); break; //Write the Multipolygon. case "RGeos.Geometries.MultiPolygon": WriteMultiPolygon((MultiPolygon)geometry, bWriter, byteorder); break; //Write the Geometrycollection. case "RGeos.Geometries.GeometryCollection": WriteGeometryCollection((GeometryCollection)geometry, bWriter, byteorder); break; //If the type is not of the above 7 throw an exception. default: throw new ArgumentException("Invalid Geometry Type"); } }
/// <summary> /// Creates a Geometry using the next token in the stream. /// </summary> /// <param name="tokenizer">Tokenizer over a stream of text in Well-known Text /// format. The next tokens must form a <Geometry Tagged Text>.</param> /// <returns>Returns a Geometry specified by the next token in the stream.</returns> /// <remarks> /// Exception is thrown if the coordinates used to create a Polygon /// shell and holes do not form closed linestrings, or if an unexpected /// token is encountered. /// </remarks> private static RGeos.Geometries.Geometry ReadGeometryTaggedText(WktStreamTokenizer tokenizer) { tokenizer.NextToken(); string type = tokenizer.GetStringValue().ToUpper(); RGeos.Geometries.Geometry geometry = null; switch (type) { case "POINT": geometry = ReadPointText(tokenizer); break; case "LINESTRING": geometry = ReadLineStringText(tokenizer); break; case "MULTIPOINT": geometry = ReadMultiPointText(tokenizer); break; case "MULTILINESTRING": geometry = ReadMultiLineStringText(tokenizer); break; case "POLYGON": geometry = ReadPolygonText(tokenizer); break; case "MULTIPOLYGON": geometry = ReadMultiPolygonText(tokenizer); break; case "GEOMETRYCOLLECTION": geometry = ReadGeometryCollectionText(tokenizer); break; default: throw new Exception(); //throw new Exception(String.Format(Map.NumberFormatEnUs, "Geometrytype '{0}' is not supported.", // type)); } return(geometry); }
//private const byte WKBByteOrder = 0; /// <summary> /// Writes a geometry to a byte array using little endian byte encoding /// </summary> /// <param name="g">The geometry to write</param> /// <returns>WKB representation of the geometry</returns> public static byte[] Write(RGeos.Geometries.Geometry g) { return(Write(g, WkbByteOrder.Ndr)); }