From c43d4f92ee23aa375cfd08ee40e0ce0373ea8719 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8D=C3=B1igo=20Cobi=C3=A1n?= Date: Sun, 10 Nov 2024 22:08:36 +0100 Subject: [PATCH 1/3] Avoid drawing holes by triangulating the vector --- .../components/geospace/processing/Rasterizer.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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..fe3f77ecb 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 @@ -188,13 +189,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, holeColor); + } else { + drawGeometry(poly, valueColor); } } } else { From 4d6d69d3716a4c0a4e1f7438101ffd3a3eeff9ce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8D=C3=B1igo=20Cobi=C3=A1n?= Date: Sun, 10 Nov 2024 22:21:49 +0100 Subject: [PATCH 2/3] Remove references to holes in rasterization process --- .../components/geospace/processing/Rasterizer.java | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) 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 fe3f77ecb..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 @@ -132,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++) { @@ -166,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 @@ -181,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())) */ { @@ -192,7 +189,7 @@ private void draw(Geometry geometry, Color valueColor, Color holeColor) { boolean hasHoles = poly.getNumInteriorRing() > 0; if (hasHoles) { Geometry triangles = PolygonTriangulator.triangulate(poly); - draw(triangles, valueColor, holeColor); + draw(triangles, valueColor); } else { drawGeometry(poly, valueColor); } From 7b0d5b761e0ff5eeb34206bab0531d9efccc1c6c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=8D=C3=B1igo=20Cobi=C3=A1n?= Date: Mon, 9 Dec 2024 12:00:44 +0100 Subject: [PATCH 3/3] Bump JTS version to 1.20 Trying to fix the issue 'Unable to find a convex corner' --- klab.engine/pom.xml | 28 ++++++++++++++++++++++++++++ pom.xml | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) 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/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