Added refiner (for minor landmarks)
All checks were successful
Build and push docker image / Build (pull_request) Successful in 2m17s
Build and release APK / Build APK (pull_request) Successful in 5m13s
Build web / Build Web (pull_request) Successful in 1m14s

This commit is contained in:
2024-06-23 10:50:44 +02:00
parent 1f5bd92895
commit 34922a2645
8 changed files with 4923 additions and 1721 deletions

View File

@@ -120,15 +120,18 @@ def remove_duplicates(L: List[Landmark]) -> List[Landmark] :
Returns:
List[Landmark]: A list of unique Landmark objects based on their names.
"""
L_clean = []
names = []
coords = []
for landmark in L :
if landmark.name in names :
if landmark.name in names and landmark.location in coords:
continue
else :
names.append(landmark.name)
L_clean.append(landmark)
coords.append(tuple((round(landmark.location[0], 3), round(landmark.location[0], 3))))
return L_clean

View File

@@ -308,6 +308,7 @@ def add_time_to_reach(order: List[Landmark], landmarks: List[Landmark])->List[La
elem = landmarks[order[j]]
if elem != prev :
elem.time_to_reach = get_distance(elem.location, prev.location, detour, speed)[1]
elem.must_do = True
L.append(elem)
prev = elem
j += 1

51
backend/src/refiner.py Normal file
View File

@@ -0,0 +1,51 @@
from shapely import buffer, LineString, Point, Polygon
from typing import List
from math import pi
from structs.landmarks import Landmark
def create_corridor(landmarks: List[Landmark], width: float) :
corrected_width = (180*width)/(6371000*pi)
path = create_linestring(landmarks)
obj = buffer(path, corrected_width, join_style="mitre", cap_style="square", mitre_limit=2)
return obj
def create_linestring(landmarks: List[Landmark])->List[Point] :
points = []
for landmark in landmarks :
points.append(Point(landmark.location))
return LineString(points)
"""def is_in_area_ring(area: Polygon, coordinates) -> bool :
point = Point(coordinates)
if area.contains(point) :
t = area.interiors[0]
return not t.contains(point)
"""
def is_in_area(area: Polygon, coordinates) -> bool :
point = Point(coordinates)
return point.within(area)
def get_minor_landmarks(all_landmarks: List[Landmark], visited_landmarks: List[Landmark], width: float) -> List[Landmark] :
second_order_landmarks = []
area = create_corridor(visited_landmarks, width)
for landmark in all_landmarks :
if is_in_area(area, landmark.location) and landmark not in visited_landmarks:
second_order_landmarks.append(landmark)
return second_order_landmarks

View File

@@ -5,13 +5,14 @@ from landmarks_manager import generate_landmarks
from fastapi.encoders import jsonable_encoder
from optimizer import solve_optimization
from refiner import get_minor_landmarks
from structs.landmarks import Landmark
from structs.landmarktype import LandmarkType
from structs.preferences import Preferences, Preference
# Helper function to create a .txt file with results
def write_data(L: List[Landmark]):
def write_data(L: List[Landmark], file_name: str):
data = pd.DataFrame()
i = 0
@@ -20,7 +21,7 @@ def write_data(L: List[Landmark]):
data[i] = jsonable_encoder(landmark)
i += 1
data.to_json('landmarks.txt', indent = 2, force_ascii=False)
data.to_json(file_name, indent = 2, force_ascii=False)
def test3(city_country: str) -> List[Landmark]:
@@ -59,6 +60,9 @@ def test3(city_country: str) -> List[Landmark]:
visiting_list = solve_optimization(test, max_walking_time*60, True)
def test4(coordinates: tuple[float, float]) -> List[Landmark]:
@@ -79,8 +83,7 @@ def test4(coordinates: tuple[float, float]) -> List[Landmark]:
city_country = None
landmarks, landmarks_short = generate_landmarks(preferences=preferences, city_country=city_country, coordinates=coordinates)
write_data(landmarks)
#write_data(landmarks, "landmarks.txt")
start = Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(48.8375946, 2.2949904), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags = 0)
@@ -91,12 +94,24 @@ def test4(coordinates: tuple[float, float]) -> List[Landmark]:
test.insert(0, start)
test.append(finish)
max_walking_time = 4 # hours
max_walking_time = 4 # hours
detour = 30 # minutes
visiting_list = solve_optimization(test, max_walking_time*60, True)
visited_list = solve_optimization(test, max_walking_time*60, True)
#visited_list = [Landmark(name='start', type=LandmarkType(landmark_type='start'), location=(48.8375946, 2.2949904), osm_type='start', osm_id=0, attractiveness=0, must_do=True, n_tags=0, time_to_reach=0), Landmark(name='Palais du Louvre', type=LandmarkType(landmark_type='sightseeing'), location=(48.8614768, 2.3351677), osm_type='relation', osm_id=3262297, attractiveness=32, must_do=False, n_tags=32, time_to_reach=85), Landmark(name='Musée du Louvre', type=LandmarkType(landmark_type='sightseeing'), location=(48.8611474, 2.3358637), osm_type='relation', osm_id=7515426, attractiveness=34, must_do=False, n_tags=33, time_to_reach=1), Landmark(name='Bourse de Commerce — Pinault Collection', type=LandmarkType(landmark_type='sightseeing'), location=(48.8628167, 2.3428183), osm_type='way', osm_id=19856722, attractiveness=32, must_do=False, n_tags=32, time_to_reach=12), Landmark(name='Centre Georges Pompidou', type=LandmarkType(landmark_type='sightseeing'), location=(48.8605235, 2.3524395), osm_type='way', osm_id=55503397, attractiveness=43, must_do=False, n_tags=43, time_to_reach=15), Landmark(name='Tour Saint-Jacques', type=LandmarkType(landmark_type='sightseeing'), location=(48.8579983, 2.3489178), osm_type='way', osm_id=20326709, attractiveness=33, must_do=False, n_tags=31, time_to_reach=8), Landmark(name='Hôtel de Ville', type=LandmarkType(landmark_type='sightseeing'), location=(48.8564265, 2.352527), osm_type='relation', osm_id=284089, attractiveness=34, must_do=False, n_tags=32, time_to_reach=7), Landmark(name='Cathédrale Notre-Dame de Paris', type=LandmarkType(landmark_type='sightseeing'), location=(48.8529372, 2.3498701), osm_type='way', osm_id=201611261, attractiveness=55, must_do=False, n_tags=54, time_to_reach=9), Landmark(name='Sainte-Chapelle', type=LandmarkType(landmark_type='sightseeing'), location=(48.8553966, 2.3450136), osm_type='relation', osm_id=3344870, attractiveness=57, must_do=False, n_tags=54, time_to_reach=10), Landmark(name='finish', type=LandmarkType(landmark_type='finish'), location=(48.8375946, 2.2949904), osm_type='finish', osm_id=0, attractiveness=0, must_do=True, n_tags=0, time_to_reach=90)]
return visiting_list
minor_landmarks = get_minor_landmarks(landmarks, visited_list, 200)
#write_data(minor_landmarks, 'minor_landmarks.txt')
print("There are " + str(len(minor_landmarks)) + " minor landmarks around the predicted path")
fuller_list = minor_landmarks + visited_list
new_visit = solve_optimization(fuller_list, max_walking_time*60+detour, True)
return visited_list
test4(tuple((48.8795156, 2.3660204)))