public VectorTile getVectorTile(LayerAttrStats.Updater layerStats) {
      VectorTile tile = new VectorTile();
      if (layerStats != null) {
        tile.trackLayerStats(layerStats.forZoom(tileCoord.z()));
      }
      List<VectorTile.Feature> items = new ArrayList<>();
      String currentLayer = null;
      Map<String, List<VectorTile.Feature>> layerFeatures = new TreeMap<>();
      for (SortableFeature entry : entries) {
        var feature = decodeVectorTileFeature(entry);
        String layer = feature.layer();

        if (currentLayer == null) {
          currentLayer = layer;
          layerFeatures.put(currentLayer, items);
        } else if (!currentLayer.equals(layer)) {
          currentLayer = layer;
          items = new ArrayList<>();
          layerFeatures.put(layer, items);
        }

        items.add(feature);
      }
      // first post-process entire tile by invoking postProcessTileFeatures to allow for post-processing that combines
      // features across different layers, infers new layers, or removes layers
      try {
        var initialFeatures = layerFeatures;
        layerFeatures = profile.postProcessTileFeatures(tileCoord, layerFeatures);
        if (layerFeatures == null) {
          layerFeatures = initialFeatures;
        }
      } catch (Throwable e) { // NOSONAR - OK to catch Throwable since we re-throw Errors
        handlePostProcessFailure(e, "entire tile");
      }
      // then let profiles post-process each layer in isolation with postProcessLayerFeatures
      for (var entry : layerFeatures.entrySet()) {
        postProcessAndAddLayerFeatures(tile, entry.getKey(), entry.getValue());
      }
      return tile;
    }
Returns true if {@code other} contains features with identical layer, geometry, and attributes, as this tile -
even if the tiles have separate coordinates.
<p>
Used as an optimization to avoid re-encoding the same ocean tiles over and over again.
planetiler-core/src/main/java/com/onthegomap/planetiler/collection/FeatureGroup.java