geocoding.py 1.2 KB

123456789101112131415161718192021222324252627282930313233343536373839
  1. from geopy.geocoders import Nominatim
  2. from geopy.distance import vincenty
  3. from source import *
  4. geolocator = Nominatim()
  5. def position_of_location(location):
  6. """returns a pair (latitude, longitude) from an adress
  7. or None if not possible"""
  8. try:
  9. pos = geolocator.geocode(location)
  10. return (pos.latitude, pos.longitude)
  11. except:
  12. return None
  13. def dist(posa, posb):
  14. """compute the distance between two position (pair latitude, longitude)
  15. in kilometers
  16. or None if one of the argument is None"""
  17. if not posa or not posb:
  18. return None
  19. else:
  20. return vincenty(posa, posb).km
  21. def k_neighbors(positions, fro, n):
  22. """returns a list of (dist, pos, id) of the nearest points from fro
  23. returns n points (if possible) and all points closer than 1.5 times the distance
  24. with the closest point.
  25. positions is a dictionary id -> (lat, long)"""
  26. if not positions:
  27. return []
  28. distances = []
  29. for (id, pos) in positions.items():
  30. (dmin, pmin) = min(map(lambda p : (dist(fro, p), p), pos))
  31. distances.append((dmin, pmin, id))
  32. dmin = min([d for (d, __, __) in distances])
  33. return list(set(sorted(distances)[:n]) | set(filter(lambda i: i[0] <= dmin+0.1, distances)))