static Geometry densify(Geometry geom, CoordinateReferenceSystem crs, double maxAreaError) throws FactoryException, TransformException { // basic checks if (maxAreaError <= 0) { throw new IllegalArgumentException("maxAreaError must be greater than 0"); } if (!(geom instanceof Polygon) && !(geom instanceof MultiPolygon)) { throw new IllegalArgumentException("Geom must be poligonal"); } if (crs == null) { throw new IllegalArgumentException("CRS cannot be set to null"); } double previousArea = 0.0; CoordinateReferenceSystem targetCRS = CRS.parseWKT(ECKERT_IV_WKT); MathTransform firstTransform = CRS.findMathTransform(crs, targetCRS); GeometryFactory geomFactory = new GeometryFactory(); int ngeom = geom.getNumGeometries(); Geometry densifiedGeometry = geom; double areaError = 1.0d; int maxIterate = 0; do { double max = 0; maxIterate++; // check the maximum side length of the densifiedGeometry for (int j = 0; j < ngeom; j++) { Geometry geometry = densifiedGeometry.getGeometryN(j); Coordinate[] coordinates = geometry.getCoordinates(); int n = coordinates.length; for (int i = 0; i < (n - 1); i++) { Coordinate[] coords = new Coordinate[2]; coords[0] = coordinates[i]; coords[1] = coordinates[i + 1]; LineString lineString = geomFactory.createLineString(coords); if (lineString.getLength() > max) max = lineString.getLength(); } } // calculate the denified geometry densifiedGeometry = Densifier.densify(densifiedGeometry, max / 2); // reproject densifiedGeometry to Eckert IV Geometry targetGeometry = JTS.transform(densifiedGeometry, firstTransform); double nextArea = targetGeometry.getArea(); // evaluate the current error areaError = Math.abs(previousArea - nextArea) / nextArea; // logger3.info("AREA ERROR"+areaError); previousArea = nextArea; // check whether the current error is greater than the maximum allowed } while (areaError > maxAreaError && maxIterate < 10); return densifiedGeometry; }
/** * Densify a geometry using the given distance tolerance. * * @param geometry Geometry * @param tolerance Distance tolerance * @return Densified geometry */ public static Geometry densify(Geometry geometry, double tolerance) { if (geometry == null) { return null; } return Densifier.densify(geometry, tolerance); }