[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 |  @parse       url, title | ||||||
| """ | """ | ||||||
| 
 | 
 | ||||||
|  | import re | ||||||
| from json import loads | from json import loads | ||||||
|  | from flask_babel import gettext | ||||||
| 
 | 
 | ||||||
| # engine dependent config | # engine dependent config | ||||||
| categories = ['map'] | categories = ['map'] | ||||||
| @ -21,10 +23,15 @@ base_url = 'https://nominatim.openstreetmap.org/' | |||||||
| search_string = 'search/{query}?format=json&polygon_geojson=1&addressdetails=1' | search_string = 'search/{query}?format=json&polygon_geojson=1&addressdetails=1' | ||||||
| result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}' | 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 | # do search-request | ||||||
| def request(query, params): | def request(query, params): | ||||||
|  | 
 | ||||||
|     params['url'] = base_url + search_string.format(query=query.decode('utf-8')) |     params['url'] = base_url + search_string.format(query=query.decode('utf-8')) | ||||||
|  |     params['route'] = route_re.match(query.decode('utf-8')) | ||||||
| 
 | 
 | ||||||
|     return params |     return params | ||||||
| 
 | 
 | ||||||
| @ -34,6 +41,13 @@ def response(resp): | |||||||
|     results = [] |     results = [] | ||||||
|     json = loads(resp.text) |     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 |     # parse results | ||||||
|     for r in json: |     for r in json: | ||||||
|         if 'display_name' not in r: |         if 'display_name' not in r: | ||||||
|  | |||||||
| @ -37,10 +37,8 @@ def post_search(request, search): | |||||||
|             ip = x_forwarded_for[0] |             ip = x_forwarded_for[0] | ||||||
|         else: |         else: | ||||||
|             ip = request.remote_addr |             ip = request.remote_addr | ||||||
|         search.result_container.answers.clear() |         search.result_container.answers['ip'] = {'answer': ip} | ||||||
|         search.result_container.answers.add(ip) |  | ||||||
|     elif p.match(search.search_query.query): |     elif p.match(search.search_query.query): | ||||||
|         ua = request.user_agent |         ua = request.user_agent | ||||||
|         search.result_container.answers.clear() |         search.result_container.answers['user-agent'] = {'answer': ua} | ||||||
|         search.result_container.answers.add(ua) |  | ||||||
|     return True |     return True | ||||||
|  | |||||||
| @ -131,7 +131,7 @@ class ResultContainer(object): | |||||||
|         self._merged_results = [] |         self._merged_results = [] | ||||||
|         self.infoboxes = [] |         self.infoboxes = [] | ||||||
|         self.suggestions = set() |         self.suggestions = set() | ||||||
|         self.answers = set() |         self.answers = {} | ||||||
|         self.corrections = set() |         self.corrections = set() | ||||||
|         self._number_of_results = [] |         self._number_of_results = [] | ||||||
|         self._ordered = False |         self._ordered = False | ||||||
| @ -146,7 +146,7 @@ class ResultContainer(object): | |||||||
|                 self.suggestions.add(result['suggestion']) |                 self.suggestions.add(result['suggestion']) | ||||||
|                 results.remove(result) |                 results.remove(result) | ||||||
|             elif 'answer' in result: |             elif 'answer' in result: | ||||||
|                 self.answers.add(result['answer']) |                 self.answers[result['answer']] = result | ||||||
|                 results.remove(result) |                 results.remove(result) | ||||||
|             elif 'correction' in result: |             elif 'correction' in result: | ||||||
|                 self.corrections.add(result['correction']) |                 self.corrections.add(result['correction']) | ||||||
|  | |||||||
| @ -33,8 +33,12 @@ | |||||||
| 
 | 
 | ||||||
|     {% if answers %} |     {% if answers %} | ||||||
|     <div id="answers"><span>{{ _('Answers') }}</span> |     <div id="answers"><span>{{ _('Answers') }}</span> | ||||||
|         {% for answer in answers %} |         {% for answer in answers.values() %} | ||||||
|         <span>{{ answer }}</span> |             {% if answer.url %} | ||||||
|  |             <a href="{{ answer.url }}">{{ answer.answer }}</a> | ||||||
|  |             {% else %} | ||||||
|  |             <span>{{ answer.answer }}</span> | ||||||
|  |             {% endif %} | ||||||
|         {% endfor %} |         {% endfor %} | ||||||
|     </div> |     </div> | ||||||
|     {% endif %} |     {% endif %} | ||||||
|  | |||||||
| @ -94,9 +94,13 @@ | |||||||
|             {%- endif %} |             {%- endif %} | ||||||
| 
 | 
 | ||||||
|             {% if answers -%} |             {% if answers -%} | ||||||
|             {%- for answer in answers %} |             {%- for answer in answers.values() %} | ||||||
|             <div class="result well"> |             <div class="result well"> | ||||||
|                 <span>{{ answer }}</span> |               {% if answer.url %} | ||||||
|  |                 <a href="{{ answer.url }}">{{ answer.answer }}</a> | ||||||
|  |               {% else %} | ||||||
|  |                 <span>{{ answer.answer }}</span> | ||||||
|  |               {% endif %} | ||||||
|             </div> |             </div> | ||||||
|             {%- endfor %} |             {%- endfor %} | ||||||
|             {%- endif %} |             {%- endif %} | ||||||
|  | |||||||
| @ -15,8 +15,14 @@ | |||||||
| <div id="results" class="{{ only_template }}"> | <div id="results" class="{{ only_template }}"> | ||||||
|     {% if answers -%} |     {% if answers -%} | ||||||
|     <div id="answers"><h4 class="title">{{ _('Answers') }} : </h4> |     <div id="answers"><h4 class="title">{{ _('Answers') }} : </h4> | ||||||
|         {%- for answer in answers -%} |         {%- for answer in answers.values() -%} | ||||||
|         <div class="answer">{{- answer -}}</div> |         <div class="answer"> | ||||||
|  |               {% if answer.url %} | ||||||
|  |                 <a href="{{ answer.url }}">{{ answer.answer }}</a> | ||||||
|  |               {% else %} | ||||||
|  |                 <span>{{ answer.answer }}</span> | ||||||
|  |               {% endif %} | ||||||
|  |         </div> | ||||||
|         {%- endfor -%} |         {%- endfor -%} | ||||||
|     </div> |     </div> | ||||||
|     {%- endif %} |     {%- endif %} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Adam Tauber
						Adam Tauber