This is an automated email from the ASF dual-hosted git repository. bchapuis pushed a commit to branch 624-geometry-projection in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git
commit c3c664718002ea70269988d3765348261b5e2a27 Author: Bertil Chapuis <[email protected]> AuthorDate: Mon Apr 24 23:36:33 2023 +0200 Correctly reproject geometries --- .../database/copy/PostgisGeometryValueHandler.java | 3 +- ...eGeometryDecorator.java => TableDecorator.java} | 49 ++++++++++++---------- .../baremaps/workflow/tasks/ImportGeoPackage.java | 8 ++-- .../baremaps/workflow/tasks/ImportShapefile.java | 4 +- 4 files changed, 35 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 59% 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..d610a7ce 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,30 @@ 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); + 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 +73,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 +83,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);
