/// <inheritdoc cref="IGeometryWriter{TSink}.Write(IGeometry, Stream)"/>>
        public void Write(IGeometry geom, Stream stream)
        {
            if (geom == null)
            {
                throw new ArgumentNullException(nameof(geom));
            }
            if (stream == null)
            {
                throw new ArgumentNullException(nameof(stream));
            }

            using (var writer = new BinaryWriter(stream))
            {
                int byteOrder = (int)ByteOrder;
                int ordinates;
                switch (HandleOrdinates)
                {
                case Ordinates.None:
                    ordinates = 0;
                    break;

                case Ordinates.XY:
                    ordinates = 1;
                    break;

                case Ordinates.XYZ:
                    ordinates = 2;
                    break;

                case Ordinates.XYM:
                    ordinates = 3;
                    break;

                case Ordinates.XYZM:
                    ordinates = 4;
                    break;

                default:
                    throw new ArgumentOutOfRangeException("HandleOrdinates");
                }
                int  isEmpty = geom.IsEmpty ? 1 : 0;
                byte flags   = (byte)(byteOrder + (ordinates << 1) + (isEmpty << 4));
                var  header  = new GeoPackageBinaryHeader
                {
                    Extent = geom.EnvelopeInternal,
                    Flags  = flags,
                    SrsId  = HandleSRID ? geom.SRID : -1
                };
                GeoPackageBinaryHeader.Write(writer, header);

                bool emitZ = (HandleOrdinates & Ordinates.Z) == Ordinates.Z;
                bool emitM = (HandleOrdinates & Ordinates.M) == Ordinates.M;
                // NOTE: GeoPackage handle SRID in header, so no need to store this also in wkb;
                // actually, trying to store srid in wkb resunts in an invalid gpkg blob value...
                const bool dontHandleSRID = false;
                var        wkbWriter      = new WKBWriter(ByteOrder, dontHandleSRID, emitZ, emitM);
                wkbWriter.Write(geom, stream);
            }
        }
예제 #2
0
        public static string Geom2WKBhex(IGeometry geometry)
        {
            // writing WKB (Well Known Binary)
            var writer = new NetTopologySuite.IO.WKBWriter(GeoAPI.IO.ByteOrder.BigEndian, true);

            var wkbBin = writer.Write(geometry);

            // writing hex-coded WKB, used in POSTGIS DB geometery column
            string hexString = NetTopologySuite.IO.WKBWriter.ToHex(wkbBin);

            return(hexString);
        }
예제 #3
0
 public void OracleWKBBigEndianWriteTest()
 {
     ILinearRing shell = Factory.CreateLinearRing(new Coordinate[] {    new Coordinate(100,100),
                                                                         new Coordinate(200,100),
                                                                         new Coordinate(200,200),
                                                                         new Coordinate(100,200),
                                                                         new Coordinate(100,100), });
     ILinearRing hole = Factory.CreateLinearRing(new Coordinate[] {     new Coordinate(120,120),
                                                                         new Coordinate(180,120),
                                                                         new Coordinate(180,180),
                                                                         new Coordinate(120,180),
                                                                         new Coordinate(120,120), });
     IPolygon polygon = Factory.CreatePolygon(shell, new ILinearRing[] { hole, });
     WKBWriter writer = new WKBWriter(ByteOrder.BigEndian);
     byte[] bytes = writer.Write(polygon);
     Assert.IsNotNull(bytes);
     Assert.IsNotEmpty(bytes);
     Debug.WriteLine(bytes.Length);
 }
예제 #4
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(IGeometry g, WkbByteOrder wkbByteOrder)
        {
            ByteOrder order;
            switch (wkbByteOrder)
            {
                case WkbByteOrder.Xdr:
                    order = ByteOrder.BigEndian;
                    break;
                case WkbByteOrder.Ndr:
                    order = ByteOrder.LittleEndian;
                    break;
                default:
                    throw new ArgumentOutOfRangeException("wkbByteOrder");
            }

            WKBWriter wkb = new WKBWriter(order);
            return wkb.Write(g);

            /*
            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();
            */
        }
        void RunGeometry(Geometry g, int dimension, ByteOrder byteOrder, bool toHex, int srid)
        {
            bool includeSRID = false;
            if (srid >= 0)
            {
                includeSRID = true;
                g.SRID = srid;
            }

            WKBWriter wkbWriter = new WKBWriter(byteOrder, includeSRID, dimension==2 ? false : true);
            byte[] wkb = wkbWriter.Write(g);
            String wkbHex = null;
            if (toHex)
                wkbHex = WKBWriter.ToHex(wkb);

            if (toHex)
                wkb = WKBReader.HexToBytes(wkbHex);
            Geometry g2 = (Geometry)_wkbReader.Read(wkb);

            CoordinateSequenceComparator comp = (dimension == 2) ? Comp2 : Comp3;
            bool isEqual = (g.CompareTo(g2, comp) == 0);
            Assert.IsTrue(isEqual);

            if (includeSRID)
            {
                bool isSRIDEqual = g.SRID == g2.SRID;
                Assert.IsTrue(isSRIDEqual);
            }
        }
예제 #6
0
        // Writes shapes in an internal format readable by {@link #readShapeFromBytes(byte[], int, int)}.
        public byte[] WriteShapeToBytes(Shape shape)
        {
            var p = shape as Shapes.Point;
            if (p != null)
            {
                using (var stream = new MemoryStream(1 + (2 * 8)))
                using (var bytes = new BinaryWriter(stream))
                {
                    bytes.Write(TYPE_POINT);
                    bytes.Write(p.GetX());
                    bytes.Write(p.GetY());
                    return stream.ToArray();
                }
            }

            var rect = shape as Rectangle;
            if (rect != null)
            {

                using (var stream = new MemoryStream(1 + (4 * 8)))
                using (var bytes = new BinaryWriter(stream))
                {
                    bytes.Write(TYPE_BBOX);
                    bytes.Write(rect.GetMinX());
                    bytes.Write(rect.GetMaxX());
                    bytes.Write(rect.GetMinY());
                    bytes.Write(rect.GetMaxY());
                    return stream.ToArray();
                }
            }

            var ntsShape = shape as NtsGeometry;
            if (ntsShape != null)
            {
                var writer = new WKBWriter();
                byte[] bb = writer.Write(ntsShape.GetGeom());
                using (var stream = new MemoryStream(1 + bb.Length))
                using (var bytes = new BinaryWriter(stream))
                {
                    bytes.Write(TYPE_GEOM);
                    bytes.Write(bb);
                    return stream.ToArray();
                }
            }

            throw new ArgumentException("unsuported shape:" + shape);
        }
예제 #7
0
 /// <summary>
 /// Returns the Well-known Binary representation of this <c>Geometry</c>.
 /// For a definition of the Well-known Binary format, see the OpenGIS Simple
 /// Features Specification.
 /// </summary>
 /// <returns>The Well-known Binary representation of this <c>Geometry</c>.</returns>
 public byte[] ToBinary()
 {
     var writer = new WKBWriter();
     return writer.Write(this);
 }