IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Trouver les communes dans un rayon spécifié [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Par défaut Trouver les communes dans un rayon spécifié
    Bonjour je sui a la recherche d'un petit script php ou/et d'idées de démarche.

    J'ai une table1 contenant toutes les villes de france avec leur coordonnées longitude et latitude respective.
    J'ai une table2 contenant uniquement le nom de certaines villes qui m'interresse.

    J'aimerai que mon script me sorte toutes les villes de la table2 qui sont dans un rayon de x km (25 km par exemple) à partir d'une ville que je choisi (paris par exemple).

    Connaissez des scripts ou une démarche optimisé ?
    Certaines formules mathématiques utiles ?

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Avec un bon vieux Therome de Pythagore tu devrais pouvoir calculer facilement la distance entre tes villes.

    Si tu ne dois faire qu'une seule fois le calcul, tu peux créér une requete SQL qui fera pour toi ce calcul et qui enregistrera en base le resultat. A mon avis tu n'as pas besoin de PHP. 36000 communes x N communes ca sera tres long.

    En revanche si ce calcul se fait a la volée, il faudra que tu optimises ton code pour ne traiter que les departments limitrophes par exemple.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Par défaut suite
    Réflections très interressantes !
    Je le fais "à la volée" la ville ne sera jamais la meme (choisie par l'internaute)
    Pour limiter la recherche au departement d'à coté, c'est une bonne idee mais des fois des departement ne se touche pas et pourtant sont tres proche...difficile a mettre en place, il faut aussi surement une base qui ressence les departement limitrophes par rapport à un department.


    Pour pythagore (je connais) je ne vois pas trop coment faire...

    Merci

    N'hésitez pas si vous avez des idées..

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    Par exemple:
    SELECT table1.ville, table2.ville, SQRT(POW((table1.x - table2.x),2) + POW((table1.y - table2.y),2)) from table1, table2
    where table1.id = selectId
    limit 10;

    Sinon tu peux eliminer les communes qui ont une certaines longitude ou latitude.
    On va dire que ta commune est a la latidtude 50 ben tu elimines toutes celle qui sont au dessus de 70 et celles au dessous de 30 car elles sont d'office trop loin.
    En faite tu créés un rayon sur X et Y

    where abs(tabe1.x - tabe2.x) < 20 and bs(tabe1.y - tabe2.y) < 20

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 65
    Par défaut suite
    Merci je vais potasser tout ça...
    Bonne idée pour la réduction/marge de lat et long.
    Mais qu'est-ce que SQRT et POW ???

    sinon j'ai trouvé cette formule :
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    (6366*acos(cos(radians($LAT))*cos(radians(`nomville`.`latitude`))*cos(radians(`ville`.`longitude`)-radians($LONG))+sin(radians($LAT))*sin(radians(`nomville`.`latitude`))))

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    957
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 957
    Par défaut
    C'est pythagore a²+b²=c² donc c = √(a²+b²)
    POW = puissance de
    SQRT = racine carré de

    Tu peux faire ta recherche en une requete je pense.

    ------------------------------------------------------
    En revanche je ne vois pas tres bien a quoi correspond ta formule

  7. #7
    Membre Expert

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Par défaut
    Citation Envoyé par yohann26 Voir le message
    Code X : Sélectionner tout - Visualiser dans une fenêtre à part
    (6366*acos(cos(radians($LAT))*cos(radians(`nomville`.`latitude`))*cos(radians(`ville`.`longitude`)-radians($LONG))+sin(radians($LAT))*sin(radians(`nomville`.`latitude`))))
    Cette formule est correcte ; elle correspond au calcul de la distance orthodromique entre 2 points du globe. Beucoup de renseignements ici :
    http://www.lion1906.com/
    Contrairement aux idées reçues, la plus court chemin d'un point à un autre sur une planishère n'est pas la ligne droite, mais plutôt une courbe, car la terre est ronde. Donc, le théoreme de pythagore n(est pas adapté car il calcul sur un plan, et non pas sur une shpère. Il est évident que sur de courtes distances, l'écart n'est pas important.

    Cette première requête permet de définir un carré dans lequel la recherche va s'effectuer en fonction d'une ville de référence et d'une distance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <?php 
    $sql = 'select ville, cp, longitude, latitude,
                   round(radians(longitude), 6) as longrad, round(radians(latitude), 6) as latrad,
                   round((radians(latitude) - ' . $km . '/ 6378), 6) as latMin,
                   round((radians(latitude) + ' . $km . ' / 6378), 6) as latMax,
                   round((radians(longitude) - ' . $km . ' / 6378 / cos(radians(latitude))), 6) as longMin,
                   round((radians(longitude) + ' . $km . ' / 6378 / cos(radians(latitude))), 6) as longMax
            from villes
            where id = ' . $villeId; 
    ?>
    Cette seconde requête recherche dans la table les villes dont les coordonnées se trouvent dans le carré précédemment défini, en filtrant celles dont l'éloignement est supérieur à la distance de recherche :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php 
    $sql = 'select round(6378 * 
                         Acos(Cos(' . $latrad . ') * 
                         Cos(radians(a.latitude)) * 
                         Cos(radians(a.longitude) - ' . $longrad . ') + 
                         Sin(' . $latrad .') * Sin(radians(a.latitude))), 1) as distance
            from villes
            where radians(latitude) between ' . $latMin . ' and ' . $latMax . '
            and radians(longitude) between '. $longMin . ' and ' . $longMax . '
            having distance <= ' . $km;
     
    ?>
    Ces requêtes sont évidemment à adapter en fonction de tes tables, et autres.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Trouver les villes dans un rayon de X km
    Par chido dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 24/01/2012, 18h44
  2. Comment trouver les contrôles dans un DBCtrlGrid
    Par Bruno75 dans le forum Composants VCL
    Réponses: 7
    Dernier message: 19/12/2010, 17h42
  3. Réponses: 21
    Dernier message: 04/05/2010, 12h14
  4. Trouver les redondances dans un code
    Par progfou dans le forum C
    Réponses: 9
    Dernier message: 17/03/2006, 08h53
  5. Trouver les redirections dans des traces
    Par severine dans le forum Développement
    Réponses: 3
    Dernier message: 21/04/2004, 18h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo