| 
									
										
										
										
											2015-05-02 15:45:17 +02:00
										 |  |  | """
 | 
					
						
							|  |  |  |  OpenStreetMap (Map) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  @website     https://openstreetmap.org/ | 
					
						
							|  |  |  |  @provide-api yes (http://wiki.openstreetmap.org/wiki/Nominatim) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |  @using-api   yes | 
					
						
							|  |  |  |  @results     JSON | 
					
						
							|  |  |  |  @stable      yes | 
					
						
							|  |  |  |  @parse       url, title | 
					
						
							|  |  |  | """
 | 
					
						
							| 
									
										
										
										
											2014-09-06 14:09:03 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | from json import loads | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # engine dependent config | 
					
						
							|  |  |  | categories = ['map'] | 
					
						
							|  |  |  | paging = False | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # search-url | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  | base_url = 'https://nominatim.openstreetmap.org/' | 
					
						
							|  |  |  | search_string = 'search/{query}?format=json&polygon_geojson=1&addressdetails=1' | 
					
						
							| 
									
										
										
										
											2014-09-06 14:09:03 +02:00
										 |  |  | result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # do search-request | 
					
						
							|  |  |  | def request(query, params): | 
					
						
							| 
									
										
										
										
											2019-12-21 20:56:38 +01:00
										 |  |  |     params['url'] = base_url + search_string.format(query=query.decode('utf-8')) | 
					
						
							| 
									
										
										
										
											2014-12-16 15:01:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-06 14:09:03 +02:00
										 |  |  |     return params | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | # get response from search-request | 
					
						
							|  |  |  | def response(resp): | 
					
						
							|  |  |  |     results = [] | 
					
						
							|  |  |  |     json = loads(resp.text) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # parse results | 
					
						
							|  |  |  |     for r in json: | 
					
						
							| 
									
										
										
										
											2015-02-07 01:15:04 +01:00
										 |  |  |         if 'display_name' not in r: | 
					
						
							|  |  |  |             continue | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-09 19:52:49 +01:00
										 |  |  |         title = r['display_name'] or u'' | 
					
						
							| 
									
										
										
										
											2014-09-06 14:09:03 +02:00
										 |  |  |         osm_type = r.get('osm_type', r.get('type')) | 
					
						
							|  |  |  |         url = result_base_url.format(osm_type=osm_type, | 
					
						
							|  |  |  |                                      osm_id=r['osm_id']) | 
					
						
							| 
									
										
										
										
											2014-11-02 13:00:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-07 16:37:56 +01:00
										 |  |  |         osm = {'type': osm_type, | 
					
						
							|  |  |  |                'id': r['osm_id']} | 
					
						
							| 
									
										
										
										
											2014-11-19 14:59:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-12-07 16:37:56 +01:00
										 |  |  |         geojson = r.get('geojson') | 
					
						
							| 
									
										
										
										
											2014-11-02 13:00:28 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # if no geojson is found and osm_type is a node, add geojson Point | 
					
						
							| 
									
										
										
										
											2015-02-07 01:15:04 +01:00
										 |  |  |         if not geojson and osm_type == 'node': | 
					
						
							|  |  |  |             geojson = {u'type': u'Point', u'coordinates': [r['lon'], r['lat']]} | 
					
						
							| 
									
										
										
										
											2014-11-02 13:00:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-03 18:46:58 +01:00
										 |  |  |         address_raw = r.get('address') | 
					
						
							|  |  |  |         address = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         # get name | 
					
						
							|  |  |  |         if r['class'] == 'amenity' or\ | 
					
						
							|  |  |  |            r['class'] == 'shop' or\ | 
					
						
							|  |  |  |            r['class'] == 'tourism' or\ | 
					
						
							|  |  |  |            r['class'] == 'leisure': | 
					
						
							|  |  |  |             if address_raw.get('address29'): | 
					
						
							| 
									
										
										
										
											2014-12-07 16:37:56 +01:00
										 |  |  |                 address = {'name': address_raw.get('address29')} | 
					
						
							| 
									
										
										
										
											2014-11-03 18:46:58 +01:00
										 |  |  |             else: | 
					
						
							| 
									
										
										
										
											2014-12-07 16:37:56 +01:00
										 |  |  |                 address = {'name': address_raw.get(r['type'])} | 
					
						
							| 
									
										
										
										
											2014-11-03 18:46:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |         # add rest of adressdata, if something is already found | 
					
						
							|  |  |  |         if address.get('name'): | 
					
						
							| 
									
										
										
										
											2014-12-07 16:37:56 +01:00
										 |  |  |             address.update({'house_number': address_raw.get('house_number'), | 
					
						
							|  |  |  |                            'road': address_raw.get('road'), | 
					
						
							|  |  |  |                            'locality': address_raw.get('city', | 
					
						
							| 
									
										
										
										
											2014-12-16 17:01:25 +01:00
										 |  |  |                                        address_raw.get('town',          # noqa | 
					
						
							|  |  |  |                                        address_raw.get('village'))),    # noqa | 
					
						
							| 
									
										
										
										
											2014-12-07 16:37:56 +01:00
										 |  |  |                            'postcode': address_raw.get('postcode'), | 
					
						
							|  |  |  |                            'country': address_raw.get('country'), | 
					
						
							|  |  |  |                            'country_code': address_raw.get('country_code')}) | 
					
						
							| 
									
										
										
										
											2014-11-03 18:46:58 +01:00
										 |  |  |         else: | 
					
						
							|  |  |  |             address = None | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-09-06 14:09:03 +02:00
										 |  |  |         # append result | 
					
						
							| 
									
										
										
										
											2014-11-02 13:00:28 +01:00
										 |  |  |         results.append({'template': 'map.html', | 
					
						
							|  |  |  |                         'title': title, | 
					
						
							| 
									
										
										
										
											2014-09-06 14:09:03 +02:00
										 |  |  |                         'content': '', | 
					
						
							| 
									
										
										
										
											2014-11-02 13:00:28 +01:00
										 |  |  |                         'longitude': r['lon'], | 
					
						
							|  |  |  |                         'latitude': r['lat'], | 
					
						
							|  |  |  |                         'boundingbox': r['boundingbox'], | 
					
						
							|  |  |  |                         'geojson': geojson, | 
					
						
							| 
									
										
										
										
											2014-11-03 18:46:58 +01:00
										 |  |  |                         'address': address, | 
					
						
							| 
									
										
										
										
											2014-11-19 14:59:30 +01:00
										 |  |  |                         'osm': osm, | 
					
						
							| 
									
										
										
										
											2014-09-06 14:09:03 +02:00
										 |  |  |                         'url': url}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # return results | 
					
						
							|  |  |  |     return results |