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

Algorithmes et structures de données Discussion :

Select en fonction de la distance


Sujet :

Algorithmes et structures de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut Select en fonction de la distance
    Bonjour,
    Comment réaliser la fonction qui consiste à sélectionner toutes les annonces dans un rayon de X km autour de l'endroit que je détermine ?
    (voir par exemple sur ebay... ainsi que sur tous les principaux sites d'annonces ou de rencontres)
    Ca se traite à partir des données longitude et latitude des villes enregistrées, mais quelle est la formule pour extraire le résultat ?
    Merci

  2. #2
    Membre expérimenté Avatar de davcha
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 258
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 258
    Points : 1 539
    Points
    1 539
    Par défaut
    euh...

    sqrt(dx²+dy²) <= N ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Points : 7
    Points
    7
    Par défaut
    Citation Envoyé par davcha
    euh...

    sqrt(dx²+dy²) <= N ?
    euh... je suis en coordonnées trigonométriques... Et je me vois mal devoir calculer sur l'ensemble de la base pour sortir le résultat... Il doit y avoir une solution plus simple qui permet, comme dans le cas de ebay, de sortir l'ensemble des annonces dans un rayon déterminé sans que ça mouline pendant des heures les millions d'annonces d'ebay

  4. #4
    Membre éclairé
    Inscrit en
    Juin 2005
    Messages
    644
    Détails du profil
    Informations professionnelles :
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2005
    Messages : 644
    Points : 754
    Points
    754
    Par défaut
    1- mettre les angles en radian ( 1deg = Pi/180 rad )
    2- considerer la terre comme une shère de rayon R ( 6'400 km environ )
    3- les points sur terre répondent alors à x^2 + y^2 + z^2 = R^2 <0>

    la latitue lat ( en radian ) donne

    Z = R * sin (lat) <1>

    ce qui implique une fois reporté dans <0>

    X^2 + Y^2 = R^2*cos(lat)^2

    compte tenu de la longiture long ( exprimée en rad ) il vient

    X = R * cos(lat) * cos(long) et Y = R*cos(lat) * sin(long) <3>

    1 & 3 donnent les coordonnées carartésiennes du point.

    si 2 points sont proches on peut dire que la distance à parcourir pour aller de l'1 à l'autre est de distance entre les 2 points. Si non il faut aller de l'1 à l'autre en suivant l'arc de grand cercle ( cercle de centre le centre de la terre et qui passe par les 2 points en question ) et calculer sa longueur.

    L = R * Theta ( Theta angle en rad <Point1, Centre terre, Point2> )
    sin ( Theta ) = (Op1 vect Op2) / R^2 où Vect = produit vectoriel
    O le centre de la terre Op1 et Op2 les 2 vecteurs.
    Prendre les valeurs abolues si sin() < 0. S'assurer de prendre le + court des 2 arcs reliant P1 à P2. Choix corrects dans arcsin.

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    Bonjour,

    Voila un bout de code, il faut faire les conversions adequates :
    2PI*radians=360°=40030km, 1°=60NM, 1'=1/60°=1NM, 1NM=1852m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    function GEO_DISTPPR(P1,P2:coord):single;
    { Lat et Lon en radians, résultat en radians}
    var
    XX,YY : extended ;
    begin
    if P1=P2
    then result:=0
    else begin
      XX := cos(P1.lat)*cos(P2.lat)*cos(P1.lon-P2.lon)+ sin(P1.lat)*sin(P2.lat) ;
      YY:=arccos(XX) ;
      if XX>0 then result:=YY else result:=YY+XPI ;
      if result>XPI then result:=result-XPI ;
      end;
    end ;

Discussions similaires

  1. [MySQL] faire un select en fonction d'un paramètre
    Par kevinf dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 07/11/2006, 20h31
  2. [timestamp] Select en fonction de la date
    Par xenos dans le forum Requêtes
    Réponses: 5
    Dernier message: 16/10/2006, 13h55
  3. [SQL] selection en fonction d'un comparaison de date
    Par carmen256 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/09/2006, 23h38
  4. Afficher/cacher des éléments de type select en fonction d'autres
    Par GLDavid dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 05/04/2006, 10h06
  5. select en fonction de la longueur d'un champ
    Par blackeagle1 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 25/07/2004, 19h42

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