查遍了JTS的Api,一直没找到方法,两个个几何对象的倒有,但一个几何对象的没有,另外,MULTIPOLYGON该如何打散成多个POLYGON的
1条回答 默认 最新
明初啥都能学会 2024-04-27 11:17关注该回答引用ChatGPT3.5,结果代码方法已验证可行
对于LineString和Polygon的自相交检测,JTS(Java Topology Suite)提供了相应的方法。LineString自相交检测:
使用LineIntersector类来检测LineString是否自相交。你可以使用LineIntersector的computeIntersections()方法来计算交点,并检查交点的数量。如果有交点,则表明LineString自相交。import com.vividsolutions.jts.geom.Coordinate; import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.LineString; import com.vividsolutions.jts.geom.PrecisionModel; import com.vividsolutions.jts.geom.TopologyException; import com.vividsolutions.jts.geom.impl.PackedCoordinateSequenceFactory; import com.vividsolutions.jts.geom.util.LineStringExtracter; import com.vividsolutions.jts.operation.linemerge.LineMerger; import com.vividsolutions.jts.precision.GeometryPrecisionReducer; import com.vividsolutions.jts.precision.MinimumClearance; import com.vividsolutions.jts.precision.MinimumClearanceFinder; import com.vividsolutions.jts.precision.SimpleGeometryPrecisionReducer; import com.vividsolutions.jts.util.GeometricShapeFactory; import com.vividsolutions.jts.util.Stopwatch; public class LineStringSelfIntersect { public static boolean isSelfIntersect(LineString line) { LineIntersector lineIntersector = new RobustLineIntersector(); Coordinate[] coordinates = line.getCoordinates(); for (int i = 0; i < coordinates.length - 1; i++) { for (int j = i + 1; j < coordinates.length - 1; j++) { lineIntersector.computeIntersection(coordinates[i], coordinates[i + 1], coordinates[j], coordinates[j + 1]); if (lineIntersector.hasIntersection()) { return true; } } } return false; } }Polygon自相交检测:
对于Polygon自相交的检测,你可以先将Polygon转换为一个LineString,然后使用上述的方法来检测LineString是否自相交。如果是自相交的,说明Polygon也自相交。import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.Polygon; import com.vividsolutions.jts.operation.polygonize.Polygonizer; public class PolygonSelfIntersect { public static boolean isSelfIntersect(Polygon polygon) { Geometry boundary = polygon.getBoundary(); // Get the boundary as LineString return LineStringSelfIntersect.isSelfIntersect(boundary); } }MULTIPOLYGON打散成多个POLYGON:
对于MULTIPOLYGON,你可以使用GeometryCollection类来打散成多个Polygon,然后遍历处理每个Polygon。import com.vividsolutions.jts.geom.Geometry; import com.vividsolutions.jts.geom.GeometryCollection; import com.vividsolutions.jts.geom.Polygon; public class MultiPolygonToPolygons { public static Polygon[] explodeMultiPolygon(MultiPolygon multiPolygon) { GeometryCollection geometryCollection = (GeometryCollection) multiPolygon; int numGeometries = geometryCollection.getNumGeometries(); Polygon[] polygons = new Polygon[numGeometries]; for (int i = 0; i < numGeometries; i++) { Geometry geometry = geometryCollection.getGeometryN(i); if (geometry instanceof Polygon) { polygons[i] = (Polygon) geometry; } } return polygons; } }
这些方法可以帮助你验证LineString和Polygon的自相交,并将MULTIPOLYGON打散成多个POLYGON。
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报