| 
									
										
										
										
											2015-05-02 15:45:17 +02:00
										 |  |  | """
 | 
					
						
							|  |  |  |  Photon (Map) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  @website     https://photon.komoot.de | 
					
						
							|  |  |  |  @provide-api yes (https://photon.komoot.de/) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  @using-api   yes | 
					
						
							|  |  |  |  @results     JSON | 
					
						
							|  |  |  |  @stable      yes | 
					
						
							|  |  |  |  @parse       url, title | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | from json import loads | 
					
						
							| 
									
										
										
										
											2020-08-06 17:42:46 +02:00
										 |  |  | from urllib.parse import urlencode | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  | from searx.utils import searx_useragent | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # engine dependent config | 
					
						
							|  |  |  | categories = ['map'] | 
					
						
							|  |  |  | paging = False | 
					
						
							|  |  |  | language_support = True | 
					
						
							|  |  |  | number_of_results = 10 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # search-url | 
					
						
							| 
									
										
										
										
											2020-11-27 08:22:28 +01:00
										 |  |  | base_url = 'https://photon.komoot.io/' | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | search_string = 'api/?{query}&limit={limit}' | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  | result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-20 10:25:53 +01:00
										 |  |  | # list of supported languages | 
					
						
							| 
									
										
										
										
											2016-08-06 06:34:56 +02:00
										 |  |  | supported_languages = ['de', 'en', 'fr', 'it'] | 
					
						
							| 
									
										
										
										
											2014-12-20 10:25:53 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | # do search-request | 
					
						
							|  |  |  | def request(query, params): | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  |     params['url'] = base_url +\ | 
					
						
							|  |  |  |         search_string.format(query=urlencode({'q': query}), | 
					
						
							|  |  |  |                              limit=number_of_results) | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-01-06 15:27:46 +01:00
										 |  |  |     if params['language'] != 'all': | 
					
						
							|  |  |  |         language = params['language'].split('_')[0] | 
					
						
							|  |  |  |         if language in supported_languages: | 
					
						
							|  |  |  |             params['url'] = params['url'] + "&lang=" + language | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # using searx User-Agent | 
					
						
							|  |  |  |     params['headers']['User-Agent'] = searx_useragent() | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |     return params | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # get response from search-request | 
					
						
							|  |  |  | def response(resp): | 
					
						
							|  |  |  |     results = [] | 
					
						
							|  |  |  |     json = loads(resp.text) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # parse results | 
					
						
							|  |  |  |     for r in json.get('features', {}): | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |         properties = r.get('properties') | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |         if not properties: | 
					
						
							|  |  |  |             continue | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |         # get title | 
					
						
							| 
									
										
										
										
											2015-02-10 18:44:49 +01:00
										 |  |  |         title = properties.get('name') | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |         # get osm-type | 
					
						
							|  |  |  |         if properties.get('osm_type') == 'N': | 
					
						
							|  |  |  |             osm_type = 'node' | 
					
						
							|  |  |  |         elif properties.get('osm_type') == 'W': | 
					
						
							|  |  |  |             osm_type = 'way' | 
					
						
							|  |  |  |         elif properties.get('osm_type') == 'R': | 
					
						
							|  |  |  |             osm_type = 'relation' | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             # continue if invalide osm-type | 
					
						
							|  |  |  |             continue | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |         url = result_base_url.format(osm_type=osm_type, | 
					
						
							|  |  |  |                                      osm_id=properties.get('osm_id')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         osm = {'type': osm_type, | 
					
						
							|  |  |  |                'id': properties.get('osm_id')} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         geojson = r.get('geometry') | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if properties.get('extent'): | 
					
						
							|  |  |  |             boundingbox = [properties.get('extent')[3], | 
					
						
							|  |  |  |                            properties.get('extent')[1], | 
					
						
							|  |  |  |                            properties.get('extent')[0], | 
					
						
							|  |  |  |                            properties.get('extent')[2]] | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |         else: | 
					
						
							|  |  |  |             # TODO: better boundingbox calculation | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  |             boundingbox = [geojson['coordinates'][1], | 
					
						
							|  |  |  |                            geojson['coordinates'][1], | 
					
						
							|  |  |  |                            geojson['coordinates'][0], | 
					
						
							|  |  |  |                            geojson['coordinates'][0]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # address calculation | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |         address = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # get name | 
					
						
							|  |  |  |         if properties.get('osm_key') == 'amenity' or\ | 
					
						
							|  |  |  |            properties.get('osm_key') == 'shop' or\ | 
					
						
							|  |  |  |            properties.get('osm_key') == 'tourism' or\ | 
					
						
							|  |  |  |            properties.get('osm_key') == 'leisure': | 
					
						
							|  |  |  |             address = {'name': properties.get('name')} | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |         # add rest of adressdata, if something is already found | 
					
						
							|  |  |  |         if address.get('name'): | 
					
						
							|  |  |  |             address.update({'house_number': properties.get('housenumber'), | 
					
						
							|  |  |  |                            'road': properties.get('street'), | 
					
						
							|  |  |  |                            'locality': properties.get('city', | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  |                                        properties.get('town',           # noqa | 
					
						
							|  |  |  |                                        properties.get('village'))),     # noqa | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  |                            'postcode': properties.get('postcode'), | 
					
						
							|  |  |  |                            'country': properties.get('country')}) | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             address = None | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # append result | 
					
						
							|  |  |  |         results.append({'template': 'map.html', | 
					
						
							|  |  |  |                         'title': title, | 
					
						
							|  |  |  |                         'content': '', | 
					
						
							|  |  |  |                         'longitude': geojson['coordinates'][0], | 
					
						
							|  |  |  |                         'latitude': geojson['coordinates'][1], | 
					
						
							|  |  |  |                         'boundingbox': boundingbox, | 
					
						
							|  |  |  |                         'geojson': geojson, | 
					
						
							|  |  |  |                         'address': address, | 
					
						
							|  |  |  |                         'osm': osm, | 
					
						
							|  |  |  |                         'url': url}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # return results | 
					
						
							|  |  |  |     return results |