예제 #1
0
        public WhenCreatingAPointFromXyValues()
        {
            _fixture = new Fixture();

            _x   = _fixture.Create <double>();
            _y   = _fixture.Create <double>();
            _sut = new PointM(_x, _y);
        }
예제 #2
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)));
        }
예제 #3
0
        public WhenCreatingAPointFromACoordinate()
        {
            _fixture = new Fixture();

            _coordinate = new Coordinate(
                _fixture.Create <double>(),
                _fixture.Create <double>(),
                _fixture.Create <double>()
                );
            _sut = new PointM(_coordinate);
        }
예제 #4
0
        public WhenCreatingAPointFromAnCoordinateSequence()
        {
            _fixture = new Fixture();

            _xySequence = new DotSpatialAffineCoordinateSequence(1, Ordinates.XYZ);
            _xySequence.SetOrdinate(0, Ordinate.X, _fixture.Create <double>());
            _xySequence.SetOrdinate(0, Ordinate.Y, _fixture.Create <double>());
            _xySequence.SetOrdinate(0, Ordinate.Z, _fixture.Create <double>());

            _sut = new PointM(_xySequence);
        }
예제 #5
0
        internal static ShapeContent ReadPolyLineMGeometry(BinaryReader reader)
        {
            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());
            }

            if (reader.BaseStream.CanSeek && reader.BaseStream.Position != reader.BaseStream.Length)
            {
                reader.ReadBytes(MeasureRangeByteLength.ToInt32()); // skip MeasureRange
                for (var measureIndex = 0; measureIndex < numberOfPoints; measureIndex++)
                {
                    points[measureIndex].ChangeMeasurement(reader.ReadDoubleLittleEndian()); // Points[i].M
                }
            } //else try-catch-EndOfStreamException?? or only support seekable streams?

            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)));
        }
예제 #6
0
        public void SetOrdinate(int index, Ordinate ordinate, double value)
        {
            if (index >= _points.Length)
            {
                return;
            }

            _points[index] = new PointM(
                ordinate == Ordinate.X ? value : _points[index].X,
                ordinate == Ordinate.Y ? value : _points[index].Y,
                ordinate == Ordinate.Z ? value : _points[index].Z,
                ordinate == Ordinate.M ? value : _points[index].M
                );
        }
예제 #7
0
 public PointShapeContent(PointM shape)
 {
     Shape         = shape ?? throw new ArgumentNullException(nameof(shape));
     ShapeType     = ShapeType.Point;
     ContentLength = Length;
 }