diff --git a/klab.engine/pom.xml b/klab.engine/pom.xml index a5b6fbf53..275bd8293 100644 --- a/klab.engine/pom.xml +++ b/klab.engine/pom.xml @@ -329,9 +329,19 @@ org.mongodb mongo-java-driver + + org.locationtech.jts + jts-core + + + org.locationtech.jts + jts-core + ${jts.version} + + xml-apis @@ -642,6 +652,12 @@ org.orbisgis h2gis 2.1.0 + + + org.locationtech.jts + jts-core + + @@ -718,11 +734,23 @@ org.geotools gt-process ${geotools.version} + + + org.locationtech.jts + jts-core + + org.geotools gt-process-raster ${geotools.version} + + + org.locationtech.jts + jts-core + + org.geotools diff --git a/klab.engine/src/main/java/org/integratedmodelling/klab/components/geospace/processing/Rasterizer.java b/klab.engine/src/main/java/org/integratedmodelling/klab/components/geospace/processing/Rasterizer.java index 6b09195a5..8f294978e 100644 --- a/klab.engine/src/main/java/org/integratedmodelling/klab/components/geospace/processing/Rasterizer.java +++ b/klab.engine/src/main/java/org/integratedmodelling/klab/components/geospace/processing/Rasterizer.java @@ -29,6 +29,7 @@ import org.locationtech.jts.geom.MultiPolygon; import org.locationtech.jts.geom.Point; import org.locationtech.jts.geom.Polygon; +import org.locationtech.jts.triangulate.polygon.PolygonTriangulator; /** * Simple, flexible rasterizer using an AWT image as a backend and closures to determine (a) the @@ -131,9 +132,8 @@ public Collection getCoordinates(IShape shape) { Geometry geometry = ((Shape) shape).getJTSGeometry(); Color valueColor = new Color(255, 255, 255); - Color holeColor = new Color(0, 0, 0); - draw(geometry, valueColor, holeColor); + draw(geometry, valueColor); int[] xy = new int[2]; for (int x = 0; x < this.raster.getWidth(); x++) { @@ -165,14 +165,12 @@ public void add(IShape shape, Function encoder) { Geometry geometry = ((Shape) shape).getJTSGeometry(); int rgbVal = floatBitsToInt(encodeToFloat(value)); - int holeVal = floatBitsToInt(Float.NaN); Color valueColor = new Color(rgbVal, true); - Color holeColor = new Color(holeVal, true); - draw(geometry, valueColor, holeColor); + draw(geometry, valueColor); } - private void draw(Geometry geometry, Color valueColor, Color holeColor) { + private void draw(Geometry geometry, Color valueColor) { Geometries geomType = Geometries.get(geometry); if (geomType == Geometries.MULTIPOLYGON || geomType == Geometries.MULTILINESTRING @@ -180,7 +178,7 @@ private void draw(Geometry geometry, Color valueColor, Color holeColor) { final int numGeom = geometry.getNumGeometries(); for (int i = 0; i < numGeom; i++) { Geometry geomN = geometry.getGeometryN(i); - draw(geomN, valueColor, holeColor); + draw(geomN, valueColor); } } else /* if (geometry.intersects(((Grid) extent).getShape().getJTSGeometry())) */ { @@ -188,13 +186,12 @@ private void draw(Geometry geometry, Color valueColor, Color holeColor) { for (int i = 0; i < geometry.getNumGeometries(); i++) { Polygon poly = (Polygon) geometry.getGeometryN(i); - LinearRing lr = geoFactory.createLinearRing(poly.getExteriorRing().getCoordinates()); - Polygon part = geoFactory.createPolygon(lr, null); - drawGeometry(part, valueColor); - for (int j = 0; j < poly.getNumInteriorRing(); j++) { - lr = geoFactory.createLinearRing(poly.getInteriorRingN(j).getCoordinates()); - part = geoFactory.createPolygon(lr, null); - drawGeometry(part, holeColor); + boolean hasHoles = poly.getNumInteriorRing() > 0; + if (hasHoles) { + Geometry triangles = PolygonTriangulator.triangulate(poly); + draw(triangles, valueColor); + } else { + drawGeometry(poly, valueColor); } } } else { diff --git a/pom.xml b/pom.xml index a1c1b0706..b91616930 100644 --- a/pom.xml +++ b/pom.xml @@ -100,7 +100,7 @@ should be the same one that geotools and HM needs. --> 28.0 0.10.9-SNAPSHOT - 1.18.1 + 1.20.0 1.5.0 11 11