Markdown Editor

Maps and Navigation System Design Template

Vector tiles and CDN, region-sharded routing graph with customizable contraction hierarchies, live-traffic ETA, rerouting, geocoding, offline packs

Diseño de sistemasCompletadesignmapsnavigationmath

Cómo usar: Use it when designing map rendering, route planning or turn-by-turn navigation, or preparing a maps interview. Fill the coverage area, traffic data source and the three load numbers (tiles, routes, location batches) first. The main pitfall is treating routing as a per-request Dijkstra on static weights instead of separating per-release preprocessing from per-minute traffic customization.

Vista previa

System Design: [Maps and navigation service name]

Reference design for a maps and turn-by-turn navigation service: map rendering with pre-generated vector tiles, a routing engine built on a contraction-hierarchy style road graph that accepts live traffic weights, ETA prediction, rerouting from streamed location updates, geocoding and offline map packs. It follows the structure of the System Design Document template, adds a 45-minute interview path, access-pattern and failure-mode tables, and is pre-filled with a worked design to adapt. Replace every [bracketed] value and every row marked Example; values marked Example are assumptions, not benchmarks.

Document control

FieldValue
Document ID[SDD-MAP-001]
System / feature[Maps, routing and navigation]
Version[0.1]
Status[Draft / In review / Approved / Implemented / Superseded]
Owner[@owner]
Author(s)[@author]
Reviewers[@reviewer-1], [@reviewer-2]
Last updatedYYYY-MM-DD
Classification[Internal / Confidential]
Coverage area[Countries or regions served]
Map data sources and licences[Source, licence, release cadence]
Related[Location privacy policy], [Traffic data contract], [ADR: tile format]

Approvals

RoleNameDecisionDate
Tech lead[@name][Approved / Changes requested]YYYY-MM-DD
Staff / principal engineer[@name][Decision]YYYY-MM-DD
SRE / operations[@name][Decision]YYYY-MM-DD
Privacy / data protection[@name][Decision]YYYY-MM-DD
Product (navigation)[@name][Decision]YYYY-MM-DD

Revision history

VersionDateAuthorChange summary
0.1YYYY-MM-DD[@name]First draft for design review
0.2YYYY-MM-DD[@name]Example: Moved from raster to vector tiles after bandwidth estimate
0.3YYYY-MM-DD[@name]Example: Replaced plain contraction hierarchies with a customizable variant for live traffic
1.0YYYY-MM-DD[@name]Example: Approved

Contents

1. Overview

1.1 Problem statement

[Example: The current product shows raster map images from a third-party provider and computes routes with a plain shortest-path search on static speed limits. Routes ignore congestion, ETAs are wrong by more than 20% at rush hour, and the per-request provider bill grows faster than usage. The product needs its own map rendering, traffic-aware routing and navigation for [coverage area].]

1.2 Proposed solution

