diff --git a/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java b/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java index 5d0631cd..26fb164b 100644 --- a/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java +++ b/java-r5rcore/src/org/ipea/r5r/Network/NetworkBuilder.java @@ -3,6 +3,7 @@ import com.conveyal.analysis.datasource.DataSourceException; import com.conveyal.gtfs.GTFSFeed; import com.conveyal.osmlib.OSM; +import com.conveyal.r5.analyst.cluster.TransportNetworkConfig; import com.conveyal.r5.analyst.scenario.RasterCost; import com.conveyal.r5.kryo.KryoNetworkSerializer; import com.conveyal.r5.streets.StreetLayer; @@ -21,6 +22,7 @@ import java.util.stream.Stream; public class NetworkBuilder { + public static final String JSON_CONFIG_FILE = "config.json"; public static boolean useNativeElevation = false; public static String elevationCostFunction = "NONE"; @@ -31,6 +33,8 @@ public class NetworkBuilder { private static OSM osmFile; private static Stream gtfsFeeds; private static String tiffFile = ""; + private static TransportNetworkConfig transportNetworkConfig = null; + public static TransportNetwork checkAndLoadR5Network(String dataFolder) throws Exception { File file = new File(dataFolder, "network.dat"); @@ -102,6 +106,8 @@ private static Map buildNetworkConfig() { networkConfig.put("elevation_cost_function", elevationCostFunction); networkConfig.put("tiff_file_name", tiffFile); + networkConfig.put("transportNetworkConfig", transportNetworkConfig != null ? JSON_CONFIG_FILE : null); + return networkConfig; } @@ -109,13 +115,14 @@ private static TransportNetwork createNetwork() { TransportNetwork network = new TransportNetwork(); network.scenarioId = "r5r"; - network.streetLayer = new StreetLayer(); + network.streetLayer = new StreetLayer(transportNetworkConfig); network.streetLayer.loadFromOsm(osmFile); osmFile.close(); network.streetLayer.parentNetwork = network; network.streetLayer.indexStreets(); + // currently the TransitLayer has no config, so we do not pass in networkConfig network.transitLayer = new TransitLayerWithShapes(); gtfsFeeds.forEach(gtfsFeed -> { @@ -185,6 +192,15 @@ public static void loadDirectory(File directory) { } if (name.endsWith(".zip")) gtfsFiles.add(file.getAbsolutePath()); if (name.endsWith(".tif") | name.endsWith(".tiff")) tiffFile = file.getAbsolutePath(); + if (name.equals(JSON_CONFIG_FILE)) { + try { + // Use the R5 object mapper to make sure R5 config files are compatible (e.g. same case conventions) + transportNetworkConfig = com.conveyal.analysis.util.JsonUtil.objectMapper.readValue(file, TransportNetworkConfig.class); + } catch (Exception e) { + // re-throw, don't silently ignore a config file + throw new RuntimeException(e); + } + } } // Supply feeds with a stream, so they do not sit open in memory while other feeds are being processed. diff --git a/r-package/R/utils.R b/r-package/R/utils.R index b45f6a04..c1fcba31 100644 --- a/r-package/R/utils.R +++ b/r-package/R/utils.R @@ -137,18 +137,27 @@ start_r5r_java <- function(data_path, fileurl <- fileurl_from_metadata( r5r_env$r5_jar_version ) filename <- basename(fileurl) - jar_file <- data.table::fifelse( - temp_dir, - file.path(tempdir(), filename), - file.path( r5r_env$cache_dir, filename) - ) - - # If there isn't a JAR already larger than 60MB, download it - if (checkmate::test_file_exists(jar_file) && file.info(jar_file)$size > r5r_env$r5_jar_size) { - if (!verbose) message("Using cached R5 version from ", jar_file) + if (is.null(getOption("r5r.r5jar"))) { + jar_file <- data.table::fifelse( + temp_dir, + file.path(tempdir(), filename), + file.path( r5r_env$cache_dir, filename) + ) + + # If there isn't a JAR already larger than 60MB, download it + if (checkmate::test_file_exists(jar_file) && file.info(jar_file)$size > r5r_env$r5_jar_size) { + if (!verbose) message("Using cached R5 version from ", jar_file) + } else { + check <- download_r5(temp_dir = temp_dir, quiet = !verbose) + if (is.null(check)) { return(invisible(NULL)) } + } } else { - check <- download_r5(temp_dir = temp_dir, quiet = !verbose) - if (is.null(check)) { return(invisible(NULL)) } + jar_file <- getOption("r5r.r5jar") + if (checkmate::test_file_exists(jar_file)) { + message("Overriding default R5 with option r5r.r5jar, using ", jar_file) + } else { + stop(paste0("Cannot find r5 jar \"", jar_file, "\", specified in options(r5r.r5jar)")) + } } # R5 jar diff --git a/r-package/inst/jar/r5r.jar b/r-package/inst/jar/r5r.jar index b8ebf475..384daad0 100644 Binary files a/r-package/inst/jar/r5r.jar and b/r-package/inst/jar/r5r.jar differ