开源社区里利用JTS库进行空间处理的代码参考(六)

2014-11-24 07:56:16 · 作者: · 浏览: 7
FACTORY;
CoordinateSequence newCoords = doubleFactory.create(length + 1, dimension);
copyCoords(coords, 0, newCoords, 0, length);
setCoordinate(newCoords, length, coordinate);
GeometryFactory factory = line.getFactory();
return factory.createLineString(newCoords);
}

public static LineString createLineString(final GeometryFactory factory,
final Coordinate coordinate, final double angle,
final double lengthBackward, final double lengthForward) {
Coordinate c1 = new Coordinate(coordinate.x - lengthBackward
* Math.cos(angle), coordinate.y - lengthBackward * Math.sin(angle));
Coordinate c2 = new Coordinate(coordinate.x + lengthForward
* Math.cos(angle), coordinate.y + lengthForward * Math.sin(angle));
LineString line = factory.createLineString(new Coordinate[] {
c1, c2
});
return line;
}

public static LineString createParallelLineString(final LineString line,
final int orientation, final double distance) {
GeometryFactory factory = line.getFactory();
CoordinateSequence coordinates = line.getCoordinateSequence();
List newCoordinates = new ArrayList();
Coordinate coordinate = coordinates.getCoordinate(0);
LineSegment lastLineSegment = null;
int coordinateCount = coordinates.size();
for (int i = 0; i < coordinateCount; i++) {
Coordinate nextCoordinate = null;
LineSegment lineSegment = null;
if (i < coordinateCount - 1) {
nextCoordinate = coordinates.getCoordinate(i + 1);
lineSegment = new LineSegment(coordinate, nextCoordinate);
lineSegment = offset(lineSegment, distance, orientation);
// if (lastLineSegment == null) {
// lineSegment = addLength(lineSegment, 0, distance*2);
// } else if (i == coordinateCount - 2) {
// lineSegment = addLength(lineSegment, distance*2, 0);
// } else {
// lineSegment = addLength(lineSegment, distance*2, distance*2);
// }
}
if (lineSegment == null) {
newCoordinates.add(lastLineSegment.p1);
} else if (lastLineSegment == null) {
newCoordinates.add(lineSegment.p0);
} else {
Coordinate intersection = lastLineSegment.intersection(lineSegment);
if (intersection != null) {
newCoordinates.add(intersection);
} else {
// newCoordinates.add(lastLineSegment.p1);
newCoordinates.add(lineSegment.p0);
}
}

coordinate = nextCoordinate;
lastLineSegment = lineSegment;
}
CoordinateSequence newCoords = PackedCoordinateSequenceFactory.DOUBLE_FACTORY.create(newCoordinates.toArray(new Coordinate[0]));
return factory.createLineString(newCoords);
}

public static LineSegment offset(final LineSegment line,
final double distance, final int orientation) {
double angle = line.angle();
if (orientation == Angle.CLOCKWISE) {
angle -= Angle.PI_OVER_2;
} else {
angle += Angle.PI_OVER_2;
}
Coordinate c1 = offset(line.p0, angle, distance);
Coordinate c2 = offset(line.p1, angle, distance);
return new LineSegment(c1, c2);
}

public static Coordinate offset(final Coordinate coordinate,
final double angle, final double distance) {
double newX = coordinate.x + distance * Math.cos(angle);
double newY = coordinate.y + distance * Math.sin(angle);
Coordinate newCoordinate = new Coordinate(newX, newY);
return newCoor