Coverage for src/overturetoosm/segments.py: 99%

205 statements  

« prev     ^ index     » next       coverage.py v7.6.1, created at 2025-07-22 06:43 -0400

1"""Pydantic models needed for transportation segments. 

2 

3Partly autogenerated by datamodel-codegen. 

4""" 

5 

6from enum import Enum 

7from typing import Any 

8 

9try: 

10 from typing import Annotated 

11except ImportError: 

12 from typing import Annotated 

13 

14from pydantic import BaseModel, ConfigDict, Field, RootModel 

15 

16from .objects import Names, Sources, Wikidata 

17 

18 

19class Subtype(str, Enum): 

20 """Model for transportation segment subtype.""" 

21 

22 road = "road" 

23 rail = "rail" 

24 water = "water" 

25 

26 

27class AccessType(str, Enum): 

28 """Model for transportation segment access type.""" 

29 

30 allowed = "allowed" 

31 denied = "denied" 

32 designated = "designated" 

33 

34 

35class Id(RootModel): 

36 """Model for transportation segment id. 

37 

38 A feature ID. This may be an ID associated with the Global Entity Reference System 

39 (GERS) if—and-only-if the feature represents an entity that is part of GERS. 

40 """ 

41 

42 root: str 

43 

44 

45class Level(RootModel): 

46 """Model for transportation segment level.""" 

47 

48 root: int = Field(default=0) 

49 

50 

51class LinearlyReferencedPosition(RootModel): 

52 """Model for transportation segment linearly referenced position.""" 

53 

54 root: Annotated[float, Field(strict=True, ge=0.0, le=1.0)] 

55 

56 

57class LinearlyReferencedRange(RootModel): 

58 """Model for transportation segment linearly referenced range.""" 

59 

60 root: Annotated[list, Field(float, min_length=2, max_length=2)] 

61 

62 

63class RoadClass(str, Enum): 

64 """Model for transportation segment road class.""" 

65 

66 motorway = "motorway" 

67 primary = "primary" 

68 secondary = "secondary" 

69 tertiary = "tertiary" 

70 residential = "residential" 

71 living_street = "living_street" 

72 trunk = "trunk" 

73 unclassified = "unclassified" 

74 service = "service" 

75 pedestrian = "pedestrian" 

76 footway = "footway" 

77 steps = "steps" 

78 path = "path" 

79 track = "track" 

80 cycleway = "cycleway" 

81 bridleway = "bridleway" 

82 sidewalk = "sidewalk" 

83 crosswalk = "crosswalk" 

84 parking_aisle = "parking_aisle" 

85 driveway = "driveway" 

86 alley = "alley" 

87 cycle_crossing = "cycle_crossing" 

88 unknown = "unknown" 

89 

90 

91class Subclass(str, Enum): 

92 """Model for transportation segment subclass.""" 

93 

94 link = "link" 

95 sidewalk = "sidewalk" 

96 crosswalk = "crosswalk" 

97 parking_aisle = "parking_aisle" 

98 driveway = "driveway" 

99 alley = "alley" 

100 cycle_crossing = "cycle_crossing" 

101 

102 

103class TemporalScopeContainer(BaseModel): 

104 """Model for transportation segment temporal scope container.""" 

105 

106 during: Any | None = None 

107 

108 

109class Heading(str, Enum): 

110 """Model for transportation segment heading.""" 

111 

112 forward = "forward" 

113 backward = "backward" 

114 

115 

116class PurposeOfUse(str, Enum): 

117 """Model for transportation segment purpose of use.""" 

118 

119 as_customer = "as_customer" 

120 at_destination = "at_destination" 

121 to_deliver = "to_deliver" 

122 to_farm = "to_farm" 

123 for_forestry = "for_forestry" 

124 

125 

126class RecognizedStatus(str, Enum): 

127 """Model for transportation segment recognized status.""" 

128 

129 as_permitted = "as_permitted" 

130 as_private = "as_private" 

131 as_disabled = "as_disabled" 

132 as_employee = "as_employee" 

133 as_student = "as_student" 

134 

135 

136class TravelMode(str, Enum): 

137 """Model for transportation segment travel mode.""" 

138 

139 vehicle = "vehicle" 

140 motor_vehicle = "motor_vehicle" 

