From 47ffc39a79d2cb720b4104c6b95bfd66b9b3ad9d Mon Sep 17 00:00:00 2001 From: Dana Bauer Date: Tue, 3 Mar 2026 16:55:57 -0500 Subject: [PATCH 1/2] new transportation guide --- .../transportation/linear-referencing.mdx | 71 ++ docs/guides/transportation/overview.mdx | 176 ++--- docs/guides/transportation/roads.mdx | 606 ++++++++++++++++++ .../scoping-and-travel-modes.mdx | 406 ++++++++++++ .../segments-and-connectors.mdx | 468 ++++++++++++++ sidebars.js | 4 + .../geometric-scoping-position-dark.png | Bin 0 -> 8374 bytes .../geometric-scoping-position-dark.svg | 4 - .../geometric-scoping-position-light.png | Bin 0 -> 4771 bytes .../geometric-scoping-position-light.svg | 3 - .../geometric-scoping-range-dark.png | Bin 0 -> 10404 bytes .../geometric-scoping-range-dark.svg | 4 - .../geometric-scoping-range-light.png | Bin 0 -> 6478 bytes .../geometric-scoping-range-light.svg | 3 - static/img/transportation/heading-dark.png | Bin 0 -> 11928 bytes static/img/transportation/heading-dark.svg | 4 - static/img/transportation/heading-light.png | Bin 0 -> 10747 bytes static/img/transportation/heading-light.svg | 3 - .../img/transportation/oriented-east-dark.png | Bin 0 -> 6874 bytes .../img/transportation/oriented-east-dark.svg | 4 - .../transportation/oriented-east-light.png | Bin 0 -> 2921 bytes .../transportation/oriented-east-light.svg | 3 - .../img/transportation/oriented-west-dark.png | Bin 0 -> 6908 bytes .../img/transportation/oriented-west-dark.svg | 4 - .../transportation/oriented-west-light.png | Bin 0 -> 2937 bytes .../transportation/oriented-west-light.svg | 3 - .../img/transportation/splitter_concept.png | Bin 0 -> 71047 bytes .../img/transportation/splitter_concept.svg | 4 - 28 files changed, 1644 insertions(+), 126 deletions(-) create mode 100644 docs/guides/transportation/linear-referencing.mdx create mode 100644 docs/guides/transportation/roads.mdx create mode 100644 docs/guides/transportation/scoping-and-travel-modes.mdx create mode 100644 docs/guides/transportation/segments-and-connectors.mdx create mode 100644 static/img/transportation/geometric-scoping-position-dark.png delete mode 100644 static/img/transportation/geometric-scoping-position-dark.svg create mode 100644 static/img/transportation/geometric-scoping-position-light.png delete mode 100644 static/img/transportation/geometric-scoping-position-light.svg create mode 100644 static/img/transportation/geometric-scoping-range-dark.png delete mode 100644 static/img/transportation/geometric-scoping-range-dark.svg create mode 100644 static/img/transportation/geometric-scoping-range-light.png delete mode 100644 static/img/transportation/geometric-scoping-range-light.svg create mode 100644 static/img/transportation/heading-dark.png delete mode 100644 static/img/transportation/heading-dark.svg create mode 100644 static/img/transportation/heading-light.png delete mode 100644 static/img/transportation/heading-light.svg create mode 100644 static/img/transportation/oriented-east-dark.png delete mode 100644 static/img/transportation/oriented-east-dark.svg create mode 100644 static/img/transportation/oriented-east-light.png delete mode 100644 static/img/transportation/oriented-east-light.svg create mode 100644 static/img/transportation/oriented-west-dark.png delete mode 100644 static/img/transportation/oriented-west-dark.svg create mode 100644 static/img/transportation/oriented-west-light.png delete mode 100644 static/img/transportation/oriented-west-light.svg create mode 100644 static/img/transportation/splitter_concept.png delete mode 100644 static/img/transportation/splitter_concept.svg diff --git a/docs/guides/transportation/linear-referencing.mdx b/docs/guides/transportation/linear-referencing.mdx new file mode 100644 index 000000000..008f7d053 --- /dev/null +++ b/docs/guides/transportation/linear-referencing.mdx @@ -0,0 +1,71 @@ +--- +title: Linear referencing +description: How Overture uses linear references to describe properties that vary along a segment +pagination_label: Linear Referencing +--- + +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +Linear referencing allows properties to apply to portions of a [segment](../segments-and-connectors#segments) without splitting the geometry. This promotes shape stability and reduces versioning when only part of a road changes. + +To avoid splitting road segments at any and every property change, linear referencing defines how properties that apply to portions of a segment can vary along that segment while it is generally understood to be the same "road." Segment splits are then reserved for more significant intersections so that we don't have to version the entire road any time any piece of the road changes. + +## Linear reference values + +A linear reference is a **normalized position** from `0.0` (start of segment) to `1.0` (end of segment). + +## `at` vs `between` + +| Property | Purpose | Example | +|----------|---------|---------| +| `at` | Single point location | `at: 0.3` — 30% along segment | +| `between` | Range along segment | `between: [0.2, 0.7]` — 20% to 70% | + +When `between` is not provided (or is null), the attribute applies to the full segment. + +## Calculation method + +Overture computes linear references using **WGS84 geodetic distance** in meters: + +``` +linear_ref = geodetic_distance_along_segment_from_start / total_geodetic_length +``` + +Both distances must be computed on the WGS84 ellipsoid, not planar distance on raw lon/lat coordinates. Other approaches exist (e.g., projected coordinates), but geodetic distance provides consistent accuracy globally. + +### Examples + +**Apache Sedona (SQL):** + +```sql +SELECT ST_LENGTHSPHEROID(ST_GEOMFROMWKB(geometry)) AS segment_length_m +FROM segments; +``` + +**pyproj (Python):** + +```python +from pyproj import Geod +from shapely import wkb + +geod = Geod(ellps="WGS84") +line_geometry = wkb.loads(geometry) # geometry is WKB bytes +segment_length = geod.geometry_length(line_geometry) # meters +``` + +See the [transportation-splitter](https://github.com/OvertureMaps/transportation-splitter) for a complete implementation. + +:::warning +Functions like `ST_LINELOCATEPOINT` can produce incorrect results on geometries that cross over or near themselves in 2D (curved on-ramps, mountain switchbacks, cul-de-sacs). These functions may pick the wrong location when the line passes over or close to itself, even though the geometry is valid because crossings occur at different elevations or positions along the segment. Note that Overture [disallows self-intersecting segments](../segments-and-connectors#loops) in its own data. +::: + +## Why geodetic distance matters + +Using planar distance (treating lon/lat as Cartesian x/y) can produce incorrect linear references, especially at high latitudes or for long segments. For a 10 km east-west segment at 60°N latitude, planar calculations can underestimate length by ~50%. Some map projections (e.g., EPSG:3857) yield reasonable results for short, straight segments, but accuracy degrades with segment length and curvature. + +If a consumer calculates linear references differently than Overture, attribution or connector positions may be misaligned, potentially causing visual discrepancies on rendered maps or routing failures. + +## Edge cases + +For very short segments (under 1 meter), floating-point precision may be limited. Treat `at` values near `0.0` or `1.0` as equivalent to endpoints. When a connector does not fall exactly on the geometry, the linear reference corresponds to the closest point on the segment. diff --git a/docs/guides/transportation/overview.mdx b/docs/guides/transportation/overview.mdx index bbeb36059..bee20e91d 100644 --- a/docs/guides/transportation/overview.mdx +++ b/docs/guides/transportation/overview.mdx @@ -14,85 +14,36 @@ import Routes from '!!raw-loader!@site/src/queries/duckdb/transportation_routes. import SpeedLimits from '!!raw-loader!@site/src/queries/athena/transportation_speed_limits.sql'; import ConnectingSegments from '!!raw-loader!@site/src/queries/athena/transportation_connecting_segments.sql'; -# Transportation Guide +# Transportation guide import DocCardList from '@theme/DocCardList'; -The Overture transportation theme is the collection of LineString and Point features that describe the infrastructure and conventions of how people and objects travel around the world. The dataset contains two features types: `connector` and `segment`. The three subtypes within `segment` -- `road`, `rail`, and `water` -- contain familiar categories of transportation data: highways, footways, cycleways, railways, ferry routes, and public transportation. +Every time you ask for directions, hail a ride, or check a map, you're relying on a model of how the world's roads, rails, and waterways connect. The Overture transportation theme is such a model: a global, open dataset of paths people and vehicles travel, built from OpenStreetMap and enhanced with data from TomTom and other local and regional authoritative data sources. -Most of the data in the transportation theme is sourced from OpenStreetMap. In the `2024-09-18.0` release, we began adding data from TomTom to improve coverage in key areas. +The dataset is simple at its core — just two feature types, `segment` and `connector` — but expressive enough to capture highway speed limits that change by time of day, one-way streets that allow buses to go the wrong way, and weight-restricted bridges with axle limits. Three subtypes within `segment` cover `road`, `rail`, and `water` transportation. -You might use the Overture transportation data for: +The rest of this page covers the feature types and subtypes, describes the dataset and how to access it, and points to tools and libraries for working with the data. The deeper topics are covered in the rest of the guide: -- **mapping:** rendering a map of connected roads and paths. -- **routing:** calculating optimal routes from place to place. -- **navigation:** generating granular instructions on the maneuvers needed to - follow a route. -- **analytics:** transportation-related analysis including traffic safety - analysis and disaster planning. -- **geocoding:** getting the coordinates of street intersections (geocodes) or - the street intersection near specific coordinates (reverse geocodes). +- **[Segments and connectors](./segments-and-connectors):** The building blocks of the network. Segments are the paths; connectors are the junctions where they meet. This page covers how they combine to form a routable graph, along with orientation, heading, and how Overture decides where to split a road. +- **[Linear referencing](./linear-referencing):** How properties can apply to just *part* of a segment — say, the first 500 meters — without chopping the geometry in two. Includes calculation methods and code examples. +- **[Scoping and travel modes](./scoping-and-travel-modes):** The rule system that makes properties conditional. A speed limit might apply only to trucks, only on weekdays, or only in the forward direction. Scoping is how all of that gets expressed. +- **[Roads](./roads):** The details specific to road segments — access restrictions, turn restrictions, speed limits, and more. -This guide is an overview of the transportation data. To dig into the details of the schema, see the reference documentation for the [segment](/schema/reference/transportation/segment) and [connector](/schema/reference/transportation/connector) feature types. +You might use Overture transportation data for mapping, routing, navigation, or geocoding street intersections. For the full schema details, see the reference documentation. -## Dataset description -All Overture data, including transportation data, is distributed as GeoParquet, a column-based data structure. Below you'll find a table with column-by-column descriptions of the properties in the transportation feature type. +## Feature types -
- Schema for GeoParquet files in the transportation theme -
- - +The Overture transportation schema defines two feature types: -| column | type | description | -| --- | --- | --- | -| id | string | A feature ID. This may be an ID associated with the Global Entity Reference System (GERS) if—and-only-if the feature represents an entity that is part of GERS. | -| geometry | binary | The line representation of the segment's location. Segment's geometry which MUST be a LineSting as defined by GeoJSON schema. | -| bbox | struct | Area defined by two longitudes and two latitudes: latitude is a decimal number between -90.0 and 90.0; longitude is a decimal number between -180.0 and 180.0. | -| version | integer | Version number of the feature, incremented in each Overture release where the geometry or attributes of this feature changed. | -| sources | struct | The array of source information for the properties of a given feature, with each entry being a source object which lists the property in JSON Pointer notation and the dataset that specific value came from. All features must have a root level source which is the default source if a specific property's source is not specified. | -| subtype | string | The broad category of transportation segment. | -| class | string | Captures the kind of road and its position in the road network hierarchy. | -| names | struct | Properties defining the names of a feature. | -| connectors | struct | Array of connector IDs identifying the connectors this segment is physically connected to linearly referenced with their location. Each connector is a possible routing decision point, meaning it defines a place along the segment in which there is possibility to transition to other segments which share the same connector. | -| routes | struct | Routes this segment belongs to. | -| subclass_rules | struct | Defines the portion of a road that the subclass applies to. | -| access_restrictions | struct | Rules governing access to this road segment or lane. | -| level_rules | struct | Defines the Z-order, i.e. stacking order, of the road segment. | -| destinations | struct | Describes objects that can be reached by following a transportation segment in the same way those objects are described on signposts or ground writing that a traveller following the segment would observe in the real world. This allows navigation systems to refer to signs and observable writing that a traveller actually sees. | -| prohibited_transitions | struct | Defines where traveling from the segment to another is disallowed for navigation. This covers things situations prohibited turns or a transition from road to bike lane disallowing cars. | -| road_surface | struct | Defines the surface material on a road such as paved, asphalt, or unpaved. | -| road_flags | struct | Additional properties relevant to roads such as is_bridge or is_under_construction. | -| speed_limits | struct | Defines the speed limit of the road segment. | -| width_rules | struct | Defines the width of the road segment for rendering. | -| subclass | string | Specifies the usage of a length of road. | -| rail_flags | struct | Additional properties relevant to rail such as is_tunnel or is_freight. | -| filename | string | Name of the file being queried. | -| theme | string | Name of the Overture theme being queried. | -| type | string | Name of the Overture feature type being queried. | +- The **segment** type has a LineString geometry that represents the center-line of a path repeatedly traversed by people or objects. Segment properties describe both the physical properties (e.g. road surface and width) and non-physical properties (e.g. access restriction rules) of that path. +- The **connector** type has a Point geometry that defines the topology of the transportation network by representing the physical connection between two or more segments. Connectors do not have properties beyond geometry and the common properties required for all Overture features. - - - -| column | type | description | -| --- | --- | --- | -| id | string | A feature ID. This may be an ID associated with the Global Entity Reference System (GERS) if—and-only-if the feature represents an entity that is part of GERS. | -| geometry | binary | The line representation of the segment's location. Segment's geometry which MUST be a LineSting as defined by GeoJSON schema. | -| bbox | struct | Area defined by two longitudes and two latitudes: latitude is a decimal number between -90.0 and 90.0; longitude is a decimal number between -180.0 and 180.0. | -| version | integer | Version number of the feature, incremented in each Overture release where the geometry or attributes of this feature changed. | -| sources | struct | The array of source information for the properties of a given feature, with each entry being a source object which lists the property in JSON Pointer notation and the dataset that specific value came from. All features must have a root level source which is the default source if a specific property's source is not specified. | -| filename | string | Name of the file being queried. | -| theme | string | Name of the Overture theme being queried. | -| type | string | Name of the Overture feature type being queried. | +A more detailed overview of these feature types can be found in [segments and connectors](./segments-and-connectors). - - -
-
+## Subtypes, classes, and subclasses -### Subtypes -Transportation segments are divided into three subtypes: **rail**, **water**, and **road**. The road subtype is then further divided into a variety of different classes based on usage captured in the table below. +Transportation segments are divided into three subtypes: **rail**, **water**, and **road**. These subtypes are further divided into a variety of different classes based on usage captured in the table below.
Class and subclass feature counts @@ -145,6 +96,62 @@ Transportation segments are divided into three subtypes: **rail**, **water**, an
+## Data dictionary + +All Overture data, including transportation data, is distributed as GeoParquet, a column-based data structure. Below you'll find tables with column-by-column descriptions of the properties for the segment and connector feature types. + +
+ Data dictionary for the GeoParquet files in the transportation theme +
+ + + +| column | type | description | +| --- | --- | --- | +| id | string | A feature ID. This may be an ID associated with the Global Entity Reference System (GERS) if—and-only-if the feature represents an entity that is part of GERS. | +| geometry | binary | The line representation of the segment's location. Segment's geometry which MUST be a LineSting as defined by GeoJSON schema. | +| bbox | struct | Area defined by two longitudes and two latitudes: latitude is a decimal number between -90.0 and 90.0; longitude is a decimal number between -180.0 and 180.0. | +| version | integer | Version number of the feature, incremented in each Overture release where the geometry or attributes of this feature changed. | +| sources | struct | The array of source information for the properties of a given feature, with each entry being a source object which lists the property in JSON Pointer notation and the dataset that specific value came from. All features must have a root level source which is the default source if a specific property's source is not specified. | +| subtype | string | The broad category of transportation segment. | +| class | string | Captures the kind of road and its position in the road network hierarchy. | +| names | struct | Properties defining the names of a feature. | +| connectors | struct | Array of connector IDs identifying the connectors this segment is physically connected to linearly referenced with their location. Each connector is a possible routing decision point, meaning it defines a place along the segment in which there is possibility to transition to other segments which share the same connector. | +| routes | struct | Routes this segment belongs to. | +| subclass_rules | struct | Defines the portion of a road that the subclass applies to. | +| access_restrictions | struct | Rules governing access to this road segment or lane. | +| level_rules | struct | Defines the Z-order, i.e. stacking order, of the road segment. | +| destinations | struct | Describes objects that can be reached by following a transportation segment in the same way those objects are described on signposts or ground writing that a traveller following the segment would observe in the real world. This allows navigation systems to refer to signs and observable writing that a traveller actually sees. | +| prohibited_transitions | struct | Defines where traveling from the segment to another is disallowed for navigation. This covers things situations prohibited turns or a transition from road to bike lane disallowing cars. | +| road_surface | struct | Defines the surface material on a road such as paved, asphalt, or unpaved. | +| road_flags | struct | Additional properties relevant to roads such as is_bridge or is_under_construction. | +| speed_limits | struct | Defines the speed limit of the road segment. | +| width_rules | struct | Defines the width of the road segment for rendering. | +| subclass | string | Specifies the usage of a length of road. | +| rail_flags | struct | Additional properties relevant to rail such as is_tunnel or is_freight. | +| filename | string | Name of the file being queried. | +| theme | string | Name of the Overture theme being queried. | +| type | string | Name of the Overture feature type being queried. | + + + + +| column | type | description | +| --- | --- | --- | +| id | string | A feature ID. This may be an ID associated with the Global Entity Reference System (GERS) if—and-only-if the feature represents an entity that is part of GERS. | +| geometry | binary | The line representation of the segment's location. Segment's geometry which MUST be a LineSting as defined by GeoJSON schema. | +| bbox | struct | Area defined by two longitudes and two latitudes: latitude is a decimal number between -90.0 and 90.0; longitude is a decimal number between -180.0 and 180.0. | +| version | integer | Version number of the feature, incremented in each Overture release where the geometry or attributes of this feature changed. | +| sources | struct | The array of source information for the properties of a given feature, with each entry being a source object which lists the property in JSON Pointer notation and the dataset that specific value came from. All features must have a root level source which is the default source if a specific property's source is not specified. | +| filename | string | Name of the file being queried. | +| theme | string | Name of the Overture theme being queried. | +| type | string | Name of the Overture feature type being queried. | + + + +
+
+ ## Data access and retrieval Overture's transportation theme data is freely available on both Amazon S3 and Microsoft Azure Blob Storage at these locations: @@ -164,9 +171,7 @@ Overture's transportation theme data is freely available on both Amazon S3 and M -## Data usage guidelines - -We recommend downloading only the Overture data you need. If you have a particular geographic area of interest, there are several options for using a simple bounding box to extract places data and output a GeoJSON file. +We recommend downloading only the Overture data you need. If you have a particular geographic area of interest, there are several options for using a simple bounding box to extract data and output a GeoJSON file. @@ -175,7 +180,7 @@ First, follow the [setup guide for the Python Command-line Tool](/getting-data/o Set type to either `segment` or `connector` and simply alter the `bbox` value to download a particular area. ``` overturemaps download --bbox=12.46,41.89,12.48,41.91 -f geojson --type=segment -o rome_segments.geojson -``` +``` First, follow the [setup guide for DuckDB](/getting-data/duckdb/). @@ -187,7 +192,7 @@ Replace the `bbox.xmin` and `bbox.ymin` values with a new bounding box to run th -## Data manipulation and analysis +## Querying transportation data ### Querying by properties in DuckDB @@ -223,44 +228,41 @@ This example selects all the segments that that connect to the example id. - ## Tools and libraries ### transportation-splitter -| ![Overture Splitter](/img/transportation/splitter_concept.svg) | -|:--:| -| *Conceptual diagram of the splitter tool output. The numbers following 1234@ represent start_lr and end_lr values.* | +| ![Overture Splitter](/img/transportation/splitter_concept.png) | +|:--| +| *Conceptual diagram of the splitter tool output. The numbers following 1234@ represent start_lr and end_lr values.* | -The [transportation-spitter tool](https://github.com/OvertureMaps/transportation-splitter) transforms Overture road data into simpler sub segments. It will optionally divide features at each connector point and at each change of a [scoped based property](/schema/reference/core/scoping/linearly_referenced_range), depending on configuration. Depending on your needs and map stack, the resulting dataset may be easier to manipulate than the original Overture data as each segment will only have connections at either end and have one set of properties for its entire length. +The [transportation-spitter tool](https://github.com/OvertureMaps/transportation-splitter) transforms Overture road data into simpler sub-segments. It will optionally divide features at each connector point and at each change of a [scoped based property](/schema/reference/core/scoping/linearly_referenced_range), depending on configuration. Depending on your needs and map stack, the resulting dataset may be easier to manipulate than the original Overture data as each segment will only have connections at either end and have one set of properties for its entire length. -Since a GERS ID will no longer be unique with this output, the resulting data will have two additional columns: `start_lr` and `end_lr` which are linear references describing which section of the orginal feature this new segment comes from. +Since a GERS ID will no longer be unique with this output, the resulting data will have two additional columns: `start_lr` and `end_lr` which are linear references describing which section of the original feature this new segment comes from. -#### Splitter Example -To help visualize this process better, here is a real world example of a residential street in OpenStreetMap, Overture, and after being run through the splitter tool. +#### Splitter example +To help visualize this process better, here is a real-world example of a residential street in OpenStreetMap, Overture, and after being run through the splitter tool. | ![OpenStreetMap Splitter Example](/img/transportation/splitter_osm.png) | -|:--:| +|:--| | In OpenStreetMap this residential road is represented by two different features with the same tags with feature 1 having an additional restricted access tag. | | ![Overture Splitter Example](/img/transportation/splitter_overture.png) | -|:--:| -| In Overture the two segments have been combined into one feature and the restricted access tag has been stored as this linear reference in **access_restrictions**: -`[{'access_type': allowed, 'when': {'during': , 'heading': , 'using': , 'recognized': [as_private], 'mode': , 'vehicle': }, 'between': [0.521962729, 1.0]}]` | +|:--| +| In Overture the two segments have been combined into one feature and the restricted access tag has been stored as this linear reference in **access_restrictions**: +`[{'access_type': allowed, 'when': {'during': , 'heading': , 'using': , 'recognized': [as_private], 'mode': , 'vehicle': }, 'between': [0.521962729, 1.0]}]` | ![Splitter Output Example](/img/transportation/splitter_output.png) -|:--:| +|:--| | The splitter has sliced the Overture feature at each connector point for the driveways as well as at the point where the access restriction begins. This results in six unique features in the output all still sharing the same GERS ID. | -#### More Information and Feedback +#### More information and feedback -The tool requires a Spark environment to run and has been tested using Azure Databricks and AWS Glue. For set up information the [transportation-spitter GitHub](https://github.com/OvertureMaps/transportation-splitter) will contain the most up to date information as the tool is in active development still. +The tool requires a Spark environment to run and has been tested using Azure Databricks and AWS Glue. For setup information the [transportation-spitter GitHub](https://github.com/OvertureMaps/transportation-splitter) will contain the most up-to-date information as the tool is in active development still. If you have feedback, questions, etc. on the tool you can create an [issue](https://github.com/OvertureMaps/transportation-splitter/issues) on the GitHub. - - diff --git a/docs/guides/transportation/roads.mdx b/docs/guides/transportation/roads.mdx new file mode 100644 index 000000000..2a0400a04 --- /dev/null +++ b/docs/guides/transportation/roads.mdx @@ -0,0 +1,606 @@ +--- +title: Roads +description: Road-specific properties in the Overture transportation schema +pagination_label: Roads +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +In the Overture transportation theme, a road is any kind of road, street, or path, including a dedicated path for walking or cycling. (Railways and waterways are separate subtypes in the transportation schema.) Road segments comprise the majority of ground-based transportation segments. Roads are modeled using [segment](/schema/reference/transportation/segment) features with the `subtype` property value set to `road`. + +This document describes properties specific to the `road` subtype. For more general information regarding segments, please refer to [segments and connectors](../segments-and-connectors). + +## Subclass + +The subclass property refines the descriptions of segments by: + +- clearly specifying the usage of a length of road, and using linear referencing instead of further segmentation to pinpoint a change in how the road is used +- properly classifying detailed information from OpenStreetMap + +Subclasses require non-overlapping geometries, which will make it easier for routing engines to consume our road data and generate turn-by-turn directions. The class and subclass structures allow us to capture more information about roads from our data sources. For example, we've been able to move more than 30 million "unknown" road segments from OSM into subclasses, laying the groundwork for richer and more detailed map displays with Overture data. + +## Surface + +The `road_surface` property of a road indicates its physical surface. If omitted, a reasonable default value should be assumed based on the `class` and `subclass`. + +Like many road segment properties, the `road_surface` property supports [geometric scoping](../scoping-and-travel-modes#geometric-scoping-linear-referencing) (linear referencing). Consequently, the effective road surface may vary along different sub-ranges of a road segment's geometry. + + +## Restrictions + +### Access restrictions + +Access restrictions on a road segment specify who is allowed to use the road, and under what circumstances. + +Every road segment has an *implied* set of access restrictions defined by its road class and local rules, norms, and customs. (The Overture transportation schema does not specify these implied access restrictions, which are left to the specific application to resolve.) + +The implied access restrictions may be modified for the road segment as a whole by providing an explicit value for the property `access_restrictions`. + +It is technically possible to specify a blanket access grant or refusal of access applying to everyone and everything; but where, as is typical, a more precise outcome is needed, one or more [rules](../scoping-and-travel-modes#rules-and-rule-based-properties) will be used to specify access restrictions. As with all rule-based properties, if no rule matches the specific facts, then the default restrictions for the road class govern. + + + + +```yaml +id: access-restrictions-segment-blanket +type: Feature +geometry: + type: LineString + coordinates: + - [0, 0] + - [0, 1] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: residential + access_restrictions: + - access_type: denied +``` + + + + + +```yaml +id: access-restrictions-segment-private-with-deliveries +type: Feature +geometry: + type: LineString + coordinates: + - [0, 0] + - [0, 1] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: residential + access_restrictions: + - access_type: denied + - access_type: allowed + when: { recognized: [as_private] } + - access_type: allowed + when: + using: [to_deliver] + during: Mo-Fr 08:30-16:30 +``` + + + + + +```yaml +id: access-restrictions-segment-motor-vehicles-destination-only +type: Feature +geometry: + type: LineString + coordinates: + - [0, 0] + - [0, 1] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: residential + access_restrictions: + - access_type: denied + when: { mode: [motor_vehicle] } + - access_type: allowed + when: { using: [at_destination] } +``` + + + + + +```yaml +id: access-restrictions-segment-axle-limit +type: Feature +geometry: + type: LineString + coordinates: + - [0, 0] + - [0, 1] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: motorway + access_restrictions: + - access_type: denied + when: + mode: [hgv] + vehicle: + - dimension: axle_count + comparison: greater_than_equal + value: 5 +``` + + + + +### Turn restrictions + +Turn restrictions on a road segment limit the transitions which are allowed from that segment into other [physically connected](../segments-and-connectors#physical-connectivity) segments. + +Every road segment has an implied set of allowed transitions defined by its [access restrictions](#access-restrictions) as well as local rules, norms, and customs. An example of a transition restriction implied by an access restriction: if the segment can only be used along the `forward` [heading](../segments-and-connectors#heading), then it is implied that no transitions are allowed to any connected segments if travelling along the `backward` heading. An example of a transition restriction implied by a local rule or norm would be a blanket prohibition on U-turns in a given jurisdiction. + +Overture takes a permissive-by-default approach to transition restrictions. By default, all implied transitions are allowed. The set of allowed transitions may be reduced by adding explicit transition restrictions in the `prohibited_transitions` property. + +Turn restrictions come in two flavors: **simple** and **via**. A simple turn restriction allows a simple regulation to be stated, such as "No right turn onto Elm Street"; a via restriction covers more elaborate cases where the sequence of maneuvers is important. + + + + +
+ +
+ + + +
+ +*Prohibited right turn from "source" to "target" segment at connector 2.* + +
+ +
+ +
+ +
+ +
+Source segment +```yaml +id: overture:transportation:example:simple-turn-restriction-source +type: Feature +geometry: + type: LineString + coordinates: + - [-113.57822030759499, 50.01868388494378] + - [-113.57831482025354, 50.018860947117304] + - [-113.57851814418316, 50.01923724443006] +properties: + theme: transportation + type: segment + version: 5 + subtype: road + class: secondary + connectors: + - connector_id: overture:transportation:example:via-turn-restriction-connector1 + at: 0 + - connector_id: overture:transportation:example:via-turn-restriction-connector2 + at: 1 + prohibited_transitions: + - sequence: + - segment_id: overture:transportation:example:simple-turn-restriction-target + connector_id: overture:transportation:example:simple-turn-restriction-connector2 + final_heading: forward + when: {heading: forward} +``` +
+ +
+Connector 1 + +*This connector is not an important part of the example, since it does +not participate in the turn restriction, but it is included to bring +real-world context to the example.* + +```yaml +id: overture:transportation:example:simple-turn-restriction-connector1 +type: Feature +geometry: + type: Point + coordinates: [-113.57831482025354, 50.018860947117304] +properties: + theme: transportation + type: connector + version: 0 +``` +
+ +
+Exit segment + +*This segment is not an important part of the example, since all implied +transitions are allowed on it. We include it to bring real-world context +to the example.* + +```yaml +id: overture:transportation:example:simple-turn-restriction-exit +type: Feature +geometry: + type: LineString + coordinates: + - [-113.57831482025354, 50.018860947117304] + - [-113.5783121688577, 50.019016827708754] + - [-113.57829228338763, 50.019079861246865] + - [-113.57826444373009, 50.019121599625294] + - [-113.57816369068271, 50.01919400284882] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: secondary + connectors: + - connector_id: overture:transportation:example:via-turn-restriction-connector1 + at: 0 + - connector_id: overture:transportation:example:via-turn-restriction-connector2 + at: 1 +``` + +
+ +
+Connector 2 + +*The right turn from the source segment (`forward` heading) to the +target segment (`forward` heading) is prohibited at this connector.* + +```yaml +id: overture:transportation:example:simple-turn-restriction-connector2 +type: Feature +geometry: + type: Point + coordinates: [-113.57851814418316, 50.01923724443006] +properties: + theme: transportation + type: connector + version: 1 +``` +
+ +
+Target segment + +*Traffic heading `forward` on the source segment may not enter this +segment heading `forward`, i.e. the right turn from the source segment +to this segment is prohibited.* + +```yaml +id: overture:transportation:example:simple-turn-restriction-target +type: Feature +geometry: + type: LineString + coordinates: + - [-113.57851814418316, 50.01923724443006] + - [-113.57837460847787, 50.01919574268962] + - [-113.57812342099429, 50.01919343703648] + - [-113.57803729957116, 50.01923263312719] + - [-113.57766410673773, 50.01923263312719] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: secondary + connectors: + - connector_id: overture:transportation:example:via-turn-restriction-connector1 + at: 0 + - connector_id: overture:transportation:example:via-turn-restriction-connector2 + at: 1 +``` +
+ +
+Connector 3 + +*This connector is not an important part of the example, since it does +not participate in the turn restriction, but it is included to bring +real-world context to the example.* + +```yaml +id: overture:transportation:example:simple-turn-restriction-connector3 +type: Feature +geometry: + type: Point + coordinates: [-113.57816369068271, 50.01919400284882] +properties: + theme: transportation + type: connector + version: 1 +``` +
+ + +
+ +
+ + + + + +
+ +
+ + + +
+ +*Prohibited transition from "source" to "target" through `via` segment.* + +
+ +
+ +
+ +
+ +
+Source segment +```yaml +id: overture:transportation:example:via-turn-restriction-source +type: Feature +geometry: + type: LineString + coordinates: + - [-71.1100226929593, 42.30156668552357] + - [-71.11055493812631, 42.30157222996385] + - [-71.11102971081017, 42.30157407811038] + - [-71.11143701579662, 42.30156114108277] + - [-71.11197425857047, 42.30152602627953] + - [-71.11234408150312, 42.30149091145671] + - [-71.1126589307566, 42.30147612626226] + - [-71.11301376086777, 42.301494607754876] + - [-71.11320616874515, 42.301516785538524] +properties: + theme: transportation + type: segment + version: 5 + subtype: road + class: primary + connectors: + - connector_id: overture:transportation:example:via-turn-restriction-connector1 + at: 0 + - connector_id: overture:transportation:example:via-turn-restriction-connector2 + at: 1 + names: + primary: Arborway + prohibited_transitions: + - sequence: + - segment_id: overture:transportation:example:via-turn-restriction-target + connector_id: overture:transportation:example:via-turn-restriction-connector2 + - segment_id: overture:transportation:example:via-turn-restriction-via + connector_id: overture:transportation:example:via-turn-restriction-connector1 + final_heading: forward + when: + heading: forward + during: Mo-Fr 06:00-09:00, 15:00-19:00 + road_surface: + - value: paved +``` +
+ +
+Connector 1 +```yaml +id: overture:transportation:example:via-turn-restriction-connector1 +type: Feature +geometry: + type: Point + coordinates: [-71.11234408150312, 42.30149091145671] +properties: + theme: transportation + type: connector + version: 1 +``` +
+ +
+Via segment +```yaml +id: overture:transportation:example:simple-road2 +type: Feature +geometry: + type: LineString + coordinates: + - [-71.11213418200086, 42.3017182333833] + - [-71.11234408150312, 42.30149091145671] + - [-71.11248901211202, 42.3013264259736] + - [-71.11283634581244, 42.30093831245662] +properties: + theme: transportation + type: segment + version: 5 + subtype: road + class: secondary + connectors: + - connector_id: overture:transportation:example:via-turn-restriction-connector1 + at: 0 + - connector_id: overture:transportation:example:via-turn-restriction-connector2 + at: 1 + names: + primary: Washington Street + road_surface: + - value: paved +``` +
+ +
+Connector 2 +```yaml +id: overture:transportation:example:via-turn-restriction-connector2 +type: Feature +geometry: + type: Point + coordinates: [-71.11248901211202, 42.3013264259736] +properties: + theme: transportation + type: connector + version: 1 +``` +
+ +
+Target segment +```yaml +id: overture:transportation:example:turn-restriction-target +type: Feature +geometry: + type: LineString + coordinates: + - [-71.11325364601365, 42.301374477956756] + - [-71.11278137213321, 42.3013264259736] + - [-71.11248901211202, 42.3013264259736] + - [-71.11157195119078, 42.30139295947919] + - [-71.1109997251666, 42.301428074356636] + - [-71.11058492376937, 42.30143177065813] + - [-71.11002519176327, 42.301415137298676] +properties: + theme: transportation + type: segment + version: 5 + subtype: road + class: primary + connectors: + - connector_id: overture:transportation:example:via-turn-restriction-connector1 + at: 0 + - connector_id: overture:transportation:example:via-turn-restriction-connector2 + at: 1 + names: + primary: Arborway + road_surface: + - value: paved +``` +
+ +
+ +
+ + + + +### Speed limits + +Speed limits restrict the speed at which travel is permitted on a road. Typically speed limits specify maximum allowed speeds, but the Overture schema also allows minimum speed limits to be set and variable speed corridors to be indicated. + +Every road segment has an implied speed limit or set of speed limits defined by its road class and local rules, norms, and customs. As with access and turn restrictions, the Overture transportation schema does not attempt to specify these implied speed limits. + +The implied speed limits may be configured for the whole road segment by providing an explicit value for the property `speed_limits`. + +As with access restrictions and turn restrictions, speed limits can be specified using [rules](../scoping-and-travel-modes#rules-and-rule-based-properties). + + + + +```yaml +id: speed-limits-simple +type: Feature +geometry: + type: LineString + coordinates: + - [-123.09348187774302, 49.280278741717865] + - [-123.0895720621171, 49.280195795155265] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: residential + speed_limits: + - max_speed: + value: 30 + unit: km/h +``` + + + + + +```yaml +id: speed-limits-variable-max +type: Feature +geometry: + type: LineString + coordinates: + - [0, 0] + - [0, 1] +properties: + theme: transportation + type: segment + version: 2 + subtype: road + class: secondary + speed_limits: + - max_speed: {value: 70, unit: "mph"} + - when: + mode: [hgv] + heading: forward + max_speed: {value: 65, unit: "mph"} +``` + + + + + +```yaml +id: speed-limits-variable-max +type: Feature +geometry: + type: LineString + coordinates: + - [-123.12895930023527, 50.007761789070344] + - [-123.12637500433082, 50.00945836227345] + - [-123.12506896231434, 50.011762034223324] + - [-123.12415195409014, 50.01351203677902] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: motorway + speed_limits: + - max_speed: + value: 100 + unit: km/h + is_max_speed_variable: true +``` + + + diff --git a/docs/guides/transportation/scoping-and-travel-modes.mdx b/docs/guides/transportation/scoping-and-travel-modes.mdx new file mode 100644 index 000000000..8eadbe0cd --- /dev/null +++ b/docs/guides/transportation/scoping-and-travel-modes.mdx @@ -0,0 +1,406 @@ +--- +title: Scoping rules and travel modes +description: How property values are constrained by location, time, and subject in the transportation schema +pagination_label: Scopint and Travel Modes +--- + +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +In the real world, many facts and rules affecting entities have only a partial application, meaning they don't apply everywhere, or they don't apply at all times, or to everyone, or to all sets of external conditions. For example, access restrictions on a road segment might not apply to all people or all kinds of vehicles, or they might vary according to the day of the week. + +The Overture schema uses two related concepts to capture the partial application of facts and rules: **scoped values** and **rule-based properties**. + +## Scoped values and scoping properties + +A *scoped* value is a value which only applies within a limited scope. Most scoped values are rules in the rule lists of [rule-based properties](#rules-and-rule-based-properties). However, scoped values also exist outside of rule-based properties. For example, a `destinations` property belonging to a road segment might be geometrically scoped to its position along the road. + +The scope in which a scoped value applies is controlled by one or more special child properties of the value known as *scoping* properties. + +### Geometric scoping (linear referencing) + + + + +The geometric scoping properties `at` and `between` limit the scope of their parent value to a position or range of positions, respectively, along a segment's geometry. When the parent value is a rule object, the rule only matches the position or range of positions specified in the `at` or `between` property. + +The value of the `at` property is a single real number `a` where `0` ≤ `a` +≤ `1`. It represents a discrete position along the segment's geometry. The +value of the `between` property is a pair of numbers `[a, b]` where `0` ≤ +`a` < `b` ≤ `1`. It represents a range of positions along the segment's +geometry. The numbers `a` and `b` are interpreted as percentage displacements +along the parent segment's geometry starting from the start of the segment. +(*The terms "start" and "end" are explained in +[segments and connectors](../segments-and-connectors#start-end-and-orientation).*) + +So, for example, the scoping property `"at": 0.15` scopes its parent value +to the position on the segment that is displaced 15% of the segment length from +the start. + +
+ +
+ + +
+*The position along the segment geometry described by `"at": 0.15`.* +
+
+
+ +The scoping property `"between": [0.35, 0.75]` scopes its parent value to the range of positions on the segment beginning at 35% and extending to 75% of the segment length from the start. + +
+ +
+ *The range on the segment geometry described by `"between": [0.35, 0.75]`.* +
+
+
+ + + The example below shows a road segment whose speed limit is defined by two geometrically-scoped speed limit rules: + ```yaml +id: overture:transportation:example:geometric-scoping +type: Feature +geometry: + type: LineString + coordinates: [[0, 0], [1, 1]] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: primary + speed_limits: + - between: [0, 0.15] + max_speed: + value: 100 + unit: km/h + - between: [0.15, 1] + max_speed: + value: 60 + unit: km/h +``` + +
+ +For details on how linear references are calculated, see the [linear referencing](../linear-referencing) guide. + +### Temporal scoping (opening hours) + + + + +The temporal, or time-based, scoping construct `when: { during: "..." }` limits the scope of its parent value to one or more recurring time ranges. When the parent value is a rule object, the rule only matches the time range or time ranges specified in the `during` property. + +The `during` property must contain a string expressed in the OpenStreetMap +[opening hours specification](https://wiki.openstreetmap.org/wiki/Key:opening_hours/specification). + + + + +The example below shows a road segment with a temporally-scoped access restriction rule. The rule states that non-bus travellers are prohibited from access to the segment on weekdays between 3PM and 6PM. + +```yaml +id: overture:transportation:example:temporal-scoping +type: Feature +geometry: + type: LineString + coordinates: + - [-122.90019762265949, 49.20784664905824] + - [-122.9003738558948, 49.207833436710956] + - [-122.90052986564378, 49.207871186265805] +properties: + theme: transportation + type: segment + version: 2 + subtype: road + class: unknown + access_restrictions: + - access_type: denied + when: + mode: [bus] + during: "Mo-Fr 15:00-18:00" +``` + + + + +### Subjective scoping + +Subjective scoping means that the scope of a property can be constrained based on subjective factors like *who* or *what* is travelling on the transportation network, or *how* they are doing it. + +The Overture transportation schema supports several subjective factors: + +#### Travel-mode scoping + +A travel mode is a way of moving about the transportation network, for example driving in a motor vehicle, or, more specifically, driving in a high-occupancy vehicle. + +The property construct `when: { mode: [...] }` limits the scope of its parent value to apply only to people or things travelling using the listed travel modes. See [travel modes](#travel-modes) below for more detail. + +#### Heading + + + + +Heading scoping limits the scope of a parent value to apply only when the traveller is proceeding along the segment geometry in the named direction, either `forward` or `backward`. (*The directions `forward` and `backward` are defined in [segments and connectors](../segments-and-connectors#heading).*) + +The property construct `when: { heading: forward|backward }` applies heading scoping to a parent value. + + + + +The example below shows a road segment with multiple heading-scoped access restriction rules. The rules allow all standard travel modes for the segment class to travel in the forward direction, but only allow buses to travel in the backward direction. + +```yaml +id: overture:transportation:example:subjective-heading-scoping +type: Feature +geometry: + type: LineString + coordinates: + - [-1.3023158, 54.5579329] + - [-1.3020090, 54.5577898] + - [-1.3014511, 54.5575155] + - [-1.3009618, 54.5572737] + - [-1.3004518, 54.5570288] + - [-1.3003009, 54.5569580] +properties: + theme: transportation + type: segment + version: 2 + subtype: road + class: primary + access_restrictions: + - access_type: denied + when: { heading: backward } + - access_type: allowed + when: + heading: backward + mode: [bus] +``` + + + + +#### Purpose of use scoping + + + + +Usage purpose scoping limits the scope of a parent value to apply only when the user is using the feature for one of the listed purposes. This type of scoping is common when it matters that a person is in the process of doing something like making a delivery or acting as the customer of a business. + +The property construct `when: { using: [...] }` applies usage purpose scoping to a parent value. + + + + +The example below shows a road segment representing a hotel driveway where through traffic is not permitted (only usage by hotel customers or as a final destination is allowed): + + ```yaml +id: overture:transportation:example:subjective-usage-purpose-scoping +type: Feature +geometry: + type: LineString + coordinates: + - [-123.12700676422021, 49.279826628301635] + - [-123.12680748254229, 49.27995121574301] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: tertiary + access_restrictions: + - access_type: denied + - access_type: allowed + when: { using: [as_customer, at_destination] } +``` + + + + +#### Status scoping (membership in a recognized group) + + + + +Status scoping limits the scope of a parent value to apply only when the user has a certain recognized status or is a member of a recognized group. This type of scoping is useful when it matters whether a person or thing has a recognized characteristic, such as holding a permit or being an employee of a business or student at an academic institution. + +The property construct `when: { recognized: [...] }` applies status scoping to a parent value. + + + + +The example below shows a road segment modeling a private condominium tower driveway where access is denied to the general public, but allowed to privately-authorized individuals, such as condo unit owners: + +```yaml +id: overture:transportation:example:subjective-status-scoping +type: Feature +geometry: + type: LineString + coordinates: + - [-123.12791513926058, 49.287502049554945] + - [-123.12795068403449, 49.287522915661725] + - [-123.12797769806272, 49.28756882106529] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: tertiary + access_restrictions: + - access_type: denied + - access_type: allowed + when: { recognized: [as_private] } +``` + + + + +### Vehicle attributes scoping + + + + +Vehicle attribute scoping limits the scope of a parent value to apply only when the vehicle in use meets certain criteria. + +The property construct `when: { vehicle: [{ dimension: ..., comparison: ..., value: ... }] }` applies vehicle attributes scoping to a parent value. + +Note that vehicle attribute scoping can overlap to some degree with [travel mode scoping](#travel-mode-scoping). For example, some access rules may be scoped to the travel mode "heavy goods vehicle", while another equivalent access rule could be scoped to the vehicle attribute "gross vehicle weight." + + + + +```yaml +id: overture:transportation:example:subjective-vehicle-attributes-scoping +type: Feature +geometry: + type: LineString + coordinates: + - [-123.12791513926058, 49.287502049554945] + - [-123.12795068403449, 49.287522915661725] + - [-123.12797769806272, 49.28756882106529] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: residential + access_restrictions: + - access_type: denied + when: + vehicle: + - dimension: weight + comparison: greater_than + value: 23 + unit: 't' +``` + + + + + +## Rules and rule-based properties + +A *rule-based* property is a property whose value in a given situation is determined by evaluating a list of rules against the facts applicable to that situation. Each individual rule in the list of rules is itself a scoped value, and the assessment of which rule applies to a given set of facts is done by the rule evaluation algorithm. + +### Absolute form + +There are cases when specifying a property value using rules makes sense, and cases where doing so is unnecessarily complicated because the real-world entity being modeled has a single unchanging state which is the same in all fact situations. In these cases, most rule-based properties support a simpler absolute form without a list of rules. + +### Rule evaluation algorithm + +Given a rule-based property, the actual value of the property in a given fact pattern is determined by a three-step process: first, all matching rules are identified; second, the single determining rule is chosen if possible; lastly, if there is no applicable rule, an appropriate default value may be assumed. + +1. **Matching rules.** For a given rule and a given set of facts, the rule *matches* the facts if the scope of the rule contains all the facts, *i.e.* the facts fit within all of the scoping properties expressed in the rule. The matching criteria for a rule can be thought of as the logical AND of all the scoping properties expressed in the rule. +2. **Determining rule.** For a given rule-based property and a given set of facts, *at most* one rule can *determine* the property value. If only one rule matches, that rule determines the property value. If more than one rule matches, the last matching rule in the list determines the value. (This is similar to how OpenStreetMap [conditional restrictions](https://wiki.openstreetmap.org/wiki/Conditional_restrictions) are evaluated.) Therefore it is important to write more general rules before more specific ones in a rule list. +3. **Fallback to default.** If there are no matching rules, an appropriate default value may apply, depending on the property being evaluated. + +## Travel modes + +In the real world, a travel mode can be thought of intuitively as a way of getting from point A to point B. Travel modes can include non-vehicle modes (foot), vehicle modes (a bicycle or motor vehicle), and occasionally more granular details, e.g. a motor vehicle classified as a high occupancy vehicle or a heavy goods vehicle. + +Within the Overture transportation theme schema model, a travel mode is a recognized mode by which a person or thing may use a [segment](/schema/reference/transportation/segment) feature. + +### Implied travel modes + +Every segment has an *implied* set of travel modes that are allowed to use the segment. For [road](../roads) segments, this implied set derives from the road class, as well as local rules, norms, and customs operative where the road segment is situated. + +Since this implied set depends on locality or jurisdiction, and is susceptible of varying over time, the Overture transportation schema does not try to specify the implied set. Resolution of the implied set is done by the specific application in the case where this level of detail is important for its proper functioning. An accurate routing engine may need this information, whereas a 2D map render or a geocoder likely do not. + +### General definitions + +Overture's recognized travel modes are defined in general terms that are broadly applicable. For example, `hov` is a high-occupancy vehicle and `hgv` is a heavy goods vehicle. In most jurisdictions, these general terms map to a concept that is in use within the jurisdiction, even though the local name for the concept may vary. + +Despite being broadly applicable, travel modes may have different definitions in different places and at different times: + +- in one jurisdiction, an `hgv` might mean any vehicle with a gross vehicle weight in excess of 3.5 tonnes (3,500 kg). In another place, an `hgv` might have a gross vehicle weight of at least 10,001 lbs. +- in one jurisdiction, an `hov` might require a minimum of 2 passengers while in another place it might have a higher minimum passenger count, or include battery-electric vehicles, or exclude certain classes of vehicle or usage. + +As a consequence of the variance in definition across place and time, Overture gives only general definitions for travel modes, leaving precise definition to those applications that require them. + +### Travel mode scoping in the schema + +#### The `mode` scoping property + +The scoping property `mode` controls whether a given scoped property applies when a given travel mode is being used for traveling along a road segment. + +If `mode` is provided, it must be a non-empty array of string values identifying travel modes, and is interpreted as a set. Values must be unique, but order is not important. + +#### Vehicle attribute scoping: `vehicle` + +Because travel modes are a fuzzy concept, there are inevitably areas of overlap with the more precise, but more limited, `vehicle` scoping property which is used for [vehicle attributes scoping](#vehicle-attributes-scoping). Where there is potential overlap, the method of scoping used in Overture data releases will depend on how the upstream data source has expressed the equivalent concept. Where there is choice, it is preferable to select the scoping method that most accurately reflects the intention expressed on local signage. + +#### Similar scoping properties: `using` and `recognized` + +The scoping properties `using` and `recognized` express concepts that are meant to be orthogonal to (completely separate from) travel modes: + +- The `using` property indicates [purpose of use](#purpose-of-use-scoping) scoping, which relates to the purpose for which the person or thing travelling is using a given segment of the transportation network. Travel modes should ideally not embed a purpose of use. +- The `recognized` property indicates [status scoping](#status-scoping-membership-in-a-recognized-group), which relates to a recognized status given to the person or thing traveling, where the recognized status is distinct from the mode of travel itself. Travel modes should ideally not embed a status. + +### The travel modes taxonomy + +Travel modes in Overture form a shallow taxonomy. Some travel modes are more general, while others are more specific, and a more general travel mode may contain a more specific one. For example, the general travel mode `vehicle` contains the more specific mode `motor_vehicle`. + +
+ +
+ + + +
+ +
+ +
+ +*The Overture travel modes taxonomy.* + +
+ +
+ +
+ +As many of the above travel modes draw on the body of knowledge accumulated in relation to OpenStreetMap [transport mode access restrictions](https://wiki.openstreetmap.org/wiki/Key:access#Transport_mode_restrictions), Overture Maps would like acknowledge an intellectual debt to the OSM community in relation to travel modes as well as to other aspects of the transportation schema. diff --git a/docs/guides/transportation/segments-and-connectors.mdx b/docs/guides/transportation/segments-and-connectors.mdx new file mode 100644 index 000000000..d709b7b5c --- /dev/null +++ b/docs/guides/transportation/segments-and-connectors.mdx @@ -0,0 +1,468 @@ +--- +title: Segments and connectors +description: Shape, connectivity, and linear referencing in the transportation schema +--- + +import CodeBlock from '@theme/CodeBlock'; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; +import ThemedImage from '@theme/ThemedImage'; +import useBaseUrl from '@docusaurus/useBaseUrl'; + +In the Overture transportation theme, features with their `type` property set to `segment` represent **paths repeatedly traversed by people or objects**. For example, a segment may represent a major highway, an abandoned subway line, or a ferry route. The `connector` feature type carries point geometry which describes a location where a physical connection between two or more segments occurs. + +Together, segments and connectors capture the shape and connectivity of the transportation network. + +
+ +
+ + + +
+ +*A connector physically joining three segments.* + +
+
+ +
+ +## Connectors + +The [connector](/schema/reference/transportation/connector) feature type carries point geometry representing a location where a physical connection between two or more segments occurs (or may occur in the future). Connectors have no properties apart from geometry and standard Overture feature properties. All other aspects of the transportation theme are modeled on segments. + +To better support routing use cases, the `segment` feature type has a property called `connectors`: an array of IDs with pre-computed linear reference values that explicitly link segments and connector features via coordinates. Each connector is a possible routing decision point, meaning it defines a place along the segment where there is a possibility to transition to other segments that share the same connector. + +Here's an example of how the connectors property is modeled in the schema: + +```yaml +id: overture:transportation:segment:123 +type: Feature +geometry: + type: LineString + coordinates: [[0, 0], [0.03, 0], [0.10, 0]] +properties: + theme: transportation + type: segment + version: 1 + subtype: road + class: secondary + connectors: + - connector_id: fooConnector + at: 0 + - connector_id: barConnector + at: 0.3 + - connector_id: bazConnector + at: 1 + road_surface: + - value: paved +``` + +### Physical connectivity + +Two or more segments are physically connected at a given connector if each segment's connectors property contains a reference to the connector. + +The connector geometry's coordinates should preferably be contained within the segment geometry's coordinates, in which case the connector coordinates define the point of physical connection. This constraint will always be met by official Overture data releases. Where this is not possible, the point of physical connection is the closest point to the connector coordinates which intersects the segment geometry. + +Conversely, two segments are **not** physically connected if their connectors properties do not reference a shared connector, even if their geometries overlap or even share a coordinate in common. + +Travel from a point on one segment to a point on another physically-connected segment is allowed, unless limited by an explicit restriction such as an access or turn restriction. + +All segments in official Overture transportation data releases have a minimum of two connectors, one at each end of the geometry, even if those endpoint connectors are not attached to any other segment. This is done to allow new segments to connect into the existing network without needing to change the properties of existing segments. + +## Segments + +The [segment](/schema/reference/transportation/segment) feature type carries `LineString` geometry which describes the physical shape of a section of the transportation network. A segment may represent an entity with a tangible real-world existence, such as a paved road, or it may represent an intangible entity, such as a ferry route, which has a well-known shape but no observable presence in the real world. + +### Subtypes + +Because of their many possible uses, the segment `type` is further organized by its `subtype`, `class`, and `subclass` properties. Currently, the Overture transportation theme supports three segment subtypes: + +| Subtype | Description | % of total segment length | +|---------|-------------|---------------------------| +| [`road`](../roads) | Roads and footpaths | ~97% | +| `rail` | Any transit system in which vehicles ride on metal rails | ~3% | +| `water` | Shipping lanes and ferry routes | <1% | + +### Geometry + +A segment's geometry approximates the physical centerline of the section of path it models. For roads, information regarding the width of this path is captured in the `width_rules` road-specific property. + +### Class + +The `class` property of a segment specifies its general purpose of use within its subtype. Unlike many segment properties, a segment's `class` property does not support [geometric scoping](../scoping-and-travel-modes#geometric-scoping-linear-referencing) (linear referencing). Consequently, whenever a linear range of real-world road or rail makes a class transition (for example, between secondary and residential roads), the Overture transportation segmentation algorithm will generate a segment split. + +Currently, **only roads and railways have the `class` property**. Within these subtypes, every segment has a class. If the `class` property is missing from a segment's source dataset, the `class` for that segment will be given default value `unknown`, indicating the class is undetermined and may be updated in a later release. + +### Flags + +A segment's flags (`road_flags` for roads, `rail_flags` for rails) are a set of named flag values indicating the presence or absence of simple physical characteristics. For example, a road segment with `road_flags = [is_link, is_under_construction]` is a link segment that is physically under construction. + +Like many segment properties, the `road_flags`/`rail_flags` property supports [geometric scoping](../scoping-and-travel-modes#geometric-scoping-linear-referencing). Consequently, the applicable flags may vary along different sub-ranges of a road segment's geometry. + +**Here's an example of how classes, subclasses, and flags are modeled in the Overture schema:** + +```yaml +class: footway +subclass_rules: + - value: sidewalk + between: [0, 0.6] + - value: crosswalk + between: [0.6, 1.0] +road_flags: + - values: [is_bridge] + between: [0.2, 0.3] + - values: [is_under_construction] + between: [0.3, 0.5] + +class: service +subclass_rules: + - value: driveway + between: [0, 0.5] + +class: primary +subclass: link +subclass_rules: + - value: link +``` + +### Granularity + +Occasionally, a real-world feature admits different representations at different granularities. For example, a dual carriageway may be modeled as one segment, or two parallel segments. Segments support modeling the transportation network at a range of granularities. A single segment can represent a bidirectional street including all of its sidewalks, a single sidewalk, two parallel subway tracks, a one-way street, or one direction of a dual carriageway. + +### Start, end, and orientation + +The first coordinate in a segment's geometry is the **start** of the segment and the last coordinate is the **end**. A segment is oriented away from the start and toward the end. + +
+ +
+ +```yaml +type: LineString +coordinates: + - [1, 0] # Start + - [0, 0] + - [-1, 0] # End +``` + +
+ + + +
+ +
+ +
+ +*This segment geometry is oriented due west.* + +
+ +
+
+ +
+ +
+ +
+ +```yaml +type: LineString +coordinates: + - [-1, 0] # Start + - [0, 0] + - [1, 0] # End +``` + +
+ + + +
+ +
+ +
+ +*This segment geometry is oriented due east.* + +
+ +
+
+ +
+ +
+ +### Heading + +Travel along a segment's geometry can follow one of two possible headings: **forward** or **backward**. The forward heading proceeds toward the end of the segment; while the backward heading proceeds back toward the start of the segment. + +
+ +
+ + + +
+ +*Travel heading along a segment.* + +
+
+ +
+ +### Level (Z-order) + +Segment geometry is two-dimensional. In the real, 3D, world, however the entities represented by segments can be above or below each other, as may happen with tunnels, bridges, overpasses, and stacked multi-level highway interchanges. To accurately render top-down 2D maps, it is important to know the relative stacking order, or Z-order, of segments. + +Segment Z-order is given by the `level` property. A `level` value of `0` indicates visual level, with positive numbers indicating above visual level, negative numbers indicating below visual level, and in general, a lesser number indicating a lower position in the stacking order than a greater number. + +
+ +
+ + + +
+ +*Ground level segments stacking above tunnel segments.* + +
+
+ +
+ +Note that two segments with different `level` values may be physically connected, since `level` is an approximation for rendering and is not meant be a precise indication of elevation at different points along the segment. + +### Destinations + +The `destinations` property in the segment feature type supports routing use cases. It describes the transitions from one segment to another on the way to a specified location. In turn-by-turn routing applications, this is what is known as "follow signs for" — the human-readable directions and signposts along a road, highway, or interstate that get us from point A to point Z, by way of any number of paths in between. The `destinations` property has a flexible schema that will allow us to capture and model navigation data from many different sources. + +## Linear referencing + +Properties on a segment can vary along its length using normalized positions from `0.0` (start) to `1.0` (end), a technique called linear referencing. For full details on how linear references work, including calculation methods, code examples, and edge cases, see the [linear referencing](../linear-referencing) guide. + +## Segmentation + +The term segmentation describes the process of converting upstream source data into Overture transportation shape and connectivity data modeled as segments and connectors. + +### Shape stability + +A primary goal of Overture's segmentation process is to promote stability of segment shape across Overture data releases. For example, if a certain real-world stretch of Main Street is represented by a single segment with particular geometry in release 1, we will strive to avoid slicing the exact same geometry up into two, three, or four segments in release 2. + +Aiming for segment shape stability categorically does not mean that Overture aims for a stable transportation dataset. On the contrary, we aim to continuously improve data accuracy and coverage, and expect the transportation network dataset to constantly evolve and grow as a result. Our goal is simply to minimize unnecessary, semantically meaningless, changes in how the geometry is sliced into segments across data releases. + +Several features of the transportation theme schema were designed to allow the segmentation process to achieve its segment stability goal. These features include: + +- [interior connectors](#interior-connectors) +- [geometrically scoped](#geometric-scoping) segment properties + +### ID stability + +Overture pursues shape stability to improve the ability to assess whether two segments from different points in time (or from different upstream data sources) represent the same real-world entity. Overture's success at this assessment directly feeds into the stability and precision of [GERS IDs](https://docs.overturemaps.org/gers) assigned to segments. In turn, higher GERS ID stability and precision makes transportation theme data more useful for conflation. + +### Interior connectors + +A key feature of the Overture transportation schema which enables shape stability is the ability of segments to support connectors at interior positions along their geometry, not only at their endpoints. The ability to add internal connectors prevents the segmentation process from having to blindly follow every split or join introduced in upstream source data. + +For example, imagine a square city block bordered by road on all four sides has been mapped in the source data, but a back alley dividing the block along the east-west axis has not. If the back alley is subsequently mapped in the source data, the Overture segmentation process can connect to the transportation network without having to subdivide any existing segments by simply introducing internal connectors on the north-south road segments bordering the block to the east and west. As a result, the [Overture IDs](https://docs.overturemaps.org/gers) of the north-south road segments remain as they were and no data needs to be re-conflated. + +
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ +
+ +*A square city block bordered by four roads before (left) and after (right) mapping the back alley using internal connectors.* + +
+ +
+ +
+ +Note that in the above example, an official Overture data release would insert coordinates in the middle of the north-south segments, if they did not already exist, because Overture data releases will always ensure that every segment's geometry includes all of its connectors. + +### Geometric scoping + +Many segment properties may include a linear reference so that they apply only to a part of the segment geometry. We refer to these linearly-referenced property values as being geometrically scoped and discuss geometric scoping at greater length in the page on [scoped properties](../scoping-and-travel-modes). + +Geometric scoping allows the segmentation algorithm to avoid introducing segment splits simply because a certain property has different values along different parts of the geometry. Like interior connectors, geometrically-scoped properties enable the segmentation process to make decisions that promote shape stability, ultimately resulting in more precise and stable [Overture IDs](https://docs.overturemaps.org/gers) and less churn in conflated data. + +
+ +
+ + + +
+ +*A single segment with multiple geometrically-scoped speed limit values.* + +
+
+ +
+ +### Loops + +Although it is technically possible to use the Overture schema to express a segment forming a connected loop, such loops are considered invalid and will never be produced by the segmentation algorithm. + +An illegal loop where one end of a segment connects to the other end can be corrected by splitting the segment and introducing a second connector to maintain physical connectivity. An illegal self-crossing loop of degree *N* can be corrected by splitting the segment into N pieces. + +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ +
+ +*An illegal loop connected at its endpoints (left) and a possible correction (right).* + +
+ +
+
+ +
+ +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ +
+ +
+ +*An illegal self-crossing loop (left) and a possible correction (right).* + +
+ +
+
+ +
+ +
diff --git a/sidebars.js b/sidebars.js index bfb976b36..dff2578f5 100644 --- a/sidebars.js +++ b/sidebars.js @@ -99,6 +99,10 @@ const sidebars = { collapsed: true, items: [ 'guides/transportation/overview', + 'guides/transportation/segments-and-connectors', + 'guides/transportation/scoping-and-travel-modes', + 'guides/transportation/linear-referencing', + 'guides/transportation/roads', ], }, ], diff --git a/static/img/transportation/geometric-scoping-position-dark.png b/static/img/transportation/geometric-scoping-position-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1000351eac25186f3e395c41e1be3e7cff662c54 GIT binary patch literal 8374 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 SCM(B|1R#2*cWdsrJ@{YrfSzyw literal 0 HcmV?d00001 diff --git a/static/img/transportation/geometric-scoping-position-dark.svg b/static/img/transportation/geometric-scoping-position-dark.svg deleted file mode 100644 index 2bd5a8c0c..000000000 --- a/static/img/transportation/geometric-scoping-position-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
back
back
front
front
"at": 0.15
"at": 0.15
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/transportation/geometric-scoping-position-light.png b/static/img/transportation/geometric-scoping-position-light.png new file mode 100644 index 0000000000000000000000000000000000000000..afcd94460639dd31f395f82e561e1c36e7726266 GIT binary patch literal 4771 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 A5&!@I literal 0 HcmV?d00001 diff --git a/static/img/transportation/geometric-scoping-position-light.svg b/static/img/transportation/geometric-scoping-position-light.svg deleted file mode 100644 index e38dabb85..000000000 --- a/static/img/transportation/geometric-scoping-position-light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
back
back
front
front
"at": 0.15
"at": 0.15
\ No newline at end of file diff --git a/static/img/transportation/geometric-scoping-range-dark.png b/static/img/transportation/geometric-scoping-range-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bf29bcc093d2ab0165a99ff33ccc0e7a66a67f26 GIT binary patch literal 10404 zcmc(Fdpy(a|No-9x;xzNJ~@?8B4#0-L|CPzk<;XC2qlMc%VDvQ&Np(H8RamsIh&le zjBRz-kkeQgh7~!CW;xAa4&SN!^UwFs-|vs_+v8#H>#%FD>vg@Z*X#LwUDw~%mZtl5 zAKDE70QNzzU4a1rl8xeb{H`71|8@|)ed3QDp5~@k0GnHXxzxf`0N@A!dgaoMds+OU zh%8sTmz%Q!DDpoBzdycsL#QZmG}+_Ngd-1Cs%`@gVh^5^(Yw;U?aF(c#;%7d$K~?&cO`7wda-!%e^GIynp(ow;VAV?l03frDZeG}MJz1R zja9E^L0;d-$yXRUz5tf+0ywtx(|U!qF9LT0&g`Z?y7Sfk>u{R;``s|913Wy#1oJ(QK83=XocmM@!1ebA~&Fm88PG-TKqF zM91n7nP(|lTVr6gsm+Jd&l)}oK;`i(28_Fe7j~|$X;entb-Ta%_9~fx=7-$n{K0?Z zRS7V9V9XHgesH@TccAd zA3Kd!#pd9rHK66_0_cDli@v&Y-{`hz^>B@#ujt&rnvaS+-TM|ByE~cP!7L*(R=%%tV(%Sc$M}SC?#H?9=!%q+3`ioRKpxz?zfbe(H z<{gnPhdHoO%AZFh2}TTU1KiO|5ub$cmB6;$Mt7#^{l+~)HbRG;xwJF{HO*l%DB1L8M3lU%+5tBp@KzXNy zSbl2C@Up?i}Tuy|RhAo+|9 zE0%=32DH%8OuNvh5Ynkv(Kcf#8lGisd ztXBBhZec818-2!#r355IEYhGHcCU*ZVCwyU7ez$}>P)~T!o8ElGNRB01kCNFk@L!! z1qN%{^C8h()kxhJ3EgQ%v1cWzmE&4Xp)kwc8)mG)2$3t~`dKxwaUiM*!#Yg}xsDAj z!^^2MlYO( zj;dyB@($D<@)aF{%4t3v8G@O`eE%w1yCyX)c@g>F?R6S>s@as2bDT%FHLFsKJwh9)d^HFz4#kG!q~1*e?3w7)(ox1}x# zea4;j4Z|{GadZdl(7mal$@pruY+O<>#JIx^y`kZ2DK+eayK}{1>L^-h1%#)Z;8J6BedD=@?cvI^1S^1*bncChc>DHqQ%UowX!-q>_uh8}tRka;bZ6AyZRtJhygIsXC*Tc7VZZ3C`tqP}K0~*;>@*knEURy=|aYrt--byYtnQ!lu zvs8+8UGs?!EQa-3znC;zU(#-wx#8Mp5w{OWC~T1ls37jb=%p|4G@CN;&9dN3*efT# zDv;m|FOstME{a#!;UCszzx6}%cY=_W_6b}#tf%*EPBKnV3bVhLn-|y*_WM2>sc^RQ z(0+OF5TrkKWrgpQk04(&I1eUayX{Lh{nEV3vT!&)gcFWlc&rk#?gaJeqa7#Q;2UlY z+^GR7mDbaWO)m)m+3%Us3v6oEO$;oOb|ds|R~Sd=qdJ7oc)I43aCXZ^Iz6h@EK(P!hS1)cXalP*QTV#{RGEVf z@@4PyPh=9A>Nj?k1JWp%z~U9==Vez`3R-f{m-gb;-JsQ~oy_rT2Ij1%Kte?U=Jvw;$_54p_CSrb{9`y6#*Cx1)?D4* z*b1d|3OVrX`H?O;%^hfPfg{&(Y7$0$&1Y0`A{0kM=2~wugks}caYQeC&{Y1GF0*a+ zz*OYP2pi;6&r@%_>WjA=EFj94gtt{IPlc^sHsd{sJ@0GA6QF0T+pe#t9pHTfGwp`=1lL^)zICVw#0P(g*vEq~SO&I@Hn3_a;$v0U|`&LiPG-20=It zUVfZ5I|%CBB!r*~#>O&e+P)5qwjL=C?eZ)kl8ooetWVN0u&KNDHG@W9??A?v&vVl8 zn3DDZ`*!WHUdabDuBo^capW#rR{Y5FevVfL_D=D281f@QQa4VzG78m(N*s-sZgL!e z*w*!APqkbK+Bh8+NtNobD?1)a;Zwy<1GZ|ed>F~|5_vy^Bb5D7M7gEse8rOQ@iqI;t*4M+dwOSeO~`=V?ZG-ls$;mF~MZ&fCxS>S$}ZaOzZkQ};bj6fA< zKRx`e>KRuC(4NS>biyJarfuB^%Maoxx%jvgjIAe%!|Z{&4ow-(rg{+gO?;F(hgNEK z0aruyNn17jHmBTu-mT{@$2I`$Zm=N^bOI~*j)?V7!Z`GBVFr{R3`G`-HSqj6=Yw=V zH%#Uwm(%Jm%~3k$d(DiOrYRy8%amS<`&ZHjf`)kiT859!36XzGo?lbdSV84Nqz3UqVsZ<@1eS$b0=nKCPH6 ztqn6}#Xw(qlZ5~Lf;*GL@15tgySINd2mV`eS!pwJ?LUV-NqAp0O%LGzXTIEj0nkpU zGhI%Ua@6hWzYt>|wM{nls9WQ|MTF6(t>V>x5r&LW#^0|V+&gIc3wZT}=^Z$`ZT85e zUqu*3DW2G=aI?;e z$-v3Z<#owU?!W7J$M2WU9u!>trLF(hiZ|ag)S;ww|4wVi!7KzvI zUDfE5wT5sLmu&#a(&cs(?R7cezYU3NYbj4j5`Z1O9V;t|+Wun3;qjw--R4;n&vIYx z!M?z1Bcn|rzkgD=rQ-JiN!7tK4{p8#N+J}_xL0nCry0Y z)Yupl&b;U{3XU;T*g-PYqeKC$bvXG5fv0GVWdY`FRP*;88Zrj7 z$Iki!-XyemB`l?ezQrSYW;1EmSdZcky5icB3f07rE>`S4vtW^kT+ZIyx;~}+WrVX0 z%Nkm0?rdAR{qq2tgg)b@2qHML%F!Lzg;orDC#4VVi__ezkOpa$1iLiBNS&t5+a zmH76i3N+{&n=v1c&VdaYzSQRBU|4O#IU39i8Uf!fv#s+`9N>-}R4WbuMK>-856g#+ zLn-F0c679uKH)3dw{<3n4b>yL(&+mB!*a2ooL4GK@b=Jrnf{kD47y~|OfZxTU9H9Y z+nNQ1+w}{NqyNAzY-1pU9O>jgTO~k|MJHf`kDWAl5sViZg{nr!wxWe4us!I;v27Pe zz*hi(y^*9=y-Qaons%>LMn;!u`5t5JOPli!JgpYx!g3NLV}jQoDK+#w(B?V9Dj%(s z99n2VnFAAcJs$^2sOmuNe^QeN(W&g#;cj6UDM-iSacDfB_~N z>4#1heH(kP)V}RUo&IumnmgE6G)gi(L&^SW^9u@`(Yr?sIl{~prrb{|`IFF|Jks!X z&)nUcKl_|{2D4ssbVL8XReCUPvpWIIoh1EiI{C#cc2-QWe*4+9&0%)}@9NLJe#aPc zV^B;i0iDWE&rp7j2{`i~@p6fu+~Qvz3-IdD|E_TM&sPxl!2Z7HC)Zxxv(=%f>C%h9 ztuOxnJP!g1SM>mZH{ah-U*i?$TDf?P+Z!VoD`p&l6tgwo>(jD6CE8CqZ#e@rdPiM4?~*UTBewpxup zZEHp^uVOkv*}cKbn`Xcv*0Xm0S&o?TJjD;Gm7gdc5`GXP!-Yo}7)m*3+7OyLU1R_v z)R;s(;tNXh)lId;>M?e|CE}r5^!^@J=VgY~NCI}qh@;s>tI*x&Y|Z#2AE@)Cb-4gb z^qHDxqBd-e^=!~km8?8H3r2aJ6GyU255=hbMYCm{MmL(j()4xUpzQbDK(z`>(1GYP zmMlYPjGgQB3$-Xm)-yzm79sR5gXkp_%awpyA%o*`qC3|A5nh4DV9q$Rs?pKMd@*>0 z+PWAkA!2Hz9*vHvz2N0F*s+|^ZpAQRAfq)wTHB4SPj3AFutIP*#`liXiI_pFhH1ThzR_jLP9Y{O3026iHRHG-aF|xv0XMQI9a#6BM)Na|sWkd1@)6)}%-EeRO%N21{SgZxI~z>3j6)^o|f~hOFdE zcIUJQ&~J%wr1VnQ#+5*3LDXN`;zhOio7fF_kfR}%&c2e`I`fHy#Du2d$5buS7pxc= z?b$LzQQS;eiEM)fc0oX3XO5dXISk#67cP)Miy5pHTv`6cgHPKyi7R6|em6vQc)l9{ z_2fo9Ue;{DoHdDInWQ}d5+Ed8T1^SQMY|EwyV_%X$25j>7VM6NIa?Ff^w7hY8XAAL zhX`>G_AZUdoAli1$FLeSd*ZbF(qeSB0m2T2R)Zt}t5!-@`sPNv5)|P?rrmZ%p}DgT zp(ezPXM_$%*IZ-CmE1aFYlgD~szJf6nU>eG6?-75KAI9WdQ-mBr*20G2w(cX{ zj@FiFmr5t{`&{i^IklqF{UnFv1v^H2w)1I7lKt9xggGlc0G!HMPsYn3xIQS{hTk#3 zUfEE>jt7m0j{4rq4l8fGrO&q6eoBXcajQ6S9oTNOJtZ5D8MgMO`n}ZlRe-RkjMHGR z;I}x}ASXX-`aaEz5AEV3^`Qs?Md#XTt}OGsx$cLci0?c@JKVl|g!{ylxUquUnzvsN z>lR>A($g~O^~Z6qa6$H=`P%7P6&XepX5R)0Um>j{qjym}G=*rksB&`HJlJUS2u~OC zCneRBS18p#e2%bCp>)RU02G(JuperraeGudK$WMqxF)a&KJfZ&w5^)rQRoskW^*4p zG3$Kr$jAO_pXriPqBG%H)6CyYAkBn6ndfjZ82-%M0K$T!qYIa#gYuiBH(5PCyLSS- z#SpO5u@JhNftQnc|IY~syG=&goRN^+t-{NW%jGNXyECc*T>?F94y!MAN%g{x45^l@ z`<`WFe3lJMI5;D4yPhiDKXO*uY3en47~~rU-3g^!XKjZhF9t)#=jGzs<|1U82Ap*N zSoA_`V-{=~6KW9Qj5XBVdV4<^NRg^I=DP=yJMR;g;KeT=i43cCwXQqSQ`Up3FpG4Z zrMkMYq@kw~T%4GV=gm~31Fg4LG!Q*@o>?d+=%S7^UWT{v=#CU!RnudS-^)Ej;yJs3i z|9ZTwt(jhWVwWb*1)Z1{n#Tv(n%UJqle}1c?4;OGGBt}0!+%&ZGX9B@et+ldrA2Cc zkM19}*t)pA-$JNH(44a?3UM*WagC~v^WFLfIJVIJZNpp(DiSC$=&pGxK7LLp3kBPU znx?66!qZ0@KgMVbBX3!sfYMu-3Yrfm|M?SA5FP}@rG>`IGXGGA)@wZEso8nQIA|g+ zXo0~wxF&4N>KT_4P#{5|8F;Q)cpmC*@0yg<7mYOI^}~ivt7hAbp8q`2ku7>@svNa| z{r$l4fFRW39F2O$Bv>-<^V>lKX{vIZKgz_H(~3S5(D&vX)GsKgV!$>}>i+fM4__NG zENZPL0i$FyC|zVv>J$dYC9KJ!|46n%ddh?Vqk4z9v=qfrQ{TT_4^9xbf195ZM{0Ur*{+`k-bK`w!j3h|p|edpBJ6$g_w z9ug!qNs5_EB6~f4F~vIt^~N=oZxJ%|YFh<=Y1}~aoJ%DiHx}a7nY#XTp8|*x@BM(F4>?gfXL z!m<7mofvVV|DsnEZD&|Kk$g7FbG}Faw8#zOFsZU<4H>57Utgg*6gge4haeAy$Ji&-McvRn7uvc< z`>jX3$shVx%FDAipoa(<-~7{TE%k3vC8Z3l{mX0ZZ>_MUhcN0B{y&(Sf=hA!$Dx9h zP*X^MMQJx3zTexzKH+m&L+qQ%ktlcjfnH6X1_OQ7r{|98O>SVz^z3t$X=9e~l{kGT zgJbu`1rzw{Irm1!MSL=@@r8oJ!fr>)E&>Vx!LIFx#()$gv0uCN3^03ct$XMROybyQ`y2_?+EdIso(~7$(;SZvO(N%c%46Y84Hh;`) z5ofbE-_ax(q3TQHvt_t;Ana3T7~|f8IHYbN?7bPz2fct2$%QigqgLh=d)@HrUH8eU z;^VK)!Z_XcARt8-OprIf0P7-z72xHh;ZOW6T2iH*x=gzxs9$ivhfPVK#(S0y6a6K( zL~K&jfNvojn>72_^XU}l***o~8&yGNlTzBjQN9e^K1Q3DiV{$lK74p4wG=JlJG7}% ztMKCV_3G$~(P7(Bqig$r)R;RT;i*CwuV;i7sRq@JVVA!3KW`m%qgQk|ebtg-Q|pPm zvx}-;S<{>6*qaS1ZzvWlu z&wq`1y7%DR!;x1Tu;52uHr8m`WGW8f9?2tw%*l^fE*`hcTJ{M1>^`p#R`qQRtmg~= zaq`JN>qTAc6%kZ&!P@C`lP#hpTx7d*pDBj-J?zRimAjQDK(^O~OhkuGmy>CwwY6b6 zc!9=-(&35>@6u*@GSuM8tfD5jTfQV?VR{E+0(GCZLqX%=fQedd(xJ0cFN}efJf0-rrZhuH7%TXGs#X*d`|cj7ef6!ZUxSTClS4-x`s?#zS%k zHugGrQ(I!Y9idFnsdpb_4pvO}q`*OIwu?vt%`JXsV`_*3*LHwJR;j1RbGXdSF51=E zVKKu=Cr6FCq4;M_(E_p8$eZThfxNj3;mLE2SH7iYGwW=5KdNuIJNN-leT$#dl{H(X z=7GY?p~YB#1R@Ht{NrmhkB}Z9s*e!ug8Zny4Oy40d3=!Ow!N|b+p3NheQl1c5g6WZ zEM3uqV_R_D=}V&8Q(7^Dea0AyR=)q^eV(YAGccgkJL2RGBvuw$W*c+}{YlhbXMd`z zzA%iCW>2w4<08fna*UzDw&Qk;vSx<~+d=)vg-Kg!_SB=g^67ob#`n86M1mmB*(P_6 z@!Y~^E3#_Ld?t4d3Yq2h)PcgrkZbuX4P(&niQOaS+FEyfee2!{!2zh=GN(-|R#=>% zZ9B&cv6;UsL8gEBpY3UZ8HYpKbd}S-o$fgQfy8XfOllED<>i$(fsCd4jY00ExMBqo zvNddiGhCh*P{bE}n{y)7XE!AM%yyZ_JIBsaB1FD2oC-Vd)|P^Ciu%OrGY5SpTCA1v z(HK&_qT;BlT)%LKLcmF{?|qfxLq05D9pN6*eDv8GPL+FqzWsE7vY{^vuQTqYY;Dk} z#57vUQj1{2kx~6ZeUi={e}9*^qM3RoaRR*7A09{iJU_2rmXTFF1+!5=)O116_os>r zv67=!Mbb6t_YIT<6JaDmYR-Do1zAlw`A%& zAsvYIA@3+Pa-}rR&LNRMJv4L8ixA7$I1Y5^1%Lghk+9lSeedzQsT+!*f zWq`7ms9lRZ$U1QR`d@#X?;sD6=2}3?M?Y=hA_S^Q5!rA;d1+myX}RUc*AH?Cim&bj z#>lT*Ls0YC@^nBFF>++U-rjr0?S|a@?{yP7^`_?L@#1BK>o~sove2-iZO1!B%y`#Y zVtm^vF0eXXgE+Q`CfYE*!66=NtWBYeHA1f3J9iB-k&jgP)8o3e7jACaE;&gfZ zIOdw<)S#C~EM9D9g?$^-^Gt9M)Oa%YQGjS4$ET*YHoIghc2)x_NIkRVG&c$ib~eKH zn!NFBtCTjxnE*f)E5kdZ_wa(WjQWZrG4eWN!;fWtuEcT_?)mw3f-&GFJxQ3-5 z$kZ`VMS~|)N!RmA?ab7ocuLn_g{OG_=OifbL|Ri8T~S_+NL!s+RE=oM&?OJJX$NUP z+_>wp_8a4|H`sbDd+i=^9#5pWn%*>Bt{LU6e~3QV;Hr5=?iQYX+~nyi^Jgzu~;l(#>G+?H8%Jr-c#Zv zNMiYN;XB9R14S8~MC*g{6__QhiXKDz9!W3YabMIW-S{Qu=+PZVByaP!OWbPzk2%wsfDtf+#G#uT*YhD%b^Zujr=qx%Y&) zfFuU}h6%e?C%QH0HY}64;2zuBdw<>NC1$MG+v$Q9E>di}5F1o@H?XR?hjMf&-5ED_ zkFj|va?WYyq<3@jZ(3SfpVcgGoG|LKwUzz=z%Msg*|Zf64K0x-shvG9@I5lPC@Oo& zm4OsA#ku`HKRqY~=#<(@828UU^fVNhs@YlMZD%y8Nh+ey;OHoPUj6(NXTyvP!Y=Gn zVV;)4w^3}lI4A9PxRfQ3iJesM)(tcOJ`|Cq53cW!r?*0Y;u`vvp-(ZfCNDCm~4><0qK7&0`Gt+0>rksC3)K zuM%m;LC3d)_S$VPOnWJ)`Wi=gm4jZ0fp?>>28VomR0n6gV%55qIeJAXGnNXD1}M92 zI6}gGUwc9ecFMr7#lIW%hI|Q6#M{jqi!>+* z=gRMG;SnM^=~g+Ta(N%8y0v6!ufOOOyIQzyO+&}QZrBAM#-V@23^moD3f*(K!ja-r zpmHz3*4rbf6;TgUd|6*B?cZ)(wrhFDdV6b{6W3D$&s$l`_sbGJLI+|Ot{Tr+iI1aq zg-^Zwa_2_i65e3SjAbf4#N2$n>p_QI1HEY;r4Pw|v~bs9%8ye2(&&0H+y@wV#1QWo zvw9bT97>7%`-3b{f`?Lzf(Nf_J9vNF#El$p@sD%c`9Y0e++5;3JH#p4xrm>1vi2T| z$!iV-=Q@^BzArQg4xj_=PQ=@}rtc>qYt}6x$(xdpr;A|>g$pD zoRn#+FHvwi)3g1nXVipwcX0j`{(h9Z zT^aO#0^VUxSLom~0i-?K=e3nP)}z40x4%4!$q!YMd44DSjqGg`aAo@Wp?bq<9GkGZ zeB(D&o>llBN>MdQrMXPqe=slOj_-k<^g69l)NL;MW}NVa!(v#m=z}#>Vcc}=`k0Ay zYjoJFp-6x}k1`Nja@bzIi}P=}$RX4GCV_-E6y(ZeELH*xu8V z9mpF-9$Sb1fZUrU7PKDatD496`16S>fZR>pM)93F50CqBMXz!zyX{~0D6kI$F2-&F zrz4bXLH;tm>v){no2#L9rp)qU`HA%hdGW%F-UZ_PUXjmUDRIWuL(eQby`EyC8|&ci rWUH&adKU8F=LyHw5B{&`!H(rk%2%!3%|Ed7TTM`i - - -
back
back
front
front
"at": [0.35, 0.75]
"at": [0.35, 0.75]
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/transportation/geometric-scoping-range-light.png b/static/img/transportation/geometric-scoping-range-light.png new file mode 100644 index 0000000000000000000000000000000000000000..9c1499598b0f6ae95c7181a6bbfc05e9eb48d9fc GIT binary patch literal 6478 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 literal 0 HcmV?d00001 diff --git a/static/img/transportation/geometric-scoping-range-light.svg b/static/img/transportation/geometric-scoping-range-light.svg deleted file mode 100644 index b125d400f..000000000 --- a/static/img/transportation/geometric-scoping-range-light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
back
back
front
front
"at": [0.35, 0.75]
"at": [0.35, 0.75]
\ No newline at end of file diff --git a/static/img/transportation/heading-dark.png b/static/img/transportation/heading-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..597788cc1dd14fd9435a545d8178e6c1e128a61c GIT binary patch literal 11928 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 - - -
forward heading
forward he...
backward heading
backward h...
segment orientation
segment orientation
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/transportation/heading-light.png b/static/img/transportation/heading-light.png new file mode 100644 index 0000000000000000000000000000000000000000..fac3845c0f0763ed6842ad0490df62b188beca35 GIT binary patch literal 10747 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 J)%P4<{2P8s!BhYM literal 0 HcmV?d00001 diff --git a/static/img/transportation/heading-light.svg b/static/img/transportation/heading-light.svg deleted file mode 100644 index 5342146c8..000000000 --- a/static/img/transportation/heading-light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
forward heading
[Not supported by viewer]
backward heading
[Not supported by viewer]
segment orientation
segment orientation
\ No newline at end of file diff --git a/static/img/transportation/oriented-east-dark.png b/static/img/transportation/oriented-east-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a206f3234517d8ab6dae0c98ea56d47725b8adda GIT binary patch literal 6874 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 literal 0 HcmV?d00001 diff --git a/static/img/transportation/oriented-east-dark.svg b/static/img/transportation/oriented-east-dark.svg deleted file mode 100644 index 5a2bc4490..000000000 --- a/static/img/transportation/oriented-east-dark.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - -
[1, 0]
[1, 0]
[0, 0]
[0, 0]
[-1, 0]
[-1, 0]
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/transportation/oriented-east-light.png b/static/img/transportation/oriented-east-light.png new file mode 100644 index 0000000000000000000000000000000000000000..eefd53ba4c515bda580dc654484fca62d909d474 GIT binary patch literal 2921 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 Tx$Y9@-x+{5#hO$Zx!(E@8RU<+ literal 0 HcmV?d00001 diff --git a/static/img/transportation/oriented-east-light.svg b/static/img/transportation/oriented-east-light.svg deleted file mode 100644 index 27c0fd210..000000000 --- a/static/img/transportation/oriented-east-light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
[1, 0]
[1, 0]
[0, 0]
[0, 0]
[-1, 0]
[-1, 0]
\ No newline at end of file diff --git a/static/img/transportation/oriented-west-dark.png b/static/img/transportation/oriented-west-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..bb5c8fdf3ac4c90aa7895ca710b421477801ee1c GIT binary patch literal 6908 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 - - -
[1, 0]
[1, 0]
[0, 0]
[0, 0]
[-1, 0]
[-1, 0]
Text is not SVG - cannot display
\ No newline at end of file diff --git a/static/img/transportation/oriented-west-light.png b/static/img/transportation/oriented-west-light.png new file mode 100644 index 0000000000000000000000000000000000000000..c1121b3facfe10b5529963c679e9314571ad4c81 GIT binary patch literal 2937 zcmai0c{J4BA0A5#g|Q_J;zd-HeW}QnW@J~9WalMY%b>^@#!O_Lv9Bpb)r}uq-fBeq9=YGHEIrl#I^L?J@p6^Yxv#}K5m*NKi00NNn z<_-V=CzAc{0OVnheYRar><5pRm8Cg=^`kxPD8~W-`_&=lCQgxsD-!|9ioP=4>tAF+ zXS1)HCM}p)dJ>H&{NXZ%}`aAHdRteVDwRdhNnhCRA+1_e3@cc zfl`c!7W}bxT)$v*!E}k2COqj4$_|p4L9mxL@#m!utlMhj8F%@ZRg`Jx5mcuxoeSmm zkL^Z05ulXM88B6qf9**q<>TqzVb1-oC8yH5e{odE9&q zGfOleYSiz~P<+P<5Ir*U?L|80MK2s6m&~hB$e5jotf>G?cIPObx zu}Lb8%*M7SE5S0T?p<$N&?AzjPkh92ocbcpk}YBoOj{?)PW1}pPyRGONTO?!B4owi ztRmCETLt1^_7axrwJ`)sdh=6>nU3VF%$hfoVqwR&bQ0!M)+Zm+yMBw5j3u=B9Vk-z zmq?U%hYYPo1X9_y{j}H@Loe|0UO4Wlr~lg>!wtP>uiv_mwr~Bzo$-HT)-$1nKd|t> z&9k2SA#l|lu=AMRy};ssWTa9H)i2VV^EWJyog1?>rJxhPt;Coz&jqk64=NYiC|~^* zFo-Jrmd=mGj!?SePVUcymE{sVQ%W0=D_Ae)2bo_fQk@UQY241n-TM`K<;^1(or2hW zY(tiCv&1HSD-{Ul!yW2t^|Kg7wl)91SNfUIIJGq_0lb;fEc>Z^)b)S|q6jxDJb`D| zy0fV)2tKuCR=js`EhxUJ%tv?)FF!EB&uDt#VE780t%Y{zzRFL|JiVIa;uP1+doZ1akM;X?>xFlrRb3TLA>C^`vzb?pE;mDF!i+S~`4#qh$@#{$ zfJu^^3Na69JJ4AOWkub&SY**mT=`0HKNidC zt7k%pM@f_3qB!AJ*+^K2Z%EcKhaPBYocpu@gFkW)Y`l4(aWd`HvYMmQfM*Ebnik19 z+&q|)(hY`=J&H!H-4bB-7Xec)F#|Rm1(>V$9S3&xO7Sovj5xr@wRm97doG0kL4UU- zNs~?{3y8j|fX8Nt&h%10q0yB^>?F)~@J%B42Q8 zRz|A@8 z7(NIzbFN)NMc!#IRb%C<=-JkRBLbj2sW6FOrTUBD-I-sTSmix3wk;!;U24IF;0 zRp(T<-%G;omHg<VEHMH-a z0-l#AM5Zi=lldx8?z0%9?+haR`Xu0UbuymF;(ZLio4!S-_ zE|u~$tI(xtxX#5dxFUr7-C0N`D$K}@H`GX)Q2>Z8K6$W4K^rN}Gn7UFtvc@-*6nDM zo)|N&MnGm25sSocgJrp9IwTa1+U&i1<4P66SkKu?X5-X48HSEy7^JlayjFo@KkH0; z$#wiVYB*a!Ke zkGzfxFU_)!-l`rYHXFYXZ!J!_vD`2_NZK*d!r9bA;MLnns3?UhPrlNRTSO(U<>QZX z>fqX!^9}#=lc`yF*NLVO_*_a~MBn4DO)B6-A08j|mtlVO9#G=lL~+>b^+~ItHv@w1 z)?faEJ>&=U50w?9l~A-6&XQL|>tfzt+=s;w*lnSbYFDF{RAk2QGZ9G#gt(>J_ zI9`wB!hI=^PN&RRzi$tprJ|}gQ-khIgX=br-jy^A*L;%IqorLv6mf8zYx+0(xWTpQn{3ibXubG~MJ_B)`Rdn}1<>6VQCFkS%XfNl-;!^gm>w^3YKIjWI9+e; zb-q~COLN1aeS5JBZfC_wzUKH#8&aWvWlP6~UU=RX^PafJr{yp&$}@Nh*cf*NB$euZ zaxW50S@xScMT|mBat(6|aqzyQj@$$84uk75{1*gCHSJ3c#bMVw>qMneN<`E>@Oqxj ze!QgM&Px>M_@(tTq^yHU*}lDvhzJQheBW%!Q-jRR!l!<~%Y%F7FQ0U0DH#*)f3!#( zsCh9o{t3y^?o1UWS|Aa(o%%u9)cm}>E~E<;y~t{>W^-umi4Pg$1M6KEeMswRT~~&= zK-}mLHRZA(}cAz@#q?r z!-ZG1Bj*dSiv;nBRzc2fZkr>~xbvgBWTVvWSq=WhL$^i-z)%@%iIe7T>oGrju5duA z=W1_a*^F$@q@(T8#T+@Z`*!YEbpIJX$*~wxohy3f5EEZ0Qdd2siJm2w{_j7w>?Vsh Y=Zm=zj1LB3-=zT%3mfxVQ;)d+0?5O$tpET3 literal 0 HcmV?d00001 diff --git a/static/img/transportation/oriented-west-light.svg b/static/img/transportation/oriented-west-light.svg deleted file mode 100644 index 7d2d3760f..000000000 --- a/static/img/transportation/oriented-west-light.svg +++ /dev/null @@ -1,3 +0,0 @@ - - -
[1, 0]
[1, 0]
[0, 0]
[0, 0]
[-1, 0]
[-1, 0]
\ No newline at end of file diff --git a/static/img/transportation/splitter_concept.png b/static/img/transportation/splitter_concept.png new file mode 100644 index 0000000000000000000000000000000000000000..2bd33a42b388f72962c23375843d248fba38b7f1 GIT binary patch literal 71047 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 z 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 - - -
Stable GERS ID 1234
(minimize need to segment in the future)
Stable GERS ID 1234...
property X between 0.1 - 0.6
property X between 0.1 - 0...
1234@0.8..1
1234@0.8..1
1234@0.1..0.5
1234@0.1..0.5
1234@0.6..0.8
1234@0.6..0.8
property X
property X
1234@0..0.1
1234@0..0.1
1234@0.5..0.6
1234@0.5..0.6
property X
property X
splitter
splitter
\ No newline at end of file From 901679c0dcc4d84806c90b9e24d17e34e82a9e40 Mon Sep 17 00:00:00 2001 From: Dana Bauer Date: Tue, 3 Mar 2026 17:16:56 -0500 Subject: [PATCH 2/2] formatting --- docs/guides/index.mdx | 1 + docs/guides/transportation/linear-referencing.mdx | 2 +- docs/guides/transportation/overview.mdx | 2 +- docs/guides/transportation/scoping-and-travel-modes.mdx | 4 ++-- docs/guides/transportation/segments-and-connectors.mdx | 3 ++- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/guides/index.mdx b/docs/guides/index.mdx index 2b488f8e4..29408ede5 100644 --- a/docs/guides/index.mdx +++ b/docs/guides/index.mdx @@ -4,6 +4,7 @@ slug: /guides/ title: Guides sidebar_label: Overview description: Overture Maps guides +pagination_label: Guides --- import useBaseUrl from '@docusaurus/useBaseUrl'; diff --git a/docs/guides/transportation/linear-referencing.mdx b/docs/guides/transportation/linear-referencing.mdx index 008f7d053..f4f2d1991 100644 --- a/docs/guides/transportation/linear-referencing.mdx +++ b/docs/guides/transportation/linear-referencing.mdx @@ -1,5 +1,5 @@ --- -title: Linear referencing +title: Linear Referencing description: How Overture uses linear references to describe properties that vary along a segment pagination_label: Linear Referencing --- diff --git a/docs/guides/transportation/overview.mdx b/docs/guides/transportation/overview.mdx index bee20e91d..627579a58 100644 --- a/docs/guides/transportation/overview.mdx +++ b/docs/guides/transportation/overview.mdx @@ -14,7 +14,7 @@ import Routes from '!!raw-loader!@site/src/queries/duckdb/transportation_routes. import SpeedLimits from '!!raw-loader!@site/src/queries/athena/transportation_speed_limits.sql'; import ConnectingSegments from '!!raw-loader!@site/src/queries/athena/transportation_connecting_segments.sql'; -# Transportation guide +# Transportation Guide import DocCardList from '@theme/DocCardList'; diff --git a/docs/guides/transportation/scoping-and-travel-modes.mdx b/docs/guides/transportation/scoping-and-travel-modes.mdx index 8eadbe0cd..2d9ce2980 100644 --- a/docs/guides/transportation/scoping-and-travel-modes.mdx +++ b/docs/guides/transportation/scoping-and-travel-modes.mdx @@ -1,7 +1,7 @@ --- -title: Scoping rules and travel modes +title: Scoping Rules and Travel Modes description: How property values are constrained by location, time, and subject in the transportation schema -pagination_label: Scopint and Travel Modes +pagination_label: Scoping Rules and Travel Modes --- import Tabs from '@theme/Tabs'; diff --git a/docs/guides/transportation/segments-and-connectors.mdx b/docs/guides/transportation/segments-and-connectors.mdx index d709b7b5c..d367271ba 100644 --- a/docs/guides/transportation/segments-and-connectors.mdx +++ b/docs/guides/transportation/segments-and-connectors.mdx @@ -1,6 +1,7 @@ --- -title: Segments and connectors +title: Segments and Connectors description: Shape, connectivity, and linear referencing in the transportation schema +pagination_label: Segments and Connectors --- import CodeBlock from '@theme/CodeBlock';