开源社区里对于JTS库的使用还是比较广泛的。 下面是一段引自网上的代码工具类,可以帮助大家理解JTS的各个功能操作。
package com.revolsys.gis.jts; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; import java.util.Map; import java.util.TreeMap; import com.revolsys.gis.data.model.DataObject; import com.vividsolutions.jts.algorithm.Angle; import com.vividsolutions.jts.algorithm.CGAlgorithms; import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.CoordinateSequence; import com.vividsolutions.jts.geom.CoordinateSequenceFactory; import com.vividsolutions.jts.geom.CoordinateSequenceFilter; import com.vividsolutions.jts.geom.Envelope; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; import com.vividsolutions.jts.geom.GeometryFactory; import com.vividsolutions.jts.geom.LineSegment; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.LinearRing; import com.vividsolutions.jts.geom.MultiLineString; import com.vividsolutions.jts.geom.MultiPoint; import com.vividsolutions.jts.geom.Point; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.geom.PrecisionModel; import com.vividsolutions.jts.geom.impl.CoordinateArraySequenceFactory; import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory; import com.vividsolutions.jts.operation.linemerge.LineMerger; public final class JtsGeometryUtil { public static final String FEATURE_PROPERTY = "feature"; private JtsGeometryUtil() { } public static DataObject getGeometryFeature(final Geometry geometry) { return (DataObject)getGeometryProperty(geometry, FEATURE_PROPERTY); } public static void setGeometryFeature(final Geometry geometry, final DataObject feature) { setGeometryProperty(geometry, FEATURE_PROPERTY, feature); } @SuppressWarnings("unchecked") public static <T extends Object> T getGeometryProperty( final Geometry geometry, final String name) { Map<String, Object> map = getGeometryProperties(geometry); return (T)map.get(name); } @SuppressWarnings("unchecked") public static Map<String, Object> getGeometryProperties( final Geometry geometry) { Object userData = geometry.getUserData(); if (userData instanceof Map) { Map<String, Object> map = (Map<String, Object>)userData; return map; } return Collections.emptyMap(); } @SuppressWarnings("unchecked") public static void setGeometryProperty(final Geometry geometry, final String name, final Object value) { Object userData = geometry.getUserData(); if (!(userData instanceof Map)) { userData = new TreeMap<Object, Object>(); geometry.setUserData(userData); } Map<Object, Object> map = (Map<Object, Object>)userData; map.put(name, value); } public static Polygon createPolygon(final MultiLineString multiLine) { GeometryFactory factory = multiLine.getFactory(); Coordinate[] coordinates = getMergeLine(multiLine).getCoordinates(); LinearRing linearRing = factory.createLinearRing(coordinates); Polygon polygon = factory.createPolygon(linearRing, null); return polygon; } public static LineString getMergeLine(final MultiLineString multiLineString) { Collection<LineString> lineStrings = getMergedLines(multiLineString); int numLines = lineStrings.size(); if (numLines == 1) { return (LineString)lineStrings.iterator().next(); } else { return null; } } @SuppressWarnings("unchecked") public static Collection<LineString> getMergedLines( final MultiLineString multiLineString) { LineMerger merger = new LineMerger(); merger.add(multiLineString); Collection<LineString> lineStrings = merger.getMergedLineStrings(); return lineStrings; } /** * Merge two lines that share common coordinates at either the start or end. * If the lines touch only at their start coordinates, the line2 will be * reversed and joined before the start of line1. If the tow lines ouch only * at their end coordinates, the line2 will be reversed and joined after the * end of line1. * * @param line1 The first line. * @param line2 The second line. * @return The new line string */ public static LineString merge(final LineString line1, final LineString line2) { CoordinateSequence coordinates = merge(line1.getCoordinateSequence(), line2.getCoordinateSequence()); GeometryFactory factory = line1.getFactory(); LineString line = factory.createLineString(coordinates); line.setUserData(line1.getUserData()); return line; } private static CoordinateSequence merge(final CoordinateSequence coordinates1, final CoordinateSequence coordinates2) { Coordinate[] coordinates = new Coordinate[coordinates1.size() + coordinates2.size() - 1]; int numCoords = 0; Coordinate coordinates1Start = coordinates1.getCoordinate(0); Coordinate coordinates1End = coordinates1.getCoordinate(coordinates1.size() - 1); Coordinate coordinates2Start = coordinates2.getCoordinate(0); Coordinate coordinates2End = coordinates2.getCoordinate(coordinates2.size() - 1); if (coordinates1Start.equals(coordinates2End)) { numCoords = addCoordinates(coordinates2, coordinates, numCoords, null); numCoords = addCoordinates(coordinates1, coordinates, numCoords, coordinates[numCoords - 1]); } else if (coordinates2Start.equals(coordinates1End)) { numCoords = addCoordinates(coordinates1, coordinates, numCoords, null); numCoords = addCoordinates(coordinates2, coordinates, numCoords, coordinates[numCoords - 1]); } else if (coordinates1Start.equals(coordinates2Start)) { numCoords = addReversedCoordinates(coordinates2, coordinates, numCoords, null); numCoords = addCoordinates(coordinates1, coordinates, numCoords, coordinates[numCoords - 1]); } else if (coordinates1End.equals(coordinates2End)) { numCoords = addCoordinates(coordinates1, coordinates, numCoords, null); numCoords = addReversedCoordinates(coordinates2, coordinates, numCoords, coordinates[numCoords - 1]); } else { throw new IllegalArgumentException("lines don't touch"); } if (numCoords != coordinates.length) { Coordinate[] newCoordinates = new Coordinate[numCoords]; System.arraycopy(coordinates, 0, newCoordinates, 0, numCoords); coordinates = newCoordinates; } return CoordinateArraySequenceFactory.instance().create(coordinates); } public static int addCoordinates(final CoordinateSequence src, final Coordinate[] dest, final int startIndex, final Coordinate lastCoordinate) { Coordinate previousCoordinate = lastCoordinate; int coordIndex = startIndex; try { for (int i = 0; i < src.size(); i++) { Coordinate coordinate = src.getCoordinate(i); if (!coordinate.equals(previousCoordinate)) { dest[coordIndex++] = coordinate; } previousCoordinate = coordinate; } } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } return coordIndex; } public static int addReversedCoordinates(final CoordinateSequence src, final Coordinate[] dest, final int startIndex, final Coordinate lastCoordinate) { Coordinate endCoordinate = lastCoordinate; int coordIndex = startIndex; try { for (int i = src.size() - 1; i > -1; i--) { Coordinate coordinate = src.getCoordinate(i); if (!coordinate.equals(endCoordinate)) { dest[coordIndex++] = coordinate; } endCoordinate = coordinate; } } catch (ArrayIndexOutOfBoundsException e) { e.printStackTrace(); } return coordIndex; } public static boolean equalsExact3D(final LineString line1, final LineString line2) { if (line1.getNumPoints() != line2.getNumPoints()) { return false; } for (int i = 0; i < line1.getNumPoints(); i++) { line1.getCoordinateN(i); Coordinate coordinate1 = line1.getCoordinateN(i); Coordinate coordinate2 = line2.getCoordinateN(i); if (!coordinate1.equals3D(coordinate2)) { return false; } } return true; } public static boolean equalsExact3D(final Point point1, final Point point2) { Coordinate coordinate