PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV Mobile 23 → Calcul rapide de distance entre deux points dont sont connus latitude et longitude en base de données
Calcul rapide de distance entre deux points dont sont connus latitude et longitude en base de données
Débuté par niKo, 18 aoû. 2016 00:47 - 7 réponses
Membre enregistré
28 messages
Posté le 18 août 2016 - 00:47
Je cherchais une méthode rapide pour isoler des POI situés à une distance fixée, parmi des centaines d'enregistrements en DB. Voici une solution qui pourra peut-être aider. Elle est basée sur la formule expliquée ici :

http://forums.futura-sciences.com/mathematiques-superieur/306536-calcul-de-distance-entre-2-points-dont-jai-coordonnees-geographiques-longitude-latitude.html

En somme, une fois la formule traduite en langage SQL, cela donne ceci :

SELECT 6367445*ACOS((SIN(radians(%1))*SIN(RADIANS(Latitude)))+(COS(RADIANS(%1))*COS(RADIANS(Latitude))*COS(RADIANS(%2)-RADIANS(Longitude)))) AS Distance FROM Localisation

où 6367445 est la moyenne des rayon polaires et équatoriaux, %1 la latitude du point de référence, %2 sa longitude (par exemple, le point où se trouve le terminal de l'utilisateur), Latitude et Longitude étant les noms très originaux de mes champs dans la base de données.

Concernant la précision, il s'agit bien sûr de distance "à vol d'oiseau" dont les résultats sont comparables à ceux fournis par l'outil "trajet" (tracé de ligne) dans Google Earth ou via cette adresse : http://www.lexilogos.com/calcul_distances.htm
La distance obtenue est exprimée en mètre (à ce sujet, le recours à RADIANS dans la requête est nécessaire puisque les longitudes et latitudes sont données en degrés).

Il ne s'agit donc pas d'un outil de haute précision mais d'une formule pratique pour sélectionner rapidement dans une base de données des points en fonction de leur distance par exemple.
Message modifié, 18 août 2016 - 01:05
Membre enregistré
547 messages
Popularité : +1 (1 vote)
Posté le 18 août 2016 - 09:03
Très bien cette info !
Merci !

--
Eric DELATTRE
http://www.yoosite.fr
Posté le 18 août 2016 - 10:32
Ce n'est pas ce que fait déjà la fonction WLangage géoDistance ?
Membre enregistré
547 messages
Popularité : +1 (1 vote)
Posté le 18 août 2016 - 11:17
Bonjour,

Si mais l'idée ici est de ne récupérer QUE les données dans un rayon utile, pour ensuite boucler sur la requête.
geodistance oblige de boucler sur TOUT le fichier.

C'est ici l'objet de l'astuce je pense, pas de récupérer la donnée "distance" en tant que telle...

Cdlt - Eric.

--
Eric DELATTRE
http://www.yoosite.fr
Membre enregistré
28 messages
Posté le 18 août 2016 - 12:24
Bonjour Eric, Bonjour Nico,

Ce système a deux objectifs :
- Permettre un traitement sur de grandes quantités d'information en déléguant le calcul au serveur de données et ainsi économiser de la bande passante
- Comme l'a bien remarqué Eric de faire de la distance entre deux points un critère, pas une information en soi. Cela permet par exemple de n'afficher les marqueurs sur une carte que dans un rayon donné, en fonction par exemple du positionnement de la carte et de son niveau de zoom (but avoué de la manœuvre dans mon cas).

Merci pour votre lecture,

niKo
Membre enregistré
1 223 messages
Popularité : +9 (11 votes)
Posté le 18 août 2016 - 17:52
Bonjour à tous,
Merci niKo pour ta contribution.

J'avais déjà "bricolé" une requête non SQL donc une requête en Webdev en visant large pour la latitude et longitude et où pour chaque enregistrement je faisais ensuite un calcul de distance mais ta requête SQL est beaucoup plus simple et plus précise. Je n'utilisais pas encore de requête construite avec HExécuteRequêteSQL()

A mon avis, il faut rajouter à ta requête par exemple "WHERE Distance <=%3" ou %3 est par exemple le rayon en mètres de la recherche. je l'ai testé et cela fonctionne bien.

Bravo encore...

--
Cordialement
François

http://intra.fr http://intrasoftware.fr
Membre enregistré
28 messages
Posté le 18 août 2016 - 19:21
Bonsoir François,

Je n'ai mis qu'une partie de la requête en place sur ce forum en effet et c'est exactement comme tu le décris que je l'utilise. On peut par exemple lier ce dernier paramètre à un curseur qui agira à la fois sur le niveau de zoom de la carte et le rayon de recherche des POI à afficher ensuite sur la carte.

Bonne soirée,

niKo
Message modifié, 18 août 2016 - 19:22
Membre enregistré
3 messages
Posté le 05 novembre 2018 - 16:00
Bonsoir ,


Je utiliser la requête avec windev mobile 23 ça marche dans le simulateur mais quand je génére l'apk pour android sa donne des résultat très différent je pense que c'est faux.

si l'un de vous l'a déja essayer sur Android merci de nous aider ?

Bonne soirée,

Riad
Message modifié, 05 novembre 2018 - 16:03