2010-02-16 5 views
1

J'ai une liste d'environ 60 magasins avec des adresses physiques et des géocodes. Je voudrais faire une interface simple où un utilisateur peut entrer un code postal, ou une ville et un état, ou même une adresse de rue et avoir le tri de la liste dans l'ordre de la proximité de l'adresse entrée. C'est une caractéristique très commune des sites Web que je comprends. Mon plan pour ce faire est d'utiliser l'API Google Maps pour trouver le géocode de l'emplacement saisi et utiliser le théorème de Pythagore pour calculer la distance de chaque emplacement et trier la liste par les distances et retourner le résultat (ou peut-être le top 5 du jeu de résultats ...).Trouver des magasins par emplacement

Est-ce la bonne façon de procéder? Existe-t-il une méthode plus optimale ou une fonction intégrée à l'API Google Maps pour cela? Puisque c'est quelque chose de si commun, j'imagine qu'il a été essayé et testé de plusieurs façons et il y a probablement plusieurs bonnes réponses. Je suis juste à la recherche de conseils si je m'y prends correctement.

Merci.

Répondre

2

pythagorien Le théorème ne suffira pas. La courbe de la Terre le fait ainsi. Cela nécessite un peu de géométrie euclidienne. Le formula et une implémentation simple pour trouver la distance entre deux points sur la Terre - à vol d'oiseau et non loin de Voyage réelle - est (en PHP):

// pass the latitudes and longitudes in as degrees 
function getDistance($lat1,$long1,$lat2,$long2) 
{ 
    $r = 3963.1; //3963.1 statute miles; 3443.9 nautical miles; 6378 km 
    $pi = pi(); 

    // convert the degrees to radians 
    $lat1 = $lat1*($pi/180); 
    $lat2 = $lat2*($pi/180); 
    $long1 = $long1*($pi/180); 
    $long2 = $long2*($pi/180); 

    $ret = (acos(cos($lat1)*cos($long1)*cos($lat2)*cos($long2) + cos($lat1)*sin($long1)*cos($lat2)*sin($long2) + sin($lat1)*sin($lat2)) * $r) ; 
    return $ret; 
} 

Vous pouvez intégrer une version dans votre code. De plus, voici une fonction possible (non testée) dérivée d'une autre que j'ai utilisée pour MySQL.

DELIMITER $$ 

DROP FUNCTION IF EXISTS `FindDist` $$ 
CREATE FUNCTION `FindDist` (lt1 DOUBLE,lg1 DOUBLE,lt2 DOUBLE,lg2 DOUBLE) RETURNS DOUBLE 
DETERMINISTIC 
BEGIN 
    DECLARE dist,eradius DOUBLE; 

    SET eradius=3963.1; 
    SET dist=Acos(Cos(lt1) * Cos(lg1) * Cos(lt2) * Cos(lg2) + Cos(lt1) * Sin(lg1) * Cos(lt2) * Sin(lg2) + Sin(lt1) * Sin(lt2)) * eradius; 
    RETURN dist; 
END $$ 

DELIMITER ; 
1

J'ai trouvé ce lien il y a quelque temps lorsque je faisais des recherches sur quelque chose de similaire. Il utilise .NET mais les principes s'appliqueraient à tout langage/cadre.

Store Locator: Help customers find you with Google Maps

La partie clé de la solution est d'utiliser l'Haversine Formul a pour trouver la distance entre deux points spécifiés comme la longitude et la latitude. Il y a une application C# de cette formule liée à l'article ci-dessus ici:

Distance between locations using latitude and longitude (CodeProject)

Un peu plus enracinant autour révélé:

Calculate Distance Between Two Points on a Globe in 9 Different Languages

Questions connexes