141 car = "car" 

142 truck = "truck" 

143 motorcycle = "motorcycle" 

144 foot = "foot" 

145 bicycle = "bicycle" 

146 bus = "bus" 

147 hgv = "hgv" 

148 hov = "hov" 

149 emergency = "emergency" 

150 

151 

152class VehicleScopeComparison(str, Enum): 

153 """Model for transportation segment vehicle scope comparison.""" 

154 

155 greater_than = "greater_than" 

156 greater_than_equal = "greater_than_equal" 

157 equal = "equal" 

158 less_than = "less_than" 

159 less_than_equal = "less_than_equal" 

160 

161 

162class VehicleScopeDimension(str, Enum): 

163 """Model for transportation segment vehicle scope dimension.""" 

164 

165 axle_count = "axle_count" 

166 height = "height" 

167 length = "length" 

168 weight = "weight" 

169 width = "width" 

170 

171 

172class LengthUnit(str, Enum): 

173 """Model for transportation segment length unit.""" 

174 

175 in_ = "in" 

176 ft = "ft" 

177 yd = "yd" 

178 mi = "mi" 

179 cm = "cm" 

180 m = "m" 

181 km = "km" 

182 

183 

184class WeightUnit(str, Enum): 

185 """Model for transportation segment weight unit.""" 

186 

187 oz = "oz" 

188 lb = "lb" 

189 st = "st" 

190 lt = "lt" 

191 g = "g" 

192 kg = "kg" 

193 t = "t" 

194 

195 

196class Connector(BaseModel): 

197 """Model for transportation segment connector.""" 

198 

199 connector_id: Id 

200 at: LinearlyReferencedPosition 

201 

202 

203class LevelRules(BaseModel): 

204 """Model for transportation segment level rules container item.""" 

205 

206 value: Level 

207 between: LinearlyReferencedRange | None = None 

208 

209 

210class Route(BaseModel): 

211 """Model for transportation segment route.""" 

212 

213 name: str | None = Field(description="Full name of the route") 

214 network: str | None = Field( 

215 description="Name of the highway system this route belongs to" 

216 ) 

217 ref: str | None = Field(description="Code or number used to reference the route") 

218 symbol: str | None = Field(description="URL or description of route signage") 

219 wikidata: Wikidata | None = None 

220 

221 

222class Routes(RootModel): 

223 """Model for transportation segment routes.""" 

224 

225 root: list[Route] = Field(description="Routes this segment belongs to.") 

226 

227 

228class HeadingScopeContainer(BaseModel): 

229 """Model for transportation segment heading scope container.""" 

230 

231 heading: Heading | None = None 

232 

233 

234class PurposeOfUseScopeContainer(BaseModel): 

235 """Model for transportation segment purpose of use scope container.""" 

236 

237 using: list[PurposeOfUse] | None = Field(None, min_length=1) 

238 

239 

240class RecognizedStatusScopeContainer(BaseModel): 

241 """Model for transportation segment recognized status scope container.""" 

242 

243 recognized: list[RecognizedStatus] | None = Field(None, min_length=1) 

244 

245 

246class TravelModeScopeContainer(BaseModel): 

247 """Model for transportation segment travel mode scope container.""" 

248 

249 mode: list[TravelMode] | None = Field( 

250 None, min_length=1, description="Travel mode(s) to which the rule applies" 

251 ) 

252 

253 

254class VehicleScopeUnit(RootModel): 

255 """Model for transportation segment vehicle scope unit.""" 

256 

257 root: LengthUnit | WeightUnit = Field( 

258 description="Parent enum of both length and width for use in vehicle scoping" 

259 ) 

260 

261 

262class VehicleItem(BaseModel): 

263 """Model for transportation segment vehicle item.""" 

264 

265 dimension: VehicleScopeDimension 

266 comparison: VehicleScopeComparison 

267 value: Annotated[float, Field(strict=True, ge=0.0)] 

268 unit: VehicleScopeUnit | None = None 

269 

270 

271class VehicleScopeContainer(BaseModel): 

272 """Model for transportation segment vehicle scope container.""" 

273 

274 vehicle: list[VehicleItem] | None = Field( 

275 None, min_length=1, description="Vehicle attributes for which the rule applies" 

276 ) 

