diff --git a/backend/src/parameters/landmark_parameters.yaml b/backend/src/parameters/landmark_parameters.yaml index 7175b72..7129c77 100644 --- a/backend/src/parameters/landmark_parameters.yaml +++ b/backend/src/parameters/landmark_parameters.yaml @@ -1,11 +1,12 @@ city_bbox_side: 7500 #m radius_close_to: 50 -church_coeff: 0.5 +church_coeff: 0.75 nature_coeff: 1.25 overall_coeff: 10 tag_exponent: 1.15 image_bonus: 10 viewpoint_bonus: 15 -wikipedia_bonus: 6 +wikipedia_bonus: 4 +name_bonus: 3 N_important: 40 pay_bonus: -1 diff --git a/backend/src/parameters/optimizer_parameters.yaml b/backend/src/parameters/optimizer_parameters.yaml index 70ba2fa..d6098d1 100644 --- a/backend/src/parameters/optimizer_parameters.yaml +++ b/backend/src/parameters/optimizer_parameters.yaml @@ -3,4 +3,4 @@ detour_corridor_width: 300 average_walking_speed: 4.8 max_landmarks: 10 max_landmarks_refiner: 30 -overshoot: 1.8 +overshoot: 1.2 diff --git a/backend/src/structs/linked_landmarks.py b/backend/src/structs/linked_landmarks.py index a00a026..e69dd7b 100644 --- a/backend/src/structs/linked_landmarks.py +++ b/backend/src/structs/linked_landmarks.py @@ -35,6 +35,7 @@ class LinkedLandmarks: time_to_next = get_time(landmark.location, self._landmarks[i + 1].location) landmark.time_to_reach_next = time_to_next self.total_time += time_to_next + self.total_time += landmark.duration self._landmarks[-1].next_uuid = None self._landmarks[-1].time_to_reach_next = 0 diff --git a/backend/src/tester.py b/backend/src/tester.py index 31543b6..83f2f2e 100644 --- a/backend/src/tester.py +++ b/backend/src/tester.py @@ -22,8 +22,8 @@ def test(start_coords: tuple[float, float], finish_coords: tuple[float, float] = preferences = Preferences( sightseeing=Preference(type='sightseeing', score = 5), nature=Preference(type='nature', score = 5), - shopping=Preference(type='shopping', score = 5), - max_time_minute=15, + shopping=Preference(type='shopping', score = 0), + max_time_minute=30, detour_tolerance_minute=0 ) @@ -74,7 +74,7 @@ def test(start_coords: tuple[float, float], finish_coords: tuple[float, float] = # test(tuple((48.8344400, 2.3220540))) # Café Chez César # test(tuple((48.8375946, 2.2949904))) # Point random # test(tuple((47.377859, 8.540585))) # Zurich HB -# test(tuple((45.758217, 4.831814))) # Lyon Bellecour +test(tuple((45.758217, 4.831814))) # Lyon Bellecour # test(tuple((48.5848435, 7.7332974))) # Strasbourg Gare # test(tuple((48.2067858, 16.3692340))) # Vienne -test(tuple((48.084588, 7.280405))) # Turckheim +# test(tuple((48.2432090, 7.3892691))) # Orschwiller diff --git a/backend/src/utils/landmarks_manager.py b/backend/src/utils/landmarks_manager.py index f205132..0f2f1f8 100644 --- a/backend/src/utils/landmarks_manager.py +++ b/backend/src/utils/landmarks_manager.py @@ -39,6 +39,7 @@ class LandmarkManager: self.overall_coeff = parameters['overall_coeff'] self.tag_exponent = parameters['tag_exponent'] self.image_bonus = parameters['image_bonus'] + self.name_bonus = parameters['name_bonus'] self.wikipedia_bonus = parameters['wikipedia_bonus'] self.viewpoint_bonus = parameters['viewpoint_bonus'] self.pay_bonus = parameters['pay_bonus'] @@ -202,18 +203,29 @@ class LandmarkManager: """ return_list = [] + if landmarktype == 'nature' : query_conditions = [] + else : query_conditions = ['count_tags()>5'] + # caution, when applying a list of selectors, overpass will search for elements that match ALL selectors simultaneously # we need to split the selectors into separate queries and merge the results for sel in dict_to_selector_list(amenity_selector): self.logger.debug(f"Current selector: {sel}") + + query_conditions = ['count_tags()>5'] + element_types = ['way', 'relation'] + + if 'viewpoint' in sel : + query_conditions = [] + element_types.append('node') + query = overpassQueryBuilder( bbox = bbox, - elementType = ['way', 'relation'], + elementType = element_types, # selector can in principle be a list already, # but it generates the intersection of the queries # we want the union selector = sel, - conditions = ['count_tags()>5'], + conditions = query_conditions, # except for nature.... includeCenter = True, out = 'body' ) @@ -229,18 +241,23 @@ class LandmarkManager: name = elem.tag('name') location = (elem.centerLat(), elem.centerLon()) + osm_type = elem.type() # Add type: 'way' or 'relation' + osm_id = elem.id() # Add OSM id # TODO: exclude these from the get go - # skip if unprecise location + # handle unprecise and no-name locations if name is None or location[0] is None: - continue + if osm_type == 'node' and 'viewpoint' in elem.tags().values(): + name = 'Viewpoint' + name_en = 'Viewpoint' + location = (elem.lat(), elem.lon()) + else : + continue # skip if part of another building if 'building:part' in elem.tags().keys() and elem.tag('building:part') == 'yes': continue - osm_type = elem.type() # Add type: 'way' or 'relation' - osm_id = elem.id() # Add OSM id elem_type = landmarktype # Add the landmark type as 'sightseeing, n_tags = len(elem.tags().keys()) # Add number of tags score = n_tags**self.tag_exponent # Add score @@ -248,59 +265,66 @@ class LandmarkManager: image_url = None name_en = None - # Adjust scoring + # Adjust scoring, browse through tag keys skip = False - for tag in elem.tags().keys(): - if "pay" in tag: + for tag_key in elem.tags().keys(): + if "pay" in tag_key: # payment options are misleading and should not count for the scoring. score += self.pay_bonus - if "disused" in tag: + if "disused" in tag_key: # skip disused amenities skip = True break - if "wiki" in tag: + if "name" in tag_key : + score += self.name_bonus + + if "wiki" in tag_key: # wikipedia entries count more score += self.wikipedia_bonus - if "viewpoint" in tag: - # viewpoints must count more - score += self.viewpoint_bonus - duration = 10 - - if "image" in tag: + if "image" in tag_key: # images must count more score += self.image_bonus if elem_type != "nature": - if "leisure" in tag and elem.tag('leisure') == "park": + if "leisure" in tag_key and elem.tag('leisure') == "park": elem_type = "nature" if landmarktype != "shopping": - if "shop" in tag: + if "shop" in tag_key: skip = True break - if tag == "building" and elem.tag('building') in ['retail', 'supermarket', 'parking']: + if tag_key == "building" and elem.tag('building') in ['retail', 'supermarket', 'parking']: skip = True break # Extract image, website and english name - if tag in ['website', 'contact:website']: - website_url = elem.tag(tag) - if tag == 'image': + if tag_key in ['website', 'contact:website']: + website_url = elem.tag(tag_key) + if tag_key == 'image': image_url = elem.tag('image') - if tag =='name:en': + if tag_key =='name:en': name_en = elem.tag('name:en') if skip: continue + # Don't visit random apartments + if 'apartments' in elem.tags().values(): + continue + score = score_function(score) if "place_of_worship" in elem.tags().values(): score = score * self.church_coeff duration = 10 + + if 'viewpoint' in elem.tags().values() : + # viewpoints must count more + score += self.viewpoint_bonus + duration = 10 elif "museum" in elem.tags().values() or "aquarium" in elem.tags().values() or "planetarium" in elem.tags().values(): duration = 60