private void postProcessAndAddLayerFeatures(VectorTile encoder, String layer,
      List<VectorTile.Feature> features) {
      if (features == null || features.isEmpty()) {
        return;
      }
      try {
        List<VectorTile.Feature> postProcessed = makeMutable(profile
          .postProcessLayerFeatures(layer, tileCoord.z(), makeMutable(features)));
        features = postProcessed == null ? features : postProcessed;
        // lines are stored using a higher precision so that rounding does not
        // introduce artificial intersections between endpoints to confuse line merging,
        // so we have to reduce the precision here, now that line merging is done.
        unscaleAndRemovePointsOutsideBuffer(features, config.maxPointBuffer());
        // also remove points more than --max-point-buffer pixels outside the tile if the
        // user has requested a narrower buffer than the profile provides by default
      } catch (Throwable e) { // NOSONAR - OK to catch Throwable since we re-throw Errors
        handlePostProcessFailure(e, layer);
      }
      encoder.addLayerFeatures(layer, features);
    }
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