From ecd3874c3980b90f18e6b6f033631034b3624c3a Mon Sep 17 00:00:00 2001 From: Alex Magnus Date: Mon, 11 Aug 2025 00:11:14 +0200 Subject: [PATCH 1/3] first implementation of pickup delay --- java-r5rcore/src/org/ipea/r5r/R5RCore.java | 22 ++++- .../src/org/ipea/r5r/Utils/RMapBuilder.java | 33 +++++++- r-package/R/assign.R | 54 ++++++++++++ r-package/R/java_utils.R | 30 ++++++- r-package/R/set.R | 34 ++++++++ r-package/R/travel_time_matrix.R | 3 +- r-package/R/utils.R | 78 ++++++++++++++++-- .../inst/extdata/poa/poa_pickup_zones.rds | Bin 0 -> 4083 bytes r-package/inst/jar/r5r.jar | Bin 141241 -> 145416 bytes r-package/man/assign_decay_function.Rd | 2 + r-package/man/assign_departure.Rd | 2 + r-package/man/assign_drop_geometry.Rd | 2 + r-package/man/assign_max_street_time.Rd | 2 + r-package/man/assign_max_trip_duration.Rd | 2 + r-package/man/assign_mode.Rd | 2 + r-package/man/assign_opportunities.Rd | 2 + r-package/man/assign_osm_link_ids.Rd | 2 + r-package/man/assign_pickup_default_wait.Rd | 35 ++++++++ r-package/man/assign_pickup_mode.Rd | 33 ++++++++ r-package/man/assign_points_input.Rd | 2 + r-package/man/assign_shortest_path.Rd | 2 + r-package/man/congestion_poly2geojson.Rd | 7 +- r-package/man/dt_to_lts_map.Rd | 1 + r-package/man/dt_to_speed_map.Rd | 1 + r-package/man/dt_to_stops_map.Rd | 29 +++++++ r-package/man/get_java_version.Rd | 1 + r-package/man/java_to_dt.Rd | 1 + r-package/man/lts_lines2shp.Rd | 3 +- r-package/man/pickup_poly2geojson.Rd | 38 +++++++++ r-package/man/reverse_if_direct_mode.Rd | 1 + r-package/man/set_breakdown.Rd | 1 + r-package/man/set_cutoffs.Rd | 1 + r-package/man/set_elevation.Rd | 1 + r-package/man/set_expanded_travel_times.Rd | 1 + r-package/man/set_fare_cutoffs.Rd | 1 + r-package/man/set_fare_structure.Rd | 1 + r-package/man/set_max_fare.Rd | 1 + r-package/man/set_max_lts.Rd | 1 + r-package/man/set_max_rides.Rd | 1 + r-package/man/set_monte_carlo_draws.Rd | 1 + r-package/man/set_n_threads.Rd | 1 + r-package/man/set_new_congestion.Rd | 1 + r-package/man/set_new_lts.Rd | 1 + r-package/man/set_output_dir.Rd | 1 + r-package/man/set_percentiles.Rd | 1 + r-package/man/set_pickup_delay.Rd | 45 ++++++++++ r-package/man/set_progress.Rd | 1 + r-package/man/set_speed.Rd | 1 + r-package/man/set_suboptimal_minutes.Rd | 1 + r-package/man/set_time_window.Rd | 1 + r-package/man/set_verbose.Rd | 1 + r-package/man/travel_time_matrix.Rd | 1 + 52 files changed, 472 insertions(+), 18 deletions(-) create mode 100644 r-package/inst/extdata/poa/poa_pickup_zones.rds create mode 100644 r-package/man/assign_pickup_default_wait.Rd create mode 100644 r-package/man/assign_pickup_mode.Rd create mode 100644 r-package/man/dt_to_stops_map.Rd create mode 100644 r-package/man/pickup_poly2geojson.Rd create mode 100644 r-package/man/set_pickup_delay.Rd diff --git a/java-r5rcore/src/org/ipea/r5r/R5RCore.java b/java-r5rcore/src/org/ipea/r5r/R5RCore.java index 673bd93d..236dfd47 100644 --- a/java-r5rcore/src/org/ipea/r5r/R5RCore.java +++ b/java-r5rcore/src/org/ipea/r5r/R5RCore.java @@ -5,9 +5,11 @@ import com.conveyal.r5.analyst.Grid; import com.conveyal.r5.analyst.cluster.PathResult; import com.conveyal.r5.analyst.decay.*; +import com.conveyal.r5.analyst.scenario.PickupDelay; import com.conveyal.r5.analyst.scenario.ShapefileLts; import com.conveyal.r5.api.util.SearchType; import com.conveyal.r5.analyst.scenario.RoadCongestion; +import com.conveyal.r5.profile.StreetMode; import com.conveyal.r5.transit.TransportNetwork; import com.fasterxml.jackson.core.JsonProcessingException; @@ -28,9 +30,7 @@ import java.nio.file.Paths; import java.text.ParseException; import java.time.LocalDate; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; +import java.util.*; import java.util.concurrent.ExecutionException; import java.util.concurrent.ForkJoinPool; @@ -642,6 +642,22 @@ public String applyLtsOsm(HashMap ltsMap){ return lts.errors.toString(); } + public String applyPickupDelay(String filePath, Map> stopsMap, String streetMode, double defaultWait){ + Path fileJPath = Paths.get(filePath).toAbsolutePath().normalize(); + + PickupDelay pickDel = new PickupDelay(); + pickDel.streetMode = StreetMode.valueOf(streetMode); + pickDel.waitTimeAttribute = "wait_time"; + pickDel.idAttribute = "poly_id"; + pickDel.stopsForZone = stopsMap; + pickDel.defaultWait = defaultWait; + pickDel.zonePolygons = fileJPath.toString(); + + pickDel.resolve(routingProperties.transportNetworkWorking); + pickDel.apply(routingProperties.transportNetworkWorking); + return pickDel.errors.toString(); + } + // ------------------------------ STREET AND TRANSIT NETWORKS ---------------------------------------- public List getStreetNetwork() { diff --git a/java-r5rcore/src/org/ipea/r5r/Utils/RMapBuilder.java b/java-r5rcore/src/org/ipea/r5r/Utils/RMapBuilder.java index 40006a60..b19d66ba 100644 --- a/java-r5rcore/src/org/ipea/r5r/Utils/RMapBuilder.java +++ b/java-r5rcore/src/org/ipea/r5r/Utils/RMapBuilder.java @@ -1,13 +1,18 @@ package org.ipea.r5r.Utils; -import java.util.HashMap; +import java.util.*; +import java.util.stream.Collectors; public class RMapBuilder { public static HashMap buildSpeedMap(String osmIds, String scale){ String[] osmIdsArray = osmIds.split(","); String[] scaleArray = scale.split(","); - HashMap map = new HashMap<>(); + if (osmIdsArray.length != scaleArray.length) { + throw new IllegalArgumentException("osmIds and scale must have the same number of items."); + } + + HashMap map = new HashMap<>((int) Math.ceil(osmIdsArray.length / 0.74)); for (int i = 0; i < osmIdsArray.length; i++) { long osmId = Long.parseLong(osmIdsArray[i]); float jScale = Float.parseFloat(scaleArray[i]); @@ -20,7 +25,11 @@ public static HashMap buildLtsMap(String osmIds, String lts){ String[] osmIdsArray = osmIds.split(","); String[] ltsArray = lts.split(","); - HashMap map = new HashMap<>(); + if (osmIdsArray.length != ltsArray.length) { + throw new IllegalArgumentException("osmIds and lts must have the same number of items."); + } + + HashMap map = new HashMap<>((int) Math.ceil(osmIdsArray.length / 0.74)); for (int i = 0; i < osmIdsArray.length; i++) { long osmId = Long.parseLong(osmIdsArray[i]); int jLts = Integer.parseInt(ltsArray[i]); @@ -28,4 +37,22 @@ public static HashMap buildLtsMap(String osmIds, String lts){ } return map; } + + public static Map> buildStopsMap(String polyIds, String stops) { + String[] polyIdsArray = polyIds.split(","); + String[] stopsArray = stops.split(";"); + + if (polyIdsArray.length != stopsArray.length) { + throw new IllegalArgumentException("polyIds and stopsGroups must have the same number of items."); + } + + Map> map = new HashMap<>((int) Math.ceil(polyIdsArray.length / 0.74)); + + for (int i = 0; i < polyIdsArray.length; i++) { + String[] ids = stopsArray[i].split(","); + Set set = new HashSet<>(List.of(ids)); + map.put(polyIdsArray[i], set); + } + return map; + } } diff --git a/r-package/R/assign.R b/r-package/R/assign.R index 150ad33d..a7e747b0 100644 --- a/r-package/R/assign.R +++ b/r-package/R/assign.R @@ -425,3 +425,57 @@ assign_osm_link_ids <- function(osm_link_ids, drop_geometry) { return(osm_link_ids) } + +#' Returns which routing mode to apply pickup delay polygons on. +#' +#' @param pickup_polygons An sf polygon +#' +#' @family assigning functions +#' +#' @return Character. One of street routing modes. +#' +#' @keywords internal +assign_pickup_mode <- function(pickup_polygons){ + + # check input class + checkmate::assert_class(pickup_polygons, "sf") + + # check input colnames + checkmate::assert_names( + x = names(pickup_polygons), + must.include = c("mode") + ) + + checkmate::assert_true(length(unique(pickup_polygons$mode)) == 1 && + pickup_polygons$mode[1] %in% c("CAR", "BIKE", "WALK")) + + return(pickup_polygons$mode[1]) +} + + +#' Returns default_wait time to use when no delay polygon is found. +#' -1 means area is not served at all. +#' +#' @param pickup_polygons An sf polygon +#' +#' @family assigning functions +#' +#' @return Numeric. Default wait +#' +#' @keywords internal +assign_pickup_default_wait <- function(pickup_polygons){ + + # check input class + checkmate::assert_class(pickup_polygons, "sf") + + # check input colnames + checkmate::assert_names( + x = names(pickup_polygons), + must.include = c("default_wait") + ) + + checkmate::assert_true(length(unique(pickup_polygons$default_wait)) == 1) + checkmate::assert_numeric(pickup_polygons$default_wait, any.missing = FALSE, lower = -1) + + return(pickup_polygons$default_wait[1]) +} diff --git a/r-package/R/java_utils.R b/r-package/R/java_utils.R index 1ee4a9d4..0711f8fd 100644 --- a/r-package/R/java_utils.R +++ b/r-package/R/java_utils.R @@ -53,7 +53,7 @@ dt_to_speed_map <- function(dt) { checkmate::assert_names(names(dt), must.include = c("osm_id", "max_speed", "speed_type")) checkmate::assert_numeric(dt$osm_id, any.missing = FALSE, all.missing = FALSE) - checkmate::assert_numeric(dt$max_speed, any.missing = FALSE, all.missing = FALSE) + checkmate::assert_numeric(dt$max_speed, any.missing = FALSE, all.missing = FALSE, lower = 0) checkmate::assert_true(length(unique(dt$speed_type)) == 1 && dt$speed_type[1] %in% c("km/h", "scale")) # Create new HashMap @@ -91,7 +91,7 @@ get_java_version <- function(){ dt_to_lts_map <- function(dt) { checkmate::assert_names(names(dt), must.include = c("osm_id", "lts")) checkmate::assert_numeric(dt$osm_id, any.missing = FALSE, all.missing = FALSE) - checkmate::assert_integer(dt$lts, any.missing = FALSE, all.missing = FALSE) + checkmate::assert_integer(dt$lts, any.missing = FALSE, all.missing = FALSE, lower = 1, upper = 4) # Create new HashMap map_builder <- rJava::.jnew("org.ipea.r5r.Utils.RMapBuilder") @@ -100,3 +100,29 @@ dt_to_lts_map <- function(dt) { return(lts_map) } + + +#' data.table to stopsMap +#' +#' @description Converts a `data.frame` with pickup polygons and and respective +#' drop off stops to a Java Map>. +#' +#' @param dt data.frame/data.table. Table specifying the +#' polygon ID and stops it links to. The table must contain columns +#' \code{poly_id} and \code{stops_ids}. +#' @return A stopsMap (Java Map>) +#' @family java support functions +#' @keywords internal +dt_to_stops_map <- function(dt) { + checkmate::assert_names(names(dt), must.include = c("poly_id", "stops_ids")) + checkmate::assert_character(dt$poly_id, any.missing = FALSE, all.missing = FALSE) + checkmate::assert_list(dt$stops_ids, types = "numeric", any.missing = FALSE, all.missing = FALSE) + + # Create new HashMap + map_builder <- rJava::.jnew("org.ipea.r5r.Utils.RMapBuilder") + stops_str <- sapply(dt$stops_ids, function(x) paste(x, collapse = ",")) + stops_map <- map_builder$buildStopsMap(paste(as.character(dt$poly_id), collapse = ","), + paste(as.character(stops_str), collapse = ";")) + + return(stops_map) +} diff --git a/r-package/R/set.R b/r-package/R/set.R index 3f9f2864..c87a64f1 100644 --- a/r-package/R/set.R +++ b/r-package/R/set.R @@ -647,3 +647,37 @@ set_new_lts <- function(r5r_network, new_lts) { } } } + + +#' Set Pickup Delay +#' +#' Verifies if to set a pickup delay and sets it +#' +#' @template r5r_network +#' @param pickup_poly A sf polygon. +#' +#' @return Invisibly returns `TRUE`. +#' @family setting functions +#' +#' @keywords internal +set_pickup_delay <- function(r5r_network, pickup_poly) { + checkmate::assert_class(pickup_poly, "sf", null.ok = TRUE) + if (!is.null(pickup_poly)){ + cli::cli_inform(c(i = "Modifying pickup delay...")) + + geojson_path <- pickup_poly2geojson(pickup_poly) + stops_map <- dt_to_stops_map(pickup_poly) + street_mode <- assign_pickup_mode(pickup_poly) + default_wait <- assign_pickup_default_wait(pickup_poly) + errors <- r5r_network$applyPickupDelay(geojson_path, + stops_map, + street_mode, + default_wait) + + if (errors != "[]"){ + cli::cli_inform(c( + "!" = "Encountered the following errors modifying pickup delay:", + " " = errors )) + } + } +} diff --git a/r-package/R/travel_time_matrix.R b/r-package/R/travel_time_matrix.R index 0e449dbd..c7e436f3 100644 --- a/r-package/R/travel_time_matrix.R +++ b/r-package/R/travel_time_matrix.R @@ -133,6 +133,7 @@ travel_time_matrix <- function(r5r_network, new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, draws_per_minute = 5L, n_threads = Inf, verbose = FALSE, @@ -224,7 +225,7 @@ travel_time_matrix <- function(r5r_network, # SCENARIOS ------------------------------------------- set_new_congestion(r5r_network, new_carspeeds, carspeed_scale) set_new_lts(r5r_network, new_lts) - + set_pickup_delay(r5r_network, pickup_zones) # call r5r_network method and process result ------------------------------- diff --git a/r-package/R/utils.R b/r-package/R/utils.R index 1b9e8757..c4a5a035 100644 --- a/r-package/R/utils.R +++ b/r-package/R/utils.R @@ -220,8 +220,8 @@ validate_bad_osm_ids <- function(bad_ids_string) { #' Save speeds polygon to .geojson temporary file #' -#' Support function that checks the input of speeds polygon passed to -#' `build_custom_network()` and saves it to a `.geojson` temporary file. +#' Support function that checks the input of speeds polygon and saves it to a +#' `.geojson` temporary file. #' #' @param new_speeds_poly An sf polygon #' @@ -254,8 +254,8 @@ congestion_poly2geojson <- function(new_speeds_poly){ # Check column types and check input geometry checkmate::assert_character(new_speeds_poly$poly_id, any.missing = FALSE) - checkmate::assert_numeric(new_speeds_poly$scale, any.missing = FALSE) - checkmate::assert_integer(new_speeds_poly$priority, any.missing = FALSE) + checkmate::assert_numeric(new_speeds_poly$scale, any.missing = FALSE, lower = 0) + checkmate::assert_integer(new_speeds_poly$priority, any.missing = FALSE, lower = 0) checkmate::assert_subset( x = unique(as.character(sf::st_geometry_type(new_speeds_poly))), choices = c("POLYGON", "MULTIPOLYGON"), @@ -320,7 +320,7 @@ lts_lines2shp <- function(new_lts_lines){ # Check column types and check input geometry checkmate::assert_character(new_lts_lines$line_id, any.missing = FALSE) checkmate::assert_integer(new_lts_lines$lts, any.missing = FALSE, lower = 1, upper = 4) - checkmate::assert_integer(new_lts_lines$priority, any.missing = FALSE) + checkmate::assert_integer(new_lts_lines$priority, any.missing = FALSE, lower = 0) checkmate::assert_subset( x = unique(as.character(sf::st_geometry_type(new_lts_lines))), choices = c("LINESTRING", "MULTILINESTRING"), @@ -346,3 +346,71 @@ lts_lines2shp <- function(new_lts_lines){ if (file.exists(file_path)) { return(file_path)} } + + +#' Save pickup polygon to .geojson temporary file +#' +#' Support function that checks the input of pickup polygons and saves it to a +#' `.geojson` temporary file. +#' +#' @param pickup_polygons An sf polygon +#' +#' @family Support functions +#' +#' @return The path to a `.geojson` saved as a temporary file. +#' +#' @examplesIf identical(tolower(Sys.getenv("NOT_CRAN")), "true") +#' +#' # read polygons for pickup +#' pickup_polygons <- readRDS( +#' system.file("extdata/poa/poa_pickup_zones.rds", package = "r5r") +#' ) +#' +#' geojson_path <- r5r:::pickup_poly2geojson( +#' pickup_polygons = pickup_polygons +#' ) +#' +#' @keywords internal +pickup_poly2geojson <- function(pickup_polygons){ + + # check input class + checkmate::assert_class(pickup_polygons, "sf") + + # check input colnames + checkmate::assert_names( + x = names(pickup_polygons), + must.include = c("poly_id", "wait_time", "priority", "geometry") + ) + + # Check column types and check input geometry + checkmate::assert_character(pickup_polygons$poly_id, any.missing = FALSE) + checkmate::assert_numeric(pickup_polygons$wait_time, any.missing = FALSE) + checkmate::assert_integer(pickup_polygons$priority, any.missing = FALSE, lower = 0) + checkmate::assert_subset( + x = unique(as.character(sf::st_geometry_type(pickup_polygons))), + choices = c("POLYGON", "MULTIPOLYGON"), + empty.ok = FALSE + ) + + # check input spatial projection + if (sf::st_crs(pickup_polygons) != sf::st_crs(4326)) { + stop( + "The CRS of parameter `new_speeds` must be WGS 84 (EPSG 4326). ", + "Please use either sf::set_crs() to set it or ", + "sf::st_transform() to reproject it." + ) + } + + # save polygons to temp file + file_path <- tempfile( + pattern = 'r5r_pickup_poly', + fileext = ".geojson" + ) + + subset <- pickup_polygons[, c("poly_id", "wait_time", "priority", "geometry")] + + sf::st_write(subset, file_path, quiet = TRUE) + + if (file.exists(file_path)) { return(file_path)} +} + diff --git a/r-package/inst/extdata/poa/poa_pickup_zones.rds b/r-package/inst/extdata/poa/poa_pickup_zones.rds new file mode 100644 index 0000000000000000000000000000000000000000..b3c1e6b45f4ab71b7cc3d57819356d8ebe5f6828 GIT binary patch literal 4083 zcmVR`{Ld zoL$a7d++ZfLAq*cYMN?VTAFH_+Bj6x4)C8a#u48c;sXWm-gs-MX{phmI$d?Z=(<9q zOLZLfge~Qs%JR&T)MN12kVo&Yz~d|JdI{mlM>*@Mu+l13Z7e)DEjvyDFUwn#hQjMH zFJ9TfyDZrOF|2>JW$Fv~EZKNZ1$=$6F_ByDnW^5Gl8bsWdsLL)@__?G4dW}}uq^=% z?vTEwae5#eH?+L^XE@2tPcj&CTMqtE1Eb6{ueZabs%c&iVd~wsy1h{0XEm0T%Qq4Y zx(tt4JxsHK7gBOZpNIE47A?qt&ACoFXUaXZH2J*417W{0%g&a;5w97d*U)ia-D0$x znVJO)B1>E+z%oi&FvcV6f>r(; zDZF!ab|@P*G;VdNf^T9tBQBJCW^1#xk9k3ZrA32G;E*_#OZNCTh10J>XX&XcLegJjg#n%PU*o6~>4(t>_gNVK?B40sPX$oRD|P*C-2dwk zjo_E?uM58Y$@t#Rd*#Z2=i2^Y&VWa%xDj}cS$l@{x`O$VmDT&rP27K0T4rd(XqbGh zvZo`AI^N!b@yiO9wJjm_dbHM!M*p)MeBN#`g2UJ3EIJGgD}5G_=dIomUpxrUzsYU= zqg(Lq=AmVHu9@eDiH$ICGfQq(@X0*PJMaDH4!BA81uq#c&zif5%&Ww;a$L~9%Kg*&Wm0R#G(=g#m!?U#CFM+-Vf%t>Js_hX*s%jnHjclu3rg(g zDKEp7byLDJVV?eo`s?s?PEw>BtXt*!at-`YTEC>JoT)o-@Z@8WkiK3!SOa<)8ynt$ zyljC_5=_ty8T=Tgu_sj5!OdZgqqX3E%fY|8!c#lS+|6NiWv$>(_;CKP-F;zmh0F9G z;DQQc#Wc&qtugiRw2nUo2Qp({Ff88*DXzH{1@gQiP&!aDb!=keLpC+GI zR8J2j=k+(6O@~G;$9?*e^2|Z;q+GAoybIx^{()=Qm1yt%K5a_|Y&y%Cc^EzrUaPEy z*VZ)Oo(oS-=@Tc0g+~>En_>3#dh45TMS)E-##whZXLqs#47<$Uw-i(GB zu1)IgZ*WII#6J4n9d$R%-Qfctoif}nrDDeU<40k>?TIbuA7xF=JN>sXf!nkg&z%xh zy;Rf+J^WiGsFy--*t>$9H`+EQ3inH)uK!7>Ue45cSw*2;gb&$zPxZ`wL*k*yFce!j;=Ys9d-#ze!R7m$1G5H6Jcc zH|#Zue3o4DBG)f_TF>kU)2JD~Nu+$~tHhab6UAUc0;&K0shyY~I=d&-u4KYPKlZe$ zfv4AeaKXILsTNKsIS=bMFHA0muN{3;(JzXwabTY((0D>XA0KFwGa@q@dYN53$AY}# zrDHiTiF0g-2VDDybM+{=hfV2y2%cHFDfj}cUwp#|_fORrX`*cehlX&^?T0@b=zCj3 zu64*A^pl#HJMtyw7j;8$Z*?9#=(L=xuUfxqYFZi}<8x==)(jWL0R7I;t(Mqjd$-H9 z`O!R?tSkC!c73T4G_~u9;>-4)>dy92RVoukbXL+m7f?i(≀4W7PN|A;g3J9Vemq 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 XrU(o7M<@jOlN diff --git a/r-package/man/assign_decay_function.Rd b/r-package/man/assign_decay_function.Rd index e64294c6..6e3ff4ed 100644 --- a/r-package/man/assign_decay_function.Rd +++ b/r-package/man/assign_decay_function.Rd @@ -26,6 +26,8 @@ Other assigning functions: \code{\link{assign_mode}()}, \code{\link{assign_opportunities}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()}, \code{\link{assign_shortest_path}()} } diff --git a/r-package/man/assign_departure.Rd b/r-package/man/assign_departure.Rd index 33af5ec1..70fd27e3 100644 --- a/r-package/man/assign_departure.Rd +++ b/r-package/man/assign_departure.Rd @@ -25,6 +25,8 @@ Other assigning functions: \code{\link{assign_mode}()}, \code{\link{assign_opportunities}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()}, \code{\link{assign_shortest_path}()} } diff --git a/r-package/man/assign_drop_geometry.Rd b/r-package/man/assign_drop_geometry.Rd index 48380990..aefff0d6 100644 --- a/r-package/man/assign_drop_geometry.Rd +++ b/r-package/man/assign_drop_geometry.Rd @@ -24,6 +24,8 @@ Other assigning functions: \code{\link{assign_mode}()}, \code{\link{assign_opportunities}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()}, \code{\link{assign_shortest_path}()} } diff --git a/r-package/man/assign_max_street_time.Rd b/r-package/man/assign_max_street_time.Rd index e4f24cc6..4942443f 100644 --- a/r-package/man/assign_max_street_time.Rd +++ b/r-package/man/assign_max_street_time.Rd @@ -33,6 +33,8 @@ Other assigning functions: \code{\link{assign_mode}()}, \code{\link{assign_opportunities}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()}, \code{\link{assign_shortest_path}()} } diff --git a/r-package/man/assign_max_trip_duration.Rd b/r-package/man/assign_max_trip_duration.Rd index 0b5a1598..fb22f471 100644 --- a/r-package/man/assign_max_trip_duration.Rd +++ b/r-package/man/assign_max_trip_duration.Rd @@ -29,6 +29,8 @@ Other assigning functions: \code{\link{assign_mode}()}, \code{\link{assign_opportunities}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()}, \code{\link{assign_shortest_path}()} } diff --git a/r-package/man/assign_mode.Rd b/r-package/man/assign_mode.Rd index b7c68822..123c9a4f 100644 --- a/r-package/man/assign_mode.Rd +++ b/r-package/man/assign_mode.Rd @@ -27,6 +27,8 @@ Other assigning functions: \code{\link{assign_max_trip_duration}()}, \code{\link{assign_opportunities}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()}, \code{\link{assign_shortest_path}()} } diff --git a/r-package/man/assign_opportunities.Rd b/r-package/man/assign_opportunities.Rd index 37aa2d9b..a533fa29 100644 --- a/r-package/man/assign_opportunities.Rd +++ b/r-package/man/assign_opportunities.Rd @@ -27,6 +27,8 @@ Other assigning functions: \code{\link{assign_max_trip_duration}()}, \code{\link{assign_mode}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()}, \code{\link{assign_shortest_path}()} } diff --git a/r-package/man/assign_osm_link_ids.Rd b/r-package/man/assign_osm_link_ids.Rd index b4394c75..fab330cc 100644 --- a/r-package/man/assign_osm_link_ids.Rd +++ b/r-package/man/assign_osm_link_ids.Rd @@ -26,6 +26,8 @@ Other assigning functions: \code{\link{assign_max_trip_duration}()}, \code{\link{assign_mode}()}, \code{\link{assign_opportunities}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()}, \code{\link{assign_shortest_path}()} } diff --git a/r-package/man/assign_pickup_default_wait.Rd b/r-package/man/assign_pickup_default_wait.Rd new file mode 100644 index 00000000..9af35a3a --- /dev/null +++ b/r-package/man/assign_pickup_default_wait.Rd @@ -0,0 +1,35 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/assign.R +\name{assign_pickup_default_wait} +\alias{assign_pickup_default_wait} +\title{Returns default_wait time to use when no delay polygon is found. +-1 means area is not served at all.} +\usage{ +assign_pickup_default_wait(pickup_polygons) +} +\arguments{ +\item{pickup_polygons}{An sf polygon} +} +\value{ +Numeric. Default wait +} +\description{ +Returns default_wait time to use when no delay polygon is found. +-1 means area is not served at all. +} +\seealso{ +Other assigning functions: +\code{\link{assign_decay_function}()}, +\code{\link{assign_departure}()}, +\code{\link{assign_drop_geometry}()}, +\code{\link{assign_max_street_time}()}, +\code{\link{assign_max_trip_duration}()}, +\code{\link{assign_mode}()}, +\code{\link{assign_opportunities}()}, +\code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_mode}()}, +\code{\link{assign_points_input}()}, +\code{\link{assign_shortest_path}()} +} +\concept{assigning functions} +\keyword{internal} diff --git a/r-package/man/assign_pickup_mode.Rd b/r-package/man/assign_pickup_mode.Rd new file mode 100644 index 00000000..349cbafb --- /dev/null +++ b/r-package/man/assign_pickup_mode.Rd @@ -0,0 +1,33 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/assign.R +\name{assign_pickup_mode} +\alias{assign_pickup_mode} +\title{Returns which routing mode to apply pickup delay polygons on.} +\usage{ +assign_pickup_mode(pickup_polygons) +} +\arguments{ +\item{pickup_polygons}{An sf polygon} +} +\value{ +Character. One of street routing modes. +} +\description{ +Returns which routing mode to apply pickup delay polygons on. +} +\seealso{ +Other assigning functions: +\code{\link{assign_decay_function}()}, +\code{\link{assign_departure}()}, +\code{\link{assign_drop_geometry}()}, +\code{\link{assign_max_street_time}()}, +\code{\link{assign_max_trip_duration}()}, +\code{\link{assign_mode}()}, +\code{\link{assign_opportunities}()}, +\code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_points_input}()}, +\code{\link{assign_shortest_path}()} +} +\concept{assigning functions} +\keyword{internal} diff --git a/r-package/man/assign_points_input.Rd b/r-package/man/assign_points_input.Rd index ba824e67..6dce12b1 100644 --- a/r-package/man/assign_points_input.Rd +++ b/r-package/man/assign_points_input.Rd @@ -27,6 +27,8 @@ Other assigning functions: \code{\link{assign_mode}()}, \code{\link{assign_opportunities}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_shortest_path}()} } \concept{assigning functions} diff --git a/r-package/man/assign_shortest_path.Rd b/r-package/man/assign_shortest_path.Rd index 9f8b4165..2e83f57d 100644 --- a/r-package/man/assign_shortest_path.Rd +++ b/r-package/man/assign_shortest_path.Rd @@ -25,6 +25,8 @@ Other assigning functions: \code{\link{assign_mode}()}, \code{\link{assign_opportunities}()}, \code{\link{assign_osm_link_ids}()}, +\code{\link{assign_pickup_default_wait}()}, +\code{\link{assign_pickup_mode}()}, \code{\link{assign_points_input}()} } \concept{assigning functions} diff --git a/r-package/man/congestion_poly2geojson.Rd b/r-package/man/congestion_poly2geojson.Rd index fda7d6dd..d8337a8b 100644 --- a/r-package/man/congestion_poly2geojson.Rd +++ b/r-package/man/congestion_poly2geojson.Rd @@ -13,8 +13,8 @@ congestion_poly2geojson(new_speeds_poly) The path to a \code{.geojson} saved as a temporary file. } \description{ -Support function that checks the input of speeds polygon passed to -\code{build_custom_network()} and saves it to a \code{.geojson} temporary file. +Support function that checks the input of speeds polygon and saves it to a +\code{.geojson} temporary file. } \examples{ \dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} @@ -31,7 +31,8 @@ geojson_path <- r5r:::congestion_poly2geojson( } \seealso{ Other Support functions: -\code{\link{lts_lines2shp}()} +\code{\link{lts_lines2shp}()}, +\code{\link{pickup_poly2geojson}()} } \concept{Support functions} \keyword{internal} diff --git a/r-package/man/dt_to_lts_map.Rd b/r-package/man/dt_to_lts_map.Rd index 32a07984..898731fb 100644 --- a/r-package/man/dt_to_lts_map.Rd +++ b/r-package/man/dt_to_lts_map.Rd @@ -21,6 +21,7 @@ levels a Java Map for use by r5r_network. \seealso{ Other java support functions: \code{\link{dt_to_speed_map}()}, +\code{\link{dt_to_stops_map}()}, \code{\link{get_java_version}()}, \code{\link{java_to_dt}()} } diff --git a/r-package/man/dt_to_speed_map.Rd b/r-package/man/dt_to_speed_map.Rd index de2cf50f..6eff33a9 100644 --- a/r-package/man/dt_to_speed_map.Rd +++ b/r-package/man/dt_to_speed_map.Rd @@ -21,6 +21,7 @@ to a Java Map for use by r5r_network. \seealso{ Other java support functions: \code{\link{dt_to_lts_map}()}, +\code{\link{dt_to_stops_map}()}, \code{\link{get_java_version}()}, \code{\link{java_to_dt}()} } diff --git a/r-package/man/dt_to_stops_map.Rd b/r-package/man/dt_to_stops_map.Rd new file mode 100644 index 00000000..34ec7b00 --- /dev/null +++ b/r-package/man/dt_to_stops_map.Rd @@ -0,0 +1,29 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/java_utils.R +\name{dt_to_stops_map} +\alias{dt_to_stops_map} +\title{data.table to stopsMap} +\usage{ +dt_to_stops_map(dt) +} +\arguments{ +\item{dt}{data.frame/data.table. Table specifying the +polygon ID and stops it links to. The table must contain columns +\code{poly_id} and \code{stops_ids}.} +} +\value{ +A stopsMap (Java Map}}>) +} +\description{ +Converts a \code{data.frame} with pickup polygons and and respective +drop off stops to a Java Map}}>. +} +\seealso{ +Other java support functions: +\code{\link{dt_to_lts_map}()}, +\code{\link{dt_to_speed_map}()}, +\code{\link{get_java_version}()}, +\code{\link{java_to_dt}()} +} +\concept{java support functions} +\keyword{internal} diff --git a/r-package/man/get_java_version.Rd b/r-package/man/get_java_version.Rd index 042ef5c0..acd18abf 100644 --- a/r-package/man/get_java_version.Rd +++ b/r-package/man/get_java_version.Rd @@ -16,6 +16,7 @@ Determine the Java version installed locally Other java support functions: \code{\link{dt_to_lts_map}()}, \code{\link{dt_to_speed_map}()}, +\code{\link{dt_to_stops_map}()}, \code{\link{java_to_dt}()} } \concept{java support functions} diff --git a/r-package/man/java_to_dt.Rd b/r-package/man/java_to_dt.Rd index 9a155757..3d9bb9f5 100644 --- a/r-package/man/java_to_dt.Rd +++ b/r-package/man/java_to_dt.Rd @@ -19,6 +19,7 @@ Converts a Java object returned by r5r_network to an R \code{data.table} Other java support functions: \code{\link{dt_to_lts_map}()}, \code{\link{dt_to_speed_map}()}, +\code{\link{dt_to_stops_map}()}, \code{\link{get_java_version}()} } \concept{java support functions} diff --git a/r-package/man/lts_lines2shp.Rd b/r-package/man/lts_lines2shp.Rd index 9bb0fe94..8990c2f5 100644 --- a/r-package/man/lts_lines2shp.Rd +++ b/r-package/man/lts_lines2shp.Rd @@ -31,7 +31,8 @@ shp_path <- r5r:::lts_lines2shp( } \seealso{ Other Support functions: -\code{\link{congestion_poly2geojson}()} +\code{\link{congestion_poly2geojson}()}, +\code{\link{pickup_poly2geojson}()} } \concept{Support functions} \keyword{internal} diff --git a/r-package/man/pickup_poly2geojson.Rd b/r-package/man/pickup_poly2geojson.Rd new file mode 100644 index 00000000..13a8239e --- /dev/null +++ b/r-package/man/pickup_poly2geojson.Rd @@ -0,0 +1,38 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/utils.R +\name{pickup_poly2geojson} +\alias{pickup_poly2geojson} +\title{Save pickup polygon to .geojson temporary file} +\usage{ +pickup_poly2geojson(pickup_polygons) +} +\arguments{ +\item{pickup_polygons}{An sf polygon} +} +\value{ +The path to a \code{.geojson} saved as a temporary file. +} +\description{ +Support function that checks the input of pickup polygons and saves it to a +\code{.geojson} temporary file. +} +\examples{ +\dontshow{if (identical(tolower(Sys.getenv("NOT_CRAN")), "true")) (if (getRversion() >= "3.4") withAutoprint else force)(\{ # examplesIf} + +# read polygons for pickup +pickup_polygons <- readRDS( + system.file("extdata/poa/poa_pickup_zones.rds", package = "r5r") + ) + +geojson_path <- r5r:::pickup_poly2geojson( + pickup_polygons = pickup_polygons + ) +\dontshow{\}) # examplesIf} +} +\seealso{ +Other Support functions: +\code{\link{congestion_poly2geojson}()}, +\code{\link{lts_lines2shp}()} +} +\concept{Support functions} +\keyword{internal} diff --git a/r-package/man/reverse_if_direct_mode.Rd b/r-package/man/reverse_if_direct_mode.Rd index 92005380..6e3a6ec6 100644 --- a/r-package/man/reverse_if_direct_mode.Rd +++ b/r-package/man/reverse_if_direct_mode.Rd @@ -40,6 +40,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_breakdown.Rd b/r-package/man/set_breakdown.Rd index c97cdf1d..995ab440 100644 --- a/r-package/man/set_breakdown.Rd +++ b/r-package/man/set_breakdown.Rd @@ -35,6 +35,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_cutoffs.Rd b/r-package/man/set_cutoffs.Rd index f959dbd6..596987d2 100644 --- a/r-package/man/set_cutoffs.Rd +++ b/r-package/man/set_cutoffs.Rd @@ -36,6 +36,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_elevation.Rd b/r-package/man/set_elevation.Rd index cc87083c..9c46b46a 100644 --- a/r-package/man/set_elevation.Rd +++ b/r-package/man/set_elevation.Rd @@ -32,6 +32,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_expanded_travel_times.Rd b/r-package/man/set_expanded_travel_times.Rd index 56dcd385..c6c3b3d3 100644 --- a/r-package/man/set_expanded_travel_times.Rd +++ b/r-package/man/set_expanded_travel_times.Rd @@ -35,6 +35,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_fare_cutoffs.Rd b/r-package/man/set_fare_cutoffs.Rd index 2955dbba..dfb331ac 100644 --- a/r-package/man/set_fare_cutoffs.Rd +++ b/r-package/man/set_fare_cutoffs.Rd @@ -35,6 +35,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_fare_structure.Rd b/r-package/man/set_fare_structure.Rd index 9e7294b3..e2c50552 100644 --- a/r-package/man/set_fare_structure.Rd +++ b/r-package/man/set_fare_structure.Rd @@ -40,6 +40,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_max_fare.Rd b/r-package/man/set_max_fare.Rd index b8e72657..80198130 100644 --- a/r-package/man/set_max_fare.Rd +++ b/r-package/man/set_max_fare.Rd @@ -34,6 +34,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_max_lts.Rd b/r-package/man/set_max_lts.Rd index 847c2276..cbef7877 100644 --- a/r-package/man/set_max_lts.Rd +++ b/r-package/man/set_max_lts.Rd @@ -37,6 +37,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_max_rides.Rd b/r-package/man/set_max_rides.Rd index a92f1998..90723673 100644 --- a/r-package/man/set_max_rides.Rd +++ b/r-package/man/set_max_rides.Rd @@ -35,6 +35,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_monte_carlo_draws.Rd b/r-package/man/set_monte_carlo_draws.Rd index 99de81d3..b28770da 100644 --- a/r-package/man/set_monte_carlo_draws.Rd +++ b/r-package/man/set_monte_carlo_draws.Rd @@ -36,6 +36,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_n_threads.Rd b/r-package/man/set_n_threads.Rd index 718372ca..a2914a60 100644 --- a/r-package/man/set_n_threads.Rd +++ b/r-package/man/set_n_threads.Rd @@ -34,6 +34,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_new_congestion.Rd b/r-package/man/set_new_congestion.Rd index 6fcf4a6d..72be3854 100644 --- a/r-package/man/set_new_congestion.Rd +++ b/r-package/man/set_new_congestion.Rd @@ -36,6 +36,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_new_lts.Rd b/r-package/man/set_new_lts.Rd index 4a74725c..1d0e1aef 100644 --- a/r-package/man/set_new_lts.Rd +++ b/r-package/man/set_new_lts.Rd @@ -34,6 +34,7 @@ Other setting functions: \code{\link{set_new_congestion}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_output_dir.Rd b/r-package/man/set_output_dir.Rd index fe4446b5..e20a819f 100644 --- a/r-package/man/set_output_dir.Rd +++ b/r-package/man/set_output_dir.Rd @@ -34,6 +34,7 @@ Other setting functions: \code{\link{set_new_congestion}()}, \code{\link{set_new_lts}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_percentiles.Rd b/r-package/man/set_percentiles.Rd index ee28b2a3..865749ef 100644 --- a/r-package/man/set_percentiles.Rd +++ b/r-package/man/set_percentiles.Rd @@ -34,6 +34,7 @@ Other setting functions: \code{\link{set_new_congestion}()}, \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_pickup_delay.Rd b/r-package/man/set_pickup_delay.Rd new file mode 100644 index 00000000..9ac996e5 --- /dev/null +++ b/r-package/man/set_pickup_delay.Rd @@ -0,0 +1,45 @@ +% Generated by roxygen2: do not edit by hand +% Please edit documentation in R/set.R +\name{set_pickup_delay} +\alias{set_pickup_delay} +\title{Set Pickup Delay} +\usage{ +set_pickup_delay(r5r_network, pickup_poly) +} +\arguments{ +\item{r5r_network}{A routable transport network created with \code{\link[=build_network]{build_network()}}.} + +\item{pickup_poly}{A sf polygon.} +} +\value{ +Invisibly returns \code{TRUE}. +} +\description{ +Verifies if to set a pickup delay and sets it +} +\seealso{ +Other setting functions: +\code{\link{reverse_if_direct_mode}()}, +\code{\link{set_breakdown}()}, +\code{\link{set_cutoffs}()}, +\code{\link{set_elevation}()}, +\code{\link{set_expanded_travel_times}()}, +\code{\link{set_fare_cutoffs}()}, +\code{\link{set_fare_structure}()}, +\code{\link{set_max_fare}()}, +\code{\link{set_max_lts}()}, +\code{\link{set_max_rides}()}, +\code{\link{set_monte_carlo_draws}()}, +\code{\link{set_n_threads}()}, +\code{\link{set_new_congestion}()}, +\code{\link{set_new_lts}()}, +\code{\link{set_output_dir}()}, +\code{\link{set_percentiles}()}, +\code{\link{set_progress}()}, +\code{\link{set_speed}()}, +\code{\link{set_suboptimal_minutes}()}, +\code{\link{set_time_window}()}, +\code{\link{set_verbose}()} +} +\concept{setting functions} +\keyword{internal} diff --git a/r-package/man/set_progress.Rd b/r-package/man/set_progress.Rd index e76ca474..d3c9b4ce 100644 --- a/r-package/man/set_progress.Rd +++ b/r-package/man/set_progress.Rd @@ -36,6 +36,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, \code{\link{set_time_window}()}, diff --git a/r-package/man/set_speed.Rd b/r-package/man/set_speed.Rd index 15f711fd..39b56540 100644 --- a/r-package/man/set_speed.Rd +++ b/r-package/man/set_speed.Rd @@ -39,6 +39,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_suboptimal_minutes}()}, \code{\link{set_time_window}()}, diff --git a/r-package/man/set_suboptimal_minutes.Rd b/r-package/man/set_suboptimal_minutes.Rd index 4ee2af0d..fa672df9 100644 --- a/r-package/man/set_suboptimal_minutes.Rd +++ b/r-package/man/set_suboptimal_minutes.Rd @@ -56,6 +56,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_time_window}()}, diff --git a/r-package/man/set_time_window.Rd b/r-package/man/set_time_window.Rd index 8081b040..b812dd40 100644 --- a/r-package/man/set_time_window.Rd +++ b/r-package/man/set_time_window.Rd @@ -35,6 +35,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/set_verbose.Rd b/r-package/man/set_verbose.Rd index 39db3514..15de93c9 100644 --- a/r-package/man/set_verbose.Rd +++ b/r-package/man/set_verbose.Rd @@ -36,6 +36,7 @@ Other setting functions: \code{\link{set_new_lts}()}, \code{\link{set_output_dir}()}, \code{\link{set_percentiles}()}, +\code{\link{set_pickup_delay}()}, \code{\link{set_progress}()}, \code{\link{set_speed}()}, \code{\link{set_suboptimal_minutes}()}, diff --git a/r-package/man/travel_time_matrix.Rd b/r-package/man/travel_time_matrix.Rd index e6695e35..21cf271d 100644 --- a/r-package/man/travel_time_matrix.Rd +++ b/r-package/man/travel_time_matrix.Rd @@ -28,6 +28,7 @@ travel_time_matrix( new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, draws_per_minute = 5L, n_threads = Inf, verbose = FALSE, From 268ed9b765be67831c3bf8c321908ef81689dd32 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 10 Aug 2025 22:15:51 +0000 Subject: [PATCH 2/3] Rebuild JAR for commit ecd3874c3980b90f18e6b6f033631034b3624c3a --- r-package/inst/jar/r5r.jar | Bin 145416 -> 142149 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/r-package/inst/jar/r5r.jar b/r-package/inst/jar/r5r.jar index 182940cb20c159b296508d875754c45d17eb4516..528f5171054a9124383a5253ca4b9375a3788dd2 100644 GIT binary patch delta 2908 zcmZuz4OG+D6@Tv~!2k&a10)cUAmjrANq_*tP!OzNZ~!}DZm7YJsRdEbDh}wBQG0Y% zu;yg=&g38t(SzbpK&4g@+W|XPdIYO(Dn-;Xuyex-_*JTV@BacN&~V8Ao_l}q_q*@j z`(FNkdMa$YEfl9E@%Zil2!-HPy^}?(=95RJC2BE$gg!q~vS*D7J+HT1*P)Sm{Gt<@ zcqH01dL10EGKGj#zxZsYuS z9E|5N@53aR>BP)ei(sD(5R?f07{D68EtCs4uB?3G!L0OB{&Z&LZR?hEmNh3bin)$Q zHrS|hYT-X5yytYQMjPBW2l9y{v+-NyYeYkh5B$$an5);r;>ck6l67pKjiE5of%$Gb zALcVFXW9lnw}PZL(|Y9GG*=$@sa=$FOHaEaC2#uJABOTdnT{_PFk|*WrI_=0T>q6T z2O1E1C6i<`8&jA4*Ov@L<0mn5 zrZb+-i1R#kAfHMGK)0PcuRvfI2?N#%|C$ic_&D*50I;pTMu3Fz2-uU8Bj1k1HUw|Nb3NiU*zM7PpQyMoZJN+akL3>haA5)Aq7%HJf{oFu^|E}II>FWJuYP4 zn1VDftm&(NOEu+v47iz}1QX-HyuPqwjoCp*|FVxO3G=uj; z9KeHNNW=7;jRb>o0oEFk4|5fUkrcvm@zW&ej!%Z60B$GY?PNC2hjglCtd&L^IHtS{$cCGKqc6DHC7Ok*xZ-r~<#xAum?Nt<-(%bGk@j z-C630&**G3;o-WX=BS(ub1VR)nB$-7;%~mDaNCd1cXa%kpWxI$+obMSsJ8fncY(p z_iE+1Ta3Lli2VfOUKNR5RgK5^*5%M8WO50ryq9%kk>PT5nmmxa;GdS_%WCAs4W#G% zhLvQ1pG!d@}c(+Z8}d90dZ(Bn#Jw&dI;I)JIo`qng;~d@*eq=s>T=y z$|Vk3E$2M(X@3}u4;jdjptUGTTIDAo87v`9Q`=>bkjU^$LXZ!qWz-XveG55ts-?hJ zLTu&ErfGzvvjvAkke=iAI1>HL>G)b{k%D zj^Q5%lbdO*+667pdL+hks&a75?wmpvwCYKMh2YY(|49uIGEo;$t06 z7UKf7?KVPpQnu>JTfk)*07|<|R=$Gxvwr9|WxfQDA3c+j5S%q- zi5E1gC8W7B$>b&|To8We5>%y5oZ_E*OBoZYF3$Bt6W>|Vk^~Mk7)$=bqyYRVBlj5i EKQPOc9smFU delta 6126 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 RN~bRJ#2{anP)W)j`5&EUy3GIp From 67827a22d4b9e45f183c48a78add2da434a999f6 Mon Sep 17 00:00:00 2001 From: Alex Magnus Date: Mon, 11 Aug 2025 00:37:24 +0200 Subject: [PATCH 3/3] update documentation for pickup delay zones --- r-package/R/accessibility.R | 2 ++ r-package/R/arrival_travel_time_matrix.R | 2 ++ r-package/R/detailed_itineraries.R | 2 ++ r-package/R/expanded_travel_time_matrix.R | 2 ++ r-package/R/set.R | 2 +- r-package/man/accessibility.Rd | 4 ++++ r-package/man/arrival_travel_time_matrix.Rd | 4 ++++ r-package/man/detailed_itineraries.Rd | 4 ++++ r-package/man/expanded_travel_time_matrix.Rd | 4 ++++ r-package/man/roxygen/templates/scenarios.R | 3 +++ r-package/man/set_new_lts.Rd | 2 +- r-package/man/travel_time_matrix.Rd | 3 +++ 12 files changed, 32 insertions(+), 2 deletions(-) diff --git a/r-package/R/accessibility.R b/r-package/R/accessibility.R index f776a4e7..ecd4895c 100644 --- a/r-package/R/accessibility.R +++ b/r-package/R/accessibility.R @@ -160,6 +160,7 @@ accessibility <- function(r5r_network, new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, draws_per_minute = 5L, n_threads = Inf, verbose = FALSE, @@ -256,6 +257,7 @@ accessibility <- function(r5r_network, # SCENARIOS ------------------------------------------- set_new_congestion(r5r_network, new_carspeeds, carspeed_scale) set_new_lts(r5r_network, new_lts) + set_pickup_delay(r5r_network, pickup_zones) # call r5r_network method and process results ------------------------------ diff --git a/r-package/R/arrival_travel_time_matrix.R b/r-package/R/arrival_travel_time_matrix.R index 2ae04b5e..3108188e 100644 --- a/r-package/R/arrival_travel_time_matrix.R +++ b/r-package/R/arrival_travel_time_matrix.R @@ -99,6 +99,7 @@ arrival_travel_time_matrix <- function(r5r_network, new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, draws_per_minute = 5L, n_threads = Inf, verbose = FALSE, @@ -191,6 +192,7 @@ arrival_travel_time_matrix <- function(r5r_network, # SCENARIOS ------------------------------------------- set_new_congestion(r5r_network, new_carspeeds, carspeed_scale) set_new_lts(r5r_network, new_lts) + set_pickup_delay(r5r_network, pickup_zones) # call r5r_network method and process result ------------------------------- diff --git a/r-package/R/detailed_itineraries.R b/r-package/R/detailed_itineraries.R index 6d638602..43d76310 100644 --- a/r-package/R/detailed_itineraries.R +++ b/r-package/R/detailed_itineraries.R @@ -120,6 +120,7 @@ detailed_itineraries <- function(r5r_network, new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, n_threads = Inf, verbose = FALSE, progress = FALSE, @@ -225,6 +226,7 @@ detailed_itineraries <- function(r5r_network, # SCENARIOS ------------------------------------------- set_new_congestion(r5r_network, new_carspeeds, carspeed_scale) set_new_lts(r5r_network, new_lts) + set_pickup_delay(r5r_network, pickup_zones) # call r5r_network method and process result ------------------------------- diff --git a/r-package/R/expanded_travel_time_matrix.R b/r-package/R/expanded_travel_time_matrix.R index 09f8b8b0..7f50444a 100644 --- a/r-package/R/expanded_travel_time_matrix.R +++ b/r-package/R/expanded_travel_time_matrix.R @@ -110,6 +110,7 @@ expanded_travel_time_matrix <- function(r5r_network, new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, draws_per_minute = 5L, n_threads = Inf, verbose = FALSE, @@ -199,6 +200,7 @@ expanded_travel_time_matrix <- function(r5r_network, # SCENARIOS ------------------------------------------- set_new_congestion(r5r_network, new_carspeeds, carspeed_scale) set_new_lts(r5r_network, new_lts) + set_pickup_delay(r5r_network, pickup_zones) # call r5r_network method and process result ------------------------------- diff --git a/r-package/R/set.R b/r-package/R/set.R index c87a64f1..456258d6 100644 --- a/r-package/R/set.R +++ b/r-package/R/set.R @@ -622,7 +622,7 @@ set_new_congestion <- function(r5r_network, new_carspeeds, carspeed_scale) { #' Verifies if and which LTS mode to use and applies it. #' #' @template r5r_network -#' @param new_carspeeds A df or sf polygon. +#' @param new_lts A df or sf polygon. #' #' @return Invisibly returns `TRUE`. #' @family setting functions diff --git a/r-package/man/accessibility.Rd b/r-package/man/accessibility.Rd index 639d9040..b335deda 100644 --- a/r-package/man/accessibility.Rd +++ b/r-package/man/accessibility.Rd @@ -31,6 +31,7 @@ accessibility( new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, draws_per_minute = 5L, n_threads = Inf, verbose = FALSE, @@ -188,6 +189,9 @@ Alternatively, the \code{new_lts} parameter can receive an \verb{sf data.frame} with LINESTRING geometry. R5 will then find the nearest road for each LINESTRING and update its LTS value accordingly.} +\item{pickup_zones}{A \code{data.frame} specifying the pickup and drop-off zones +as well as their respective wait times for dynamic-transit or bike share.} + \item{draws_per_minute}{An integer. The number of Monte Carlo draws to perform per time window minute when calculating travel time matrices and when estimating accessibility. Defaults to 5. This would mean 300 draws in diff --git a/r-package/man/arrival_travel_time_matrix.Rd b/r-package/man/arrival_travel_time_matrix.Rd index 3c6aa5be..70000028 100644 --- a/r-package/man/arrival_travel_time_matrix.Rd +++ b/r-package/man/arrival_travel_time_matrix.Rd @@ -25,6 +25,7 @@ arrival_travel_time_matrix( new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, draws_per_minute = 5L, n_threads = Inf, verbose = FALSE, @@ -131,6 +132,9 @@ Alternatively, the \code{new_lts} parameter can receive an \verb{sf data.frame} with LINESTRING geometry. R5 will then find the nearest road for each LINESTRING and update its LTS value accordingly.} +\item{pickup_zones}{A \code{data.frame} specifying the pickup and drop-off zones +as well as their respective wait times for dynamic-transit or bike share.} + \item{draws_per_minute}{An integer. The number of Monte Carlo draws to perform per time window minute when calculating travel time matrices and when estimating accessibility. Defaults to 5. This would mean 300 draws in diff --git a/r-package/man/detailed_itineraries.Rd b/r-package/man/detailed_itineraries.Rd index c1640f38..8413655b 100644 --- a/r-package/man/detailed_itineraries.Rd +++ b/r-package/man/detailed_itineraries.Rd @@ -29,6 +29,7 @@ detailed_itineraries( new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, n_threads = Inf, verbose = FALSE, progress = FALSE, @@ -172,6 +173,9 @@ Alternatively, the \code{new_lts} parameter can receive an \verb{sf data.frame} with LINESTRING geometry. R5 will then find the nearest road for each LINESTRING and update its LTS value accordingly.} +\item{pickup_zones}{A \code{data.frame} specifying the pickup and drop-off zones +as well as their respective wait times for dynamic-transit or bike share.} + \item{n_threads}{An integer. The number of threads to use when running the router in parallel. Defaults to use all available threads (Inf).} diff --git a/r-package/man/expanded_travel_time_matrix.Rd b/r-package/man/expanded_travel_time_matrix.Rd index e4c714c4..67e5a0e3 100644 --- a/r-package/man/expanded_travel_time_matrix.Rd +++ b/r-package/man/expanded_travel_time_matrix.Rd @@ -25,6 +25,7 @@ expanded_travel_time_matrix( new_carspeeds = NULL, carspeed_scale = 1, new_lts = NULL, + pickup_zones = NULL, draws_per_minute = 5L, n_threads = Inf, verbose = FALSE, @@ -141,6 +142,9 @@ Alternatively, the \code{new_lts} parameter can receive an \verb{sf data.frame} with LINESTRING geometry. R5 will then find the nearest road for each LINESTRING and update its LTS value accordingly.} +\item{pickup_zones}{A \code{data.frame} specifying the pickup and drop-off zones +as well as their respective wait times for dynamic-transit or bike share.} + \item{draws_per_minute}{An integer. The number of Monte Carlo draws to perform per time window minute when calculating travel time matrices and when estimating accessibility. Defaults to 5. This would mean 300 draws in diff --git a/r-package/man/roxygen/templates/scenarios.R b/r-package/man/roxygen/templates/scenarios.R index 71a94567..449a9560 100644 --- a/r-package/man/roxygen/templates/scenarios.R +++ b/r-package/man/roxygen/templates/scenarios.R @@ -19,3 +19,6 @@ #' Alternatively, the `new_lts` parameter can receive an `sf data.frame` #' with LINESTRING geometry. R5 will then find the nearest road for each #' LINESTRING and update its LTS value accordingly. +#' @param pickup_zones A `data.frame` specifying the pickup and drop-off zones +#' as well as their respective wait times for dynamic-transit or bike share. +#' diff --git a/r-package/man/set_new_lts.Rd b/r-package/man/set_new_lts.Rd index 1d0e1aef..dd77d43b 100644 --- a/r-package/man/set_new_lts.Rd +++ b/r-package/man/set_new_lts.Rd @@ -9,7 +9,7 @@ set_new_lts(r5r_network, new_lts) \arguments{ \item{r5r_network}{A routable transport network created with \code{\link[=build_network]{build_network()}}.} -\item{new_carspeeds}{A df or sf polygon.} +\item{new_lts}{A df or sf polygon.} } \value{ Invisibly returns \code{TRUE}. diff --git a/r-package/man/travel_time_matrix.Rd b/r-package/man/travel_time_matrix.Rd index 21cf271d..9d0dfc00 100644 --- a/r-package/man/travel_time_matrix.Rd +++ b/r-package/man/travel_time_matrix.Rd @@ -159,6 +159,9 @@ Alternatively, the \code{new_lts} parameter can receive an \verb{sf data.frame} with LINESTRING geometry. R5 will then find the nearest road for each LINESTRING and update its LTS value accordingly.} +\item{pickup_zones}{A \code{data.frame} specifying the pickup and drop-off zones +as well as their respective wait times for dynamic-transit or bike share.} + \item{draws_per_minute}{An integer. The number of Monte Carlo draws to perform per time window minute when calculating travel time matrices and when estimating accessibility. Defaults to 5. This would mean 300 draws in