示例#1
0
        internal static ShapeContent ReadPolyLineMFromRecord(BinaryReader reader, ShapeRecordHeader header)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            reader.ReadBytes(BoundingBoxByteLength.ToInt32()); // skip BoundingBox
            var numberOfParts  = reader.ReadInt32LittleEndian();
            var numberOfPoints = reader.ReadInt32LittleEndian();

            var parts = new int[numberOfParts];

            for (var partIndex = 0; partIndex < numberOfParts; partIndex++)
            {
                parts[partIndex] = reader.ReadInt32LittleEndian();
            }

            var points = new PointM[numberOfPoints];

            for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++)
            {
                points[pointIndex] = new PointM(
                    reader.ReadDoubleLittleEndian(),
                    reader.ReadDoubleLittleEndian());
            }

            var contentLengthWithoutMeasures = ContentHeaderLength
                                               .Plus(ByteLength.Int32.Times(numberOfParts))        // Parts
                                               .Plus(ByteLength.Double.Times(numberOfPoints * 2)); // Points(X,Y)

            if (header.ContentLength > contentLengthWithoutMeasures)
            {
                reader.ReadBytes(MeasureRangeByteLength.ToInt32()); // skip MeasureRange
                for (var measureIndex = 0; measureIndex < numberOfPoints; measureIndex++)
                {
                    points[measureIndex].ChangeMeasurement(reader.ReadDoubleLittleEndian()); // Points[i].M
                }
            }

            var lines        = new ILineString[numberOfParts];
            var toPointIndex = points.Length;

            for (var partIndex = numberOfParts - 1; partIndex >= 0; partIndex--)
            {
                var fromPointIndex = parts[partIndex];

                lines[partIndex] = new LineString(
                    new PointSequence(new ArraySegment <PointM>(points, fromPointIndex, toPointIndex - fromPointIndex)),
                    GeometryConfiguration.GeometryFactory);

                toPointIndex = fromPointIndex;
            }

            return(new PolyLineMShapeContent(new MultiLineString(lines)));
        }
示例#2
0
        internal static ShapeContent ReadPolyLineMFromRecord(BinaryReader reader, ShapeRecordHeader header)
        {
            if (reader == null)
            {
                throw new ArgumentNullException(nameof(reader));
            }

            var box = new BoundingBox2D(
                reader.ReadDoubleLittleEndian(),
                reader.ReadDoubleLittleEndian(),
                reader.ReadDoubleLittleEndian(),
                reader.ReadDoubleLittleEndian());
            var numberOfParts  = reader.ReadInt32LittleEndian();
            var numberOfPoints = reader.ReadInt32LittleEndian();

            var parts = new int[numberOfParts];

            for (var partIndex = 0; partIndex < numberOfParts; partIndex++)
            {
                parts[partIndex] = reader.ReadInt32LittleEndian();
            }

            var points = new Point[numberOfPoints];

            for (var pointIndex = 0; pointIndex < numberOfPoints; pointIndex++)
            {
                points[pointIndex] = new Point(
                    reader.ReadDoubleLittleEndian(),
                    reader.ReadDoubleLittleEndian());
            }

            var contentLengthWithoutMeasures = ContentHeaderLength
                                               .Plus(ByteLength.Int32.Times(numberOfParts))        // Parts
                                               .Plus(ByteLength.Double.Times(numberOfPoints * 2)); // Points(X,Y)

            double[] measures;
            if (header.ContentLength > contentLengthWithoutMeasures)
            {
                measures = new double[numberOfPoints];
                reader.ReadBytes(MeasureRangeByteLength.ToInt32()); // skip MeasureRange
                for (var measureIndex = 0; measureIndex < numberOfPoints; measureIndex++)
                {
                    measures[measureIndex] = reader.ReadDoubleLittleEndian();
                }
            }
            else
            {
                measures = new double[0];
            }

            return(new PolyLineMShapeContent(new PolyLineM(box, parts, points, measures)));
        }
        public void ToInt32ReturnsExpectedValue()
        {
            var value = _fixture.Create <int>().AsByteLengthValue();
            var sut   = new ByteLength(value);

            var result = sut.ToInt32();

            Assert.Equal(value, result);
        }
示例#4
0
 public ByteOffset Plus(ByteLength other)
 {
     return(new ByteOffset(_value + other.ToInt32()));
 }
示例#5
0
 public ByteOffset Plus(ByteLength other) => new ByteOffset(_value + other.ToInt32());