@Override
    protected Geometry computeWorldGeometry() throws GeometryException {
      List<LongArrayList> rings = new ArrayList<>(relation.members().size());
      Set<Long> added = new HashSet<>();
      for (OsmElement.Relation.Member member : relation.members()) {
        String role = member.role();
        LongArrayList poly = multipolygonWayGeometries.get(member.ref());
        if (member.type() == OsmElement.Type.WAY) {
          if (!added.add(member.ref())) {
            // ignore duplicate relation members
            stats.dataError("osm_" + relation.getTag("type") + "_duplicate_member");
          } else if (poly != null && !poly.isEmpty()) {
            rings.add(poly);
          } else {
            // boundary and land_area relations might not be complete for extracts, but multipolygons should be
            stats.dataError("osm_" + relation.getTag("type") + "_missing_way");
            LOGGER.trace(
              "Missing {} OsmWay[{}] for {} {}", role, member.ref(), relation.getTag("type"), this);
          }
        }
      }
      return OsmMultipolygon.build(rings, nodeLocations, id());
    }
A {@link MultiPolygon} created from an OSM relation where {@code type=multipolygon}.
<p>
Delegates complex reconstruction work to {@link OsmMultipolygon}.
planetiler-core/src/main/java/com/onthegomap/planetiler/reader/osm/OsmReader.java