Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2017
148
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.48 KB | None | 0 0
  1. from django.db import models, connection
  2.  
  3. """
  4. Haversine formula in Django using Postgres SQL
  5. Queries a model for all rows that are within a certain radius (given in meters) of a central point.
  6.  
  7. The 'location_model' placeholder should be raplaced with a table that includes a latitude and longitude column.
  8.  
  9. Returns a list of row ids.
  10. """
  11. class LocationManager(models.Manager):
  12. def in_range(self, latitude, longitude, radius, results=100):
  13. unit = 6371 # Distance unit (kms)
  14. radius = float(radius) / 1000.0 # Distance radius convert m to km
  15. latitude = float(latitude) # Central point latitude
  16. longitude = float(longitude) # Central point longitude
  17.  
  18. sql = """SELECT id FROM
  19. (SELECT id, latitude, longitude, ({unit} * acos(CAST((cos(radians({latitude})) * cos(radians(latitude)) *
  20. cos(radians(longitude) - radians({longitude})) +
  21. sin(radians({latitude})) * sin(radians(latitude))) AS DECIMAL)))
  22. AS distance
  23. FROM location_model) AS distances
  24. WHERE distance < {radius}
  25. ORDER BY distance
  26. OFFSET 0
  27. LIMIT {results};""".format(unit=unit, latitude=latitude, longitude=longitude, radius=radius, results=results)
  28.  
  29. cursor = connection.cursor()
  30. cursor.execute(sql)
  31. ids = [row[0] for row in cursor.fetchall()]
  32.  
  33. return ids
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement