Skip to content

Commit

Permalink
Merge pull request #176 from OpenTrafficCam/user-story/2064-let-line-…
Browse files Browse the repository at this point in the history
…section-be-defined-by-a-list-of-multiple-coordinates

Let line sections be defined by a list of multiple coordinates
  • Loading branch information
randy-seng authored May 3, 2023
2 parents 6ece409 + 9de8d30 commit 8dd50d2
Show file tree
Hide file tree
Showing 13 changed files with 61 additions and 88 deletions.
8 changes: 2 additions & 6 deletions OTAnalytics/domain/intersect.py
Original file line number Diff line number Diff line change
Expand Up @@ -237,9 +237,7 @@ def __init__(
super().__init__(implementation, line_section)

def intersect(self, track: Track, event_builder: EventBuilder) -> list[Event]:
line_section_as_geometry = Line(
[self._line_section.start, self._line_section.end]
)
line_section_as_geometry = Line(self._line_section.get_coordinates())
if event_builder.event_type is None:
raise ValueError("Event type not set in section builder")

Expand Down Expand Up @@ -313,9 +311,7 @@ def __init__(
def intersect(self, track: Track, event_builder: EventBuilder) -> list[Event]:
events: list[Event] = []

line_section_as_geometry = Line(
[self._line_section.start, self._line_section.end]
)
line_section_as_geometry = Line(self._line_section.get_coordinates())

event_builder.add_road_user_type(track.classification)
offset = self._extract_offset_from_section(
Expand Down
18 changes: 10 additions & 8 deletions OTAnalytics/domain/section.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,6 @@
ID: str = "id"
TYPE: str = "type"
LINE: str = "line"
START: str = "start"
END: str = "end"
AREA: str = "area"
COORDINATES: str = "coordinates"
RELATIVE_OFFSET_COORDINATES: str = "relative_offset_coordinates"
Expand Down Expand Up @@ -153,11 +151,16 @@ class LineSection(Section):
end (Coordinate): the end coordinate
"""

start: Coordinate
end: Coordinate
coordinates: list[Coordinate]

def _validate(self) -> None:
if self.start == self.end:
if len(self.coordinates) < 2:
raise ValueError(
"The number of coordinates to make up a line must be greater equal 2, "
f"but is {len(self.coordinates)}"
)

if self.coordinates[0] == self.coordinates[-1]:
raise ValueError(
(
"Start and end point of coordinate must be different to be a line, "
Expand All @@ -166,7 +169,7 @@ def _validate(self) -> None:
)

def get_coordinates(self) -> list[Coordinate]:
return [self.start, self.end]
return self.coordinates.copy()

def to_dict(self) -> dict:
"""
Expand All @@ -177,8 +180,7 @@ def to_dict(self) -> dict:
ID: self.id.serialize(),
TYPE: LINE,
RELATIVE_OFFSET_COORDINATES: self._serialize_relative_offset_coordinates(),
START: self.start.to_dict(),
END: self.end.to_dict(),
COORDINATES: [coordinate.to_dict() for coordinate in self.coordinates],
PLUGIN_DATA: self.plugin_data,
}

Expand Down
7 changes: 2 additions & 5 deletions OTAnalytics/plugin_parser/otvision_parser.py
Original file line number Diff line number Diff line change
Expand Up @@ -366,17 +366,14 @@ def _parse_line_section(self, data: dict) -> Section:
attributes=[
section.ID,
section.RELATIVE_OFFSET_COORDINATES,
section.START,
section.END,
],
)
section_id = self._parse_section_id(data)
relative_offset_coordinates = self._parse_relative_offset_coordinates(data)
start = self._parse_coordinate(data[section.START])
end = self._parse_coordinate(data[section.END])
coordinates = self._parse_coordinates(data)
plugin_data = self._parse_plugin_data(data)
return LineSection(
section_id, relative_offset_coordinates, plugin_data, start, end
section_id, relative_offset_coordinates, plugin_data, coordinates
)

def _parse_section_id(self, data: dict) -> SectionId:
Expand Down
12 changes: 6 additions & 6 deletions OTAnalytics/plugin_ui/customtkinter_gui/dummy_viewmodel.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,8 @@
from OTAnalytics.application.datastore import NoSectionsToSave, SectionParser
from OTAnalytics.domain import geometry
from OTAnalytics.domain.section import (
END,
COORDINATES,
ID,
START,
Section,
SectionId,
SectionListObserver,
Expand Down Expand Up @@ -263,8 +262,8 @@ def _draw_all_sections_on_canvas(self) -> None:
painter.draw(
tags=[LINE_SECTION],
id=section[ID],
start=section[START],
end=section[END],
start=section[COORDINATES][0],
end=section[COORDINATES][-1],
style=style,
)

Expand All @@ -278,8 +277,9 @@ def _get_sections(self) -> Iterable[dict]:
)

def _transform_coordinates(self, section: dict) -> dict:
section[START] = self._to_coordinate_tuple(section[START])
section[END] = self._to_coordinate_tuple(section[END])
section[COORDINATES] = [
self._to_coordinate_tuple(coordinate) for coordinate in section[COORDINATES]
]
return section

def _to_coordinate_tuple(self, coordinate: dict) -> tuple[int, int]:
Expand Down
5 changes: 3 additions & 2 deletions OTAnalytics/plugin_ui/customtkinter_gui/line_section.py
Original file line number Diff line number Diff line change
Expand Up @@ -256,8 +256,9 @@ def _create_section(self) -> None:
)
},
plugin_data={},
start=self._to_coordinate(self._start()),
end=self._to_coordinate(self._end()),
coordinates=[
self._to_coordinate(coordinate) for coordinate in self._coordinates
],
)
self._viewmodel.set_new_section(line_section)

