Example #1
0
        /// <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());
        }
Example #2
0
        /// <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");
            }
        }
Example #3
0
        /// <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");
            }
        }
Example #4
0
        /// <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 &lt;Geometry Tagged Text&gt;.</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);
        }
Example #5
0
        //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));
        }