[Example: A batch pipeline turns map data into vector tiles, a routing graph and a geocoding index for each release. Clients fetch tiles from a CDN and render them locally. A routing service holds a preprocessed road graph per region in memory and applies live traffic weights every minute through a customization step, so queries stay fast while weights change. Navigating clients stream batched location samples; a traffic pipeline map-matches them to road segments and publishes segment speeds. A navigation session service compares each client's progress with its route and triggers rerouting when the client leaves the route or a much faster route appears. Offline packs bundle tiles, a compact routing graph and a geocoding subset per area.]

1.3 Decisions requested from reviewers

IDQuestionRecommended optionSection
Q-01Example: Raster or vector tiles?Vector tiles up to zoom 14, client overzoom above7.1, 10
Q-02Example: Which speed-up technique for routing?Customizable contraction hierarchy (metric-independent preprocessing, per-minute customization)7.2
Q-03Example: Where does rerouting run?Server decides, client has an offline fallback7.4
Q-04Example: How long are raw location traces kept?24 hours raw, then aggregated per segment only9.2
[Q-nn][Question][Option][Section]

1.4 45-minute interview path

Use this order when the document serves an interview or a short review. It fits the time and leaves room for one deep dive chosen by the interviewer.

MinutesCoverOutput on the whiteboard
0 to 5Scope: map view, route, ETA, turn-by-turn; state below-the-line itemsThree core flows, coverage area
5 to 10Estimates: tile requests, route requests, location updates per secondThree numbers, each with its consequence
10 to 15API: tile fetch, route request, location batch, reroute pushFour calls
15 to 25High-level design: tile pipeline and CDN, routing service, traffic pipeline, session serviceOne diagram with three separate paths
25 to 40One deep dive: routing with live traffic (default), or ETA, or reroutingOptions, choice, reason
40 to 45Failures and trade-offs: stale traffic, region outage, privacy of tracesFailure table rows, one 10x change

Pick the routing deep dive unless the interviewer steers elsewhere: it is where a naive answer (run Dijkstra on the planet per request) fails most visibly. Say early that tiles are a caching problem, not a compute problem.

2. Requirements

2.1 Core functional requirements

IDRequirementPriority
FR-01Example: Render a pannable, zoomable map of the coverage areaMust
FR-02Example: Compute a driving route between two points with up to 3 alternativesMust
FR-03Example: Show an ETA that reflects current trafficMust
FR-04Example: Give turn-by-turn guidance and reroute when the driver leaves the routeMust
FR-05Example: Convert an address or place name to coordinates and back (geocoding, reverse geocoding)Must
FR-06Example: Download an area for offline viewing, search and routingShould
FR-07Example: Walking and cycling profilesShould
[FR-nn][Requirement][Must / Should / Could]

2.2 Non-functional requirements

IDQualityTargetMeasured as
NFR-01Tile latencyExample: p95 at or below 100 ms from CDNClient real-user metrics
NFR-02Route latencyExample: p95 at or below 300 ms for routes under 500 kmServer timing
NFR-03ETA accuracyExample: Median absolute error under 10% at arrivalPredicted vs actual for completed trips
NFR-04Traffic freshnessExample: Segment speeds reflect conditions within 2 minutesLag from sample to published speed
NFR-05Reroute timeExample: New route on screen within 3 s of leaving the routeSession timing
NFR-06AvailabilityExample: 99.95% for routing; map view works from cache during outagesSynthetic probes
NFR-07PrivacyExample: No raw trace retained beyond 24 h; no trace linked to an account after aggregationData audit
[NFR-nn][Quality][Target][Measurement]

2.3 Below the line (out of scope)

  • [Example: public transit routing with timetables (needs a different algorithm family)]
  • [Example: collecting and editing base map data (consumed as releases from the data team)]
  • [Example: places reviews, photos and business listings]
  • [Example: truck routing with legal restrictions per vehicle]
  • [Item deferred, with the release that will take it]

3. Capacity estimation

3.1 Assumptions

InputSymbolValueSource
Daily active usersUUExample: 100 millionProduct forecast
Share of users who navigate per dayffExample: 20%Usage analytics
Navigation sessions per navigating user per dayssExample: 2Usage analytics
Average session lengthddExample: 25 minUsage analytics
Peak to average ratiokkExample: 3Hourly traffic curve
Location batch interval while navigatingttExample: 5 sClient design
Tiles fetched per user per dayTTExample: 100Client telemetry
Road graph edges in the largest regionEEExample: 500 millionMap data release

3.2 Location updates

Sessions per day and average concurrent sessions:

S=U×f×s=108×0.2×2=4×107 sessions/dayS = U \times f \times s = 10^{8} \times 0.2 \times 2 = 4 \times 10^{7} \ \text{sessions/day}
Cavg=S×d1440=4×107×251440≈694 000,Cpeak=3×Cavg≈2.1 millionC_{avg} = S \times \frac{d}{1440} = 4 \times 10^{7} \times \frac{25}{1440} \approx 694\,000, \qquad C_{peak} = 3 \times C_{avg} \approx 2.1 \ \text{million}
W=Cpeakt=2.1×1065≈420 000 batches/sW = \frac{C_{peak}}{t} = \frac{2.1 \times 10^{6}}{5} \approx 420\,000 \ \text{batches/s}

Consequence: location ingestion is the highest-rate write path. It goes into a partitioned log, never into a database on the request path, and the session service keeps only the latest position per session in memory.

3.3 Route requests

Assume per day one route per session, two reroutes per session on average, and 60 million route previews from users who do not start navigation:

Qroute=4×107+8×107+6×10786 400≈2 080 routes/s,Qpeak≈6 250 routes/sQ_{route} = \frac{4 \times 10^{7} + 8 \times 10^{7} + 6 \times 10^{7}}{86\,400} \approx 2\,080 \ \text{routes/s}, \qquad Q_{peak} \approx 6\,250 \ \text{routes/s}

Consequence: the route rate is modest, so routing is bounded by memory (the graph must stay resident) more than by CPU. Even at an Example 15 ms of CPU per query including two alternatives, the peak needs about 6 250×0.015≈946\,250 \times 0.015 \approx 94 cores per copy of the fleet, which is small.

3.4 Routing graph memory

With shortcuts, a contracted graph holds roughly twice the original edges. At an Example 20 bytes per stored edge:

Mgraph=2×E×20 B=2×5×108×20 B=20 GBM_{graph} = 2 \times E \times 20 \ \text{B} = 2 \times 5 \times 10^{8} \times 20 \ \text{B} = 20 \ \text{GB}

Consequence: one region fits on one large-memory server, so we shard routing by region (continent or country group), replicate each region graph, and handle the rare cross-region route with a coarse overlay graph.

3.5 Tiles

Tile requests and origin load with an Example CDN hit rate of 95%:

Rtiles=U×T86 400=101086 400≈116 000 tiles/s,Rpeak≈350 000,Rorigin=0.05×Rpeak≈17 500R_{tiles} = \frac{U \times T}{86\,400} = \frac{10^{10}}{86\,400} \approx 116\,000 \ \text{tiles/s}, \qquad R_{peak} \approx 350\,000, \qquad R_{origin} = 0.05 \times R_{peak} \approx 17\,500

Zoom 14 has 414≈2.7×1084^{14} \approx 2.7 \times 10^{8} tiles. If 30% hold data and an average vector tile is Example 20 KB, zoom 14 needs about 1.6 TB, and all lower zooms together add about one third more, about 2.1 TB per release.

Consequence: tiles are generated once per data release, stored in object storage and served through a CDN; the origin only fills cache misses.

3.6 Summary

QuantityEstimateDesign consequence
Location batches~420 000/s at peakPartitioned log; latest position in memory only
Route requests~6 250/s at peakSmall CPU fleet; size by memory per region
Graph memory~20 GB per large regionShard routing by region; replicas per region
Tile requests~350 000/s at peak, ~17 500/s at originCDN first; pre-generated tiles in object storage
Tile storage~2 TB per releaseKeep two releases for rollback; offline packs cut from the same set

4. API design

4.1 Endpoints

InterfaceOperationPurpose
TilesGET /tiles/v1/{release}/{z}/{x}/{y}.mvtVector tile, immutable per release, long cache lifetime
RoutingPOST /v1/routesCompute route and alternatives with ETA
NavigationPOST /v1/sessionsStart a navigation session for a chosen route
NavigationPOST /v1/sessions/{id}/locationsUpload a batch of location samples
NavigationServer push on session channelReroute, ETA update, incident ahead
GeocodingGET /v1/geocode?q=&near= and GET /v1/reverse?lat=&lng=Address and place lookup
OfflineGET /v1/offline/packs?bbox=List packs and their versions for an area

4.2 Request and response examples

A route request, its response, and one location batch from a navigating client:

POST /v1/routes HTTP/1.1
Content-Type: application/json

{"origin": {"lat": 10.7769, "lng": 106.7009}, "destination": {"lat": 10.8231, "lng": 106.6297}, "profile": "car", "alternatives": 2, "depart_at": "now", "avoid": ["tolls"]}
{"routes": [{"route_id": "rt_9f2c", "distance_m": 11240, "duration_s": 1680, "duration_no_traffic_s": 1260, "polyline": "[encoded polyline]", "legs": [{"steps": [{"maneuver": "turn-right", "street": "[Street name]", "distance_m": 420}]}], "traffic_version": "2026-10-22T08:14Z", "graph_release": "2026.42"}]}
{"session_id": "nav_51ab", "samples": [{"t": 1792640000, "lat": 10.7771, "lng": 106.7012, "speed_mps": 8.1, "heading": 82, "accuracy_m": 6}]}

4.3 Errors and limits

CaseStatusBody type
No route (island, closed area)422problems/no-route
Point outside coverage422problems/out-of-coverage
Unknown or retired graph release409problems/stale-release, client refreshes
Too many requests429 with Retry-Afterproblems/rate-limited

Route requests are idempotent reads. Location batches carry a sequence number per session so the server drops duplicates after client retries.

5. Data model

5.1 Entities

The graph entities come from the data release; speeds and sessions are runtime data with short lifetimes.

5.2 Storage choices

DataStoreWhy
Vector tilesExample: Object storage per release, CDN in frontImmutable, cache forever per release
Road graph and shortcutsIn-memory arrays on routing servers, loaded from a release fileRandom access at memory speed
Live segment speedsExample: In-memory table per region, snapshot each minute to object storageRead by routing customization every minute
Speed profiles (typical speed per weekday slot)Columnar files per releaseBatch built, read for future departures
Session stateExample: Sharded in-memory store with TTLLatest position only, high write rate
Places and addressesSearch index with a geo fieldText plus proximity queries

5.3 Access patterns

QueryKey or index that serves itPartition key and rationale
Fetch tile for a viewrelease/z/x/y object keyNone needed; CDN caches by URL
Route from A to BNode arrays and shortcut arrays in memoryRegion; a route almost always stays in one region
Speeds for customizationSegment id array, dense indexRegion, same as the graph, so no cross-shard reads
Latest position of a sessionsession_idsession_id hash; spreads hot cities evenly
Samples to aggregate per segmentLog keyed by H3 cell at a coarse resolutionGeography, so one aggregator sees all samples of a road stretch
Geocode "address near me"Text index plus geo filterCountry, because address formats and data releases are per country
Offline pack for an areaPack manifest by region and releaseRegion, matching how packs are cut

6. High-level design

ComponentResponsibilityScales by
Tile generatorCut data into vector tiles per zoomBatch workers per release
CDNServe tiles, absorb almost all read trafficProvider
Routing serviceAnswer route queries on the customized graphReplicas per region
Customization jobApply new speeds to the preprocessed graphOne per region, every minute
Location ingestAccept batches, validate, write to the logStateless instances
Map matchingSnap noisy samples to road segmentsLog partitions
Segment speed aggregatorTurn matched samples into speeds per segment and minuteLog partitions
Navigation session serviceTrack progress, decide reroutes, push updatesSessions per shard
Geocoding serviceText and reverse lookupsReplicas per country index

7. Detailed design

7.1 Deep dive: map tiles

The map is cut into square tiles addressed by zoom zz, column xx and row yy in the Web Mercator projection; zoom zz has 2z×2z2^{z} \times 2^{z} tiles.

OptionHow it worksCostFit
Raster tiles, pre-renderedServer draws PNG images per zoomLarge storage, one image set per style and languageSimple clients, no styling at runtime
Raster tiles, on demandRender on request, cacheRender farm sized for missesRarely viewed areas
Vector tiles, pre-generatedGeometry and attributes encoded per tile (Mapbox Vector Tile format), client rendersSmaller transfers, client GPU workRotation, tilt, dark mode, labels in the user's language

Choice: vector tiles pre-generated up to zoom 14, with the client overzooming (reusing zoom 14 geometry) for closer views. Reason: one tile set serves every style and language, transfers are smaller than raster, and the client can rotate the map during navigation without new requests. Generalise geometry per zoom so a zoom 5 tile does not carry every building.

Tile URLs include the release, so tiles are immutable and cacheable for the life of the release. A new release changes the URL prefix; nothing is purged.

7.2 Deep dive: routing on a road graph with live traffic

The road network is a directed graph: intersections are nodes, road segments are edges with a travel-time weight. Turn restrictions are modelled as edges between segment pairs or as a turn-cost table.

OptionQuery costWeight changesNotes
DijkstraExplores every node closer than the target; seconds on a continentFreeCorrect baseline, too slow at scale
A* with a distance lower boundFewer nodes, still large on long routesFreeGood for walking in small areas
Contraction hierarchies (CH)Very small search (bidirectional, upward only)Full re-preprocessing, minutes to hoursFast but assumes fixed weights
Customizable variants (CCH, CRP)Slightly slower than CHCustomization in secondsSeparates topology preprocessing from weights

How contraction works, in short: rank nodes by importance, remove them one at a time from least important upward, and add a shortcut edge whenever removing a node would break a shortest path between its neighbours. A query then runs two searches, forward from the origin and backward from the destination, each only climbing to more important nodes, and meets in the middle.

Choice: a customizable variant. The expensive step depends only on the road topology and runs once per data release; a customization step applies the live travel times every minute and finishes in seconds. Reason: plain CH would need full preprocessing for every traffic update, while Dijkstra or A* cannot meet NFR-02 on long routes.

Alternatives come from penalising the edges of the best route and searching again, keeping routes that differ enough and are not much longer. Return the traffic_version so a reroute can be compared fairly with the original.

7.3 Deep dive: ETA with live traffic

The ETA is the sum of predicted travel times along the route at the time the driver will reach each segment, not at departure time.

OptionStrengthWeakness
Static speed limitsSimpleWrong whenever traffic exists
Live speeds onlyReflects nowWrong for segments reached in 40 minutes
Historical profile per weekday slotCaptures rush hourMisses incidents
Blend: live for near segments, profile for far ones, learned correctionBest accuracyModel to train and monitor

Choice: blend. For each segment use the live speed if the driver reaches it soon, fade toward the historical profile further ahead, then apply a learned correction per route (intersections, turns, time of day) trained on completed trips. Reason: it meets NFR-03 without a heavy model on the request path; the correction is a small model served next to the router.

Speeds come from map-matched samples. Aggregate per segment per minute only when at least Example 3 distinct sessions contributed; otherwise fall back to the profile. This also protects privacy (9.2).

7.4 Deep dive: location updates and rerouting

Clients sample GPS every second and send a batch every 5 s while navigating. The session service keeps the route, the last matched position and the expected progress.

OptionProsCons
Client detects off-route and asks for a new routeFast, works with poor signalClient logic per platform, no server view of traffic changes
Server decides everythingOne implementation, can push faster routesDepends on connectivity
HybridClient detects off-route instantly, server pushes faster routesTwo code paths to test

Choice: hybrid. The client detects leaving the route (for example a distance above a threshold for several consecutive samples) and requests a reroute immediately; the server re-evaluates the remaining route every Example 2 minutes against fresh traffic and pushes a better route only when it saves more than Example 3 minutes or 10%. Reason: NFR-05 needs a local decision, while traffic changes are visible only on the server.

Map matching snaps noisy samples to the most likely sequence of segments, using the road geometry and the order of samples, not just the nearest road. A nearest-road snap confuses parallel roads and overpasses.

7.5 Geocoding

Forward geocoding parses a free-text query, matches it against an address and place index, and ranks by text score, importance and distance from the user. Reverse geocoding finds the nearest address or street to a point with a spatial index. Keep one index per country so formats and releases stay independent. Typing suggestions reuse the prefix techniques in Search Autocomplete System Design (system-design/design-search-autocomplete).

7.6 Offline maps

An offline pack holds the vector tiles for an area up to zoom 14, a compact routing graph for the same area with typical speed profiles, and a geocoding subset. Packs are versioned with the data release; the client downloads a binary diff when a new release covers its packs. Offline routing has no live traffic, so the client labels the ETA as an estimate and switches to online routing when connectivity returns.

7.7 How real systems do it

How real systems do it (paraphrased, not copied). Delling, Goldberg, Pajor and Werneck describe Customizable Route Planning (SEA 2011): a preprocessing phase that depends only on the road network, a fast customization phase that applies any cost function, and a query phase. Microsoft Research states that the approach underlies the routing engine of Bing Maps. The key idea for this design is the same split: run the expensive work per map release, and run the cheap work per traffic update. Uber's H3 write-up (2018) describes a hexagonal, hierarchical grid used to aggregate and analyse spatial data, which is the role H3 cells play here for partitioning location samples. Read the originals in 12.3; this box keeps only the general idea.

8. Scalability and performance

ConcernApproachLimit before redesign
Tile readsCDN with immutable URLs per releaseOrigin sized for cache misses only
Route queriesReplicas per region, graph in memoryExample: graph above about 60% of server memory
CustomizationParallel per cell of the partition, atomic weight swapExample: must finish within the 60 s update interval
Location ingestionLog partitioned by coarse H3 cellHot partitions in dense cities; split cells further
Session stateSharded by session id, TTLMemory per shard
Cross-region routesOverlay graph of border nodesRare long routes take a slower path

Latency budget for a route request (target p95 300 ms):

StepBudget
Gateway, auth, rate limit20 ms
Snap origin and destination to the graph20 ms
Best route search and shortcut unpacking40 ms
Two alternatives80 ms
ETA correction model20 ms
Steps, street names, encoding20 ms
Network and headroom100 ms

9. Reliability, security and operations

9.1 Failure modes

ComponentFailureDetectionBlast radiusMitigationRTO
Traffic pipelineSpeeds stop updatingFreshness lag above 5 minETAs drift in all regionsFall back to historical profiles, show "traffic unavailable"Example: 15 min
Customization jobJob overruns or failsWeight version ageOne region keeps old weightsKeep serving last good weightsExample: 5 min
Routing regionAll replicas downProbe failuresRouting in one regionRoute through a second site holding the same region graphExample: 5 min
Bad data releaseBroken roads or tilesRelease validation, canary errorsWhole product if shipped widelyStaged rollout by region, keep previous releaseExample: 30 min
CDNProvider outageReal-user tile errorsMap view for new areasSecond CDN by DNS weight; client tile cacheExample: 15 min
Session service shardShard lostError rateSessions on that shardClient keeps route and reroutes locally; session recreated from next batchExample: 1 min
[Component][Failure][Signal][Scope][Mitigation][Time]

9.2 Security and privacy

Threat or dutyControl
Location traces reveal home and workRaw samples kept Example 24 h, keyed by session not account; only aggregates kept longer
Re-identification from sparse roadsPublish a segment speed only with enough distinct sessions; drop trip start and end segments
Fake traffic from spoofed devicesDevice attestation, plausibility checks on speed and heading, cap influence per device
Scraping tiles and routesAPI keys, rate limits, signed tile URLs for partners
Data licence breachAttribution in the client; licence check before redistribution in offline packs
[Threat][Control]

9.3 Observability

SignalMetricAlert threshold
ETA accuracyMedian absolute error by regionExample: above 12% for 1 h
Traffic freshnessAge of newest speedsAbove 5 min
Route latencyp95 by regionAbove 300 ms for 10 min
Reroute rateReroutes per sessionDoubling vs. 7-day baseline (map error or bad weights)
Tile errors4xx and 5xx at CDNAbove 0.5%

9.4 Cost estimate

ItemUnit costQuantityMonthly cost
CDN egress[USD per GB][GB per month][USD]
Routing servers (large memory)[USD per node-month]Example: 3 replicas x regions[USD]
Location log and aggregation[USD per node-month][Nodes][USD]
Object storage for releases[USD per TB-month]Example: 2 releases x 2 TB[USD]
Total[USD]

10. Trade-offs and alternatives

DecisionOptionsChosenWhyWhat we give up
Tile formatRaster; vectorVectorSmaller, restylable, rotatableClient rendering work, older devices slower
Routing techniqueDijkstra or A*; CH; customizable CH or CRPCustomizableFast queries and minute-level traffic updatesMore complex pipeline than plain CH
Graph shardingOne planet graph; per regionPer region with overlayFits memory, isolates failuresCross-region routes slower
Reroute decisionClient; server; hybridHybridFast local reaction plus traffic awarenessTwo code paths
Traffic retentionKeep traces; aggregate onlyAggregate after 24 hPrivacy and storageCannot reprocess old raw data
What changes at 10x / 0.1x10x users: location log and session shards first, then CDN cost; graph memory unchanged. 0.1x users: buy tiles and routing from a provider, keep only the session serviceRevisit at each annual planLoad profile shifts the build or buy line[Note]
[Decision][Options][Chosen][Why][Cost]

11. Delivery plan and risks

11.1 Milestones

MilestoneScopeExit criterionTarget date
M1Tile pipeline and CDN for one countryTile p95 within NFR-01YYYY-MM-DD
M2Routing with historical profilesRoute p95 within NFR-02YYYY-MM-DD
M3Live traffic and customizationFreshness within NFR-04YYYY-MM-DD
M4Navigation sessions and reroutingReroute time within NFR-05YYYY-MM-DD
M5Offline packsPack update by diff works on test devicesYYYY-MM-DD

11.2 Rollout and rollback

[Example: Each data release ships to one region first and to the rest after 48 hours without regressions in reroute rate or ETA error. The previous release stays loaded on routing servers and tile URLs, so rollback is a configuration change that takes effect within 5 minutes.]

11.3 Risks

IDRiskLikelihoodImpactMitigationOwner
R-01Example: Too few probe vehicles for reliable speeds in small citiesHighMediumHistorical profiles, partner data, minimum sample rule[@name]
R-02Example: Customization exceeds 60 s as the graph growsMediumHighMeasure per release, split regions, parallelise cells[@name]
R-03Example: Privacy complaint over trace retentionLowHighRetention limits, DPIA, published policy[@name]
[R-nn][Risk][L / M / H][L / M / H][Mitigation][@name]

12. Appendices

12.1 Open questions

IDQuestionOwnerDue
OQ-01Example: Do we license third-party traffic data for regions with few users?[@name]YYYY-MM-DD
OQ-02Example: Which zoom is the maximum for offline packs on low-storage devices?[@name]YYYY-MM-DD
[OQ-nn][Question][@name]YYYY-MM-DD

12.2 Glossary

TermMeaning
Vector tileA tile carrying geometry and attributes that the client draws itself
OverzoomDrawing a closer zoom from the most detailed tile available
Contraction hierarchyPreprocessed graph with node ranks and shortcut edges that makes shortest-path queries small
CustomizationApplying new edge weights to a preprocessed graph without redoing the topology work
Map matchingSnapping a sequence of noisy positions to the roads actually travelled
Speed profileTypical speed per segment for each weekday and time slot
H3 cellHexagonal cell of Uber's hierarchical grid, used here to partition samples

12.3 References

ReferenceUse
Geisberger, Sanders, Schultes, Delling, "Contraction Hierarchies: Faster and Simpler Hierarchical Routing in Road Networks", WEA 2008, LNCS 50387.2 contraction idea
Dibbelt, Strasser, Wagner, "Customizable Contraction Hierarchies", SEA 2014 (arXiv:1402.0402)7.2 customizable variant
Delling, Goldberg, Pajor, Werneck, "Customizable Route Planning", SEA 2011 (Microsoft Research)7.2 and 7.7
Brodsky, "H3: Uber's Hexagonal Hierarchical Spatial Index", Uber engineering blog, 20185.3 and 7.7 partitioning idea
Mapbox Vector Tile Specification 2.1 (CC BY 3.0 US)7.1 tile encoding
Xu and Lam, System Design Interview: An Insider's Guide, Volume 2 (2022), chapter "Google Maps"Inspiration only; no text or figures reused
Ride-Hailing Dispatch System Design (system-design/design-ride-matching)Driver location indexing and dispatch
Search Autocomplete System Design (system-design/design-search-autocomplete)Typing suggestions for places
Back-of-Envelope Estimation and Capacity Model (system-design/back-of-envelope-estimation)Method for section 3

Standard and licence note

Based on common industry practice for map rendering and route planning and on the published research and specifications cited in 12.3. The book and engineering write-ups listed there are inspiration only; no text, diagrams or numbers were copied, and all figures here are illustrative examples. Check the current version of each cited specification and the licence of your map data before use. Original text written for this collection. Template licence: MIT.

Plantillas relacionadas