Better landmark finding #27
| @@ -9,9 +9,9 @@ name = "pypi" | ||||
| numpy = "*" | ||||
| fastapi = "*" | ||||
| pydantic = "*" | ||||
| geopy = "*" | ||||
| shapely = "*" | ||||
| scipy = "*" | ||||
| osmpythontools = "*" | ||||
| pywikibot = "*" | ||||
| pymemcache = "*" | ||||
| fastapi-cli = "*" | ||||
|   | ||||
							
								
								
									
										2208
									
								
								backend/Pipfile.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2208
									
								
								backend/Pipfile.lock
									
									
									
										generated
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							 Submodule backend/deployment updated: 8927f278f3...718df09e88
									
								
							| @@ -16,7 +16,7 @@ OSM_CACHE_DIR = Path(cache_dir_string) | ||||
|  | ||||
| import logging | ||||
| # if we are in a debug session, set verbose and rich logging | ||||
| if os.getenv('DEBUG', False): | ||||
| if os.getenv('DEBUG', "false") == "true": | ||||
|     from rich.logging import RichHandler | ||||
|     logging.basicConfig( | ||||
|         level=logging.DEBUG, | ||||
|   | ||||
| @@ -1,3 +1,6 @@ | ||||
| # Tags were picked mostly arbitrarily, based on the OSM wiki and the OSM tags page. | ||||
| # See https://taginfo.openstreetmap.org for more inspiration. | ||||
|  | ||||
| nature: | ||||
|   leisure: park | ||||
|   geological: '' | ||||
| @@ -11,7 +14,24 @@ nature: | ||||
|     - alpine_hut | ||||
|     - viewpoint | ||||
|     - zoo | ||||
|   waterway: waterfall | ||||
|     - resort | ||||
|     - picnic_site | ||||
|   water: | ||||
|     - pond | ||||
|     - lake | ||||
|     - river | ||||
|     - basin | ||||
|     - stream | ||||
|     - lagoon | ||||
|     - rapids | ||||
|   waterway: | ||||
|     - waterfall | ||||
|     - river | ||||
|     - canal | ||||
|     - dam | ||||
|     - dock | ||||
|     - boatyard | ||||
|  | ||||
|  | ||||
| shopping: | ||||
|   shop: | ||||
| @@ -23,10 +43,48 @@ sightseeing: | ||||
|     - museum | ||||
|     - attraction | ||||
|     - gallery | ||||
|     - artwork | ||||
|     - aquarium | ||||
|  | ||||
|   historic: '' | ||||
|   amenity: | ||||
|     - planetarium | ||||
|     - place_of_worship | ||||
|     - fountain | ||||
|     - townhall | ||||
|   water: | ||||
|     - reflecting_pool | ||||
|   bridge: | ||||
|     - aqueduct | ||||
|     - viaduct | ||||
|     - boardwalk | ||||
|     - cantilever | ||||
|     - abandoned | ||||
|   building: | ||||
|     - church | ||||
|     - chapel | ||||
|     - mosque | ||||
|     - synagogue | ||||
|     - ruins | ||||
|     - temple | ||||
|     - government | ||||
|     - cathedral | ||||
|     - castle | ||||
|     - museum | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| # to be used later on | ||||
| restauration: | ||||
|   shop: | ||||
|     - coffee | ||||
|     - bakery | ||||
|     - restaurant | ||||
|     - pastry | ||||
|   amenity: | ||||
|     - restaurant | ||||
|     - cafe | ||||
|     - ice_cream | ||||
|     - food_court | ||||
|     - biergarten | ||||
|   | ||||
| @@ -21,8 +21,8 @@ if constants.MEMCACHED_HOST_PATH is None: | ||||
| else: | ||||
|     client = Client( | ||||
|         constants.MEMCACHED_HOST_PATH, | ||||
|         timeout=1, | ||||
|         allow_unicode_keys=True, | ||||
|         encoding='utf-8', | ||||
|         serde=serde.pickle_serde | ||||
|         timeout = 1, | ||||
|         allow_unicode_keys = True, | ||||
|         encoding = 'utf-8', | ||||
|         serde = serde.pickle_serde | ||||
|     ) | ||||
|   | ||||
| @@ -22,7 +22,8 @@ class Trip(BaseModel): | ||||
|  | ||||
|         # Store the trip in the cache | ||||
|         cache_client.set(f"trip_{trip.uuid}", trip) | ||||
|         cache_client.set_many({f"landmark_{landmark.uuid}": landmark for landmark in landmarks}, expire=3600) | ||||
|         # make sure to await the result (noreply=False). Otherwise the cache might not be inplace when the trip is actually requested | ||||
|         cache_client.set_many({f"landmark_{landmark.uuid}": landmark for landmark in landmarks}, expire=3600, noreply=False) | ||||
|         # is equivalent to: | ||||
|         # for landmark in landmarks: | ||||
|         #     cache_client.set(f"landmark_{landmark.uuid}", landmark, expire=3600) | ||||
|   | ||||
| @@ -1,5 +1,5 @@ | ||||
| import yaml | ||||
| from geopy.distance import geodesic | ||||
| from math import sin, cos, sqrt, atan2, radians | ||||
|  | ||||
| import constants | ||||
|  | ||||
| @@ -8,6 +8,7 @@ with constants.OPTIMIZER_PARAMETERS_PATH.open('r') as f: | ||||
|     DETOUR_FACTOR = parameters['detour_factor'] | ||||
|     AVERAGE_WALKING_SPEED = parameters['average_walking_speed'] | ||||
|  | ||||
| EARTH_RADIUS_KM = 6373 | ||||
|  | ||||
| def get_time(p1: tuple[float, float], p2: tuple[float, float]) -> int: | ||||
|     """ | ||||
| @@ -22,16 +23,28 @@ def get_time(p1: tuple[float, float], p2: tuple[float, float]) -> int: | ||||
|     """ | ||||
|  | ||||
|  | ||||
|     # Compute the straight-line distance in km | ||||
|     if p1 == p2 : | ||||
|     if p1 == p2: | ||||
|         return 0 | ||||
|     else: | ||||
|         dist = geodesic(p1, p2).kilometers | ||||
|         # Compute the distance in km along the surface of the Earth | ||||
|         # (assume spherical Earth) | ||||
|         # this is the haversine formula, stolen from stackoverflow | ||||
|         # in order to not use any external libraries | ||||
|         lat1, lon1 = radians(p1[0]), radians(p1[1]) | ||||
|         lat2, lon2 = radians(p2[0]), radians(p2[1]) | ||||
|  | ||||
|     # Consider the detour factor for average cityto deterline walking distance (in km) | ||||
|     walk_dist = dist*DETOUR_FACTOR | ||||
|         dlon = lon2 - lon1 | ||||
|         dlat = lat2 - lat1 | ||||
|  | ||||
|         a = sin(dlat / 2)**2 + cos(lat1) * cos(lat2) * sin(dlon / 2)**2 | ||||
|         c = 2 * atan2(sqrt(a), sqrt(1 - a)) | ||||
|  | ||||
|         distance = EARTH_RADIUS_KM * c | ||||
|  | ||||
|     # Consider the detour factor for average an average city | ||||
|     walk_distance = distance * DETOUR_FACTOR | ||||
|  | ||||
|     # Time to walk this distance (in minutes) | ||||
|     walk_time = walk_dist/AVERAGE_WALKING_SPEED*60 | ||||
|     walk_time = walk_distance / AVERAGE_WALKING_SPEED * 60 | ||||
|  | ||||
|     return round(walk_time) | ||||
|   | ||||
| @@ -10,7 +10,8 @@ from structs.landmark import Landmark | ||||
| from .take_most_important import take_most_important | ||||
| import constants | ||||
|  | ||||
|  | ||||
| # silence the overpass logger | ||||
| logging.getLogger('OSMPythonTools').setLevel(level=logging.CRITICAL) | ||||
|  | ||||
|  | ||||
| class LandmarkManager: | ||||
| @@ -206,11 +207,15 @@ class LandmarkManager: | ||||
|             query = overpassQueryBuilder( | ||||
|                 bbox = bbox, | ||||
|                 elementType = ['way', 'relation'], | ||||
|                 # selector can in principle be a list already, | ||||
|                 # but it generates the intersection of the queries | ||||
|                 # we want the union | ||||
|                 selector = sel, | ||||
|                 # conditions = [], | ||||
|                 conditions = ['count_tags()>5'], | ||||
|                 includeCenter = True, | ||||
|                 out = 'body' | ||||
|                 ) | ||||
|             self.logger.debug(f"Query: {query}") | ||||
|  | ||||
|             try: | ||||
|                 result = self.overpass.query(query) | ||||
| @@ -336,7 +341,7 @@ def dict_to_selector_list(d: dict) -> list: | ||||
|     for key, value in d.items(): | ||||
|         if type(value) == list: | ||||
|             val = '|'.join(value) | ||||
|             return_list.append(f'{key}~"{val}"') | ||||
|             return_list.append(f'{key}~"^({val})$"') | ||||
|         elif type(value) == str and len(value) == 0: | ||||
|             return_list.append(f'{key}') | ||||
|         else: | ||||
|   | ||||
| @@ -3,7 +3,6 @@ import numpy as np | ||||
|  | ||||
| from scipy.optimize import linprog | ||||
| from collections import defaultdict, deque | ||||
| from geopy.distance import geodesic | ||||
|  | ||||
| from structs.landmark import Landmark | ||||
| from .get_time_separation import get_time | ||||
|   | ||||
| @@ -42,7 +42,7 @@ jobs: | ||||
|       - name: Load secrets from github | ||||
|         run: | | ||||
|           echo "${{ secrets.ANDROID_SECRET_PROPERTIES_BASE64 }}" | base64 -d > secrets.properties | ||||
|           echo "${{ secrets.ANDROID_GOOGLE_PLAY_JSON_BASE64 }}" | base64 -d > fastlane/google-key.json | ||||
|           echo "${{ secrets.ANDROID_GOOGLE_PLAY_JSON_BASE64 }}" | base64 -d > google-key.json | ||||
|           echo "${{ secrets.ANDROID_KEYSTORE_BASE64 }}" | base64 -d > release.keystore | ||||
|         working-directory: android | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user