Example #1
0
        public void CanWritePolygonWithInnerRing()
        {
            var ring1 = new List <Pnt3D>
            {
                new Pnt3D(0, 0, 9),
                new Pnt3D(0, 100, 8),
                new Pnt3D(100, 100, 5),
                new Pnt3D(100, 20, 9)
            };

            RingGroup polygon = CreatePoly(ring1);

            polygon.AddInteriorRing(new Linestring(new[]
            {
                new Pnt3D(25, 50, 0),
                new Pnt3D(50, 50, 0),
                new Pnt3D(50, 75, 0),
                new Pnt3D(25, 75, 0),
                new Pnt3D(25, 50, 0)
            }
                                                   ));

            WkbGeomWriter writer = new WkbGeomWriter();

            byte[] bytes = writer.WritePolygon(polygon);

            WkbGeomReader reader       = new WkbGeomReader();
            RingGroup     deserialized = reader.ReadPolygon(new MemoryStream(bytes));

            Assert.IsTrue(deserialized.Equals(polygon));
        }
Example #2
0
        public void CanReadWriteSingleRingPolygonXyz()
        {
            IPolygon poly = GeometryFactory.CreatePolygon(2600000, 1200000, 2601000, 1201000, 400);

            WkbGeometryWriter writer = new WkbGeometryWriter();

            byte[] wkb = writer.WritePolygon(poly);

            // Wkx
            var        ordinates     = Ordinates.Xyz;
            LinearRing wkxLinearRing =
                ToWkxLinearRing(GeometryUtils.GetWKSPointZs(poly), ordinates);

            byte[] wkx = ToChristianSchwarzWkb(ToWkxPolygon(wkxLinearRing));
            Assert.AreEqual(wkx, wkb);

            // Bonus test: Geom
            WkbGeomWriter geomWriter = new WkbGeomWriter();
            RingGroup     ringGroup  = GeometryConversionUtils.CreateRingGroup(poly);

            byte[] wkbGeom = geomWriter.WritePolygon(ringGroup, ordinates);
            Assert.AreEqual(wkb, wkbGeom);

            WkbGeometryReader reader = new WkbGeometryReader();

            IPolygon restored = reader.ReadPolygon(new MemoryStream(wkb));

            Assert.IsTrue(GeometryUtils.AreEqual(poly, restored));

            WkbGeomReader geomReader = new WkbGeomReader();

            Assert.IsTrue(
                ringGroup.Equals(geomReader.ReadPolygon(new MemoryStream(wkbGeom))));
        }
Example #3
0
        public void CanWriteAndReadMultiLinestring()
        {
            var points1 = new List <Pnt3D>
            {
                new Pnt3D(0, 0, 9),
                new Pnt3D(0, 100, 8),
                new Pnt3D(100, 100, 5)
            };

            var points2 = new List <Pnt3D>();

            points2.Add(new Pnt3D(140, -10, 0));
            points2.Add(new Pnt3D(140, 30, 23));
            points2.Add(new Pnt3D(300, 30, 56));
            points2.Add(new Pnt3D(300, -10, 0));

            MultiPolycurve polycurve =
                new MultiPolycurve(new[] { new Linestring(points1), new Linestring(points2) });

            WkbGeomWriter writer = new WkbGeomWriter();

            byte[] bytes = writer.WriteMultiLinestring(polycurve);

            WkbGeomReader  reader       = new WkbGeomReader();
            MultiPolycurve deserialized = reader.ReadMultiPolycurve(new MemoryStream(bytes));

            Assert.IsTrue(deserialized.Equals(polycurve));
        }
Example #4
0
        public void CanWriteMultiPoint()
        {
            Pnt3D point1 = new Pnt3D(2600001.123, 1200000.987, 432.1);
            Pnt3D point2 = new Pnt3D(2600002.234, 1200002.876, 321.98);

            IList <IPnt> multipoint = new IPnt[]
            {
                point1,
                point2
            };

            WkbGeomWriter writer = new WkbGeomWriter();

            byte[] bytes = writer.WriteMultipoint(multipoint);

            WkbGeomReader reader = new WkbGeomReader();

            List <IPnt> deserizalized = reader.ReadMultiPoint(new MemoryStream(bytes)).ToList();

            Assert.AreEqual(multipoint.Count, deserizalized.Count);

            for (int i = 0; i < multipoint.Count; i++)
            {
                Assert.IsTrue(deserizalized[i].Equals(multipoint[i]));
            }
        }
