Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Let line sections be defined by a list of multiple coordinates #176

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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