Source code for pedpy.data.geometry
"""Module handling the geometrical environment of the analysis."""
import logging
from dataclasses import dataclass
from typing import List, Optional
import shapely
from shapely import Polygon
log = logging.getLogger(__name__)
[docs]@dataclass
class Geometry:
"""Class holding the geometry information of the analysis.
Attributes:
walkable_area (shapely.Polygon): area in which the pedestrian walk,
they are only considered for the analysis when inside this area.
obstacles (List[shapely.Polygon]): areas which are excluded from the
analysis, pedestrians inside these areas will be ignored.
"""
walkable_area: Polygon
obstacles: List[Polygon]
def __init__(
self,
*,
walkable_area: Polygon,
obstacles: Optional[List[Polygon]] = None,
):
"""Create a geometry object.
Args:
walkable_area (Polygon): area in pedestrian can walk
obstacles (Optional[List[Polygon]]): list of obstacles, which will
be excluded from the walkable area
"""
self.obstacles = []
self.walkable_area = walkable_area
if obstacles is None:
obstacles = []
for obstacle in obstacles:
self.add_obstacle(obstacle)
shapely.prepare(self.walkable_area)
[docs] def add_obstacle(self, obstacle: Polygon) -> None:
"""Adds an obstacle to the geometry.
Args:
obstacle (Polygon): area which will be excluded from the
analysis.
"""
if obstacle.within(self.walkable_area):
self.walkable_area = shapely.difference(
self.walkable_area, obstacle
)
self.obstacles.append(obstacle)
shapely.prepare(self.walkable_area)
else:
log.warning(
f"The obstacle {obstacle} is not inside the walkable area of "
"the geometry and thus will be ignored!"
)