routing
BETA
This module contains functions that perform routing and path calculations natively in BigQuery without the need of calling external location data services. In order to run the functions of this module the user needs to have access to CARTO's pre-generated road network (based on OSM segments) that is available as a public subscription via the Data Observatory. Please check this guide to learn how to subscribe to a dataset from the Data Observatory.
ROUTING_MATRIX
ROUTING_MATRIX(start_point_array, dest_point_array, area_of_interest, transportation_mode, do_network_table, do_source, output_table, options)Description
This procedure calculates the shortest paths in terms of travel times or distances for all routes between all of a given set of locations. It requires a Data Observatory road network subscription to perform the calculations.
For every given origin, this procedure calculates the minimum cost of travel from that origin to every given destination on the road network specified.
start_point_array:ARRAY<GEOGRAPHY>Source points array. the node of the network nearest to this point will be used as the source point to compute the shortest path.dest_point_array:ARRAY<GEOGRAPHY>destination points array. the node of the network nearest to this point will be used as the destination point to compute the shortest path.area_of_interest:GEOGRAPHYarea of interest over where the analysis takes place.transportation_mode:STRINGtype of transportation mode to be used for the calculation of routes. Available options:car,car_motorway_only,car_major_road_only,bicycleorfoot.do_network_table:STRINGidentifier (slug) of the Data Observatory Network table.do_source:STRINGname of the location where the Data Observatory subscriptions of the user are stored, in<my-dataobs-project>.<my-dataobs-dataset>format. If only the<my-dataobs-dataset>is included, it uses the projectcarto-databy default. It can be set to NULL or ''.output_table:STRINGthe full path name of the output table.options:STRINGcontaining a valid JSON with the different options. Valid options are described the table below. Ifoptionsis set toNULLthe all options are set to default.
TYPE
STRING
time
Defines the kind of optimisation for pathfinding. Possible values: "time", "distance".
MAX_COST
FLOAT64
NULL
Defines maximum cost for pathfinding. If NULL all snapping distance are allowed.
WITH_PATH
BOOL
TRUE
If True returns paths and detailed geography. If not returns only the cost.
UNCOMPACT_GEOMETRY
BOOL
TRUE
If True the full non-compacted geometry between each link in the path. If not return only start and destination nodes of each link in the path.
FALLBACK_WRONG_WAY_SPEED_RATIO
FLOAT64
NULL
Defines the penalty ratio that should be applied to take a one-way road backwards. Value should be between 1 and 0 (excluded). If NULL, one-way roads cannot be used backwards.
MAX_SNAPPING_DISTANCE
FLOAT64
NULL
Defines the maximum allowed snapping distance (in meters) between start and destination points and network nodes. If exceeded no route is returned. If NULL all snapping distance are allowed.
Return type
The output table includes the following columns:
start_geo:GEOGRAPHYStart point from source points array.dest_geo:GEOGRAPHYDestination point from destination points array.start_geo_snapped:GEOGRAPHYStart point snapped to the nearest start node of links of the network.dest_geo_snapped:GEOGRAPHYDestination point snapped to the nearest destination node of links of the network.start_order:INT64Start point position in the source points array.dest_order:INT64Destination point position in the destination points array.start_s2:INT64Unique identifier of the start point snapped from start point.dest_s2:INT64Unique identifier of the destination node snapped from destination point.cost:FLOAT64Overall cost of the path (travel time or distance depending on theTYPEparameter value).distance:FLOAT64Overall driving distance of the path in meters.travel_time:FLOAT64Overall travel time of the path in seconds.path:GEOGRAPHYOverall path.detailed_linestring:RECORD: Array of links that makes up the path.start_s2INT64: Unique identifier of the start node of the link.dest_s2INT64: Unique identifier of the destination node of the link.speed:FLOAT64Speed over the link.cost:FLOAT64Cost of the link (travel time or distance depending on theTYPEparameter value).distance:FLOAT64Driving distance of the link in meters.travel_time:FLOAT64Travel time of the path in seconds.path:GEOGRAPHYPath of the link.detailed_geography:ARRAY<GEOGRAPHY>Array of points that makes up the link.
Example
CALL `carto-un`.carto.ROUTING_MATRIX(
-- start_point_array
[ST_GEOGPOINT(-73.0, 40.0),ST_GEOGPOINT(-73.0, 41.0)],
-- dest_point_array
[ST_GEOGPOINT(-75.0, 41.0),ST_GEOGPOINT(-75.0, 40.0)],
-- area of interest,
ST_GEOGFROMTEXT("FULLGLOBE"),
-- transportation mode
'car',
-- do_network_table
'cdb_road_networ_81badfc2',
--do_source
'<my-dataobs-project>.<my-dataobs-dataset>',
--output_table
'<my-project>.<my-dataset>.<output_filename>',
-- options
"""
{
"TYPE":"time",
"MAX_COST":"100000",
"WITH_PATH":"True"
}
"""
);
-- {
-- "start_geo": "POINT(-73 40)",
-- "dest_geo": "POINT(-75 41)",
-- "start_geo_snapped": "POINT(-74.013134 40.688339)",
-- "dest_geo_snapped": "POINT(-74.026365 40.685995)",
-- "start_order": "0",
-- "dest_order": "0",
-- "start_s2": "-8520148151882761037",
-- "dest_s2": "-8520148044108704841",
-- "cost": "1082.6350274098224",
-- "distance": "1397.2114843386769",
-- "travel_time": "1082.6350274098224",
-- "path": "LINESTRING(-74.013134 40.688339, ..., -74.026365 40.685995)",
-- "detailed_linestring": [{
-- "start_s2": "-8520148151882761037",
-- "dest_s2": "-8520148151714079533",
-- "speed": "1.9",
-- "cost": "10.694765667341704",
-- "distance": "20.320054767949237",
-- "travel_time": "10.694765667341704",
-- "path": "LINESTRING(-74.013134 40.688339, -74.013375 40.688339)",
-- "detailed_geography": ["POINT(-74.013134 40.688339)", "POINT(-74.013375 40.688339)"]
-- },
-- ...,
-- {
-- "start_s2": "-8520148151867093047",
-- "dest_s2": "-8520148151854368777",
-- "speed": "1.2",
-- "cost": "11.348771839149197",
-- "distance": "13.618526206979036",
-- "travel_time": "11.348771839149197",
-- "path": "LINESTRING(-74.013587 40.688492, -74.013702 40.688578)",
-- "detailed_geography": ["POINT(-74.013587 40.688492)", "POINT(-74.013702 40.688578)"]
-- }]
-- }, {
-- "start_geo": "POINT(-73 40)",
-- "dest_geo": "POINT(-75 40)",
-- "start_geo_snapped": "POINT(-74.013134 40.688339)",
-- "dest_geo_snapped": "POINT(-74.026041 40.684658)",
-- "start_order": "0",
-- "dest_order": "1",
-- "start_s2": "-8520148151882761037",
-- "dest_s2": "-8520148043684863917",
-- "cost": "1124.4760381433846",
-- "distance": "1248.9194302355879",
-- "travel_time": "1124.4760381433846",
-- "path": "LINESTRING(-74.013134 40.688339, ..., -74.026041 40.684658)",
-- "detailed_linestring": [{
-- "start_s2": "-8520148151882761037",
-- "dest_s2": "-8520148151721556507",
-- "speed": "1.5",
-- "cost": "19.218684425894505",
-- "distance": "28.828026638841756",
-- "travel_time": "19.218684425894505",
-- "path": "LINESTRING(-74.013134 40.688339, -74.013221 40.688225, -74.013358 40.688151)",
-- "detailed_geography": ["POINT(-74.013134 40.688339)", "POINT(-74.013221 40.688225)", "POINT(-74.013358 40.688151)"]
-- },
-- ...,
-- {
-- "start_s2": "-8520148055505489297",
-- "dest_s2": "-8520148043684863917",
-- "speed": "1.0",
-- "cost": "305.40490363182045",
-- "distance": "305.40490363182045",
-- "travel_time": "305.40490363182045",
-- "path": "LINESTRING(-74.022772 40.684401, ..., -74.026041 40.684658)",
-- "detailed_geography": ["POINT(-74.022772 40.684401)", ..., "POINT(-74.026041 40.684658)"]
-- }]
-- },
-- ...Limitations
Since this module runs natively on Bigquery, it relies exclusively on the resources allocated by the data warehouse for the query.
If a request fails due to a resource limit, you can try the following:
reduce the size of the network (reduce the size of the area of interest)
reduce or split into different queries the points in
start_point_arrayset or reduce (if it already exists) the
MAX_COSTparameterset
WITH_PATHparameter toFalse
In some cases road networks contain segments that are not connected to the main network. If any of the destination or origin points are closer to such segments than to other parts of the network it won't be possible to find routes to or from such points and some paths can be missing from the results. We're working on improving the quality of the road networks to avoid such problems. If you find this problem using the car transportation mode you can try using car_major_road_only or car_motorway_only instead, since the major roads network is less prone to this kind of problem.
ROUTING_ISOLINES
ROUTING_ISOLINES(start_point_array, cost_limit_array, area_of_interest, transportation_mode, do_network_table, do_source, output_table, options)Description
This procedure generates a table containing isolines in terms of either travel times (isochrones) or distances (isodistances) for a given set of origin locations and range limits to be computed on the road network table.
start_point_array:ARRAY<GEOGRAPHY>Source points array. The node of the network nearest to this point will be used as the source point to compute the shortest path.cost_limit_array:ARRAY<FLOAT64>Cost limit array. For each cost limit all the path within this range are returned. For an isochrone the cost is time in seconds, for an isodistance it's distance in meters.area_of_interest:GEOGRAPHYArea of interest over where the analysis takes place.transportation_mode:STRINGType of transportation mode to be used for the calculation of isolines. Available options:car,car_motorway_only,car_major_road_only,bicycleorfoot.do_network_table:STRINGIdentifier (slug) of the Data Observatory Network table.do_source:STRINGName of the location where the Data Observatory subscriptions of the user are stored, in<my-dataobs-project>.<my-dataobs-dataset>format. If only the<my-dataobs-dataset>is included, it uses the projectcarto-databy default. It can be set to NULL or ''.output_table:STRINGThe full path name of the output table.options:STRINGContaining a valid JSON with the different options. Valid options are described the table below. Ifoptionsis set toNULLthe all options are set to default.
TYPE
STRING
time
Defines the kind of optimisation for pathfinding. Possible values: "time", "distance".
UNCOMPACT_GEOMETRY
BOOL
TRUE
If True the full non-compacted geometry between each link in the path. If not return only start and destination nodes of each link in the path.
FALLBACK_WRONG_WAY_SPEED_RATIO
FLOAT64
NULL
Defines the penalty ratio that should be applied to take a one-way road backward. Value should be between 1 and 0 (excluded). If NULL, one-way road cannot be used backward.
MAX_SNAPPING_DISTANCE
FLOAT64
NULL
Defines maximum allowed snapping distance (in meters) between start and destination points and network nodes. If exceeded no route is returned. If NULL all snapping distance are allowed.
Return type
The output table includes the following columns:
cost_limit:FLOAT64Cost limit from thestart_point_arrayinput parameter taken in account for this row.cost_limit_idx:INT64Cost limit position from thestart_point_arrayinput parameter taken in account for this row.start_order:INT64Start point position from the source points array taken in account for this row.start_geo:GEOGRAPHYThe point geometry of the starting node taken in account for this row.start_geo_snapped:GEOGRAPHYStart point snapped to the nearest start node of links of the network.start_s2:INT64Index of the node snapped from start point.start_cost:FLOAT64Cost from snapped start point to the start node of the link.dest_s2:INT64The unique identifier of the destination node of the link.dest_cost:FLOAT64Cost from snapped start point to the destination node of the link.detailed_geography:ARRAY<GEOGRAPHY>Array of points that makes up the link.detailed_geography_chunked_agg:GEOGRAPHYLink geography chunked to cost limit and aggregated in a single geography.
Example
CALL `carto-un`.carto.ROUTING_ISOLINES(
-- start_point_array
[ST_GEOGPOINT(-73.0, 40.0)],
-- cost_limit_array
[60., 120.],
-- area of interest,
ST_GEOGFROMTEXT("FULLGLOBE"),
-- transportation mode
'car',
-- do_network_table
'cdb_road_networ_81badfc2',
--do_source
'<my-dataobs-project>.<my-dataobs-dataset>',
--output_table
'<my-project>.<my-dataset>.<output_filename>',
-- options
"""
{
"TYPE":"time",
"MAX_COST":"100000",
"WITH_PATH":"False"
}
"""
);
-- {
-- "start_geo": "POINT(-122.3296557 47.582691)",
-- "dest_geo": "POINT(-122.3290612 47.5807722)",
-- "start_geo_snapped": "POINT(-122.3296557 47.582691)",
-- "dest_geo_snapped": "POINT(-122.3290612 47.5807722)",
-- "start_order": "0",
-- "dest_order": "35164",
-- "start_s2": "6093487519859207645",
-- "dest_s2": "6093440836742041863",
-- "cost": "27.095695089725034",
-- "distance": "309.31565973502575",
-- "travel_time": "27.095695089725034",
-- "path": "LINESTRING(-122.3296557 47.582691, -122.3298669 47.5827281, ..., -122.3290612 47.5807722)",
-- "detailed_linestring": [{
-- "start_s2": "6093487519859207645",
-- "dest_s2": "6093440836214032467",
-- "speed": "4.166666666666667",
-- "cost": "5.8301084779070846",
-- "distance": "24.292118657946187",
-- "travel_time": "5.8301084779070846",
-- "path": "LINESTRING(-122.3296557 47.582691, -122.3298669 47.5827281, -122.3299725 47.5827299)",
-- "detailed_geography": ["POINT(-122.3296557 47.582691)", "POINT(-122.3298669 47.5827281)", "POINT(-122.3299725 47.5827299)"]
-- },
-- ...,
-- {
-- "start_s2": "6093440836753434943",
-- "dest_s2": "6093440836742041863",
-- "speed": "18.055555555555554",
-- "cost": "0.658359285678671",
-- "distance": "11.887042658087113",
-- "travel_time": "0.658359285678671",
-- "path": "LINESTRING(-122.3290623 47.5808791, -122.3290612 47.5807722)",
-- "detailed_geography": ["POINT(-122.3290623 47.5808791)", "POINT(-122.3290612 47.5807722)"]
-- }]
-- }, ...The output table returns links that form the isolines indexed by origin location and range limits. To get the full isoline geographies you need to aggregate the table:
SELECT ST_UNION_AGG(detailed_geography_chunked_agg) AS full_isoline_geography
FROM `output_table`
GROUP BY cost_limit, start_s2Limitations
Since this module runs natively on Bigquery, it relies exclusively on the resources allocated by the data warehouse for the query.
If a request fails due to a resource limit, you can try the following:
reduce the size of the network (reduce the size of the area of interest)
reduce or split into different queries the points in
start_point_arrayreduce the maximum the cost limit in
cost_limit_array
In some cases road networks contain segments that are not connected to the main network. If any of the destination or origin points are closer to such segments than to other parts of the network it won't be possible to find routes to or from such points and some paths can be missing from the results. We're working on improving the quality of the road networks to avoid such problems. If you find this problem using the car transportation mode you can try using car_major_road_only or car_motorway_only instead, since the major roads network is less prone to this kind of problem.
This project has received funding from the European Union’s Horizon 2020 research and innovation programme under grant agreement No 960401.
Last updated
Was this helpful?
