# Copyright (C) 2019-2021 HERE Europe B.V.
# SPDX-License-Identifier: Apache-2.0
"""
This module defines all the base classes which will be used for configuration classes of
various APIs.
"""
import json
from typing import List, Optional
[docs]class Bunch(dict):
"""A class for dot notation implementation of dictionary."""
[docs] def __init__(self, **kwargs):
dict.__init__(self, kwargs)
self.__dict__ = self
[docs]class RoutingMode(Bunch):
"""A Class to define constant values for Routing Modes.
``fast``:
Route calculation from start to destination optimized by travel time. In many cases, the route
returned by the fast mode may not be the route with the fastest possible travel time.
For example, the routing service may favor a route that remains on a highway, even
if a faster travel time can be achieved by taking a detour or shortcut through
an inconvenient side road.
``short``:
Route calculation from start to destination disregarding any speed information. In this mode,
the distance of the route is minimized, while keeping the route sensible. This includes,
for example, penalizing turns. Because of that, the resulting route will not necessarily be
the one with minimal distance.
"""
#: Use this config for routing_mode of routing API.
#: Example: for ``fast`` routing_mode use ``ROUTING_MODE.fast``.
ROUTING_MODE = RoutingMode(**{"fast": "fast", "short": "short"})
[docs]class ShippedHazardousGoods(Bunch):
"""A class to define the constant values for truck option ``shippedHazardousGoods``."""
#: Use this config for shipped_hazardous_goods attribute of Truck options of matrix Routing API.
#: Example: for ``explosive`` shipped_hazardous_goods use ``SHIPPED_HAZARDOUS_GOODS.explosive``.
SHIPPED_HAZARDOUS_GOODS = ShippedHazardousGoods(
**{
"explosive": "explosive",
"gas": "gas",
"flammable": "flammable",
"combustible": "combustible",
"organic": "organic",
"poison": "poison",
"radioactive": "radioactive",
"corrosive": "corrosive",
"poisonousInhalation": "poisonousInhalation",
"harmfulToWater": "harmfulToWater",
"other": "other",
}
)
[docs]class Truck:
"""A class to define different truck options which will be used during route calculation.
Truck options should be used when transport_mode is ``truck``.
"""
[docs] def __init__(
self,
shipped_hazardous_goods: Optional[List] = None,
gross_weight: Optional[int] = None,
weight_per_axle: Optional[int] = None,
height: Optional[int] = None,
width: Optional[int] = None,
length: Optional[int] = None,
tunnel_category: Optional[str] = None,
axle_count: Optional[int] = None,
truck_type: str = "straight",
trailer_count: int = 0,
):
"""Object Initializer.
:param shipped_hazardous_goods: List of hazardous materials in the vehicle. valid values
for hazardous materials can be used from config
:attr:`SHIPPED_HAZARDOUS_GOODS <here_location_services.config.matrix_routing_config.SHIPPED_HAZARDOUS_GOODS>`
:param gross_weight: Total vehicle weight, including trailers and shipped goods, in
kilograms. Should be greater than or equal to zero.
:param weight_per_axle: Vehicle weight per axle, in kilograms. Should be greater than or
equal to zero.
:param height: Vehicle height, in centimeters. Should be in range [0, 5000]
:param width: Vehicle width, in centimeters. Should be in range [0, 5000]
:param length: Vehicle length, in centimeters. Should be in range [0, 5000]
:param tunnel_category: A string for category of tunnel. Valid values are "B", "C", "D", "E".
Specifies the `cargo tunnel restriction code <https://adrbook.com/en/2017/ADR/8.6.3>`_.
The route will pass only through tunnels of less restrictive categories.
:param axle_count: Total number of axles that the vehicle has. Should be in the
range [2, 255].
:param truck_type: A string to represent the type of truck.
:param trailer_count: Number of trailers attached to the vehicle.
""" # noqa E501
self.shippedHazardousGoods = shipped_hazardous_goods
self.grossWeight = gross_weight
self.weightPerAxle = weight_per_axle
self.height = height
self.width = width
self.length = length
self.tunnelCategory = tunnel_category
self.axleCount = axle_count
self.type = truck_type
self.trailerCount = trailer_count
[docs]class PlaceOptions:
"""A class to define ``PlaceOptions`` for ``origin``/ ``via``/ ``destination``.
Various options can be found here:
`PlaceOptions <https://developer.here.com/documentation/routing-api/8.16.0/api-reference-swagger.html>`_.
""" # noqa E501
[docs] def __init__(
self,
course: Optional[int] = None,
sideof_street_hint: Optional[List[float]] = None,
match_sideof_street: Optional[str] = None,
namehint: Optional[str] = None,
radius: Optional[int] = None,
min_course_distance: Optional[int] = None,
):
"""Object Initializer.
:param course: An int representing degrees clock-wise from north.
Indicating the desired direction at the place. E.g. 90 indicating ``east``.
This is defined in constant ``ROUTE_COURSE``.
:param sideof_street_hint: A list of latitude and longitude.Indicating the side of the
street that should be used.
:param match_sideof_street: Specifies how the location set by ``sideof_street_hint`` should
be handled. If this is set then sideof_street_hint should also be set. There are two
valid values for match_sideof_street:
``always``:
Always prefer the given side of street.
``onlyIfDivided``:
Only prefer using side of street set by ``sideof_street_hint`` in case the street
has dividers. This is the default behavior.
These values are mainted as config in:
:attr:`ROUTE_MATCH_SIDEOF_STREET <here_location_services.config.routing_config.ROUTE_MATCH_SIDEOF_STREET>`
:param namehint: A string for the router to look for the place with the most similar name.
This can e.g. include things like: North being used to differentiate between
interstates I66 North and I66 South, Downtown Avenue being used to correctly
select a residential street.
:param radius: In meters Asks the router to consider all places within the given radius as
potential candidates for route calculation. This can be either because it is not
important which place is used, or because it is unknown. Radius more than 200 meters
are not supported.
:param min_course_distance: In meters Asks the routing service to try to find a route that
avoids actions for the indicated distance. E.g. if the origin is determined by a moving
vehicle, the user might not have time to react to early actions.
""" # noqa E501
self.course = course
self.sideOfStreetHint: Optional[str] = None
if sideof_street_hint is not None:
self.sideOfStreetHint = ",".join([str(point) for point in sideof_street_hint])
self.matchSideOfStreet = match_sideof_street
self.namehint = namehint
self.radius = radius
self.minCourseDistance = min_course_distance
[docs] def __repr__(self):
"""Return string representation of this instance."""
return json.dumps(self.__dict__)
[docs]class WayPointOptions:
"""A class to define ``PlaceOptions`` for ``via``/ ``destination``.
Various options can be found here:
`PlaceOptions <https://developer.here.com/documentation/routing-api/8.16.0/api-reference-swagger.html>`_.
""" # noqa E501
[docs] def __init__(self, stop_duration: Optional[int] = None, pass_through: Optional[bool] = None):
self.stopDuration = stop_duration
self.passThrough = pass_through
[docs] def __repr__(self):
"""Return string representation of this instance."""
return json.dumps(self.__dict__)