coordinates.toArray(coords);
return factory.createLineString(coords);
}
public static int[] findClosestSegmentAndCoordinate(final LineString line,
final Coordinate coordinate) {
int[] closest = new int[] {
-1, -1, 0
};
double closestDistance = Double.MAX_VALUE;
CoordinateSequence coordinates = line.getCoordinateSequence();
Coordinate previousCoord = coordinates.getCoordinate(0);
double previousCoordinateDistance = previousCoord.distance(coordinate);
if (previousCoordinateDistance == 0) {
closest[0] = 0;
closest[1] = 0;
closest[2] = 1;
} else {
for (int i = 1; i < coordinates.size(); i++) {
Coordinate currentCoordinate = coordinates.getCoordinate(i);
double currentCoordinateDistance = currentCoordinate.distance(coordinate);
if (currentCoordinateDistance == 0) {
closest[0] = i;
closest[1] = i;
closest[2] = 1;
return closest;
}
LineSegment lineSegment = new LineSegment(previousCoord,
currentCoordinate);
double distance = lineSegment.distance(coordinate);
if (distance == 0) {
closest[0] = i - 1;
if (previousCoordinateDistance < currentCoordinateDistance) {
closest[1] = i - 1;
} else {
closest[1] = i;
}
return closest;
} else if (distance < closestDistance) {
closestDistance = distance;
closest[0] = i - 1;
if (previousCoordinateDistance < currentCoordinateDistance) {
closest[1] = i - 1;
} else {
closest[1] = i;
}
}
previousCoord = currentCoordinate;
}
}
return closest;
}
public static List
final Coordinate coordinate) {
int[] indexes = findClosestSegmentAndCoordinate(line, coordinate);
int segmentIndex = indexes[0];
if (segmentIndex != -1) {
int coordinateIndex = indexes[1];
boolean exactMatch = coordinateIndex == 1;
if (coordinateIndex == 0) {
if (exactMatch) {
return Collections.singletonList(line);
} else {
Coordinate c0 = line.getCoordinateN(0);
Coordinate c1;
int i = 1;
do {
c1 = line.getCoordinateN(i);
i++;
} while (c1.equals(c0));
if (Angle.isAcute(c1, c0, coordinate)) {
Coordinate projectedCoordinate = new LineSegment(c0, c1).project(coordinate);
return split(line, 1, projectedCoordinate);
} else {
return Collections.singletonList(line);
}
}
} else if (coordinateIndex == line.getNumPoints() - 1) {
if (exactMatch) {
return Collections.singletonList(line);
} else {
Coordinate cn = line.getCoordinateN(line.getNumPoints() - 1);
Coordinate cn1;
int i = line.getNumPoints() - 2;
do {
cn1 = line.getCoordinateN(i);
i++;
} while (cn1.equals(cn));
if (Angle.isAcute(cn1, cn, coordinate)) {
Coordinate projectedCoordinate = new LineSegment(cn, cn1).project(coordinate);
return split(line, line.getNumPoints() - 1, projectedCoordinate);
} else {
return Collections.singletonList(line);
}
}
} else {
Coordinate c = line.getCoordinateN(segmentIndex);