package org.opentripplanner.standalone;
import org.opentripplanner.graph_builder.services.osm.CustomNamer;
import org.opentripplanner.routing.impl.DefaultFareServiceFactory;
import org.opentripplanner.routing.services.FareServiceFactory;
import com.fasterxml.jackson.databind.JsonNode;
/**
* These are parameters that when changed, necessitate a Graph rebuild.
* They are distinct from the RouterParameters which can be applied to a pre-built graph or on the fly at runtime.
* Eventually both classes may be initialized from the same config file so make sure there is no overlap
* in the JSON keys used.
*
* These used to be command line parameters, but there were getting to be too many of them and besides, we want to
* allow different graph builder configuration for each Graph.
* <p>
* TODO maybe have only one giant config file and just annotate the parameters to indicate which ones trigger a rebuild
* ...or just feed the same JSON tree to two different classes, one of which is the build configuration and the other is the router configuration.
*/
public class GraphBuilderParameters {
public static double DEFAULT_SUBWAY_ACCESS_TIME = 2.0; // minutes
/**
* Generates nice HTML report of Graph errors/warnings (annotations). They are stored in the same location as the graph.
*/
public final boolean htmlAnnotations;
/**
* If number of annotations is larger then specified number annotations will be split in multiple files.
* Since browsers have problems opening large HTML files.
*/
public final int maxHtmlAnnotationsPerFile;
/**
* Include all transit input files (GTFS) from scanned directory.
*/
public final boolean transit;
/**
* Create direct transfer edges from transfers.txt in GTFS, instead of based on distance.
*/
public final boolean useTransfersTxt;
/**
* Link GTFS stops to their parent stops.
*/
public final boolean parentStopLinking;
/**
* Create direct transfers between the constituent stops of each parent station.
*/
public final boolean stationTransfers;
/**
* Minutes necessary to reach stops served by trips on routes of route_type=1 (subway) from the street.
* Perhaps this should be a runtime router parameter rather than a graph build parameter.
*/
public final double subwayAccessTime;
/**
* Include street input files (OSM/PBF).
*/
public final boolean streets;
/**
* Embed the Router config in the graph, which allows it to be sent to a server fully configured over the wire.
*/
public final boolean embedRouterConfig;
/**
* Perform visibility calculations on OSM areas (these calculations can be time consuming).
*/
public final boolean areaVisibility;
/**
* Based on GTFS shape data, guess which OSM streets each bus runs on to improve stop linking.
*/
public final boolean matchBusRoutesToStreets;
/**
* Download US NED elevation data and apply it to the graph.
*/
public final boolean fetchElevationUS;
/** If specified, download NED elevation tiles from the given AWS S3 bucket. */
public final S3BucketConfig elevationBucket;
/**
* A specific fares service to use.
*/
public final FareServiceFactory fareServiceFactory;
/**
* A custom OSM namer to use.
*/
public final CustomNamer customNamer;
/**
* Whether bike rental stations should be loaded from OSM, rather than periodically dynamically pulled from APIs.
*/
public boolean staticBikeRental = false;
/**
* Whether we should create car P+R stations from OSM data.
*/
public boolean staticParkAndRide = true;
/**
* Whether we should create bike P+R stations from OSM data.
*/
public boolean staticBikeParkAndRide = false;
/**
* Maximal distance between stops in meters that will connect consecutive trips that are made with same vehicle
*/
public int maxInterlineDistance = 200;
/**
* This field indicates the pruning threshold for islands without stops.
* Any such island under this size will be pruned.
*/
public final int pruningThresholdIslandWithoutStops;
/**
* This field indicates the pruning threshold for islands with stops.
* Any such island under this size will be pruned.
*/
public final int pruningThresholdIslandWithStops;
/**
* This field indicates whether walking should be allowed on OSM ways
* tagged with "foot=discouraged".
*/
public final boolean banDiscouragedWalking;
/**
* This field indicates whether bicycling should be allowed on OSM ways
* tagged with "bicycle=discouraged".
*/
public final boolean banDiscouragedBiking;
/**
* Transfers up to this length in meters will be pre-calculated and included in the Graph.
*/
public final double maxTransferDistance;
/**
* Set all parameters from the given Jackson JSON tree, applying defaults.
* Supplying MissingNode.getInstance() will cause all the defaults to be applied.
* This could be done automatically with the "reflective query scraper" but it's less type safe and less clear.
* Until that class is more type safe, it seems simpler to just list out the parameters by name here.
*/
public GraphBuilderParameters(JsonNode config) {
htmlAnnotations = config.path("htmlAnnotations").asBoolean(false);
transit = config.path("transit").asBoolean(true);
useTransfersTxt = config.path("useTransfersTxt").asBoolean(false);
parentStopLinking = config.path("parentStopLinking").asBoolean(false);
stationTransfers = config.path("stationTransfers").asBoolean(false);
subwayAccessTime = config.path("subwayAccessTime").asDouble(DEFAULT_SUBWAY_ACCESS_TIME);
streets = config.path("streets").asBoolean(true);
embedRouterConfig = config.path("embedRouterConfig").asBoolean(true);
areaVisibility = config.path("areaVisibility").asBoolean(false);
matchBusRoutesToStreets = config.path("matchBusRoutesToStreets").asBoolean(false);
fetchElevationUS = config.path("fetchElevationUS").asBoolean(false);
elevationBucket = S3BucketConfig.fromConfig(config.path("elevationBucket"));
fareServiceFactory = DefaultFareServiceFactory.fromConfig(config.path("fares"));
customNamer = CustomNamer.CustomNamerFactory.fromConfig(config.path("osmNaming"));
staticBikeRental = config.path("staticBikeRental").asBoolean(false);
staticParkAndRide = config.path("staticParkAndRide").asBoolean(true);
staticBikeParkAndRide = config.path("staticBikeParkAndRide").asBoolean(false);
maxHtmlAnnotationsPerFile = config.path("maxHtmlAnnotationsPerFile").asInt(1000);
maxInterlineDistance = config.path("maxInterlineDistance").asInt(200);
pruningThresholdIslandWithoutStops = config.path("islandWithoutStopsMaxSize").asInt(40);
pruningThresholdIslandWithStops = config.path("islandWithStopsMaxSize").asInt(5);
banDiscouragedWalking = config.path("banDiscouragedWalking").asBoolean(false);
banDiscouragedBiking = config.path("banDiscouragedBiking").asBoolean(false);
maxTransferDistance = config.path("maxTransferDistance").asDouble(2000);
}
}