docs: public static TDRelation fromRelation(Relation relation, WayResolver resolver, List<String> preferredLanguages) {
          if (relation == null) {
              return null;
          }
  
          if (relation.getMembers().isEmpty()) {
              return null;
          }
  
          SpecialTagExtractionResult ster = OSMUtils.extractSpecialFields(relation, preferredLanguages);
          Map<Short, Object> knownWayTags = OSMUtils.extractKnownWayTags(relation);
  
          // special tags
          // TODO what about the layer of relations?
  
          // TODO exclude boundaries
  
          if (!knownRelationType(ster.getType())) {
              return null;
          }
  
          List<RelationMember> members = relation.getMembers();
          List<TDWay> wayMembers = new ArrayList<>();
          for (RelationMember relationMember : members) {
              if (relationMember.getMemberType() != EntityType.Way) {
                  continue;
              }
              TDWay member = resolver.getWay(relationMember.getMemberId());
              if (member == null) {
                  LOGGER.finest("relation is missing a member, rel-id: " + relation.getId() + " member id: "
                          + relationMember.getMemberId());
                  continue;
              }
              wayMembers.add(member);
          }
  
          if (wayMembers.isEmpty()) {
              LOGGER.finest("relation has no valid members: " + relation.getId());
              return null;
          }
  
          return new TDRelation(relation.getId(), ster.getLayer(), ster.getName(), ster.getHousenumber(), ster.getRef(),
                  knownWayTags, wayMembers.toArray(new TDWay[wayMembers.size()]));
      }