2010-06-23 10 views
0

J'ai une table de base de données avec une liste de restaurants, y compris leurs noms, latitudes et longitudes. Je voudrais sélectionner tous les restaurants qui sont à une certaine distance de mon emplacement actuel. l'emplacement actuel est déterminé dans le fichier php (en ce moment je suis en train d'utiliser un lat statique & lng). J'ai trouvé le code pour calculer la distance:sélectionnez les entrées de la table de restaurant à une certaine distance de l'emplacement actuel en utilisant php

function findDist($lat, $lng){ 
    $currLat = 33.777563; 
    $currLng = -84.389959; 

    $currLat = deg2rad ($currLat); 
    $sincurrLat = sin ($currLat); 
    $lat = deg2rad ($lat); 
    $currLng = deg2rad ($currLng); 
    $lng = deg2rad ($lng); 

    return round((7926 - 26 * $sincurrLat) * asin (min (1, 0.707106781186548 * sqrt ((1 - (sin ($lat) * $sincurrLat) - cos ($currLat) * cos ($lat) * cos ($lng - $currLng))))),4); 
} 

mais comment l'incorporer dans ma requête de sélection? J'ai essayé ceci:

$query = "SELECT * 
FROM 
    eateries E 
WHERE 
    EXISTS 
    (
     SELECT * 
     FROM 
      eateries_hours EH, eateries_type ET 
     WHERE 
      EH.eateries_id = E.id AND ET.eateries_id = E.id 
      AND findDist(E.lat, E.lng) <= .5 
    )"; 

mais bien sûr, cela ne fonctionne pas parce qu'il est de ne pas reconnaître la fonction. puis-je faire une requête séparée juste pour lats et lngs au début, calculer les distances, puis rejoindre cela avec la question ci-dessus en quelque sorte? des idées?

merci.

+0

Vous devriez vraiment regarder le composant MySQL Spatial, sauf si vous aimez réinventer la roue. –

Répondre

2

Jetez un oeil à a question que j'ai déjà répondu. Vous pouvez créer une fonction stockée dans MySQL (ou d'autres bases de données) à condition que vous ayez les latitudes et les longitudes.

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 ; 
+0

http://dev.mysql.com/doc/refman/5.1/fr/stored-routines.html Ceci est la documentation MySQL pour les procédures stockées et les fonctions – gawpertron

+0

merci pour l'aide! Cela ressemble à ça va marcher. Malheureusement, je reçois une erreur mais je pense que c'est un problème avec phpMyAdmin et pas avec le code. Je vais travailler à comprendre. en passant, quelle distance unitaire (miles, km, etc.) cette fonction produit-elle? – vee

+0

Ceci est en miles. Pour le générer en km, changez la valeur de 'eradius' en 6378.1. – Buggabill