Ho il seguente modello.Come filtrare un modello django con coordinate di latitudine e longitudine che rientrano in un determinato raggio
class Location(models.Model):
name = models.CharField(max_length = 128, blank = True)
address =models.CharField(max_length = 200, blank= True)
latitude = models.DecimalField(max_digits=6, decimal_places=3)
longitude = models.DecimalField(max_digits=6, decimal_places=3)
def __unicode__(self):
return self.name
Se il mio attuale latitudine & longitudine è:
current_lat = 43.648
current_long = 79.404
ho fatto qualche ricerca e sono imbattuto nel Haversine Equation che calcola la distanza tra due coordinate di posizione. Qui di seguito è l'equazione che ho trovato:
import math
def distance(origin, destination):
lat1, lon1 = origin
lat2, lon2 = destination
radius = 6371 # km
dlat = math.radians(lat2-lat1)
dlon = math.radians(lon2-lon1)
a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
* math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
d = radius * c
return d
Vorrei restituire tutti gli oggetti di localizzazione che rientrano in un raggio di 10 km, come posso filtrare in modo tale che sarà solo restituire tutti gli oggetti di localizzazione che rientra in questo raggio di 10 km?
LocationsNearMe = Location.objects.filter(#This is where I am stuck)
C'è qualche cosa che posso implementare l'equazione Haversine nel filtraggio in modo che restituisca solo gli oggetti di localizzazione che ricadono in un raggio di 10 km?
Sto cercando una risposta ben dettagliata. Apprezzo l'aiuto.
si dovrebbe provare e utilizzare geodjango https://docs.djangoproject.com/en/dev/ref/contrib/gis/ – user710907
Sicuramente guardare in geodjango, ho una soluzione per questo problema b it richiede geodjango: https://gist.github.com/omouse/5623772 –
@omouse ringrazia per avermi guidato nella giusta direzione, nella tua soluzione hai punto, ma qui in questo modello, è diviso in due campi: longitudine e latitudine. Potresti mettere la tua risposta per questo caso qui sotto nella sezione di risposta. – noahandthewhale