Example #5
0
        public void CanReadWriteMultipointXy()
        {
            var points = new WKSPointZ[4];

            points[0] = new WKSPointZ {
                X = 2600000, Y = 1200000, Z = double.NaN
            };
            points[1] = new WKSPointZ {
                X = 2600030, Y = 1200020, Z = double.NaN
            };
            points[2] = new WKSPointZ {
                X = 2600020, Y = 1200030, Z = double.NaN
            };
            points[3] = new WKSPointZ {
                X = 2600040, Y = 1200040, Z = double.NaN
            };

            ISpatialReference sr =
                SpatialReferenceUtils.CreateSpatialReference(WellKnownHorizontalCS.LV95);

            IMultipoint multipoint = GeometryFactory.CreateMultipoint(points, sr);

            GeometryUtils.MakeNonZAware(multipoint);

            WkbGeometryWriter writer = new WkbGeometryWriter();

            byte[] wkb = writer.WriteMultipoint(multipoint);

            // ArcObjects
            byte[] arcObjectsWkb = GeometryUtils.ToWkb(multipoint);
            Assert.AreEqual(wkb, arcObjectsWkb);

            // Wkx
            byte[] wkx = ToChristianSchwarzWkb(ToWkxMultipoint(points, Ordinates.Xy));
            Assert.AreEqual(wkx, wkb);

            // Bonus test: Geom
            WkbGeomWriter     geomWriter = new WkbGeomWriter();
            Multipoint <IPnt> multipnt   = GeometryConversionUtils.CreateMultipoint(multipoint);

            byte[] wkbGeom = geomWriter.WriteMultipoint(multipnt, Ordinates.Xy);
            Assert.AreEqual(wkb, wkbGeom);

            WkbGeometryReader reader = new WkbGeometryReader();

            IMultipoint restored = reader.ReadMultipoint(new MemoryStream(wkb));

            Assert.IsTrue(GeometryUtils.AreEqual(multipoint, restored));

            // Geom
            WkbGeomReader geomReader = new WkbGeomReader();

            Multipoint <IPnt> deserializedPnts =
                geomReader.ReadMultiPoint(new MemoryStream(wkbGeom));

            Assert.IsTrue(
                GeomRelationUtils.AreMultipointsEqualXY(multipnt, deserializedPnts,
                                                        double.Epsilon));
        }
Example #6
0
        public void CanReadWriteSinglePartPolylineXy()
        {
            var points = new WKSPointZ[4];

            points[0] = new WKSPointZ {
                X = 2600000, Y = 1200000, Z = double.NaN
            };
            points[1] = new WKSPointZ {
                X = 2600030, Y = 1200020, Z = double.NaN
            };
            points[2] = new WKSPointZ {
                X = 2600020, Y = 1200030, Z = double.NaN
            };
            points[3] = new WKSPointZ {
                X = 2600040, Y = 1200040, Z = double.NaN
            };

            IPolyline polyline = GeometryFactory.CreatePolyline(points, null);

            GeometryUtils.MakeNonZAware(polyline);

            GeometryUtils.Simplify(polyline);

            WkbGeometryWriter writer = new WkbGeometryWriter();

            byte[] wkb = writer.WritePolyline(polyline);

            // ArcObjects
            byte[] arcObjectsWkb = GeometryUtils.ToWkb(polyline);
            Assert.AreEqual(wkb, arcObjectsWkb);

            // Wkx
            byte[] wkx = ToChristianSchwarzWkb(ToWkxLineString(points, Ordinates.Xy));
            Assert.AreEqual(wkx, wkb);

            // Bonus test: Geom
            WkbGeomWriter  geomWriter    = new WkbGeomWriter();
            MultiPolycurve multiPlycurve = GeometryConversionUtils.CreateMultiPolycurve(polyline);

            byte[] wkbGeom = geomWriter.WriteMultiLinestring(multiPlycurve, Ordinates.Xy);
            Assert.AreEqual(wkb, wkbGeom);

            WkbGeometryReader reader = new WkbGeometryReader();

            IPolyline restored = reader.ReadPolyline(new MemoryStream(wkb));

            Assert.IsTrue(GeometryUtils.AreEqual(polyline, restored));

            // Geom
            WkbGeomReader geomReader = new WkbGeomReader();

            Assert.IsTrue(
                multiPlycurve.Equals(geomReader.ReadMultiPolycurve(new MemoryStream(wkbGeom))));
        }
Example #7
0
        public void CanReadWritePoint()
        {
            IPoint pointXy  = GeometryFactory.CreatePoint(2600000, 1200000);
            IPoint pointXyz = GeometryFactory.CreatePoint(2600000, 1200000, 400);

            WkbGeometryWriter writer = new WkbGeometryWriter();

            byte[] wkb2D = writer.WritePoint(pointXy);
            byte[] wkb3D = writer.WritePoint(pointXyz);

            // Compare with AO (2D only)
            byte[] arcObjectsWkb = GeometryUtils.ToWkb(pointXy);
            Assert.AreEqual(arcObjectsWkb, wkb2D);

            // Compare with Wkx
            byte[] wkx2D = ToChristianSchwarzWkb(pointXy);
            Assert.AreEqual(wkx2D, wkb2D);

            byte[] wkx3D = ToChristianSchwarzWkb(pointXyz);
            Assert.AreEqual(wkx3D, wkb3D);

            // Bonus test: Geom
            WkbGeomWriter geomWriter = new WkbGeomWriter();
            Pnt3D         pnt2D      = new Pnt3D(pointXy.X, pointXy.Y, double.NaN);

            byte[] bytesGeom2D = geomWriter.WritePoint(pnt2D, Ordinates.Xy);
            Assert.AreEqual(wkb2D, bytesGeom2D);

            Pnt3D pnt3D = new Pnt3D(pointXyz.X, pointXyz.Y, pointXyz.Z);

            byte[] bytesGeom3D = geomWriter.WritePoint(pnt3D);
            Assert.AreEqual(wkb3D, bytesGeom3D);

            // NOTE: Comparison with ST_Geometry SDE.ST_AsBinary(SHAPE) using nHibernate
            // connection is performed in StGeometryPerimeterRepositoryTest

            // Read back:
            WkbGeometryReader reader = new WkbGeometryReader();

            IPoint restored = reader.ReadPoint(new MemoryStream(wkb2D));

            Assert.IsTrue(GeometryUtils.AreEqual(pointXy, restored));

            restored = reader.ReadPoint(new MemoryStream(wkb3D));
            Assert.IsTrue(GeometryUtils.AreEqual(pointXyz, restored));

            // Geom:
            WkbGeomReader geomReader = new WkbGeomReader();

            Assert.IsTrue(pnt2D.Equals(geomReader.ReadPoint(new MemoryStream(bytesGeom2D))));

            Assert.IsTrue(pnt3D.Equals(geomReader.ReadPoint(new MemoryStream(bytesGeom3D))));
        }
Example #8
0
        public void CanReadWriteSingleExteriorRingWithIslandsPolygonXyz()
        {
            ISpatialReference sr = SpatialReferenceUtils.CreateSpatialReference(
                WellKnownHorizontalCS.LV95, WellKnownVerticalCS.LHN95);

            IPolygon outerRing =
                GeometryFactory.CreatePolygon(2600000, 1200000, 2601000, 1201000, 432);

            outerRing.SpatialReference = sr;

            IPolygon innerRing =
                GeometryFactory.CreatePolygon(2600100, 1200100, 2600200, 1200200, 321);

            innerRing.SpatialReference = sr;

            IPolygon polyWithHole = (IPolygon)IntersectionUtils.Difference(outerRing, innerRing);

            WkbGeometryWriter writer = new WkbGeometryWriter();

            byte[] wkb = writer.WritePolygon(polyWithHole);

            // Wkx
            var       ordinates    = Ordinates.Xyz;
            IGeometry exteriorRing = GeometryUtils.GetParts(polyWithHole).First();
            IGeometry interiorRing = GeometryUtils.GetPaths(polyWithHole).Last();

            LinearRing wkxOuterRing = ToWkxLinearRing(exteriorRing, ordinates);
            LinearRing wkxInnerRing = ToWkxLinearRing(interiorRing, ordinates);

            byte[] wkx = ToChristianSchwarzWkb(ToWkxPolygon(wkxOuterRing, new[] { wkxInnerRing }));
            Assert.AreEqual(wkx, wkb);

            // Bonus test: Geom
            WkbGeomWriter geomWriter = new WkbGeomWriter();
            RingGroup     ringGroup  = GeometryConversionUtils.CreateRingGroup(polyWithHole);

            byte[] wkbGeom = geomWriter.WritePolygon(ringGroup, ordinates);
            Assert.AreEqual(wkb, wkbGeom);

            WkbGeometryReader reader = new WkbGeometryReader();

            IPolygon restored = reader.ReadPolygon(new MemoryStream(wkb));

            Assert.IsTrue(GeometryUtils.AreEqual(polyWithHole, restored));

            // Geom:
            WkbGeomReader geomReader = new WkbGeomReader();

            Assert.IsTrue(
                ringGroup.Equals(geomReader.ReadPolygon(new MemoryStream(wkbGeom))));
        }
Example #9
0
        public void CanReadWriteMultipointXyz()
        {
            var points = new WKSPointZ[4];

            points[0] = new WKSPointZ {
                X = 2600000, Y = 1200000, Z = 456
            };
            points[1] = new WKSPointZ {
                X = 2600030, Y = 1200020, Z = 457
            };
            points[2] = new WKSPointZ {
                X = 2600020, Y = 1200030, Z = 459
            };
            points[3] = new WKSPointZ {
                X = 2600010, Y = 1200010, Z = 416
            };

            ISpatialReference sr =
                SpatialReferenceUtils.CreateSpatialReference(WellKnownHorizontalCS.LV95);

            IMultipoint multipoint = GeometryFactory.CreateMultipoint(points, sr);

            WkbGeometryWriter writer = new WkbGeometryWriter();

            byte[] wkb = writer.WriteMultipoint(multipoint);

            // Wkx
            byte[] wkx = ToChristianSchwarzWkb(ToWkxMultipoint(points, Ordinates.Xyz));
            Assert.AreEqual(wkx, wkb);

            // Bonus test: Geom
            WkbGeomWriter     geomWriter = new WkbGeomWriter();
            Multipoint <IPnt> multipnt   = GeometryConversionUtils.CreateMultipoint(multipoint);

            byte[] wkbGeom = geomWriter.WriteMultipoint(multipnt, Ordinates.Xyz);
            Assert.AreEqual(wkb, wkbGeom);

            WkbGeometryReader reader = new WkbGeometryReader();

            IMultipoint restored = reader.ReadMultipoint(new MemoryStream(wkb));

            Assert.IsTrue(GeometryUtils.AreEqual(multipoint, restored));

            // Geom
            WkbGeomReader geomReader = new WkbGeomReader();

            Multipoint <IPnt> deserializedPnts =
                geomReader.ReadMultiPoint(new MemoryStream(wkbGeom));

            Assert.IsTrue(multipnt.Equals(deserializedPnts));
        }
Example #10
0
        public void CanWritePoint()
        {
            Pnt3D point = new Pnt3D(2600001.123, 1200000.987, 432.1);

            WkbGeomWriter writer = new WkbGeomWriter();

            byte[] bytes = writer.WritePoint(point);

            WkbGeomReader reader = new WkbGeomReader();

            IPnt deserializedPoint = reader.ReadPoint(new MemoryStream(bytes));

            Assert.IsTrue(deserializedPoint.Equals(point));
        }
Example #11
0
        public void CanWriteAndReadMultiPolygonWithInnerRing()
        {
            var ring1 = new List <Pnt3D>
            {
                new Pnt3D(0, 0, 9),
                new Pnt3D(0, 100, 8),
                new Pnt3D(100, 100, 5),
                new Pnt3D(100, 20, 9)
            };

            var disjoint = new List <Pnt3D>();

            disjoint.Add(new Pnt3D(140, -10, 0));
            disjoint.Add(new Pnt3D(140, 30, 23));
            disjoint.Add(new Pnt3D(300, 30, 56));
            disjoint.Add(new Pnt3D(300, -10, 0));

            RingGroup poly1 = CreatePoly(ring1);

            poly1.AddInteriorRing(new Linestring(new[]
            {
                new Pnt3D(25, 50, 0),
                new Pnt3D(50, 50, 0),
                new Pnt3D(50, 75, 0),
                new Pnt3D(25, 75, 0),
                new Pnt3D(25, 50, 0)
            }
                                                 ));

            Linestring disjointRing = CreateRing(disjoint);

            var poly2 = new RingGroup(disjointRing);

            var multipolygon = new List <RingGroup>(new[] { poly1, poly2 });

            WkbGeomWriter writer = new WkbGeomWriter();

            byte[] bytes = writer.WriteMultipolygon(multipolygon);

            WkbGeomReader     reader       = new WkbGeomReader();
            IList <RingGroup> deserialized = reader.ReadMultiPolygon(new MemoryStream(bytes));

            Assert.IsTrue(deserialized[0].Equals(multipolygon[0]));
            Assert.IsTrue(deserialized[1].Equals(multipolygon[1]));
        }
Example #12
0
        public void CanReadClockwiseWindingPolygon()
        {
            // Some OGC 1.1 implementations do not have counter-clockwise polygon winding order:
            var ring1 = new List <Pnt3D>
            {
                new Pnt3D(0, 0, 9),
                new Pnt3D(0, 100, 8),
                new Pnt3D(100, 100, 5),
                new Pnt3D(100, 20, 9)
            };

            RingGroup polygon = CreatePoly(ring1);

            polygon.AddInteriorRing(new Linestring(new[]
            {
                new Pnt3D(25, 50, 0),
                new Pnt3D(50, 50, 0),
                new Pnt3D(50, 75, 0),
                new Pnt3D(25, 75, 0),
                new Pnt3D(25, 50, 0)
            }
                                                   ));

            RingGroup inverted = (RingGroup)polygon.Clone();

            inverted.ReverseOrientation();

            WkbGeomWriter writer = new WkbGeomWriter();

            byte[] bytes = writer.WritePolygon(inverted);

            const bool    assumeWkbPolygonsClockwise = true;
            WkbGeomReader reader = new WkbGeomReader(assumeWkbPolygonsClockwise);

            RingGroup deserialized = reader.ReadPolygon(new MemoryStream(bytes));

            Assert.IsTrue(deserialized.Equals(polygon));
        }
Example #13
0
        public void CanWriteMultiPoint()
        {
            Pnt3D point1 = new Pnt3D(2600001.123, 1200000.987, 432.1);
            Pnt3D point2 = new Pnt3D(2600002.234, 1200002.876, 321.98);

            var multipoint = new Multipoint <IPnt>(new[]
            {
                point1,
                point2
            });

            WkbGeomWriter writer = new WkbGeomWriter();

            byte[] bytes = writer.WriteMultipoint(multipoint);

            WkbGeomReader reader = new WkbGeomReader();

            Multipoint <IPnt> deserizalized = reader.ReadMultiPoint(new MemoryStream(bytes));

            Assert.AreEqual(multipoint.PointCount, deserizalized.PointCount);

            Assert.IsTrue(deserizalized.Equals(multipoint));
        }
Example #14
0
        public void CanReadWriteMultipartPolygonXyz()
        {
            ISpatialReference sr = SpatialReferenceUtils.CreateSpatialReference(
                WellKnownHorizontalCS.LV95, WellKnownVerticalCS.LHN95);

            IPolygon outerRing =
                GeometryFactory.CreatePolygon(2600000, 1200000, 2601000, 1201000, 432);

            outerRing.SpatialReference = sr;
            IPolygon innerRing =
                GeometryFactory.CreatePolygon(2600100, 1200100, 2600200, 1200200, 421);

            innerRing.SpatialReference = sr;

            IPolygon polyWithHole = (IPolygon)IntersectionUtils.Difference(outerRing, innerRing);

            IPolygon poly2 = GeometryFactory.CreatePolygon(2610000, 1200000, 2611000, 1201000, 543);

            poly2.SpatialReference = sr;

            IPolygon multiPolygon = (IPolygon)GeometryUtils.Union(polyWithHole, poly2);

            Assert.IsTrue(GeometryUtils.IsZAware(multiPolygon));

            GeometryUtils.Simplify(multiPolygon);

            WkbGeometryWriter writer = new WkbGeometryWriter();

            byte[] wkb = writer.WritePolygon(multiPolygon);

            // Wkx
            var ordinates                        = Ordinates.Xyz;
            IList <IGeometry> parts              = GeometryUtils.GetParts(multiPolygon).ToList();
            IGeometry         exteriorRing       = parts[0];
            IGeometry         interiorRing       = parts[1];
            IGeometry         secondExteriorRing = parts[2];

            LinearRing wkxOuterRing = ToWkxLinearRing(exteriorRing, ordinates);
            LinearRing wkxInnerRing = ToWkxLinearRing(interiorRing, ordinates);

            Polygon wkxPolygon1 = ToWkxPolygon(wkxOuterRing, new[] { wkxInnerRing });
            Polygon wkxPolygon2 = ToWkxPolygon(ToWkxLinearRing(secondExteriorRing, ordinates));

            MultiPolygon wkxMultiPolygon = new MultiPolygon(new[] { wkxPolygon1, wkxPolygon2 });

            byte[] wkx = ToChristianSchwarzWkb(wkxMultiPolygon);
            Assert.AreEqual(wkx, wkb);

            // Bonus test: Geom
            WkbGeomWriter  geomWriter = new WkbGeomWriter();
            MultiPolycurve multiPly   = GeometryConversionUtils.CreateMultiPolycurve(multiPolygon);

            byte[] wkbGeom = geomWriter.WriteMultipolygon(multiPly, ordinates);
            Assert.AreEqual(wkb, wkbGeom);

            WkbGeometryReader reader = new WkbGeometryReader();

            IPolygon restored = reader.ReadPolygon(new MemoryStream(wkb));

            Assert.IsTrue(GeometryUtils.AreEqual(multiPolygon, restored));

            // Geom:
            WkbGeomReader     geomReader       = new WkbGeomReader();
            IList <RingGroup> readMultiPolygon =
                geomReader.ReadMultiPolygon(new MemoryStream(wkbGeom));
            var readMultiPolycurve = new MultiPolycurve(
                readMultiPolygon.SelectMany(g => g.GetLinestrings()));

            Assert.IsTrue(multiPly.Equals(readMultiPolycurve));

            // As multipatch
            IMultiPatch multipatch = GeometryFactory.CreateMultiPatch(multiPolygon);

            wkb = writer.WriteMultipatch(multipatch);

            IMultiPatch readMultipatch = (IMultiPatch)reader.ReadGeometry(new MemoryStream(wkb));

            // TODO: Implement AreEqual for multipatch that is more permissive regarding First/Outer ring type
            AssertEqual(multipatch, readMultipatch);
        }
