in baremaps-geoparquet/src/main/java/org/apache/baremaps/geoparquet/GeoParquetGroupFactory.java [57:118]
public static GeoParquetSchema createGeoParquetSchema(
GroupType schema,
GeoParquetMetadata metadata) {
// Map the fields
List<Field> fields = schema.getFields().stream().map(field -> {
// Map the column cardinality
Cardinality cardinality = switch (field.getRepetition()) {
case REQUIRED -> GeoParquetSchema.Cardinality.REQUIRED;
case OPTIONAL -> GeoParquetSchema.Cardinality.OPTIONAL;
case REPEATED -> GeoParquetSchema.Cardinality.REPEATED;
};
// Handle geometry columns
if (field.isPrimitive() && metadata.columns().containsKey(field.getName())) {
return new GeometryField(field.getName(), cardinality);
}
// Handle envelope columns
else if (!field.isPrimitive() && field.getName().equals("bbox")) {
GroupType groupType = field.asGroupType();
GeoParquetSchema geoParquetSchema = createGeoParquetSchema(groupType, metadata);
return new EnvelopeField(field.getName(), cardinality, geoParquetSchema);
}
// Handle group columns
else if (!field.isPrimitive()) {
GroupType groupType = field.asGroupType();
GeoParquetSchema geoParquetSchema = createGeoParquetSchema(groupType, metadata);
return (Field) new GroupField(
groupType.getName(),
cardinality,
geoParquetSchema);
}
// Handle logical types
else if (field.getLogicalTypeAnnotation() != null
&& field.getLogicalTypeAnnotation().equals(LogicalTypeAnnotation.stringType())) {
return new StringField(field.getName(), cardinality);
}
// Handle primitive columns
else {
PrimitiveType primitiveType = field.asPrimitiveType();
PrimitiveTypeName primitiveTypeName = primitiveType.getPrimitiveTypeName();
String columnName = primitiveType.getName();
return switch (primitiveTypeName) {
case INT32 -> new IntegerField(columnName, cardinality);
case INT64 -> new LongField(columnName, cardinality);
case INT96 -> new Int96Field(columnName, cardinality);
case FLOAT -> new FloatField(columnName, cardinality);
case DOUBLE -> new DoubleField(columnName, cardinality);
case BOOLEAN -> new BooleanField(columnName, cardinality);
case BINARY -> new BinaryField(columnName, cardinality);
case FIXED_LEN_BYTE_ARRAY -> new BinaryField(columnName, cardinality);
};
}
}).toList();
return new GeoParquetSchema(schema.getName(), fields);
}