Expand Down
8 changes: 3 additions & 5 deletions tests/OTAnalytics/adapter_intersect/test_intersect.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def plot_tracks_and_sections(tracks: list[Track], sections: list[Section]) -> No
for section in sections:
if isinstance(section, LineSection):
shapely_line_section = mapper.map_to_shapely_line_string(
Line([section.start, section.end])
Line(section.get_coordinates())
)
ax.plot(*shapely_line_section.xy)
elif isinstance(section, Area):
Expand Down Expand Up @@ -83,8 +83,7 @@ def test_intersect_by_small_track_components(
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0.5, 0.5)
},
plugin_data={},
start=Coordinate(103, 194),
end=Coordinate(366, 129),
coordinates=[Coordinate(103, 194), Coordinate(366, 129)],
)

line_section_intersector = IntersectBySmallTrackComponents(
Expand Down Expand Up @@ -114,8 +113,7 @@ def test_intersect_by_single_track_line(
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0.5, 0.5)
},
plugin_data={},
start=Coordinate(103, 194),
end=Coordinate(366, 129),
coordinates=[Coordinate(103, 194), Coordinate(366, 129)],
)

line_section_intersector = IntersectBySplittingTrackLine(
Expand Down
3 changes: 1 addition & 2 deletions tests/OTAnalytics/application/test_datastore.py
Original file line number Diff line number Diff line change
Expand Up @@ -175,8 +175,7 @@ def test_save_section_file(
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0, 0)
},
plugin_data={},
start=Coordinate(0, 0),
end=Coordinate(1, 1),
coordinates=[Coordinate(0, 0), Coordinate(1, 1)],
)
)
store.save_section_file(some_file)
Expand Down
3 changes: 1 addition & 2 deletions tests/OTAnalytics/application/test_eventlist.py
Original file line number Diff line number Diff line change
Expand Up @@ -124,8 +124,7 @@ def line_section() -> LineSection:
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0, 0)
},
plugin_data={},
start=Coordinate(5, 0),
end=Coordinate(5, 10),
coordinates=[Coordinate(5, 0), Coordinate(5, 10)],
)


Expand Down
15 changes: 5 additions & 10 deletions tests/OTAnalytics/domain/test_intersect.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,8 +130,7 @@ def test_extract_offset_from_section(self) -> None:
SectionId("N"),
{EventType.SECTION_ENTER: offset},
{},
start=Coordinate(0, 0),
end=Coordinate(1, 1),
coordinates=[Coordinate(0, 0), Coordinate(1, 1)],
)
result = Intersector._extract_offset_from_section(
section, EventType.SECTION_ENTER
Expand Down Expand Up @@ -160,8 +159,7 @@ def test_intersect(self, track: Track) -> None:
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0, 0)
},
plugin_data={},
start=Coordinate(5, 0),
end=Coordinate(5, 10),
coordinates=[Coordinate(5, 0), Coordinate(5, 10)],
)

