/// <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)); } ICoordinate[] 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 ICoordinate[] { 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 <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 ICoordinate ExtractPoint(LinearLocation index) { return(index.GetCoordinate(linearGeom)); }
/// <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 ICoordinate ExtractPoint(double index) { LinearLocation loc = LengthLocationMap.GetLocation(linearGeom, index); return(loc.GetCoordinate(linearGeom)); }