/// <summary>
        /// Assumes input is valid
        /// (e.g. <paramref name="start" /> minor or equals to <paramref name="end" />).
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        private ILineString ComputeLine(LinearLocation start, LinearLocation end)
        {
            ICoordinate[]  coordinates    = line.Coordinates;
            CoordinateList newCoordinates = new CoordinateList();

            int startSegmentIndex = start.SegmentIndex;

            if (start.SegmentFraction > 0.0)
            {
                startSegmentIndex += 1;
            }
            int lastSegmentIndex = end.SegmentIndex;

            if (end.SegmentFraction == 1.0)
            {
                lastSegmentIndex += 1;
            }
            if (lastSegmentIndex >= coordinates.Length)
            {
                lastSegmentIndex = coordinates.Length - 1;
            }
            // not needed - LinearLocation values should always be correct
            // Assert.IsTrue(end.SegmentFraction <= 1.0, "invalid segment fraction value");

            if (!start.IsVertex)
            {
                newCoordinates.Add(start.GetCoordinate(line));
            }
            for (int i = startSegmentIndex; i <= lastSegmentIndex; i++)
            {
                newCoordinates.Add(coordinates[i]);
            }
            if (!end.IsVertex)
            {
                newCoordinates.Add(end.GetCoordinate(line));
            }

            // ensure there is at least one coordinate in the result
            if (newCoordinates.Count <= 0)
            {
                newCoordinates.Add(start.GetCoordinate(line));
            }

            Coordinate[] newCoordinateArray = newCoordinates.ToCoordinateArray();

            /*
             * Ensure there is enough coordinates to build a valid line.
             * Make a 2-point line with duplicate coordinates, if necessary.
             * There will always be at least one coordinate in the coordList.
             */
            if (newCoordinateArray.Length <= 1)
            {
                newCoordinateArray = new Coordinate[] { newCoordinateArray[0], newCoordinateArray[0] }
            }
            ;

            return(line.Factory.CreateLineString(newCoordinateArray));
        }
        /// <summary>
        /// Assumes input is valid
        /// (e.g. <paramref name="start" /> minor or equals to <paramref name="end" />).
        /// </summary>
        /// <param name="start"></param>
        /// <param name="end"></param>
        /// <returns></returns>
        private IGeometry ComputeLinear(LinearLocation start, LinearLocation end)
        {
            LinearGeometryBuilder builder = new LinearGeometryBuilder(line.Factory);

            builder.FixInvalidLines = true;

            if (!start.IsVertex)
            {
                builder.Add(start.GetCoordinate(line));
            }

            LinearIterator it = new LinearIterator(line, start);

            foreach (LinearIterator.LinearElement element in it)
            {
                int compare = end.CompareLocationValues(element.ComponentIndex, element.VertexIndex, 0.0);
                if (compare < 0)
                {
                    break;
                }

                ICoordinate pt = element.SegmentStart;
                builder.Add(pt);
                if (element.IsEndOfLine)
                {
                    builder.EndLine();
                }
            }

            if (!end.IsVertex)
            {
                builder.Add(end.GetCoordinate(line));
            }

            return(builder.GetGeometry());
        }
        /// <summary>
        /// Computes the <see cref="Coordinate" /> for the point
        /// on the line at the given index.
        /// If the index is out of range the first or last point on the
        /// line will be returned.
        /// </summary>
        /// <param name="index">The index of the desired point.</param>
        /// <returns>The <see cref="Coordinate" /> at the given index.</returns>
        public virtual ICoordinate ExtractPoint(double index)
        {
            LinearLocation loc = LengthLocationMap.GetLocation(linearGeom, index);

            return(loc.GetCoordinate(linearGeom));
        }
Example #4
0
 /// <summary>
 /// Computes the <see cref="Coordinate" />for the point on the line at the given index.
 /// If the <paramref name="index" /> is out of range,
 /// the first or last point on the line will be returned.
 /// </summary>
 /// <param name="index">The index of the desired point.</param>
 /// <returns>The <see cref="Coordinate" /> at the given index.</returns>
 public virtual ICoordinate ExtractPoint(LinearLocation index)
 {
     return(index.GetCoordinate(linearGeom));
 }