in baremaps-flatgeobuf/src/main/java/org/apache/baremaps/flatgeobuf/GeometryConversions.java [42:116]
public static GeometryOffsets writeGeometryPart(
FlatBufferBuilder builder,
org.locationtech.jts.geom.Geometry geometry,
int geometryType) {
GeometryOffsets go = new GeometryOffsets();
if (geometry == null) {
return go;
}
if (geometryType == GeometryType.MultiLineString) {
int end = 0;
MultiLineString mls = (MultiLineString) geometry;
if (mls.getNumGeometries() > 1) {
go.ends = new long[mls.getNumGeometries()];
for (int i = 0; i < mls.getNumGeometries(); i++) {
end += mls.getGeometryN(i).getNumPoints();
go.ends[i] = end;
}
}
} else if (geometryType == GeometryType.Polygon) {
Polygon p = (Polygon) geometry;
go.ends = new long[p.getNumInteriorRing() + 1];
int end = p.getExteriorRing().getNumPoints();
go.ends[0] = end;
for (int i = 0; i < p.getNumInteriorRing(); i++) {
end += p.getInteriorRingN(i).getNumPoints();
go.ends[i + 1] = end;
}
} else if (geometryType == GeometryType.MultiPolygon) {
MultiPolygon mp = (MultiPolygon) geometry;
int numGeometries = mp.getNumGeometries();
GeometryOffsets[] gos = new GeometryOffsets[numGeometries];
for (int i = 0; i < numGeometries; i++) {
Polygon p = (Polygon) mp.getGeometryN(i);
gos[i] = writeGeometryPart(builder, p, GeometryType.Polygon);
}
go.gos = gos;
return go;
}
final int numPoints = geometry.getNumPoints();
// build the vector "manually", using a CoordinateSequenceFilter to avoid creating
// Coordinate arrays or any Coordinate at all, depending on the underlying
// CoordinateSequence implementation. Vector elements ought to be added in reverse order
Geometry.startXyVector(builder, 2 * numPoints);
ReverseXYCoordinateSequenceFilter filter = new ReverseXYCoordinateSequenceFilter(builder);
applyInReverseOrder(geometry, filter);
go.coordsOffset = builder.endVector();
if (filter.hasZ) {
Geometry.startZVector(builder, numPoints);
applyInReverseOrder(geometry, new OrdinateCoordinateSequenceFilter(builder, 2));
go.zOffset = builder.endVector();
} else {
go.zOffset = 0;
}
if (filter.hasM) {
Geometry.startMVector(builder, numPoints);
applyInReverseOrder(geometry, new OrdinateCoordinateSequenceFilter(builder, 3));
go.mOffset = builder.endVector();
} else {
go.mOffset = 0;
}
if (go.ends != null) {
go.endsOffset = Geometry.createEndsVector(builder, go.ends);
}
go.type = geometryType;
return go;
}