use of org.opentripplanner.graph_builder.model.GtfsBundle in project OpenTripPlanner by opentripplanner.
the class GraphBuilder method forDirectory.
/**
* Factory method to create and configure a GraphBuilder with all the appropriate modules to build a graph from
* the files in the given directory, accounting for any configuration files located there.
*
* TODO parameterize with the router ID and call repeatedly to make multiple builders
* note of all command line options this is only using params.inMemory params.preFlight and params.build directory
*/
public static GraphBuilder forDirectory(CommandLineParameters params, File dir) {
LOG.info("Wiring up and configuring graph builder task.");
GraphBuilder graphBuilder = new GraphBuilder();
List<File> gtfsFiles = Lists.newArrayList();
List<File> osmFiles = Lists.newArrayList();
JsonNode builderConfig = null;
JsonNode routerConfig = null;
File demFile = null;
LOG.info("Searching for graph builder input files in {}", dir);
if (!dir.isDirectory() && dir.canRead()) {
LOG.error("'{}' is not a readable directory.", dir);
return null;
}
graphBuilder.setPath(dir);
// Find and parse config files first to reveal syntax errors early without waiting for graph build.
builderConfig = OTPMain.loadJson(new File(dir, BUILDER_CONFIG_FILENAME));
GraphBuilderParameters builderParams = new GraphBuilderParameters(builderConfig);
// Load the router config JSON to fail fast, but we will only apply it later when a router starts up
routerConfig = OTPMain.loadJson(new File(dir, Router.ROUTER_CONFIG_FILENAME));
LOG.info(ReflectionLibrary.dumpFields(builderParams));
for (File file : dir.listFiles()) {
switch(InputFileType.forFile(file)) {
case GTFS:
LOG.info("Found GTFS file {}", file);
gtfsFiles.add(file);
break;
case OSM:
LOG.info("Found OSM file {}", file);
osmFiles.add(file);
break;
case DEM:
if (!builderParams.fetchElevationUS && demFile == null) {
LOG.info("Found DEM file {}", file);
demFile = file;
} else {
LOG.info("Skipping DEM file {}", file);
}
break;
case OTHER:
LOG.warn("Skipping unrecognized file '{}'", file);
}
}
boolean hasOSM = builderParams.streets && !osmFiles.isEmpty();
boolean hasGTFS = builderParams.transit && !gtfsFiles.isEmpty();
if (!(hasOSM || hasGTFS)) {
LOG.error("Found no input files from which to build a graph in {}", dir);
return null;
}
if (hasOSM) {
List<OpenStreetMapProvider> osmProviders = Lists.newArrayList();
for (File osmFile : osmFiles) {
OpenStreetMapProvider osmProvider = new AnyFileBasedOpenStreetMapProviderImpl(osmFile);
osmProviders.add(osmProvider);
}
OpenStreetMapModule osmModule = new OpenStreetMapModule(osmProviders);
DefaultStreetEdgeFactory streetEdgeFactory = new DefaultStreetEdgeFactory();
streetEdgeFactory.useElevationData = builderParams.fetchElevationUS || (demFile != null);
osmModule.edgeFactory = streetEdgeFactory;
osmModule.customNamer = builderParams.customNamer;
osmModule.setDefaultWayPropertySetSource(builderParams.wayPropertySet);
osmModule.skipVisibility = !builderParams.areaVisibility;
osmModule.platformEntriesLinking = builderParams.platformEntriesLinking;
osmModule.staticBikeRental = builderParams.staticBikeRental;
osmModule.staticBikeParkAndRide = builderParams.staticBikeParkAndRide;
osmModule.staticParkAndRide = builderParams.staticParkAndRide;
osmModule.banDiscouragedWalking = builderParams.banDiscouragedWalking;
osmModule.banDiscouragedBiking = builderParams.banDiscouragedBiking;
graphBuilder.addModule(osmModule);
PruneFloatingIslands pruneFloatingIslands = new PruneFloatingIslands();
pruneFloatingIslands.setPruningThresholdIslandWithoutStops(builderParams.pruningThresholdIslandWithoutStops);
pruneFloatingIslands.setPruningThresholdIslandWithStops(builderParams.pruningThresholdIslandWithStops);
graphBuilder.addModule(pruneFloatingIslands);
}
if (hasGTFS) {
List<GtfsBundle> gtfsBundles = Lists.newArrayList();
for (File gtfsFile : gtfsFiles) {
GtfsBundle gtfsBundle = new GtfsBundle(gtfsFile);
gtfsBundle.setTransfersTxtDefinesStationPaths(builderParams.useTransfersTxt);
if (builderParams.parentStopLinking) {
gtfsBundle.linkStopsToParentStations = true;
}
gtfsBundle.parentStationTransfers = builderParams.stationTransfers;
gtfsBundle.subwayAccessTime = (int) (builderParams.subwayAccessTime * 60);
gtfsBundle.maxInterlineDistance = builderParams.maxInterlineDistance;
gtfsBundles.add(gtfsBundle);
}
GtfsModule gtfsModule = new GtfsModule(gtfsBundles);
gtfsModule.setFareServiceFactory(builderParams.fareServiceFactory);
graphBuilder.addModule(gtfsModule);
if (hasOSM) {
if (builderParams.matchBusRoutesToStreets) {
graphBuilder.addModule(new BusRouteStreetMatcher());
}
graphBuilder.addModule(new TransitToTaggedStopsModule());
}
}
// This module is outside the hasGTFS conditional block because it also links things like bike rental
// which need to be handled even when there's no transit.
graphBuilder.addModule(new StreetLinkerModule());
// We want to do run this module after loading the OSM street network but before finding transfers.
if (builderParams.elevationBucket != null) {
// Download the elevation tiles from an Amazon S3 bucket
S3BucketConfig bucketConfig = builderParams.elevationBucket;
File cacheDirectory = new File(params.cacheDirectory, "ned");
DegreeGridNEDTileSource awsTileSource = new DegreeGridNEDTileSource();
awsTileSource = new DegreeGridNEDTileSource();
awsTileSource.awsAccessKey = bucketConfig.accessKey;
awsTileSource.awsSecretKey = bucketConfig.secretKey;
awsTileSource.awsBucketName = bucketConfig.bucketName;
NEDGridCoverageFactoryImpl gcf = new NEDGridCoverageFactoryImpl(cacheDirectory);
gcf.tileSource = awsTileSource;
GraphBuilderModule elevationBuilder = new ElevationModule(gcf);
graphBuilder.addModule(elevationBuilder);
} else if (builderParams.fetchElevationUS) {
// Download the elevation tiles from the official web service
File cacheDirectory = new File(params.cacheDirectory, "ned");
ElevationGridCoverageFactory gcf = new NEDGridCoverageFactoryImpl(cacheDirectory);
GraphBuilderModule elevationBuilder = new ElevationModule(gcf);
graphBuilder.addModule(elevationBuilder);
} else if (demFile != null) {
// Load the elevation from a file in the graph inputs directory
ElevationGridCoverageFactory gcf = new GeotiffGridCoverageFactoryImpl(demFile);
GraphBuilderModule elevationBuilder = new ElevationModule(gcf);
graphBuilder.addModule(elevationBuilder);
}
if (hasGTFS) {
// The stops can be linked to each other once they are already linked to the street network.
if (!builderParams.useTransfersTxt) {
// This module will use streets or straight line distance depending on whether OSM data is found in the graph.
graphBuilder.addModule(new DirectTransferGenerator(builderParams.maxTransferDistance));
}
}
graphBuilder.addModule(new EmbedConfig(builderConfig, routerConfig));
if (builderParams.htmlAnnotations) {
graphBuilder.addModule(new AnnotationsToHTML(params.build, builderParams.maxHtmlAnnotationsPerFile));
}
graphBuilder.serializeGraph = (!params.inMemory) || params.preFlight;
return graphBuilder;
}
Aggregations