Scoping rules
Scoped 和 rule-based 屬性
在現實世界中,許多影響實體的事實和規則具有部分適用性,意味著它們不是在所有地方都適用,或者不是在所有時間、所有人群或所有外部條件下都適用。例如,某段道路的通行限制可能不適用於所有人或所有類型的車輛,或者可能會根據星期幾而有所變化。
Overture schema 使用兩個相關概念來捕捉事實和規則的 通例:Scoped 和 rule-based 屬性。
Scoped values 和 scoping properties
Scoped 值是僅在有限範圍內適用的值。大多數 Scoped 值是 rule-based 屬性 中規則列表的一部分。然而,Scoped 值也存在於 rule-based properties 之外。例如,屬於道路段的標示屬性可能會幾何範圍限制於沿道路的位置。
Scoped 值適用的範圍由一個或多個稱為 scoping properties 的特殊子屬性控制。
幾何範圍限制 (線性引用)
- Description
- Example
幾何範圍限制屬性 at
和 between
分別將其父值的範圍限制為沿著段的幾何形狀的位置或位置範圍。當父值是一個規則對象時,該規則僅匹配 at
或 between
屬性中指定的位置或位置範圍。
at
屬性的值是一個單一實數 a
,其中 0
≤ a
≤ 1
。它表示段的幾何形狀上的一個離散位置。between
屬性的值是一對數字 [a, b]
,其中 0
≤ a
< b
≤ 1
。它表示段的幾何形狀上的一個位置範圍。數字 a
和 b
被解釋為沿著父段幾何形狀的百分比位移,從段的起點開始。 (“起點”和“終點”這些術語在 形狀和連接 中進行了解釋。)
例如,範圍限制屬性 "at": 0.15
將其父值限制為段上從起點開始偏移了段長度的 15% 的位置。
範圍限制屬性 "between": [0.35, 0.75]
將其父值限制為段上從起點開始偏移了段長度的 35% 到 75% 之間的範圍位置。
下面的範例顯示了一個道路段,其速度限制由兩個幾何範圍限制的速度限制規則定義:
---
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
時間範圍限制(營業時間)
- Description
- 範例
時間範圍限制結構 when: { during: "..." }
將其父值的範圍限制為一個或多個重複的時間區間。當父值是規則對象時,該規則僅匹配 during
屬性中指定的時間區間或時間區間集合。
during
屬性必須包含一個以 OpenStreetMap 營業時間規範 表達的字串。
during
屬性必須包含一個以 OpenStreetMap 開放時間規範 表達的字串。
下面的範例顯示了一個具有時間範圍限制的道路段。該規則指出,非公車旅客在平日的下午3點到6點之間禁止進入該段道路。
---
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"
主觀範圍限制
主觀範圍限制意味著屬性的範圍可以根據主觀因素來限制,例如誰或什麼正在使用交通網路,或如何使用。
Overture 交通模式架構支援以下主觀因素:
下面的小標題將更詳細地解釋這些主觀因素。
旅行模式範圍限制
旅行模式是指在交通網路中移動的方式,例如駕駛汽車,或更具體地說,駕駛高乘載量的車輛。
屬性構造 when: { mode: [...] }
將其父值的範圍限制為僅適用於使用列出旅行模式的人或物體。
要深入了解此主題,請參閱 旅行模式 頁面。
方向範圍限制
- Description
- Example
方向範圍限制將父值的範圍限制為僅在旅行者沿著段幾何形狀向指定方向(forward
或 backward
)行進時適用。 (方向 forward
和 backward
的定義見於 形狀和連接性 頁面。)
屬性構造 when: { heading: forward|backward }
將方向範圍限制應用於父值。
下面的例子顯示了一個擁有多個方向範圍限制的道路段。這些規則允許所有標準旅行模式在段的正向方向上行駛,但僅允許巴士在反向方向上行駛。
---
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]
使用目的範圍限制
- 說明
- 範例
使用目的範圍限制將父值的範圍限制為僅在使用者以列出的目的之一使用該功能時適用。這種範圍限制在需要確保人們正在進行如交付或作為業務客戶等活動時非常常見。
when: { using: [...] }
屬性構造將使用目的範圍限制應用於父值。
以下範例顯示了一段代表酒店車道的道路段,其中不允許通行(僅允許酒店客戶使用或作為最終目的地):
---
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] }
狀態範圍限制(會員資格)
- 說明
- 範例
狀態範圍限制將父值的範圍限制為僅在使用者擁有某種認可的狀態或是某個認可群體的成員時適用。這種類型的範圍限制在確保某人或某物具有某種認可的 Features 時非常有用,例如持有許可證或是企業的員工或學校的學生。
when: { recognized: [...] }
屬性構造將狀態範圍限制應用於父值。
以下範例顯示了一段建模為私人公寓 大樓車道的道路段,該車道對公眾封閉,但允許經過私下授權的人員使用,例如公寓單位的擁有者:
---
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] }
車輛屬性範圍限制
- 說明
- Example
車輛屬性範圍限制將父值的範圍限制為僅在使用的車輛符合某些標準時適用。
when: { vehicle: [{ dimension: ..., comparison: ..., value: ... }] }
屬性構造將車輛屬性範圍限制應用於父值。
請注意,車輛屬性範圍限制在某種程度上可能會與 旅行模式範圍限制 重疊。例如,某些通行規則可能以「重型貨車」作為範圍限制,而另一個等效的通行規則則可能以「總車輛重量」作為範圍限制。
---
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'
規則和基於規則的屬性
基於規則的 屬性是指其值在特定情況下由一組規則的評估結果決定的屬性。規則列表中的每個個別規則本身都是一個範圍限制值,而對於特定事實套件適用哪條規則的評估由規則評估算法進行。
絕對形式
在某些情況下,使用規則來指定屬性值是有意義的,而在某些情況下,這樣做則會使事情複雜化,因為被建模的現實世界實體具有單一且不變的狀態,這種狀態在所有事實情況下都是相同的。在這些情況下,大多數基於規則的屬性支援一種更簡單的絕對形式,無需規則列表。
考慮以下兩個道路段的例子。左側是一條簡單的雙向城市街道,在這條街道上,無論何時都有一條車道在每個方向上通行。右側是一條單行城市街道,其中兩條車道僅在一天中的特定時間可供行駛,其餘時間則保留用於停車。在左側的例子中,車道列表是絕對指定的;而在右側的例子中,則作為一組時間範圍限制的車道規則給出。
規則評估算法
給定一個基於規則的屬性,在特定事實模式下,該屬性的實際值是通過以下三個步驟過程來確定的:首先,識別所有匹配的規則;其次,選擇單一確定規則(如果可能);最後,如果沒有適用的規則,則可以假設一個適當的默認值。
-
匹配規則。 對於給定的規則和一組事實,如果該規則的範圍包含所有事實,即這些事實符合規則中表達的所有範圍屬性,則該規則與這些事實「匹 配」。規則的匹配標準可以看作是規則中表達的所有範圍屬性的邏輯與運算(AND)。
-
確定規則。 對於給定的基於規則的屬性和一組事實,最多只有一個規則可以「確定」屬性值。如果只有一個規則匹配,該規則確定屬性值。如果有多個規則匹配,則列表中最後一個匹配的規則確定該值。(這類似於 OpenStreetMap 條件限制 的評估方式。)因此,將更一般的規則寫在規則列表的前面是很重要的。
-
回到默認值。 如果沒有匹配的規則,則根據所評估的屬性,可能會應用一個適當的默認值。