[enh] add routing directions to osm search - closes #254
This commit is contained in:
		
							parent
							
								
									785f0938fd
								
							
						
					
					
						commit
						2c6531b233
					
				| @ -10,7 +10,9 @@ | ||||
|  @parse       url, title | ||||
| """ | ||||
| 
 | ||||
| import re | ||||
| from json import loads | ||||
| from flask_babel import gettext | ||||
| 
 | ||||
| # engine dependent config | ||||
| categories = ['map'] | ||||
| @ -21,10 +23,15 @@ base_url = 'https://nominatim.openstreetmap.org/' | ||||
| search_string = 'search/{query}?format=json&polygon_geojson=1&addressdetails=1' | ||||
| result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}' | ||||
| 
 | ||||
| route_url = 'https://graphhopper.com/maps/?point={}&point={}&locale=en-US&vehicle=car&weighting=fastest&turn_costs=true&use_miles=false&layer=Omniscale' | ||||
| route_re = re.compile('(?:from )?(.+) to (.+)') | ||||
| 
 | ||||
| 
 | ||||
| # do search-request | ||||
| def request(query, params): | ||||
| 
 | ||||
|     params['url'] = base_url + search_string.format(query=query.decode('utf-8')) | ||||
|     params['route'] = route_re.match(query.decode('utf-8')) | ||||
| 
 | ||||
|     return params | ||||
| 
 | ||||
| @ -34,6 +41,13 @@ def response(resp): | ||||
|     results = [] | ||||
|     json = loads(resp.text) | ||||
| 
 | ||||
| 
 | ||||
|     if resp.search_params['route']: | ||||
|         results.append({ | ||||
|             'answer': gettext('Get directions'), | ||||
|             'url': route_url.format(*resp.search_params['route'].groups()), | ||||
|         }) | ||||
| 
 | ||||
|     # parse results | ||||
|     for r in json: | ||||
|         if 'display_name' not in r: | ||||
|  | ||||
| @ -37,10 +37,8 @@ def post_search(request, search): | ||||
|             ip = x_forwarded_for[0] | ||||
|         else: | ||||
|             ip = request.remote_addr | ||||
|         search.result_container.answers.clear() | ||||
|         search.result_container.answers.add(ip) | ||||
|         search.result_container.answers['ip'] = {'answer': ip} | ||||
|     elif p.match(search.search_query.query): | ||||
|         ua = request.user_agent | ||||
|         search.result_container.answers.clear() | ||||
|         search.result_container.answers.add(ua) | ||||
|         search.result_container.answers['user-agent'] = {'answer': ua} | ||||
|     return True | ||||
|  | ||||
| @ -131,7 +131,7 @@ class ResultContainer(object): | ||||
|         self._merged_results = [] | ||||
|         self.infoboxes = [] | ||||
|         self.suggestions = set() | ||||
|         self.answers = set() | ||||
|         self.answers = {} | ||||
|         self.corrections = set() | ||||
|         self._number_of_results = [] | ||||
|         self._ordered = False | ||||
| @ -146,7 +146,7 @@ class ResultContainer(object): | ||||
|                 self.suggestions.add(result['suggestion']) | ||||
|                 results.remove(result) | ||||
|             elif 'answer' in result: | ||||
|                 self.answers.add(result['answer']) | ||||
|                 self.answers[result['answer']] = result | ||||
|                 results.remove(result) | ||||
|             elif 'correction' in result: | ||||
|                 self.corrections.add(result['correction']) | ||||
|  | ||||
| @ -33,8 +33,12 @@ | ||||
| 
 | ||||
|     {% if answers %} | ||||
|     <div id="answers"><span>{{ _('Answers') }}</span> | ||||
|         {% for answer in answers %} | ||||
|         <span>{{ answer }}</span> | ||||
|         {% for answer in answers.values() %} | ||||
|             {% if answer.url %} | ||||
|             <a href="{{ answer.url }}">{{ answer.answer }}</a> | ||||
|             {% else %} | ||||
|             <span>{{ answer.answer }}</span> | ||||
|             {% endif %} | ||||
|         {% endfor %} | ||||
|     </div> | ||||
|     {% endif %} | ||||
|  | ||||
| @ -94,9 +94,13 @@ | ||||
|             {%- endif %} | ||||
| 
 | ||||
|             {% if answers -%} | ||||
|             {%- for answer in answers %} | ||||
|             {%- for answer in answers.values() %} | ||||
|             <div class="result well"> | ||||
|                 <span>{{ answer }}</span> | ||||
|               {% if answer.url %} | ||||
|                 <a href="{{ answer.url }}">{{ answer.answer }}</a> | ||||
|               {% else %} | ||||
|                 <span>{{ answer.answer }}</span> | ||||
|               {% endif %} | ||||
|             </div> | ||||
|             {%- endfor %} | ||||
|             {%- endif %} | ||||
|  | ||||
| @ -15,8 +15,14 @@ | ||||
| <div id="results" class="{{ only_template }}"> | ||||
|     {% if answers -%} | ||||
|     <div id="answers"><h4 class="title">{{ _('Answers') }} : </h4> | ||||
|         {%- for answer in answers -%} | ||||
|         <div class="answer">{{- answer -}}</div> | ||||
|         {%- for answer in answers.values() -%} | ||||
|         <div class="answer"> | ||||
|               {% if answer.url %} | ||||
|                 <a href="{{ answer.url }}">{{ answer.answer }}</a> | ||||
|               {% else %} | ||||
|                 <span>{{ answer.answer }}</span> | ||||
|               {% endif %} | ||||
|         </div> | ||||
|         {%- endfor -%} | ||||
|     </div> | ||||
|     {%- endif %} | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Adam Tauber
						Adam Tauber