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

2014-11-24 07:56:16 · 作者: · 浏览: 9
c Geometry intersection2DZFloating(final LineString line1,
final LineString line2) {
GeometryFactory factory = new GeometryFactory();
CoordinateSequence coordinates1 = line1.getCoordinateSequence();
LineString line1Floating = factory.createLineString(coordinates1);
CoordinateSequence coordinates2 = line2.getCoordinateSequence();
LineString line2Floating = factory.createLineString(coordinates2);
return JtsGeometryUtil.intersection2DZ(line1Floating, line2Floating);
}

public static Geometry intersection2DZ(final LineString line, final Geometry geometry) {
Geometry intersection = line.intersection(geometry);
if (intersection instanceof LineString) {
LineString lineDiff = (LineString)intersection;
addElevation(line, lineDiff);

} else {
if (intersection instanceof MultiLineString) {
for (int i = 0; i < intersection.getNumGeometries(); i++) {
LineString lineDiff = (LineString)intersection.getGeometryN(i);
addElevation(line, lineDiff);
}
}
}
intersection.setUserData(line.getUserData());
return intersection;
}

private static void addElevation(final LineString original, final LineString update) {
Coordinate c0 = update.getCoordinateN(0);
if (Double.isNaN(c0.z)) {
addElevation(c0, original);
}
Coordinate cN = update.getCoordinateN(update.getNumPoints() - 1);
if (Double.isNaN(cN.z)) {
addElevation(cN, original);
}
}

public static Polygon getMitredBuffer(final Polygon polygon,
final double distance) {
Geometry buffer = polygon;
LineString exteriorRing = polygon.getExteriorRing();
Geometry exteriorBuffer = getMitredBuffer(exteriorRing, distance);
buffer = buffer.union(exteriorBuffer);
for (int i = 0; i < polygon.getNumInteriorRing(); i++) {
LineString ring = polygon.getInteriorRingN(i);
Geometry bufferedRing = getMitredBuffer(ring, distance);
buffer = buffer.union(bufferedRing);
}
return (Polygon)buffer;
}

public static Polygon getMitredBuffer(final LineString lineString,
final double distance) {
LineStringMitredBuffer visitor = new LineStringMitredBuffer(distance);
visitLineSegments(lineString.getCoordinateSequence(), visitor);
return visitor.getBuffer();
}

public static Polygon getMitredBuffer(final LineSegment segment,
final double distance) {

LineSegment extendedSegment = addLength(segment, distance, distance);
LineSegment clockwiseSegment = offset(extendedSegment, distance,
Angle.CLOCKWISE);
LineSegment counterClockwiseSegment = offset(extendedSegment, distance,
Angle.COUNTERCLOCKWISE);

Coordinate[] coords = new Coordinate[] {
clockwiseSegment.p0, clockwiseSegment.p1, counterClockwiseSegment.p1,
counterClockwiseSegment.p0, clockwiseSegment.p0
};
GeometryFactory factory = new GeometryFactory();
LinearRing exteriorRing = factory.createLinearRing(coords);
return factory.createPolygon(exteriorRing, null);
}

/**
* @param line1 The line to match
* @param line2 The line to compare the start of with the other line
* @return
*/
public static boolean touchesAtStart(final LineString line1,
final LineString line2) {
Coordinate l1c0 = line1.getCoordinateN(0);
Coordinate l1cN = line1.getCoordinateN(line1.getNumPoints() - 1);
Coordinate l2c0 = line2.getCoordinateN(0);
if (l2c0