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

org.opentripplanner.ext.debugrastertiles.TileRendererManager Maven / Gradle / Ivy

The newest version!
package org.opentripplanner.ext.debugrastertiles;

import java.awt.image.BufferedImage;
import java.util.HashMap;
import java.util.Map;
import org.locationtech.jts.geom.Envelope;
import org.locationtech.jts.geom.util.AffineTransformation;
import org.opentripplanner.ext.debugrastertiles.TileRenderer.TileRenderContext;
import org.opentripplanner.ext.debugrastertiles.api.resource.DebugRasterTileResource;
import org.opentripplanner.routing.api.request.preference.WheelchairPreferences;
import org.opentripplanner.routing.graph.Graph;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * Process slippy map tile rendering requests. Get the tile renderer for the given layer, setup a
 * tile rendering context (bounding box, image graphic context, affine transform, etc...) and call
 * the renderer to paint the tile.
 *
 * @author laurent
 * @see DebugRasterTileResource
 * @see TileRenderer
 */
public class TileRendererManager {

  private static final Logger LOG = LoggerFactory.getLogger(TileRendererManager.class);

  private final Map renderers = new HashMap<>();

  private final Graph graph;

  public TileRendererManager(Graph graph, WheelchairPreferences wheelchairPreferences) {
    this.graph = graph;

    // Register layers.
    renderers.put("bike-safety", new EdgeVertexTileRenderer(new BikeSafetyEdgeRenderer()));
    renderers.put("walk-safety", new EdgeVertexTileRenderer(new WalkSafetyEdgeRenderer()));
    renderers.put("thru-traffic", new EdgeVertexTileRenderer(new NoThruTrafficEdgeRenderer()));
    renderers.put("traversal", new EdgeVertexTileRenderer(new TraversalPermissionsEdgeRenderer()));
    renderers.put(
      "wheelchair",
      new EdgeVertexTileRenderer(new WheelchairEdgeRenderer(wheelchairPreferences))
    );
    renderers.put("elevation", new EdgeVertexTileRenderer(new ElevationEdgeRenderer(graph)));
  }

  public BufferedImage renderTile(final MapTile mapTile, String layer) {
    TileRenderContext context = new TileRenderContext() {
      @Override
      public Envelope expandPixels(double marginXPixels, double marginYPixels) {
        Envelope retval = new Envelope(bbox);
        retval.expandBy(
          (marginXPixels / mapTile.width()) * (bbox.getMaxX() - bbox.getMinX()),
          (marginYPixels / mapTile.height()) * (bbox.getMaxY() - bbox.getMinY())
        );
        return retval;
      }
    };

    context.graph = graph;

    TileRenderer renderer = renderers.get(layer);
    if (renderer == null) throw new IllegalArgumentException("Unknown layer: " + layer);

    // The best place for caching tiles may be here
    BufferedImage image = new BufferedImage(
      mapTile.width(),
      mapTile.height(),
      renderer.getColorModel()
    );
    context.graphics = image.createGraphics();
    context.bbox = mapTile.bbox();
    context.transform = new AffineTransformation();
    double xScale = mapTile.width() / context.bbox.getWidth();
    double yScale = mapTile.height() / context.bbox.getHeight();

    context.transform.translate(
      -context.bbox.getMinX(),
      -context.bbox.getMinY() - context.bbox.getHeight()
    );
    context.transform.scale(xScale, -yScale);
    context.metersPerPixel =
      (Math.toRadians(context.bbox.getHeight()) * 6371000) / mapTile.height();
    context.tileWidth = mapTile.width();
    context.tileHeight = mapTile.height();

    long start = System.currentTimeMillis();
    renderer.renderTile(context);
    LOG.debug("Rendered tile at {} in {} ms", mapTile.bbox(), System.currentTimeMillis() - start);
    return image;
  }

  /**
   * Gets all renderers
   * 

* Used to return list of renderers to client. Could be also used to show legend. */ public Map getRenderers() { return renderers; } }





© 2015 - 2025 Weber Informatics LLC | Privacy Policy