277 

278 

279class When( 

280 TemporalScopeContainer, 

281 HeadingScopeContainer, 

282 PurposeOfUseScopeContainer, 

283 RecognizedStatusScopeContainer, 

284 TravelModeScopeContainer, 

285 VehicleScopeContainer, 

286): 

287 """Model for transportation segment when.""" 

288 

289 

290class AccessContainer(BaseModel): 

291 """Model for transportation segment access container item.""" 

292 

293 access_type: AccessType 

294 when: When | None = None 

295 

296 

297class RoadFlagEnum(str, Enum): 

298 """Overture road flag options.""" 

299 

300 is_bridge = "is_bridge" 

301 is_link = "is_link" 

302 is_tunnel = "is_tunnel" 

303 is_under_construction = "is_under_construction" 

304 is_abandoned = "is_abandoned" 

305 is_covered = "is_covered" 

306 

307 

308class RoadFlag(BaseModel): 

309 """Overture road flag.""" 

310 

311 values: list[RoadFlagEnum] 

312 between: LinearlyReferencedRange | None = None 

313 

314 

315class RoadSurfaceEnum(str, Enum): 

316 """Overture road surface options.""" 

317 

318 unknown = "unknown" 

319 paved = "paved" 

320 unpaved = "unpaved" 

321 gravel = "gravel" 

322 dirt = "dirt" 

323 paving_stones = "paving_stones" 

324 metal = "metal" 

325 

326 

327class RoadSurface(BaseModel): 

328 """Overture road surface.""" 

329 

330 value: RoadSurfaceEnum 

331 between: LinearlyReferencedRange | None = None 

332 

333 

334class SpeedUnit(str, Enum): 

335 """Overture speed unit options.""" 

336 

337 kmh = "km/h" 

338 mph = "mph" 

339 

340 

341class Speed(BaseModel): 

342 """Overture speed.""" 

343 

344 value: Annotated[int, Field(ge=1, le=350)] 

345 unit: SpeedUnit | None = None 

346 

347 

348class SpeedLimit(BaseModel): 

349 """Overture speed limit.""" 

350 

351 min_speed: Speed | None = None 

352 max_speed: Speed 

353 

354 

355class Sequence(BaseModel): 

356 """Overture sequence.""" 

357 

358 connector_id: Id 

359 segment_id: Id 

360 

361 

362class ProhibitedTransition(BaseModel): 

363 """Overture prohibited transition.""" 

364 

365 sequence: list[Sequence] 

366 final_heading: Heading 

367 when: When 

368 between: LinearlyReferencedRange | None = None 

369 

370 

371class SegmentProperties(BaseModel): 

372 """Model for transportation segment properties.""" 

373 

374 model_config = ConfigDict(extra="forbid") 

375 

376 version: int = Field( 

377 ge=0, 

378 description="""Version number of the feature, incremented in each Overture 

379 release where the geometry or attributes of this feature changed.""", 

380 ) 

381 id: Id 

382 subtype: Subtype = Field(description="Broad category of transportation segment.") 

383 sources: list[Sources] | None = None 

384 class_: RoadClass | None = Field(None, alias="class") 

385 access_restrictions: list[AccessContainer] | None = Field( 

386 None, description="Rules governing access to this road segment or lane" 

387 ) 

388 level: Level | None = Field( 

389 0, description="Z-order of the feature where 0 is visual level" 

390 ) 

391 level_rules: list[LevelRules] | None = None 

392 connector_ids: list[Id] | None = Field( 

393 None, min_length=2, description="** DEPRECATED **" 

394 ) 

395 connectors: Annotated[list[Connector], Field(min_length=2)] | None = Field([]) 

396 """ 

397 List of connectors which this segment is physically connected to and their relative 

398 location. Each connector is a possible routing decision point, meaning it defines a 

399 place along the segment in which there is possibility to transition to other 

400 segments which share the same connector. 

401 """ 

402 road_surface: list[RoadSurface] | None = None 

403 road_flags: list[RoadFlag] | None = None 

404 speed_limits: list[SpeedLimit] | None = None 

405 prohibited_transitions: list[ProhibitedTransition] | None = None 

406 routes: Routes | None = None 

407 names: Names | None = None