You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@baremaps.apache.org by bc...@apache.org on 2024/10/19 21:46:47 UTC
(incubator-baremaps) 01/01: Implement a geoparquet writer
This is an automated email from the ASF dual-hosted git repository.
bchapuis pushed a commit to branch geoparquet-writer
in repository https://gitbox.apache.org/repos/asf/incubator-baremaps.git
commit b00df171a98f3df7c6056eec29e0d7169ebe31a5
Author: Bertil Chapuis <bc...@gmail.com>
AuthorDate: Sat Oct 19 23:46:30 2024 +0200
Implement a geoparquet writer
---
.../geoparquet/OvertureMapsBenchmark.java | 6 +-
.../geoparquet/SmallFileBenchmark.java | 7 +-
.../storage/geoparquet/GeoParquetDataTable.java | 3 +-
.../baremaps/geoparquet/GeoParquetGroup.java | 2 +-
.../baremaps/geoparquet/GeoParquetReader.java | 26 ++--
.../geoparquet/GeoParquetWriteSupport.java | 134 +++++++++++++++++++++
.../baremaps/geoparquet/GeoParquetWriter.java | 76 ++++++++++++
.../baremaps/geoparquet/GeoParquetReaderTest.java | 12 +-
.../baremaps/geoparquet/GeoParquetWriterTest.java | 110 +++++++++++++++++
.../baremaps/geoparquet/OvertureMapsTest.java | 27 ++---
10 files changed, 362 insertions(+), 41 deletions(-)
diff --git a/baremaps-benchmarking/src/main/java/org/apache/baremaps/benchmarking/geoparquet/OvertureMapsBenchmark.java b/baremaps-benchmarking/src/main/java/org/apache/baremaps/benchmarking/geoparquet/OvertureMapsBenchmark.java
index a230e41da..59da4d153 100644
--- a/baremaps-benchmarking/src/main/java/org/apache/baremaps/benchmarking/geoparquet/OvertureMapsBenchmark.java
+++ b/baremaps-benchmarking/src/main/java/org/apache/baremaps/benchmarking/geoparquet/OvertureMapsBenchmark.java
@@ -83,14 +83,16 @@ public class OvertureMapsBenchmark {
@SuppressWarnings({"squid:S1481", "squid:S2201"})
@Benchmark
public void read() {
- GeoParquetReader reader = new GeoParquetReader(directory.toUri());
+ var path = new org.apache.hadoop.fs.Path(directory.toUri());
+ GeoParquetReader reader = new GeoParquetReader(path);
reader.read().count();
}
@SuppressWarnings({"squid:S1481", "squid:S2201"})
@Benchmark
public void readParallel() {
- GeoParquetReader reader = new GeoParquetReader(directory.toUri());
+ var path = new org.apache.hadoop.fs.Path(directory.toUri());
+ GeoParquetReader reader = new GeoParquetReader(path);
reader.readParallel().count();
}
}
diff --git a/baremaps-benchmarking/src/main/java/org/apache/baremaps/benchmarking/geoparquet/SmallFileBenchmark.java b/baremaps-benchmarking/src/main/java/org/apache/baremaps/benchmarking/geoparquet/SmallFileBenchmark.java
index 11f468f00..1ae2a7476 100644
--- a/baremaps-benchmarking/src/main/java/org/apache/baremaps/benchmarking/geoparquet/SmallFileBenchmark.java
+++ b/baremaps-benchmarking/src/main/java/org/apache/baremaps/benchmarking/geoparquet/SmallFileBenchmark.java
@@ -61,16 +61,17 @@ public class SmallFileBenchmark {
@SuppressWarnings({"squid:S1481", "squid:S2201"})
@Benchmark
public void read() {
- GeoParquetReader reader =
- new GeoParquetReader(Path.of("baremaps-benchmarking/data/small/*.parquet").toUri());
+ var path = new org.apache.hadoop.fs.Path("baremaps-benchmarking/data/small/*.parquet");
+ GeoParquetReader reader = new GeoParquetReader(path);
reader.read().count();
}
@SuppressWarnings({"squid:S1481", "squid:S2201"})
@Benchmark
public void readParallel() {
+ var path = new org.apache.hadoop.fs.Path("baremaps-benchmarking/data/small/*.parquet");
GeoParquetReader reader =
- new GeoParquetReader(Path.of("baremaps-benchmarking/data/small/*.parquet").toUri());
+ new GeoParquetReader(path);
reader.readParallel().count();
}
}
diff --git a/baremaps-core/src/main/java/org/apache/baremaps/storage/geoparquet/GeoParquetDataTable.java b/baremaps-core/src/main/java/org/apache/baremaps/storage/geoparquet/GeoParquetDataTable.java
index 90c78d1a7..b3867cfa6 100644
--- a/baremaps-core/src/main/java/org/apache/baremaps/storage/geoparquet/GeoParquetDataTable.java
+++ b/baremaps-core/src/main/java/org/apache/baremaps/storage/geoparquet/GeoParquetDataTable.java
@@ -24,6 +24,7 @@ import java.util.stream.Stream;
import org.apache.baremaps.data.storage.*;
import org.apache.baremaps.geoparquet.GeoParquetException;
import org.apache.baremaps.geoparquet.GeoParquetReader;
+import org.apache.hadoop.fs.Path;
public class GeoParquetDataTable implements DataTable {
@@ -35,7 +36,7 @@ public class GeoParquetDataTable implements DataTable {
public GeoParquetDataTable(URI path) {
this.path = path;
- this.reader = new GeoParquetReader(path);
+ this.reader = new GeoParquetReader(new Path(path));
}
@Override
diff --git a/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetGroup.java b/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetGroup.java
index 38c6dd746..e524a229f 100644
--- a/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetGroup.java
+++ b/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetGroup.java
@@ -105,7 +105,7 @@ public class GeoParquetGroup {
}
}
- private Object getValue(int fieldIndex, int index) {
+ Object getValue(int fieldIndex, int index) {
Object value = data[fieldIndex];
if (value instanceof List<?>list) {
return list.get(index);
diff --git a/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetReader.java b/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetReader.java
index 8b4697aa1..e965d250a 100644
--- a/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetReader.java
+++ b/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetReader.java
@@ -20,7 +20,6 @@ package org.apache.baremaps.geoparquet;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
-import java.net.URI;
import java.util.*;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.Collectors;
@@ -53,31 +52,31 @@ public class GeoParquetReader {
/**
* Constructs a new {@code GeoParquetReader}.
*
- * @param uri the URI to read from
+ * @param path the path to read from
*/
- public GeoParquetReader(URI uri) {
- this(uri, null, new Configuration());
+ public GeoParquetReader(Path path) {
+ this(path, null, new Configuration());
}
/**
* Constructs a new {@code GeoParquetReader}.
*
- * @param uri the URI to read from
+ * @param path the path to read from
* @param envelope the envelope to filter records
*/
- public GeoParquetReader(URI uri, Envelope envelope) {
- this(uri, envelope, new Configuration());
+ public GeoParquetReader(Path path, Envelope envelope) {
+ this(path, envelope, new Configuration());
}
/**
* Constructs a new {@code GeoParquetReader}.
*
- * @param uri the URI to read from
+ * @param path the path to read from
* @param configuration the configuration
*/
- public GeoParquetReader(URI uri, Envelope envelope, Configuration configuration) {
+ public GeoParquetReader(Path path, Envelope envelope, Configuration configuration) {
this.configuration = configuration;
- this.files = initializeFiles(uri, configuration);
+ this.files = initializeFiles(path, configuration);
this.envelope = envelope;
}
@@ -168,11 +167,10 @@ public class GeoParquetReader {
}
}
- private static List<FileStatus> initializeFiles(URI uri, Configuration configuration) {
+ private static List<FileStatus> initializeFiles(Path path, Configuration configuration) {
try {
- Path globPath = new Path(uri.getPath());
- FileSystem fileSystem = FileSystem.get(uri, configuration);
- FileStatus[] fileStatuses = fileSystem.globStatus(globPath);
+ FileSystem fileSystem = FileSystem.get(path.toUri(), configuration);
+ FileStatus[] fileStatuses = fileSystem.globStatus(path);
if (fileStatuses == null) {
throw new GeoParquetException("No files found at the specified URI.");
}
diff --git a/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetWriteSupport.java b/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetWriteSupport.java
new file mode 100644
index 000000000..2f85cd193
--- /dev/null
+++ b/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetWriteSupport.java
@@ -0,0 +1,134 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.geoparquet;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.parquet.hadoop.api.WriteSupport;
+import org.apache.parquet.io.api.Binary;
+import org.apache.parquet.io.api.RecordConsumer;
+import org.apache.parquet.schema.*;
+
+/**
+ * WriteSupport implementation for writing GeoParquetGroup instances to Parquet.
+ */
+public class GeoParquetWriteSupport extends WriteSupport<GeoParquetGroup> {
+
+ private RecordConsumer recordConsumer;
+ private final MessageType schema;
+ private final GeoParquetMetadata metadata;
+ private final ObjectMapper objectMapper = new ObjectMapper();
+
+ /**
+ * Constructs a new GeoParquetWriteSupport.
+ *
+ * @param schema the Parquet schema
+ * @param metadata the GeoParquet metadata
+ */
+ public GeoParquetWriteSupport(MessageType schema, GeoParquetMetadata metadata) {
+ this.schema = schema;
+ this.metadata = metadata;
+ }
+
+ @Override
+ public WriteContext init(Configuration configuration) {
+ Map<String, String> extraMetadata = new HashMap<>();
+ // Serialize the GeoParquet metadata to JSON and add it to the file metadata
+ String geoMetadataJson = serializeMetadata(metadata);
+ extraMetadata.put("geo", geoMetadataJson);
+
+ return new WriteContext(schema, extraMetadata);
+ }
+
+ @Override
+ public void prepareForWrite(RecordConsumer recordConsumer) {
+ this.recordConsumer = recordConsumer;
+ }
+
+ @Override
+ public void write(GeoParquetGroup group) {
+ writeGroup(group, schema);
+ }
+
+ private void writeGroup(GeoParquetGroup group, GroupType groupType) {
+ recordConsumer.startMessage();
+ for (int i = 0; i < groupType.getFieldCount(); i++) {
+ Type fieldType = groupType.getType(i);
+ String fieldName = fieldType.getName();
+ int repetitionCount = group.getFieldRepetitionCount(i);
+ if (repetitionCount == 0) {
+ continue; // Skip if no values are present
+ }
+ for (int j = 0; j < repetitionCount; j++) {
+ recordConsumer.startField(fieldName, i);
+ if (fieldType.isPrimitive()) {
+ Object value = group.getValue(i, j);
+ writePrimitive(value, fieldType.asPrimitiveType());
+ } else {
+ GeoParquetGroup childGroup = group.getGroup(i, j);
+ writeGroup(childGroup, fieldType.asGroupType());
+ }
+ recordConsumer.endField(fieldName, i);
+ }
+ }
+ recordConsumer.endMessage();
+ }
+
+ private void writePrimitive(Object value, PrimitiveType primitiveType) {
+ if (value == null) {
+ // The Parquet format does not support writing null values directly.
+ // If the field is optional and the value is null, we simply do not write it.
+ return;
+ }
+ switch (primitiveType.getPrimitiveTypeName()) {
+ case INT32:
+ recordConsumer.addInteger((Integer) value);
+ break;
+ case INT64:
+ recordConsumer.addLong((Long) value);
+ break;
+ case FLOAT:
+ recordConsumer.addFloat((Float) value);
+ break;
+ case DOUBLE:
+ recordConsumer.addDouble((Double) value);
+ break;
+ case BOOLEAN:
+ recordConsumer.addBoolean((Boolean) value);
+ break;
+ case BINARY:
+ case FIXED_LEN_BYTE_ARRAY:
+ recordConsumer.addBinary((Binary) value);
+ break;
+ default:
+ throw new UnsupportedOperationException(
+ "Unsupported type: " + primitiveType.getPrimitiveTypeName());
+ }
+ }
+
+ private String serializeMetadata(GeoParquetMetadata metadata) {
+ try {
+ return objectMapper.writeValueAsString(metadata);
+ } catch (JsonProcessingException e) {
+ throw new RuntimeException("Failed to serialize GeoParquet metadata", e);
+ }
+ }
+}
diff --git a/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetWriter.java b/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetWriter.java
new file mode 100644
index 000000000..918dbdf19
--- /dev/null
+++ b/baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetWriter.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.geoparquet;
+
+import java.io.IOException;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.Path;
+import org.apache.parquet.column.ParquetProperties;
+import org.apache.parquet.hadoop.ParquetWriter;
+import org.apache.parquet.hadoop.metadata.CompressionCodecName;
+import org.apache.parquet.schema.MessageType;
+
+/**
+ * A writer for GeoParquet files that writes GeoParquetGroup instances to a Parquet file.
+ */
+public class GeoParquetWriter {
+
+ private final ParquetWriter<GeoParquetGroup> parquetWriter;
+
+ /**
+ * Constructs a new GeoParquetWriter.
+ *
+ * @param outputFile the output file
+ * @param schema the Parquet schema
+ * @param metadata the GeoParquet metadata
+ * @throws IOException if an I/O error occurs
+ */
+ public GeoParquetWriter(Path outputFile, MessageType schema, GeoParquetMetadata metadata)
+ throws IOException {
+ this.parquetWriter = new ParquetWriter<>(
+ outputFile,
+ new GeoParquetWriteSupport(schema, metadata),
+ CompressionCodecName.UNCOMPRESSED,
+ ParquetWriter.DEFAULT_BLOCK_SIZE,
+ ParquetWriter.DEFAULT_PAGE_SIZE,
+ ParquetWriter.DEFAULT_PAGE_SIZE,
+ ParquetWriter.DEFAULT_IS_DICTIONARY_ENABLED,
+ ParquetWriter.DEFAULT_IS_VALIDATING_ENABLED,
+ ParquetProperties.WriterVersion.PARQUET_1_0,
+ new Configuration());
+ }
+
+ /**
+ * Writes a GeoParquetGroup to the Parquet file.
+ *
+ * @param group the GeoParquetGroup to write
+ * @throws IOException if an I/O error occurs
+ */
+ public void write(GeoParquetGroup group) throws IOException {
+ parquetWriter.write(group);
+ }
+
+ /**
+ * Closes the writer and releases any system resources associated with it.
+ *
+ * @throws IOException if an I/O error occurs
+ */
+ public void close() throws IOException {
+ parquetWriter.close();
+ }
+}
diff --git a/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/GeoParquetReaderTest.java b/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/GeoParquetReaderTest.java
index 849720a3e..b7b73a9d5 100644
--- a/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/GeoParquetReaderTest.java
+++ b/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/GeoParquetReaderTest.java
@@ -19,8 +19,8 @@ package org.apache.baremaps.geoparquet;
import static org.junit.jupiter.api.Assertions.*;
-import java.net.URI;
import org.apache.baremaps.testing.TestFiles;
+import org.apache.hadoop.fs.Path;
import org.junit.jupiter.api.Test;
import org.locationtech.jts.geom.Envelope;
@@ -28,14 +28,14 @@ class GeoParquetReaderTest {
@Test
void read() {
- URI geoParquet = TestFiles.GEOPARQUET.toUri();
+ Path geoParquet = new Path(TestFiles.GEOPARQUET.toUri());
GeoParquetReader geoParquetReader = new GeoParquetReader(geoParquet);
assertEquals(5, geoParquetReader.read().count());
}
@Test
void readFiltered() {
- URI geoParquet = TestFiles.GEOPARQUET.toUri();
+ Path geoParquet = new Path(TestFiles.GEOPARQUET.toUri());
GeoParquetReader geoParquetReader =
new GeoParquetReader(geoParquet, new Envelope(-172, -65, 18, 72));
assertEquals(1, geoParquetReader.read().count());
@@ -43,21 +43,21 @@ class GeoParquetReaderTest {
@Test
void size() {
- URI geoParquet = TestFiles.GEOPARQUET.toUri();
+ Path geoParquet = new Path(TestFiles.GEOPARQUET.toUri());
GeoParquetReader geoParquetReader = new GeoParquetReader(geoParquet);
assertEquals(5, geoParquetReader.size());
}
@Test
void count() {
- URI geoParquet = TestFiles.GEOPARQUET.toUri();
+ Path geoParquet = new Path(TestFiles.GEOPARQUET.toUri());
GeoParquetReader geoParquetReader = new GeoParquetReader(geoParquet);
assertEquals(5, geoParquetReader.read().count());
}
@Test
void validateSchemas() {
- URI geoParquet = TestFiles.GEOPARQUET.toUri();
+ Path geoParquet = new Path(TestFiles.GEOPARQUET.toUri());
GeoParquetReader geoParquetReader = new GeoParquetReader(geoParquet);
assertTrue(geoParquetReader.validateSchemasAreIdentical());
}
diff --git a/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/GeoParquetWriterTest.java b/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/GeoParquetWriterTest.java
new file mode 100644
index 000000000..e77168198
--- /dev/null
+++ b/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/GeoParquetWriterTest.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to you under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.baremaps.geoparquet;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+import org.apache.baremaps.geoparquet.GeoParquetMetadata.Column;
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.Path;
+import org.apache.parquet.schema.MessageType;
+import org.apache.parquet.schema.OriginalType;
+import org.apache.parquet.schema.PrimitiveType.PrimitiveTypeName;
+import org.apache.parquet.schema.Types;
+import org.junit.jupiter.api.Test;
+import org.locationtech.jts.geom.Coordinate;
+import org.locationtech.jts.geom.GeometryFactory;
+import org.locationtech.jts.geom.Point;
+
+class GeoParquetWriterTest {
+
+ @Test
+ public void testWriteAndReadGeoParquet() throws IOException {
+ // Define the Parquet schema
+ MessageType schema = Types.buildMessage()
+ .required(PrimitiveTypeName.BINARY).as(OriginalType.UTF8).named("name")
+ .required(PrimitiveTypeName.BINARY).as(OriginalType.UTF8).named("city")
+ .optional(PrimitiveTypeName.BINARY).named("geometry")
+ .named("GeoParquetSchema");
+
+ // Create GeoParquet metadata
+ Map<String, Column> columns = new HashMap<>();
+ columns.put("geometry", new GeoParquetMetadata.Column(
+ "WKB",
+ Arrays.asList("Point"),
+ null,
+ null,
+ null,
+ null));
+
+ GeoParquetMetadata metadata = new GeoParquetMetadata(
+ "1.0",
+ "geometry",
+ columns,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null,
+ null);
+
+ // Create the output file
+ Configuration conf = new Configuration();
+ Path outputPath = new Path("target/test-output/geoparquet-test.parquet");
+
+ // Create the GeoParquetWriter
+ GeoParquetWriter writer = new GeoParquetWriter(outputPath, schema, metadata);
+
+ // Create a GeoParquetGroup and write it
+ GeoParquetSchema geoParquetSchema =
+ GeoParquetGroupFactory.createGeoParquetSchema(schema, metadata);
+ GeoParquetGroup group = new GeoParquetGroup(schema.asGroupType(), metadata, geoParquetSchema);
+ group.add("name", "Test Point");
+ group.add("city", "Test City");
+
+ // Create a Point geometry
+ GeometryFactory geometryFactory = new GeometryFactory();
+ Point point = geometryFactory.createPoint(new Coordinate(1.0, 2.0));
+ group.add("geometry", point);
+
+ // Write the group
+ writer.write(group);
+ writer.close();
+
+ // Now read back the file using GeoParquetReader
+ GeoParquetReader reader = new GeoParquetReader(outputPath, null, conf);
+ GeoParquetGroup readGroup = reader.read().findFirst().orElse(null);
+
+ assertNotNull(readGroup, "Read group should not be null");
+
+ // Verify the data
+ assertEquals("Test Point", readGroup.getStringValue("name"));
+ assertEquals("Test City", readGroup.getStringValue("city"));
+
+ Point readPoint = (Point) readGroup.getGeometryValue("geometry");
+ assertEquals(point.getX(), readPoint.getX(), 0.0001);
+ assertEquals(point.getY(), readPoint.getY(), 0.0001);
+ }
+
+}
diff --git a/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/OvertureMapsTest.java b/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/OvertureMapsTest.java
index 0fb5b9205..3ecf61484 100644
--- a/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/OvertureMapsTest.java
+++ b/baremaps-geoparquet/src/test/java/org/apache/baremaps/geoparquet/OvertureMapsTest.java
@@ -20,8 +20,7 @@ package org.apache.baremaps.geoparquet;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
-import java.net.URI;
-import java.net.URISyntaxException;
+import org.apache.hadoop.fs.Path;
import org.junit.jupiter.api.Disabled;
import org.junit.jupiter.api.Test;
import org.locationtech.jts.geom.Envelope;
@@ -30,9 +29,9 @@ class OvertureMapsTest {
@Disabled("Requires access to the Internet")
@Test
- void countAddresses() throws URISyntaxException {
- URI geoParquet = new URI(
- "s3a://overturemaps-us-west-2/release/2024-09-18.0/theme=addresses/**/*.parquet");
+ void countAddresses() {
+ Path geoParquet =
+ new Path("s3a://overturemaps-us-west-2/release/2024-09-18.0/theme=addresses/**/*.parquet");
Envelope switzerland = new Envelope(6.02260949059, 10.4427014502, 45.7769477403, 47.8308275417);
GeoParquetReader geoParquetReader =
new GeoParquetReader(geoParquet, switzerland, OvertureMaps.configuration());
@@ -41,9 +40,9 @@ class OvertureMapsTest {
@Disabled("Requires access to the Internet")
@Test
- void countAddressesInSwitzerland() throws URISyntaxException {
- URI geoParquet = new URI(
- "s3a://overturemaps-us-west-2/release/2024-09-18.0/theme=addresses/**/*.parquet");
+ void countAddressesInSwitzerland() {
+ Path geoParquet =
+ new Path("s3a://overturemaps-us-west-2/release/2024-09-18.0/theme=addresses/**/*.parquet");
Envelope switzerland = new Envelope(6.02260949059, 10.4427014502, 45.7769477403, 47.8308275417);
GeoParquetReader geoParquetReader =
new GeoParquetReader(geoParquet, switzerland, OvertureMaps.configuration());
@@ -52,9 +51,9 @@ class OvertureMapsTest {
@Disabled("Requires access to the Internet")
@Test
- void validateSchemas() throws URISyntaxException {
- URI geoParquet = new URI(
- "s3a://overturemaps-us-west-2/release/2024-09-18.0/theme=addresses/**/*.parquet");
+ void validateSchemas() {
+ Path geoParquet =
+ new Path("s3a://overturemaps-us-west-2/release/2024-09-18.0/theme=addresses/**/*.parquet");
GeoParquetReader geoParquetReader =
new GeoParquetReader(geoParquet, null, OvertureMaps.configuration());
assertTrue(geoParquetReader.validateSchemasAreIdentical(), "Schemas are identical");
@@ -62,9 +61,9 @@ class OvertureMapsTest {
@Disabled("Requires access to the Internet")
@Test
- void size() throws URISyntaxException {
- URI geoParquet = new URI(
- "s3a://overturemaps-us-west-2/release/2024-09-18.0/theme=addresses/**/*.parquet");
+ void size() {
+ Path geoParquet =
+ new Path("s3a://overturemaps-us-west-2/release/2024-09-18.0/theme=addresses/**/*.parquet");
GeoParquetReader geoParquetReader =
new GeoParquetReader(geoParquet, null, OvertureMaps.configuration());
assertEquals(213535887L, geoParquetReader.size());