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);