Search in sources :

Example 11 with GtfsBundle

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;
}
Also used : ElevationModule(org.opentripplanner.graph_builder.module.ned.ElevationModule) NEDGridCoverageFactoryImpl(org.opentripplanner.graph_builder.module.ned.NEDGridCoverageFactoryImpl) S3BucketConfig(org.opentripplanner.standalone.S3BucketConfig) JsonNode(com.fasterxml.jackson.databind.JsonNode) GtfsModule(org.opentripplanner.graph_builder.module.GtfsModule) GeotiffGridCoverageFactoryImpl(org.opentripplanner.graph_builder.module.ned.GeotiffGridCoverageFactoryImpl) GraphBuilderModule(org.opentripplanner.graph_builder.services.GraphBuilderModule) StreetLinkerModule(org.opentripplanner.graph_builder.module.StreetLinkerModule) EmbedConfig(org.opentripplanner.graph_builder.module.EmbedConfig) TransitToTaggedStopsModule(org.opentripplanner.graph_builder.module.TransitToTaggedStopsModule) DegreeGridNEDTileSource(org.opentripplanner.graph_builder.module.ned.DegreeGridNEDTileSource) DirectTransferGenerator(org.opentripplanner.graph_builder.module.DirectTransferGenerator) OpenStreetMapModule(org.opentripplanner.graph_builder.module.osm.OpenStreetMapModule) OpenStreetMapProvider(org.opentripplanner.openstreetmap.services.OpenStreetMapProvider) ElevationGridCoverageFactory(org.opentripplanner.graph_builder.services.ned.ElevationGridCoverageFactory) PruneFloatingIslands(org.opentripplanner.graph_builder.module.PruneFloatingIslands) GtfsBundle(org.opentripplanner.graph_builder.model.GtfsBundle) BusRouteStreetMatcher(org.opentripplanner.graph_builder.module.map.BusRouteStreetMatcher) AnyFileBasedOpenStreetMapProviderImpl(org.opentripplanner.openstreetmap.impl.AnyFileBasedOpenStreetMapProviderImpl) GraphBuilderParameters(org.opentripplanner.standalone.GraphBuilderParameters) ZipFile(java.util.zip.ZipFile) File(java.io.File) DefaultStreetEdgeFactory(org.opentripplanner.graph_builder.services.DefaultStreetEdgeFactory)

Aggregations

GtfsBundle (org.opentripplanner.graph_builder.model.GtfsBundle)11 File (java.io.File)7 GTFSFeed (com.conveyal.gtfs.GTFSFeed)5 com.conveyal.gtfs.model (com.conveyal.gtfs.model)5 Fun (org.mapdb.Fun)5 Stop (org.onebusaway.gtfs.model.Stop)5 TransitStop (org.opentripplanner.routing.vertextype.TransitStop)5 Graph (org.opentripplanner.routing.graph.Graph)3 DefaultStreetVertexIndexFactory (org.opentripplanner.routing.impl.DefaultStreetVertexIndexFactory)3 Test (org.junit.Test)2 AgencyAndId (org.onebusaway.gtfs.model.AgencyAndId)2 Trip (org.onebusaway.gtfs.model.Trip)2 MockGtfs (org.onebusaway.gtfs.services.MockGtfs)2 GtfsModule (org.opentripplanner.graph_builder.module.GtfsModule)2 TripPattern (org.opentripplanner.routing.edgetype.TripPattern)2 JsonNode (com.fasterxml.jackson.databind.JsonNode)1 FeedEntity (com.google.transit.realtime.GtfsRealtime.FeedEntity)1 FeedMessage (com.google.transit.realtime.GtfsRealtime.FeedMessage)1 TripUpdate (com.google.transit.realtime.GtfsRealtime.TripUpdate)1 FileInputStream (java.io.FileInputStream)1