Search in sources :

Example 1 with GraphBuilderModule

use of org.opentripplanner.graph_builder.services.GraphBuilderModule 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)

Example 2 with GraphBuilderModule

use of org.opentripplanner.graph_builder.services.GraphBuilderModule in project OpenTripPlanner by opentripplanner.

the class GraphBuilder method run.

public void run() {
    /* Record how long it takes to build the graph, purely for informational purposes. */
    long startTime = System.currentTimeMillis();
    if (serializeGraph) {
        if (graphFile == null) {
            throw new RuntimeException("graphBuilderTask has no attribute graphFile.");
        }
        if (graphFile.exists() && !_alwaysRebuild) {
            LOG.info("graph already exists and alwaysRebuild=false => skipping graph build");
            return;
        }
        try {
            if (!graphFile.getParentFile().exists()) {
                if (!graphFile.getParentFile().mkdirs()) {
                    LOG.error("Failed to create directories for graph bundle at " + graphFile);
                }
            }
            graphFile.createNewFile();
        } catch (IOException e) {
            throw new RuntimeException("Cannot create or overwrite graph at path " + graphFile);
        }
    }
    // Check all graph builder inputs, and fail fast to avoid waiting until the build process advances.
    for (GraphBuilderModule builder : _graphBuilderModules) {
        builder.checkInputs();
    }
    HashMap<Class<?>, Object> extra = new HashMap<Class<?>, Object>();
    for (GraphBuilderModule load : _graphBuilderModules) load.buildGraph(graph, extra);
    graph.summarizeBuilderAnnotations();
    if (serializeGraph) {
        try {
            graph.save(graphFile);
        } catch (Exception ex) {
            throw new IllegalStateException(ex);
        }
    } else {
        LOG.info("Not saving graph to disk, as requested.");
    }
    long endTime = System.currentTimeMillis();
    LOG.info(String.format("Graph building took %.1f minutes.", (endTime - startTime) / 1000 / 60.0));
}
Also used : HashMap(java.util.HashMap) IOException(java.io.IOException) GraphBuilderModule(org.opentripplanner.graph_builder.services.GraphBuilderModule) IOException(java.io.IOException)

Aggregations

GraphBuilderModule (org.opentripplanner.graph_builder.services.GraphBuilderModule)2 JsonNode (com.fasterxml.jackson.databind.JsonNode)1 File (java.io.File)1 IOException (java.io.IOException)1 HashMap (java.util.HashMap)1 ZipFile (java.util.zip.ZipFile)1 GtfsBundle (org.opentripplanner.graph_builder.model.GtfsBundle)1 DirectTransferGenerator (org.opentripplanner.graph_builder.module.DirectTransferGenerator)1 EmbedConfig (org.opentripplanner.graph_builder.module.EmbedConfig)1 GtfsModule (org.opentripplanner.graph_builder.module.GtfsModule)1 PruneFloatingIslands (org.opentripplanner.graph_builder.module.PruneFloatingIslands)1 StreetLinkerModule (org.opentripplanner.graph_builder.module.StreetLinkerModule)1 TransitToTaggedStopsModule (org.opentripplanner.graph_builder.module.TransitToTaggedStopsModule)1 BusRouteStreetMatcher (org.opentripplanner.graph_builder.module.map.BusRouteStreetMatcher)1 DegreeGridNEDTileSource (org.opentripplanner.graph_builder.module.ned.DegreeGridNEDTileSource)1 ElevationModule (org.opentripplanner.graph_builder.module.ned.ElevationModule)1 GeotiffGridCoverageFactoryImpl (org.opentripplanner.graph_builder.module.ned.GeotiffGridCoverageFactoryImpl)1 NEDGridCoverageFactoryImpl (org.opentripplanner.graph_builder.module.ned.NEDGridCoverageFactoryImpl)1 OpenStreetMapModule (org.opentripplanner.graph_builder.module.osm.OpenStreetMapModule)1 DefaultStreetEdgeFactory (org.opentripplanner.graph_builder.services.DefaultStreetEdgeFactory)1