Advanced use#
Snap origins and destination to the street network#
Sometimes, origin or destination points are far from the walkable, cyclable, or drivable street network. Especially when using a regular grid of points, many origins or destinations of a data set might be in the middle of a swamp (example above), on top of a mountain, or in the deep forest.
While r5py and R⁵ do their best to provide a reasonable route even for these points, at times, you might want to be able to control the situation a bit better.
R5py’s TransportNetwork
allows you to snap a
GeoSeries
of points
to
points on the network.
Simply load a transport network, have a geo-data frame with origin or
destination points, and call the transport network’s
snap_to_network()
method:
import geopandas
origins = geopandas.GeoDataFrame(
{
"id": [1, 2],
"geometry": [
shapely.Point(24.841466, 60.208892),
shapely.Point(24.848001, 60.207177),
],
},
crs="EPSG:4326",
)
origins["snapped_geometry"] = transport_network.snap_to_network(origins["geometry"])
origins
id | geometry | snapped_geometry | |
---|---|---|---|
0 | 1 | POINT (24.84147 60.20889) | POINT (24.84582 60.20980) |
1 | 2 | POINT (24.84800 60.20718) | POINT (24.85189 60.20731) |
By default, snapping takes into consideration all network nodes that support
TransportMode.WALK
, and that are within search
radius of 1600 metres. In other words, points are snapped to the closest path
that is accessible on foot, within a maximum of 1.6 kilometres.
Both parameters can be adjusted. For example, to snap to network nodes that are drivable, within 500 m, use the following code:
origins["snapped_geometry"] = transport_network.snap_to_network(
origins["geometry"],
radius=500,
street_mode=r5py.TransportMode.CAR,
)
origins
id | geometry | snapped_geometry | |
---|---|---|---|
0 | 1 | POINT (24.84147 60.20889) | POINT EMPTY |
1 | 2 | POINT (24.84800 60.20718) | POINT (24.85281 60.20762) |
As you can see, one of the points could not be snapped with the tightened requirements: it was returned as an ‘empty’ point.
Convenient short-hands
Both TravelTimeMatrixComputer
and DetailedItinerariesComputer
support a
convenient parameter, snap_to_network
, that controls whether the origins and
destinations should automatically be snapped to the transport network.
travel_time_matrix_computer = r5py.TravelTimeMatrixComputer(
...
snap_to_network=True,
)
Limit the maximum Java heap size (memory use)#
A Java Virtual Machine (JVM) typically restricts the memory usage of programs it runs. More specifically, the heap size can be limited (see this stackoverflow discussion for a detailed explanation).
The tasks carried out by R⁵ under the hood of r5py are fairly memory-intensive, which is why, by default, r5py allows the JVM to grant up to 80% of total memory to R⁵ (but ensures to always leave at least 2 GiB to the operating system and other processes).
You may want to lower this limit if you are running other tasks in parallel, or raise it if you have a dedicated computer with large memory and small operating system requirements.
To change the memory limit, you can either create a configuration file and set max-memory
from there by specifying the --max-memory
or -m
command line
arguments, or add the same arguments to sys.argv
. See detailed explanation on
the configuration page.
For instance, to set the maximum heap size to a fixed 12 GiB, you can create a configuration file in the location suitable for your operating system, and add the following line:
max-memory: 12G
Use a custom installation of R⁵#
For some use cases, it can be useful to use a local copy of R⁵, rather than the one downloaded by r5py, for instance, in order to apply custom patches to extend or modify R⁵’s functionality, or to force the use of a certain version for longitudinal comparability.
This can be achieved by passing a configuration option or command line argument to change the class path.
For example, to set a custom classpath inside a Python notebook, you can set
sys.argv
before importing r5py
:
import sys
sys.argv.append(["--r5-classpath", "/opt/r5/"])
import r5py
To use the patched R⁵ version provided by the Digital Geography Lab on their GitHub pages, for example, pass the full URL, instead:
import sys
sys.argv.append([
"--r5-classpath",
"https://github.com/DigitalGeographyLab/r5/releases/download/v6.9-post16-g1054c1e-20230619/r5-v6.9-post16-g1054c1e-20230619-all.jar"
])
import r5py