All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.opentripplanner.inspector.vector.LayerBuilder Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.inspector.vector;

import edu.colorado.cires.cmg.mvt.VectorTile;
import edu.colorado.cires.cmg.mvt.adapt.jts.JtsAdapter;
import edu.colorado.cires.cmg.mvt.adapt.jts.TileGeomResult;
import edu.colorado.cires.cmg.mvt.build.MvtLayerBuild;
import edu.colorado.cires.cmg.mvt.build.MvtLayerParams;
import edu.colorado.cires.cmg.mvt.build.MvtLayerProps;
import java.util.List;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.Geometry;
import org.locationtech.jts.geom.GeometryFactory;
import org.opentripplanner.apis.support.mapping.PropertyMapper;
import org.opentripplanner.framework.geometry.GeometryUtils;

/**
 * Common functionality for creating a vector tile from a data source able to supply a set of JTS
 * geometries with userData of type {@link T} for an {@link Envelope}.
 */
public abstract class LayerBuilder {

  private static final GeometryFactory GEOMETRY_FACTORY = GeometryUtils.getGeometryFactory();
  private final MvtLayerProps layerProps = new MvtLayerProps();
  private final VectorTile.Tile.Layer.Builder layerBuilder;
  private final PropertyMapper mapper;
  private final double expansionFactor;

  public LayerBuilder(PropertyMapper mapper, String layerName, double expansionFactor) {
    this.mapper = mapper;
    this.layerBuilder = MvtLayerBuild.newLayerBuilder(layerName, MvtLayerParams.DEFAULT);
    this.expansionFactor = expansionFactor;
  }

  /**
   * Get a list of geometries in this layer inside the query envelope. The geometries should include
   * an object of type T as their userData.
   */
  protected abstract List getGeometries(Envelope query);

  final VectorTile.Tile.Layer build(Envelope envelope) {
    Envelope query = new Envelope(envelope);
    query.expandBy(envelope.getWidth() * expansionFactor, envelope.getHeight() * expansionFactor);

    TileGeomResult tileGeom = JtsAdapter.createTileGeom(
      getGeometries(query),
      envelope,
      query,
      GEOMETRY_FACTORY,
      MvtLayerParams.DEFAULT,
      g -> true
    );

    List features = JtsAdapter.toFeatures(
      tileGeom.mvtGeoms,
      layerProps,
      this.mapper
    );
    layerBuilder.addAllFeatures(features);

    MvtLayerBuild.writeProps(layerBuilder, layerProps);
    return layerBuilder.build();
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy