J'ai des utilisateurs inscrits dans mon application Django et je souhaite simplement pouvoir comprendre la distance, géographiquement, entre deux utilisateurs basé sur leur code postal, puis trier une liste en fonction de cela. J'imagine que cette fonctionnalité n'est pas intégrée à Django. Je regardais des options et je suis tombé sur Geodjango qui semble être trop excitée pour ce que sont mes besoins. P>
4 Réponses :
http://code.google.com/apis/maps/documentation/directions / p>
Vous pouvez faire des directions pour chaque emplacement. La distance totale est donnée. L'API semble produire JSON; Vous pouvez soit analyser la réponse du côté serveur ou avoir la distance calculée par JavaScript. P>
Faire cela serait contre les conditions d'utilisation de Google, sauf si vous êtes une carte pour le client des entreprises, BTW.
Après la suggestion de TCarroBruce, voici mon commentaire ci-dessus comme réponse:
Le Projet de base de données de code postal A une base de données des latitudes et des longitudes des codes postaux américains, en tant que SQL ou CSV. Ils fournissent également le code suivant pour le calcul de distance (Slighlty édité par moi): p> Notez que le résultat est donné dans Statut Miles. P> EDIT: Corrections dues à John Machin. P> p>
Vous auriez dû résister à la tentation de modifier légèrement le code d'origine sans tester le résultat. Voir ma réponse.
Ceci est un grand commentaire de la graisse sur le code posté dans la réponse (actuellement acceptée) de @sven Marnach.
code d'origine du site Web du projet Zip, avec une indentation éditée par moi: P>
from math import sin, cos, radians, acos # http://en.wikipedia.org/wiki/Earth_radius # """For Earth, the mean radius is 6,371.009 km (Ë3,958.761 mi; Ë3,440.069 nmi)""" EARTH_RADIUS_IN_MILES = 3958.761 def calc_dist_fixed(lat_a, long_a, lat_b, long_b): """all angles in degrees, result in miles""" lat_a = radians(lat_a) lat_b = radians(lat_b) delta_long = radians(long_a - long_b) cos_x = ( sin(lat_a) * sin(lat_b) + cos(lat_a) * cos(lat_b) * cos(delta_long) ) return acos(cos_x) * EARTH_RADIUS_IN_MILES
@Sven Marnach: Réexaminez votre code. Il existe exactement deux occurrences de «radians», chacun appliquée à une latitude, aucune à une longitude. Réexaminer mon code. Les radians code> sont appliqués une fois à la différence de longitude. Essayez de tester les codes et d'expliquer pourquoi le vôtre est l'homme étrange.
@Sven Marnach: C'est drôle; J'aurais pu juré j'ai vu un commentaire où vous avez dit que mon code était faux. Alors a besoin d'un sentier d'audit :-)
Désolé. Le commentaire était là pendant quelques secondes, mais j'ai immédiatement remarqué que j'avais tort. Je ne pensais pas que vous auriez chargé la page dans ce minuscule cadre :)
Un autre moyen simple:
La fonction renvoie la distance entre deux emplacements après avoir calculé les latitudes et les longitudes à partir du code postal. P>
Lat1 code>,
long1 code> sont Les latitudes et les longitudes de premier emplacement. p>
lat2 code>,
long2 code> sont les latitudes et les longitudes du deuxième emplacement. P>
from decimal import Decimal
from math import sin, cos, sqrt, atan2, radians
def distance(lat1, lat2, long1, long2):
r = 6373.0
lat1 = radians(lat1)
lat2 = radians(lat2)
long1 = radians(long1)
long2 = radians(long2)
d_lat = lat2 - lat1
d_long = long2 - long1
a = (sin(d_lat/2))**2 + cos(lat1) * cos(lat2) * (sin(d_long/2))**2
c = 2 * atan2(sqrt(a), sqrt(1-a))
# distance in miles
dis = r * c
# distance in KM
dis /= 1.609344
return dis
Voici un Activer la recette pour cette but. Cela n'est certainement pas construit à Django.
Regardez le Projet de base de données de code postal , aussi. Ils fournissent également un code Python pour le calcul de la distance sur la page liée.
@Sven Marnach - Postez le projet de base de données de code postal comme réponse - c'est un bon. (Et oui, Geodjango est probablement surchargé pour cela.)
Cela pourrait être ce dont j'ai besoin merci!
Le code dans la réponse que vous avez acceptée est Buggy B>; voir ma réponse.