{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "title": "segment",
  "description": "Segments are paths which can be traveled by people or things. Segments are compatible with GeoJSON LineString features.",
  "type": "object",
  "properties": {
    "id": {
      "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyDefinitions/id"
    },
    "geometry": {
      "description": "Segment's geometry which MUST be a LineSting as defined by GeoJSON schema.",
      "unevaluatedProperties": false,
      "allOf": [
        {
          "$ref": "https://geojson.org/schema/LineString.json"
        }
      ]
    },
    "properties": {
      "unevaluatedProperties": false,
      "required": [
        "theme",
        "type",
        "subtype"
      ],
      "allOf": [
        {
          "title": "Common Segment Properties",
          "properties": {
            "subclass_rules": {
              "$ref": "#/$defs/propertyContainers/subclassRulesContainer"
            },
            "access_restrictions": {
              "$ref": "#/$defs/propertyContainers/accessContainer"
            },
            "level": {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyDefinitions/level",
              "x-jsonld-id": "https://w3id.org/ogc/om/hasLevel"
            },
            "level_rules": {
              "$ref": "#/$defs/propertyContainers/levelRulesContainer"
            }
          }
        },
        {
          "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/overtureFeaturePropertiesContainer"
        },
        {
          "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/namesContainer"
        }
      ],
      "oneOf": [
        {
          "title": "Road-Specific Properties",
          "required": [
            "class"
          ],
          "properties": {
            "subtype": {
              "const": "road"
            },
            "class": {
              "$ref": "#/$defs/propertyDefinitions/roadClass"
            },
            "destinations": {
              "$ref": "#/$defs/propertyDefinitions/destinations"
            },
            "prohibited_transitions": {
              "$ref": "#/$defs/propertyContainers/prohibitedTransitionsContainer"
            },
            "road_surface": {
              "$ref": "#/$defs/propertyContainers/surfaceContainer",
              "x-jsonld-id": "osm:hasSurfaceType",
              "x-jsonld-base": "https://w3id.org/ogc/om/surfaces/"
            },
            "road_flags": {
              "$ref": "#/$defs/propertyContainers/roadFlagsContainer"
            },
            "speed_limits": {
              "$ref": "#/$defs/propertyContainers/speedLimitsContainer",
              "x-jsonld-id": "https://w3id.org/ogc/om/hasSpeedLimit"
            },
            "width_rules": {
              "$ref": "#/$defs/propertyContainers/widthRulesContainer"
            },
            "subclass": {
              "$ref": "#/$defs/propertyDefinitions/subclass"
            }
          }
        },
        {
          "title": "Rail-Specific Properties",
          "required": [
            "class"
          ],
          "properties": {
            "subtype": {
              "const": "rail"
            },
            "class": {
              "$ref": "#/$defs/propertyDefinitions/railClass"
            },
            "rail_flags": {
              "$ref": "#/$defs/propertyContainers/railFlagsContainer"
            }
          }
        },
        {
          "title": "Water-Specific Properties",
          "properties": {
            "subtype": {
              "const": "water"
            }
          }
        }
      ],
      "properties": {
        "theme": {
          "const": "transportation"
        },
        "type": {
          "const": "segment"
        },
        "subtype": {
          "description": "Broad category of transportation segment.",
          "type": "string",
          "enum": [
            "road",
            "rail",
            "water"
          ],
          "$comment": "Should not be confused with a transport mode. A segment kind has an (implied) set of default transport modes."
        },
        "connectors": {
          "description": "List of connectors which this segment is physically connected to and their relative 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.",
          "type": "array",
          "items": {
            "type": "object",
            "$comment": "Contains the GERS ID and relative position between 0 and 1 of a connector feature along the segment.",
            "unevaluatedProperties": false,
            "required": [
              "connector_id",
              "at"
            ],
            "properties": {
              "connector_id": {
                "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyDefinitions/id"
              },
              "at": {
                "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyDefinitions/linearlyReferencedPosition"
              }
            }
          },
          "uniqueItems": true,
          "minItems": 2,
          "default": []
        },
        "routes": {
          "$ref": "#/$defs/propertyDefinitions/routes"
        }
      },
      "x-jsonld-id": "@nest"
    }
  },
  "$defs": {
    "propertyDefinitions": {
      "destinationLabelType": {
        "description": "The type of object of the destination label.",
        "type": "string",
        "enum": [
          "street",
          "country",
          "route_ref",
          "toward_route_ref",
          "unknown"
        ]
      },
      "destinations": {
        "description": "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.",
        "type": "array",
        "items": {
          "type": "object",
          "unevaluatedProperties": false,
          "required": [
            "from_connector_id",
            "to_connector_id",
            "to_segment_id",
            "final_heading"
          ],
          "anyOf": [
            {
              "required": [
                "labels"
              ]
            },
            {
              "required": [
                "symbols"
              ]
            }
          ],
          "properties": {
            "labels": {
              "description": "Labeled destinations that can be reached by following the segment.",
              "type": "array",
              "items": {
                "type": "object",
                "unevaluatedProperties": false,
                "required": [
                  "value",
                  "type"
                ],
                "properties": {
                  "value": {
                    "description": "Names the object that is reached",
                    "type": "string",
                    "pattern": "^(\\S.*)?\\S$"
                  },
                  "type": {
                    "$ref": "#/$defs/propertyDefinitions/destinationLabelType"
                  }
                }
              },
              "minItems": 1,
              "uniqueItems": true
            },
            "symbols": {
              "description": "A collection of symbols or icons present on the sign next to current destination label.",
              "type": "array",
              "items": {
                "$ref": "#/$defs/propertyDefinitions/destinationSignSymbol"
              },
              "uniqueItems": true,
              "minLength": 1
            },
            "from_connector_id": {
              "description": "Identifies the point of physical connection on this segment before which the destination sign or marking is visible.",
              "type": "string"
            },
            "to_segment_id": {
              "description": "Identifies the segment to transition to reach the destination(s) labeled on the sign or marking.",
              "type": "string"
            },
            "to_connector_id": {
              "description": "Identifies the point of physical connection on the segment identified by 'to_segment_id' to transition to for reaching the destination(s).",
              "type": "string"
            },
            "when": {
              "allOf": [
                {
                  "$ref": "#/$defs/propertyContainers/headingScopeContainer"
                }
              ],
              "minProperties": 1,
              "unevaluatedProperties": false
            },
            "final_heading": {
              "description": "Direction of travel on the segment identified by 'to_segment_id' that leads to the destination.",
              "$ref": "#/$defs/propertyDefinitions/heading"
            }
          }
        }
      },
      "roadClass": {
        "description": "Captures the kind of road and its position in the road network hierarchy.",
        "type": "string",
        "enum": [
          "motorway",
          "primary",
          "secondary",
          "tertiary",
          "residential",
          "living_street",
          "trunk",
          "unclassified",
          "service",
          "pedestrian",
          "footway",
          "steps",
          "path",
          "track",
          "cycleway",
          "bridleway",
          "unknown"
        ]
      },
      "railClass": {
        "description": "Captures the kind of rail segment.",
        "type": "string",
        "enum": [
          "funicular",
          "light_rail",
          "monorail",
          "narrow_gauge",
          "standard_gauge",
          "subway",
          "tram",
          "unknown"
        ]
      },
      "heading": {
        "description": "Enumerates possible travel headings along segment geometry.",
        "type": "string",
        "enum": [
          "forward",
          "backward"
        ]
      },
      "travelMode": {
        "description": "Enumerates possible travel modes. Some modes represent groups of modes.",
        "type": "string",
        "enum": [
          "vehicle",
          "motor_vehicle",
          "car",
          "truck",
          "motorcycle",
          "foot",
          "bicycle",
          "bus",
          "hgv",
          "hov",
          "emergency"
        ],
        "$comment": "motor_vehicle includes car, truck and motorcycle"
      },
      "destinationSignSymbol": {
        "description": "Indicates what special symbol/icon is present on a signpost, visible as road marking or similar.",
        "type": "string",
        "enum": [
          "motorway",
          "airport",
          "hospital",
          "center",
          "industrial",
          "parking",
          "bus",
          "train_station",
          "rest_area",
          "ferry",
          "motorroad",
          "fuel",
          "viewpoint",
          "fuel_diesel",
          "food",
          "lodging",
          "info",
          "camp_site",
          "interchange",
          "restrooms"
        ]
      },
      "roadFlag": {
        "description": "Simple flags that can be on or off for a road segment. Specifies physical characteristics and can overlap.",
        "type": "string",
        "enum": [
          "is_bridge",
          "is_link",
          "is_tunnel",
          "is_under_construction",
          "is_abandoned",
          "is_covered",
          "is_indoor"
        ]
      },
      "railFlag": {
        "description": "Simple flags that can be on or off for a railway segment. Specifies physical characteristics and can overlap.",
        "type": "string",
        "enum": [
          "is_bridge",
          "is_tunnel",
          "is_under_construction",
          "is_abandoned",
          "is_covered",
          "is_passenger",
          "is_freight",
          "is_disused"
        ]
      },
      "roadSurface": {
        "description": "Physical surface of the road",
        "type": "string",
        "enum": [
          "unknown",
          "paved",
          "unpaved",
          "gravel",
          "dirt",
          "paving_stones",
          "metal"
        ]
      },
      "routes": {
        "description": "Routes this segment belongs to",
        "type": "array",
        "items": {
          "type": "object",
          "unevaluatedProperties": false,
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "properties": {
            "name": {
              "description": "Full name of the route",
              "type": "string",
              "minLength": 1,
              "pattern": "^(\\S.*)?\\S$"
            },
            "network": {
              "description": "Name of the highway system this route belongs to",
              "type": "string",
              "minLength": 1,
              "pattern": "^(\\S.*)?\\S$"
            },
            "ref": {
              "description": "Code or number used to reference the route",
              "type": "string",
              "minLength": 1,
              "pattern": "^(\\S.*)?\\S$"
            },
            "symbol": {
              "description": "URL or description of route signage",
              "type": "string",
              "minLength": 1,
              "pattern": "^(\\S.*)?\\S$"
            },
            "wikidata": {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyDefinitions/wikidata"
            }
          }
        }
      },
      "subclass": {
        "description": "Refines expected usage of the segment, must not overlap.",
        "type": "string",
        "enum": [
          "link",
          "sidewalk",
          "crosswalk",
          "parking_aisle",
          "driveway",
          "alley",
          "cycle_crossing"
        ]
      },
      "speed": {
        "description": "A speed value, i.e. a certain number of distance units travelled per unit time.",
        "type": "object",
        "properties": {
          "value": {
            "description": "Speed value",
            "type": "integer",
            "minimum": 1,
            "maximum": 350,
            "x-jsonld-id": "rdf:value"
          },
          "unit": {
            "description": "Speed unit",
            "type": "string",
            "enum": [
              "km/h",
              "mph"
            ],
            "x-jsonld-id": "http://qudt.org/schema/qudt/hasUnit"
          }
        },
        "required": [
          "value",
          "unit"
        ],
        "unevaluatedProperties": false
      },
      "purposeOfUse": {
        "description": "Reason why a person or entity travelling on the transportation network is using a particular location.",
        "type": "string",
        "enum": [
          "as_customer",
          "at_destination",
          "to_deliver",
          "to_farm",
          "for_forestry"
        ]
      },
      "recognizedStatus": {
        "description": "Status of the person or entity travelling as recognized by authorities controlling the particular location",
        "type": "string",
        "enum": [
          "as_permitted",
          "as_private",
          "as_disabled",
          "as_employee",
          "as_student"
        ]
      },
      "integerRelation": {
        "description": "Completes an integer relational expression of the form <lhs> <operator> <integer_value>. An example of such an expression is:\n  `{ axle_count: { is_more_than: 2 } }`.",
        "type": "object",
        "unevaluatedProperties": false,
        "oneOf": [
          {
            "required": [
              "is_more_than"
            ],
            "properties": {
              "is_more_than": {
                "type": "integer"
              }
            }
          },
          {
            "required": [
              "is_at_least"
            ],
            "properties": {
              "is_at_least": {
                "type": "integer"
              }
            }
          },
          {
            "required": [
              "is_equal_to"
            ],
            "properties": {
              "is_equal_to": {
                "type": "integer"
              }
            }
          },
          {
            "required": [
              "is_at_most"
            ],
            "properties": {
              "is_at_most": {
                "type": "integer"
              }
            }
          },
          {
            "required": [
              "is_less_than"
            ],
            "properties": {
              "is_less_than": {
                "type": "integer"
              }
            }
          }
        ]
      },
      "vehicleScopeDimension": {
        "description": "Enumerates possible vehicle dimensions for use in restrictions",
        "type": "string",
        "enum": [
          "axle_count",
          "height",
          "length",
          "weight",
          "width"
        ]
      },
      "vehicleScopeComparison": {
        "description": "Enumerates possible comparison operators for use in scoping",
        "type": "string",
        "enum": [
          "greater_than",
          "greater_than_equal",
          "equal",
          "less_than",
          "less_than_equal"
        ]
      },
      "vehicleScopeUnit": {
        "description": "Parent enum of both length and width for use in vehicle scoping",
        "anyOf": [
          {
            "$ref": "#/$defs/propertyDefinitions/lengthUnit"
          },
          {
            "$ref": "#/$defs/propertyDefinitions/weightUnit"
          }
        ]
      },
      "lengthUnit": {
        "description": "Enumerates length units supported by the Overture schema.",
        "$comment": "Keep in sync with `combobulib/measure.py`.",
        "type": "string",
        "enum": [
          "in",
          "ft",
          "yd",
          "mi",
          "cm",
          "m",
          "km"
        ]
      },
      "lengthValueWithUnit": {
        "description": "Combines a length value with a length unit.",
        "type": "object",
        "unevaluatedProperties": false,
        "required": [
          "value",
          "unit"
        ],
        "properties": {
          "value": {
            "type": "number",
            "minimum": 0
          },
          "unit": {
            "$ref": "#/$defs/propertyDefinitions/lengthUnit"
          }
        }
      },
      "lengthRelation": {
        "description": "Completes a length relational expression of the form <lhs> <operator> <length_value>. An example of such an expression is:\n  `{ height: { is_less_than: { value: 3, unit: 'm' } } }`.",
        "type": "object",
        "unevaluatedProperties": false,
        "oneOf": [
          {
            "required": [
              "is_more_than"
            ],
            "properties": {
              "is_more_than": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/lengthValueWithUnit"
                  }
                ]
              }
            }
          },
          {
            "required": [
              "is_at_least"
            ],
            "properties": {
              "is_at_least": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/lengthValueWithUnit"
                  }
                ]
              }
            }
          },
          {
            "required": [
              "is_equal_to"
            ],
            "properties": {
              "is_equal_to": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/lengthValueWithUnit"
                  }
                ]
              }
            }
          },
          {
            "required": [
              "is_at_most"
            ],
            "properties": {
              "is_at_most": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/lengthValueWithUnit"
                  }
                ]
              }
            }
          },
          {
            "required": [
              "is_less_than"
            ],
            "properties": {
              "is_less_than": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/lengthValueWithUnit"
                  }
                ]
              }
            }
          }
        ]
      },
      "weightUnit": {
        "description": "Enumerates weight units supported by the Overture schema.",
        "$comment": "Keep in sync with `combobulib/measure.py`.",
        "type": "string",
        "enum": [
          "oz",
          "lb",
          "st",
          "lt",
          "g",
          "kg",
          "t"
        ]
      },
      "weightValueWithUnit": {
        "description": "Combines a weight value with a weight unit.",
        "type": "object",
        "unevaluatedProperties": false,
        "required": [
          "value",
          "unit"
        ],
        "properties": {
          "value": {
            "type": "number",
            "minimum": 0
          },
          "unit": {
            "$ref": "#/$defs/propertyDefinitions/weightUnit"
          }
        }
      },
      "weightRelation": {
        "description": "Completes a weight relational expression of the form <lhs> <operator> <weight_value>. An example of such an expression is:\n  `{ weight: { is_more_than: { value: 2, unit: 't' } } }`.",
        "type": "object",
        "unevaluatedProperties": false,
        "oneOf": [
          {
            "required": [
              "is_more_than"
            ],
            "properties": {
              "is_more_than": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/weightValueWithUnit"
                  }
                ]
              }
            }
          },
          {
            "required": [
              "is_at_least"
            ],
            "properties": {
              "is_at_least": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/weightValueWithUnit"
                  }
                ]
              }
            }
          },
          {
            "required": [
              "is_equal_to"
            ],
            "properties": {
              "is_equal_to": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/weightValueWithUnit"
                  }
                ]
              }
            }
          },
          {
            "required": [
              "is_at_most"
            ],
            "properties": {
              "is_at_most": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/weightValueWithUnit"
                  }
                ]
              }
            }
          },
          {
            "required": [
              "is_less_than"
            ],
            "properties": {
              "is_less_than": {
                "allOf": [
                  {
                    "$ref": "#/$defs/propertyDefinitions/weightValueWithUnit"
                  }
                ]
              }
            }
          }
        ]
      },
      "width": {
        "type": "number",
        "exclusiveMinimum": 0
      },
      "sequenceEntry": {
        "description": "A segment/connector pair in a prohibited transition sequence.",
        "type": "object",
        "required": [
          "connector_id",
          "segment_id"
        ],
        "properties": {
          "connector_id": {
            "description": "Identifies the point of physical connection between the previous segment in the sequence and the segment in this sequence entry.",
            "type": "string"
          },
          "segment_id": {
            "description": "Identifies the segment that the previous segment in the sequence is physically connected to via the sequence entry's connector.",
            "type": "string"
          }
        }
      }
    },
    "propertyContainers": {
      "headingScopeContainer": {
        "description": "Properties defining travel headings that match a rule.",
        "properties": {
          "heading": {
            "$ref": "#/$defs/propertyDefinitions/heading"
          }
        }
      },
      "purposeOfUseScopeContainer": {
        "description": "Properties defining usage purposes that match a rule.",
        "properties": {
          "using": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/propertyDefinitions/purposeOfUse"
            },
            "uniqueItems": true,
            "minLength": 1
          }
        }
      },
      "temporalScopeContainer": {
        "$comment": "Temporal scoping properties defining the time spans when a recurring rule is active.",
        "properties": {
          "during": {
            "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyDefinitions/openingHours"
          }
        }
      },
      "travelModeScopeContainer": {
        "description": "Properties defining travel modes that match a rule.",
        "type": "object",
        "properties": {
          "mode": {
            "description": "Travel mode(s) to which the rule applies",
            "type": "array",
            "items": {
              "$ref": "#/$defs/propertyDefinitions/travelMode"
            },
            "uniqueItems": true,
            "minLength": 1
          }
        }
      },
      "recognizedStatusScopeContainer": {
        "description": "Properties defining statuses that match a rule.",
        "properties": {
          "recognized": {
            "type": "array",
            "items": {
              "$ref": "#/$defs/propertyDefinitions/recognizedStatus"
            },
            "uniqueItems": true,
            "minLength": 1
          }
        }
      },
      "vehicleScopeContainer": {
        "description": "Properties defining vehicle attributes for which a rule is active.",
        "type": "object",
        "properties": {
          "vehicle": {
            "description": "Vehicle attributes for which the rule applies",
            "type": "array",
            "uniqueItems": true,
            "minLength": 1,
            "items": {
              "description": "An individual vehicle scope rule",
              "type": "object",
              "unevaluatedProperties": false,
              "required": [
                "dimension",
                "comparison",
                "value"
              ],
              "properties": {
                "dimension": {
                  "$ref": "#/$defs/propertyDefinitions/vehicleScopeDimension"
                },
                "comparison": {
                  "$ref": "#/$defs/propertyDefinitions/vehicleScopeComparison"
                },
                "value": {
                  "type": "number",
                  "minimum": 0,
                  "x-jsonld-id": "rdf:value"
                },
                "unit": {
                  "$ref": "#/$defs/propertyDefinitions/vehicleScopeUnit",
                  "x-jsonld-id": "http://qudt.org/vocab/unit/"
                }
              }
            }
          }
        }
      },
      "speedLimitsContainer": {
        "description": "Rules governing speed on this road segment",
        "type": "array",
        "items": {
          "description": "An individual speed limit rule",
          "$comment": "TODO: Speed limits probably have directionality, so should factor out a headingScopeContainer for this purpose and use it to introduce an optional direction property in each rule.",
          "type": "object",
          "anyOf": [
            {
              "required": [
                "min_speed"
              ]
            },
            {
              "required": [
                "max_speed"
              ]
            }
          ],
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "unevaluatedProperties": false,
          "properties": {
            "min_speed": {
              "$ref": "#/$defs/propertyDefinitions/speed",
              "x-jsonld-id": "https://w3id.org/ogc/om/hasMinSpeed"
            },
            "max_speed": {
              "$ref": "#/$defs/propertyDefinitions/speed",
              "x-jsonld-id": "https://w3id.org/ogc/om/hasMaxSpeed"
            },
            "is_max_speed_variable": {
              "description": "Indicates a variable speed corridor",
              "type": "boolean",
              "default": false,
              "x-jsonld-id": "https://w3id.org/ogc/om/isMaxSpeedVariable"
            },
            "when": {
              "allOf": [
                {
                  "$ref": "#/$defs/propertyContainers/temporalScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/headingScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/purposeOfUseScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/recognizedStatusScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/travelModeScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/vehicleScopeContainer"
                }
              ],
              "minProperties": 1,
              "unevaluatedProperties": false,
              "x-jsonld-id": "https://w3id.org/ogc/om/when",
              "x-jsonld-type": "@json"
            }
          }
        },
        "minLength": 1,
        "uniqueItems": true
      },
      "accessContainer": {
        "description": "Rules governing access to this road segment",
        "type": "array",
        "items": {
          "type": "object",
          "unevaluatedProperties": false,
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "required": [
            "access_type"
          ],
          "properties": {
            "access_type": {
              "type": "string",
              "enum": [
                "allowed",
                "denied",
                "designated"
              ]
            },
            "when": {
              "allOf": [
                {
                  "$ref": "#/$defs/propertyContainers/temporalScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/headingScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/purposeOfUseScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/recognizedStatusScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/travelModeScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/vehicleScopeContainer"
                }
              ],
              "minProperties": 1,
              "unevaluatedProperties": false
            }
          },
          "minLength": 1,
          "uniqueItems": true
        }
      },
      "prohibitedTransitionsContainer": {
        "description": "Rules preventing transitions from this segment to another segment.",
        "type": "array",
        "items": {
          "type": "object",
          "unevaluatedProperties": false,
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "required": [
            "sequence",
            "final_heading"
          ],
          "properties": {
            "sequence": {
              "description": "Ordered sequence of connector/segment pairs that it is prohibited to follow from this segment.",
              "type": "array",
              "items": {
                "description": "Pair of segment and connector IDs along the sequence",
                "$ref": "#/$defs/propertyDefinitions/sequenceEntry"
              },
              "minItems": 1,
              "uniqueItems": true
            },
            "final_heading": {
              "description": "Direction of travel that is prohibited on the destination segment of the sequence.",
              "$ref": "#/$defs/propertyDefinitions/heading"
            },
            "when": {
              "allOf": [
                {
                  "$ref": "#/$defs/propertyContainers/headingScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/temporalScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/purposeOfUseScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/recognizedStatusScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/travelModeScopeContainer"
                },
                {
                  "$ref": "#/$defs/propertyContainers/vehicleScopeContainer"
                }
              ],
              "minProperties": 1,
              "unevaluatedProperties": false
            }
          }
        }
      },
      "roadFlagsContainer": {
        "description": "Set of boolean attributes applicable to roads. May be specified either as a single flag array of flag values, or as an array of flag rules.",
        "type": "array",
        "items": {
          "type": "object",
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "unevaluatedProperties": false,
          "properties": {
            "values": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/propertyDefinitions/roadFlag"
              },
              "uniqueItems": true,
              "minLength": 1
            }
          }
        },
        "uniqueItems": true,
        "minLength": 1
      },
      "railFlagsContainer": {
        "description": "Set of boolean attributes applicable to railways. May be specified either as a single flag array of flag values, or as an array of flag rules.",
        "type": "array",
        "items": {
          "type": "object",
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "unevaluatedProperties": false,
          "properties": {
            "values": {
              "type": "array",
              "items": {
                "$ref": "#/$defs/propertyDefinitions/railFlag"
              },
              "uniqueItems": true,
              "minLength": 1
            }
          }
        },
        "uniqueItems": true,
        "minLength": 1
      },
      "levelRulesContainer": {
        "description": "Defines the Z-order, i.e. stacking order, of the road segment.",
        "type": "array",
        "items": {
          "description": "A single level rule defining the Z-order, i.e. stacking order, applicable within a given scope on the road segment.",
          "type": "object",
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "unevaluatedProperties": false,
          "required": [
            "value"
          ],
          "properties": {
            "value": {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyDefinitions/level"
            }
          }
        }
      },
      "subclassRulesContainer": {
        "description": "Set of subclasses scoped along segment",
        "type": "array",
        "items": {
          "type": "object",
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "unevaluatedProperties": false,
          "properties": {
            "value": {
              "$ref": "#/$defs/propertyDefinitions/subclass"
            }
          }
        }
      },
      "surfaceContainer": {
        "description": "Physical surface of the road. May either be specified as a single global value for the segment, or as an array of surface rules.",
        "type": "array",
        "items": {
          "type": "object",
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "unevaluatedProperties": false,
          "properties": {
            "value": {
              "$ref": "#/$defs/propertyDefinitions/roadSurface",
              "x-jsonld-id": "@id"
            }
          }
        },
        "minItems": 1,
        "uniqueItems": true,
        "$comment": "We should likely restrict the available surface types to the subset of the common OSM surface=* tag values that are useful both for routing and for map tile rendering."
      },
      "widthRulesContainer": {
        "description": "Edge-to-edge width of the road modeled by this segment, in meters.\nExamples: (1) If this segment models a carriageway without sidewalk, this value represents the edge-to-edge width of the carriageway, inclusive of any shoulder. (2) If this segment models a sidewalk by itself, this value represents the edge-to-edge width of the sidewalk. (3) If this segment models a combined sidewalk and carriageway, this value represents the edge-to-edge width inclusive of sidewalk.",
        "type": "array",
        "items": {
          "type": "object",
          "allOf": [
            {
              "$ref": "https://ogcincubator.github.io/bblocks-overturemaps/build/annotated/overturemaps/schemas/definitions/schema.json#/$defs/propertyContainers/geometricRangeScopeContainer"
            }
          ],
          "required": [
            "value"
          ],
          "properties": {
            "value": {
              "$ref": "#/$defs/propertyDefinitions/width"
            }
          },
          "unevaluatedProperties": false
        },
        "minItems": 1,
        "uniqueItems": true
      }
    }
  },
  "x-jsonld-prefixes": {
    "om": "https://w3id.org/ogc/om/",
    "qudt": "http://qudt.org/schema/qudt/"
  }
}