Example #15
0
        public void CanReadWriteMultiPartPolylineXyz()
        {
            // The spatial reference is important to avoid small differences in
            // coordinates (snap to spatial reference!)
            ISpatialReference sr = SpatialReferenceUtils.CreateSpatialReference(
                WellKnownHorizontalCS.LV95, WellKnownVerticalCS.LHN95);

            var points1 = new WKSPointZ[4];

            points1[0] = new WKSPointZ {
                X = 2600000, Y = 1200000, Z = 456
            };
            points1[1] = new WKSPointZ {
                X = 2600030, Y = 1200020, Z = 457
            };
            points1[2] = new WKSPointZ {
                X = 2600020, Y = 1200030, Z = 459
            };
            points1[3] = new WKSPointZ {
                X = 2600040, Y = 1200040, Z = 416
            };

            IPolyline polyline1 = GeometryFactory.CreatePolyline(points1, sr);

            var points2 = new WKSPointZ[4];

            points2[0] = new WKSPointZ {
                X = 2610000, Y = 1200000, Z = 656
            };
            points2[1] = new WKSPointZ {
                X = 2610030, Y = 1200020, Z = 657
            };
            points2[2] = new WKSPointZ {
                X = 2610020, Y = 1200030, Z = 659
            };
            points2[3] = new WKSPointZ {
                X = 2610040, Y = 1200040, Z = 616
            };

            IPolyline polyline2 = GeometryFactory.CreatePolyline(points2, sr);

            IPolyline polyline = (IPolyline)GeometryUtils.Union(polyline1, polyline2);

            GeometryUtils.Simplify(polyline);

            WkbGeometryWriter writer = new WkbGeometryWriter();

            byte[] wkb = writer.WritePolyline(polyline);

            // Wkx
            var             ordinates       = Ordinates.Xyz;
            MultiLineString multiLineString = new MultiLineString(
                new List <LineString>
            {
                ToWkxLineString(points1, ordinates), ToWkxLineString(points2, ordinates)
            });

            byte[] wkx = ToChristianSchwarzWkb(multiLineString);
            Assert.AreEqual(wkx, wkb);

            // Bonus test: Geom
            WkbGeomWriter  geomWriter    = new WkbGeomWriter();
            MultiPolycurve multiPlycurve = GeometryConversionUtils.CreateMultiPolycurve(polyline);

            byte[] wkbGeom = geomWriter.WriteMultiLinestring(multiPlycurve, ordinates);
            Assert.AreEqual(wkb, wkbGeom);

            WkbGeometryReader reader = new WkbGeometryReader();

            IPolyline restored = reader.ReadPolyline(new MemoryStream(wkb));

            Assert.IsTrue(GeometryUtils.AreEqual(polyline, restored));

            // Geom:
            WkbGeomReader geomReader = new WkbGeomReader();

            Assert.IsTrue(
                multiPlycurve.Equals(geomReader.ReadMultiPolycurve(new MemoryStream(wkbGeom))));
        }