This is an automated email from the ASF dual-hosted git repository.

bchapuis pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git


The following commit(s) were added to refs/heads/main by this push:
     new 84778f3c Correctly reproject geometries (#628)
84778f3c is described below

commit 84778f3c8b992eccca1808b16b70ab34d3b99238
Author: Bertil Chapuis <[email protected]>
AuthorDate: Tue Apr 25 01:05:55 2023 +0200

    Correctly reproject geometries (#628)
---
 .../database/copy/PostgisGeometryValueHandler.java |  3 +-
 ...eGeometryDecorator.java => TableDecorator.java} | 51 ++++++++++++----------
 .../baremaps/workflow/tasks/ImportGeoPackage.java  |  8 ++--
 .../baremaps/workflow/tasks/ImportShapefile.java   |  4 +-
 4 files changed, 37 insertions(+), 29 deletions(-)

diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/database/copy/PostgisGeometryValueHandler.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/database/copy/PostgisGeometryValueHandler.java
index 7857e519..3e23f4ec 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/database/copy/PostgisGeometryValueHandler.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/database/copy/PostgisGeometryValueHandler.java
@@ -22,9 +22,10 @@ import org.locationtech.jts.io.WKBWriter;
 
 public class PostgisGeometryValueHandler extends BaseValueHandler<Geometry> {
 
+  private final WKBWriter writer = new WKBWriter(2, wkbNDR, true);
+
   @Override
   protected void internalHandle(DataOutputStream buffer, Geometry value) 
throws IOException {
-    WKBWriter writer = new WKBWriter(2, wkbNDR, true);
     byte[] wkb = writer.write(value);
     buffer.writeInt(wkb.length);
     buffer.write(wkb, 0, wkb.length);
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/TableGeometryDecorator.java
 b/baremaps-core/src/main/java/org/apache/baremaps/storage/TableDecorator.java
similarity index 58%
rename from 
baremaps-core/src/main/java/org/apache/baremaps/storage/TableGeometryDecorator.java
rename to 
baremaps-core/src/main/java/org/apache/baremaps/storage/TableDecorator.java
index bbdf166d..04613113 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/storage/TableGeometryDecorator.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/storage/TableDecorator.java
@@ -14,6 +14,7 @@ package org.apache.baremaps.storage;
 
 
 import java.util.Iterator;
+import java.util.function.Function;
 import org.apache.baremaps.collection.AbstractDataCollection;
 import org.locationtech.jts.geom.Geometry;
 import org.locationtech.jts.geom.util.GeometryTransformer;
@@ -21,11 +22,11 @@ import org.locationtech.jts.geom.util.GeometryTransformer;
 /**
  * A decorator for a table that transforms the geometries of the rows.
  */
-public class TableGeometryDecorator extends AbstractDataCollection<Row> 
implements Table {
+public class TableDecorator extends AbstractDataCollection<Row> implements 
Table {
 
   private final Table table;
 
-  private final GeometryTransformer transformer;
+  private final Function<Row, Row> transformer;
 
   /**
    * Constructs a new table geometry decorator.
@@ -33,9 +34,32 @@ public class TableGeometryDecorator extends 
AbstractDataCollection<Row> implemen
    * @param table the table to decorate
    * @param geometryTransformer the geometry transformer
    */
-  public TableGeometryDecorator(Table table, GeometryTransformer 
geometryTransformer) {
+  public TableDecorator(Table table, GeometryTransformer geometryTransformer) {
+    this(table, row -> {
+      var columns = table.schema()
+          .columns().stream()
+          .filter(column -> column.type().isAssignableFrom(Geometry.class))
+          .toList();
+      for (Column column : columns) {
+        var name = column.name();
+        var geometry = (Geometry) row.get(name);
+        if (geometry != null) {
+          row.set(name, geometryTransformer.transform(geometry));
+        }
+      }
+      return row;
+    });
+  }
+
+  /**
+   * Constructs a new table decorator.
+   *
+   * @param table the table to decorate
+   * @param transformer the row transformer
+   */
+  public TableDecorator(Table table, Function<Row, Row> transformer) {
     this.table = table;
-    this.transformer = geometryTransformer;
+    this.transformer = transformer;
   }
 
   /**
@@ -51,7 +75,7 @@ public class TableGeometryDecorator extends 
AbstractDataCollection<Row> implemen
    */
   @Override
   public Iterator<Row> iterator() {
-    return table.stream().map(this::transform).iterator();
+    return table.stream().map(this.transformer).iterator();
   }
 
   /**
@@ -61,21 +85,4 @@ public class TableGeometryDecorator extends 
AbstractDataCollection<Row> implemen
   public long sizeAsLong() {
     return table.sizeAsLong();
   }
-
-  /**
-   * Transforms the geometry of a row.
-   *
-   * @param row The row to transform.
-   * @return The transformed row.
-   */
-  protected Row transform(Row row) {
-    var columns = schema().columns().stream()
-        .filter(column -> column.type().isInstance(Geometry.class)).toList();
-    for (Column column : columns) {
-      var name = column.name();
-      var geometry = (Geometry) row.get(name);
-      row.set(name, transformer.transform(geometry));
-    }
-    return row;
-  }
 }
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportGeoPackage.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportGeoPackage.java
index 50ef29c2..ef2ea390 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportGeoPackage.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportGeoPackage.java
@@ -14,7 +14,7 @@ package org.apache.baremaps.workflow.tasks;
 
 import java.nio.file.Path;
 import org.apache.baremaps.openstreetmap.utils.ProjectionTransformer;
-import org.apache.baremaps.storage.TableGeometryDecorator;
+import org.apache.baremaps.storage.TableDecorator;
 import org.apache.baremaps.storage.geopackage.GeoPackageStore;
 import org.apache.baremaps.storage.postgres.PostgresStore;
 import org.apache.baremaps.workflow.Task;
@@ -37,9 +37,9 @@ public record ImportGeoPackage(Path file, String database, 
Integer sourceSRID, I
       var postgresDatabase = new PostgresStore(dataSource);
       for (var name : geoPackageDatabase.list()) {
         var transformer = new ProjectionTransformer(sourceSRID, targetSRID);
-        var transformedTable =
-            new TableGeometryDecorator(geoPackageDatabase.get(name), 
transformer);
-        postgresDatabase.add(transformedTable);
+        var decoratedTable =
+            new TableDecorator(geoPackageDatabase.get(name), transformer);
+        postgresDatabase.add(decoratedTable);
       }
     } catch (Exception e) {
       throw new WorkflowException(e);
diff --git 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportShapefile.java
 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportShapefile.java
index 8bcbb095..689a38bb 100644
--- 
a/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportShapefile.java
+++ 
b/baremaps-core/src/main/java/org/apache/baremaps/workflow/tasks/ImportShapefile.java
@@ -14,7 +14,7 @@ package org.apache.baremaps.workflow.tasks;
 
 import java.nio.file.Path;
 import org.apache.baremaps.openstreetmap.utils.ProjectionTransformer;
-import org.apache.baremaps.storage.TableGeometryDecorator;
+import org.apache.baremaps.storage.TableDecorator;
 import org.apache.baremaps.storage.postgres.PostgresStore;
 import org.apache.baremaps.storage.shapefile.ShapefileTable;
 import org.apache.baremaps.workflow.Task;
@@ -36,7 +36,7 @@ public record ImportShapefile(Path file, String database, 
Integer sourceSRID, In
       var featureSet = new ShapefileTable(path);
       var dataSource = context.getDataSource(database);
       var postgresDatabase = new PostgresStore(dataSource);
-      postgresDatabase.add(new TableGeometryDecorator(
+      postgresDatabase.add(new TableDecorator(
           featureSet, new ProjectionTransformer(sourceSRID, targetSRID)));
     } catch (Exception e) {
       throw new WorkflowException(e);

Reply via email to