public static GeometryOffsets writeGeometryPart()

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