openstreetmap.py 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. ## OpenStreetMap (Map)
  2. #
  3. # @website https://openstreetmap.org/
  4. # @provide-api yes (http://wiki.openstreetmap.org/wiki/Nominatim)
  5. #
  6. # @using-api yes
  7. # @results JSON
  8. # @stable yes
  9. # @parse url, title
  10. from json import loads
  11. # engine dependent config
  12. categories = ['map']
  13. paging = False
  14. # search-url
  15. url = 'https://nominatim.openstreetmap.org/search/{query}?format=json&polygon_geojson=1&addressdetails=1'
  16. result_base_url = 'https://openstreetmap.org/{osm_type}/{osm_id}'
  17. # do search-request
  18. def request(query, params):
  19. params['url'] = url.format(query=query)
  20. return params
  21. # get response from search-request
  22. def response(resp):
  23. results = []
  24. json = loads(resp.text)
  25. # parse results
  26. for r in json:
  27. title = r['display_name']
  28. osm_type = r.get('osm_type', r.get('type'))
  29. url = result_base_url.format(osm_type=osm_type,
  30. osm_id=r['osm_id'])
  31. geojson = r.get('geojson')
  32. # if no geojson is found and osm_type is a node, add geojson Point
  33. if not geojson and\
  34. osm_type == 'node':
  35. geojson = {u'type':u'Point',
  36. u'coordinates':[r['lon'],r['lat']]}
  37. address_raw = r.get('address')
  38. address = {}
  39. # get name
  40. if r['class'] == 'amenity' or\
  41. r['class'] == 'shop' or\
  42. r['class'] == 'tourism' or\
  43. r['class'] == 'leisure':
  44. if address_raw.get('address29'):
  45. address = {'name':address_raw.get('address29')}
  46. else:
  47. address = {'name':address_raw.get(r['type'])}
  48. # add rest of adressdata, if something is already found
  49. if address.get('name'):
  50. address.update({'house_number':address_raw.get('house_number'),
  51. 'road':address_raw.get('road'),
  52. 'locality':address_raw.get('city',
  53. address_raw.get('town',
  54. address_raw.get('village'))),
  55. 'postcode':address_raw.get('postcode'),
  56. 'country':address_raw.get('country'),
  57. 'country_code':address_raw.get('country_code')})
  58. else:
  59. address = None
  60. # append result
  61. results.append({'template': 'map.html',
  62. 'title': title,
  63. 'content': '',
  64. 'longitude': r['lon'],
  65. 'latitude': r['lat'],
  66. 'boundingbox': r['boundingbox'],
  67. 'geojson': geojson,
  68. 'address': address,
  69. 'url': url})
  70. # return results
  71. return results