intersector = IntersectBySplittingTrackLine(mock_implementation, line_section)
Expand Down Expand Up @@ -205,8 +203,7 @@ def test_intersect_track_offset_applied_to_event_coordinate(
EventType.SECTION_ENTER: RelativeOffsetCoordinate(1, 1)
},
plugin_data={},
start=Coordinate(5, 0),
end=Coordinate(5, 10),
coordinates=[Coordinate(5, 0), Coordinate(5, 10)],
)

intersector = IntersectBySplittingTrackLine(mock_implementation, line_section)
Expand Down Expand Up @@ -254,8 +251,7 @@ def test_intersect(self, detection: Detection, track: Track) -> None:
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0, 0)
},
plugin_data={},
start=Coordinate(5, 0),
end=Coordinate(5, 10),
coordinates=[Coordinate(5, 0), Coordinate(5, 10)],
)

intersector = IntersectBySmallTrackComponents(mock_implementation, line_section)
Expand Down Expand Up @@ -301,8 +297,7 @@ def test_intersect_track_offset_applied_to_event_coordinate(
EventType.SECTION_ENTER: RelativeOffsetCoordinate(1, 1)
},
plugin_data={},
start=Coordinate(5, 0),
end=Coordinate(5, 10),
coordinates=[Coordinate(5, 0), Coordinate(5, 10)],
)

intersector = IntersectBySmallTrackComponents(mock_implementation, line_section)
Expand Down
22 changes: 8 additions & 14 deletions tests/OTAnalytics/domain/test_section.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,10 @@
from OTAnalytics.domain.section import (
AREA,
COORDINATES,
END,
ID,
LINE,
PLUGIN_DATA,
RELATIVE_OFFSET_COORDINATES,
START,
TYPE,
Area,
LineSection,
Expand Down Expand Up @@ -44,8 +42,7 @@ def test_coordinates_define_point_raises_value_error(self) -> None:
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0, 0)
},
plugin_data={},
start=Coordinate(0, 0),
end=Coordinate(0, 0),
coordinates=[Coordinate(0, 0), Coordinate(0, 0)],
)

def test_valid_line_section(self) -> None:
Expand All @@ -55,22 +52,21 @@ def test_valid_line_section(self) -> None:
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0, 0)
},
plugin_data={},
start=Coordinate(0, 0),
end=Coordinate(1, 0),
coordinates=[Coordinate(0, 0), Coordinate(1, 0)],
)

def test_to_dict(self) -> None:
section_id = SectionId("some")
start = Coordinate(0, 0)
end = Coordinate(1, 1)
coordinates = [start, end]
section = LineSection(
id=section_id,
relative_offset_coordinates={
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0, 0)
},
plugin_data={},
start=start,
end=end,
coordinates=coordinates,
)

section_dict = section.to_dict()
Expand All @@ -81,8 +77,7 @@ def test_to_dict(self) -> None:
RELATIVE_OFFSET_COORDINATES: {
EventType.SECTION_ENTER.serialize(): {X: 0, Y: 0}
},
START: start.to_dict(),
END: end.to_dict(),
COORDINATES: [coordinate.to_dict() for coordinate in coordinates],
PLUGIN_DATA: {},
}

Expand All @@ -91,19 +86,18 @@ def test_initialization_with_plugin_data(self) -> None:
id = "N"
start = Coordinate(0, 0)
end = Coordinate(10, 10)
coordinates = [start, end]
line = LineSection(
id=SectionId(id),
relative_offset_coordinates={
EventType.SECTION_ENTER: RelativeOffsetCoordinate(0, 0)
},
plugin_data=plugin_data,
start=start,
end=end,
coordinates=coordinates,
)
assert line.id == SectionId(id)
assert line.plugin_data == plugin_data
assert line.start == start
assert line.end == end
assert line.coordinates == coordinates


class TestAreaSection:
Expand Down
Loading

0 comments on commit 8dd50d2

Please sign in to comment.