Source code for dtcc_core.model.object.roadnetwork
from dataclasses import dataclass, field
from typing import Union, List, Tuple
from enum import Enum, auto
from .object import Object, GeometryType
from ..geometry import LineString, MultiLineString
from ..geometry import Bounds
from .. import dtcc_pb2 as proto
import numpy as np
[docs]
class RoadType(Enum):
"""Enumeration representing different road types."""
MOTORWAY = auto()
PRIMARY = auto()
SECONDARY = auto()
TERTIARY = auto()
RESIDENTIAL = auto()
SERVICE = auto()
TRACK = auto()
PEDESTRIAN = auto()
CYCLEWAY = auto()
FOOTWAY = auto()
BRIDLEWAY = auto()
PATH = auto()
[docs]
@dataclass
class RoadNetwork(Object):
vertices: np.ndarray = field(default_factory=lambda: np.empty(0, dtype=np.float64))
edges: np.ndarray = field(
default_factory=lambda: np.empty(0, dtype=np.int64)
) # each edge (start_idx, end_idx)
length: np.ndarray = field(default_factory=lambda: np.empty(0, dtype=np.float64))
@property
def linestrings(self) -> List[LineString]:
geom = self.geometry.get(GeometryType.MULTILINESTRING)
if geom is None:
return []
return geom.linestrings
@property
def multilinestrings(self) -> MultiLineString:
geom = self.geometry.get(GeometryType.MULTILINESTRING)
return geom
@property
def bounds(self):
geom = self.geometry.get(GeometryType.MULTILINESTRING)
if geom is None:
xmin = np.min(self.vertices[:, 0])
ymin = np.min(self.vertices[:, 1])
xmax = np.max(self.vertices[:, 0])
ymax = np.max(self.vertices[:, 1])
return Bounds(xmin=xmin, ymin=ymin, xmax=xmax, ymax=ymax)
return geom.bounds
[docs]
def to_shapely(self):
multilinestring = self.geometry.get(GeometryType.MULTILINESTRING)
if multilinestring is None:
return None
return multilinestring.to_shapely()
[docs]
def to_proto(self):
pb = Object.to_proto(self)
_pb = proto.RoadNetwork()
dim = self.vertices.shape[1]
_pb.vertices.extend(self.vertices.flatten())
_pb.dim = dim
_pb.edges.extend(self.edges.flatten())
_pb.lengths.extend(self.length.flatten())
pb.road_network.CopyFrom(_pb)
return pb
[docs]
def from_proto(self, pb):
if isinstance(pb, bytes):
pb = proto.Object.FromString(pb)
Object.from_proto(self, pb)
_pb = pb.road_network
dim = _pb.dim
self.vertices = np.array(_pb.vertices).reshape(-1, dim)
self.edges = np.array(_pb.edges).reshape(-1, 2)
self.length = np.array(_pb.lengths)