using NetTopologySuite.Geometries;
using NetTopologySuite.Geometries.Utilities;
using NetTopologySuite.IO;
static void Main(string[] args)
string wktLineString = "LINESTRING (0 0, 1 1, 2 2, 3 3, 4 4)";
string wktPoint1 = "POINT (1.5 1.5)";
string wktPoint2 = "POINT (3 3)";
var wktReader = new WKTReader();
LineString lineString = (LineString)wktReader.Read(wktLineString);
Point point1 = (Point)wktReader.Read(wktPoint1);
Point point2 = (Point)wktReader.Read(wktPoint2);
LineSegment segment = GetLineSegmentBetweenPoints(lineString, point1, point2);
string segmentWKT = segment.ToString();
Console.WriteLine($"Segment between points:\n{segmentWKT}");
static LineSegment GetLineSegmentBetweenPoints(LineString lineString, Point point1, Point point2)
if (lineString == null || point1 == null || point2 == null)
throw new ArgumentNullException("Input geometries cannot be null.");
if (!lineString.Coordinates.Contains(point1.Coordinate) || !lineString.Coordinates.Contains(point2.Coordinate))
throw new ArgumentException("Both points must fall on the LineString.");
Coordinate[] coordinates = lineString.Coordinates;
int index1 = Array.IndexOf(coordinates, point1.Coordinate);
int index2 = Array.IndexOf(coordinates, point2.Coordinate);
int startIndex = Math.Min(index1, index2);
int endIndex = Math.Max(index1, index2);
Coordinate[] segmentCoordinates = new Coordinate[endIndex - startIndex + 1];
Array.Copy(coordinates, startIndex, segmentCoordinates, 0, segmentCoordinates.Length);
return new LineSegment(segmentCoordinates[0], segmentCoordinates[segmentCoordinates.Length - 1]);