Bonjour,

Je suis actuellement dans le développement d'une petit app, qui permet d'afficher les bars autour d'une adresse défini.
Pour cela je suis sous PostgreSQL et j'utilise des decimal avec une colonne latitude et longitude. J'ai trouver un petit script qui me permet de faire ce que je souhaite sauf que j'ai quelques lignes que je ne comprend pas.

Ce que je fais

SELECT * FROM
                    (SELECT id, name,, latitude, longitude, ('8000' * acos(cos(radians('44.832755')) * cos(radians(latitude)) *
                    cos(radians(longitude) - radians('-0.528606')) +
                    sin(radians('44.832755')) * sin(radians(latitude))))
                    AS distance
                    FROM establishments) AS distance
                WHERE distance < '5'
                LIMIT 20;

Cette requête SQL me renvois un tableau avec les latitude/longitude et une nouvelle colonne distance qui est sous cette forme : 6.12747919947683, j'ai detecté que cette distance varie quand je modifie le 8000. A quoi correspond ce 8000?

Ce que je veux

L'ideal c'est que je puisse afficher seulement les bars 5km autour de ma position actuelle (44.832755, -0.528606).

14 réponses


Huggy
Réponse acceptée

ça ressemble au calcul de l'orthodromie
la formule renvoie l'angle entre 2 points vu du centre de la terre
cet angle est en radian, si on veut le convertir en kilomètre il faudrait appliquer un coef (40000km / 2pi) soit 6366
8000 c'est une unité anglo-saxonne ???

Muxxable
Auteur

Merci de la réponse, je comprend mieux le principe.
Le 8000 correspond à une valeur à la volé ^^

Ce que je fais c'est dans ma base de donnée j'ai une adresse (23 rue de la pomme: exemple) et j'entre en dur une latitude/longitude qui correspond à par exemple 120 avenue thiers, sur google maps les 2 rue sont à 3,8km. Hors la distance calculé par SQL est de 4.3102245949027

Est-ce un problème de précision ou la requête qui est fausse ?

Ou existe t'il un autre moyen de requeter uniquement les bars à 5Km autour de ma position ?

Il faudrait regarder avec Google Earth qui propose une règle de mesure
c'est sûr que SQL donne la distance à vol d'oiseau
maps lui, doit calculer le trajet le plus court

Muxxable
Auteur

D'accord et quelle est la meilleur solution du coup ?

Tu peux difficilement interroger google maps pour obtenir l'itinéraire pour chaque bar de France
le filtrage SQL est ce qu'il y a de mieux même si en général on travaille avec un carré
on filtre latitude entre min et max puis longitude entre min et max
Sinon Postgis propose des fonctions spatiales faites pour ça, MySQL aussi

Muxxable
Auteur

Ce que je viens de voir c'est l'API V3 de google maps qui calcule la distance entre 2 positions qu'on lui donne.

Postgis j'ai vite fait établis cette solution, mais j'imagine que c'est le même problème ? Vol d'oiseau?

Qui Postgis c'est "vol d'oiseau" sinon il faudrait qu'ils aient une cartographie de toutes les routes, chemins, pistes cyclables ...
j'ai testé l'API V3 il y a qques années, le fait d'être piéton ou cycliste ne changeait rien au calcul !!!
Pour les bars vaut mieux y aller à pieds, non ? ;)

Muxxable
Auteur

Ype c'est sur ! Du coup j'utilise la fonctione "vol d'oiseau" haha ! Merci de l'aide ! Toute façon après quelques tests il n'y as pas grande différence mais c'est juste moins précis :/

un clurl sur cette url :
https://www.google.fr/maps/search/bar+a+proximite/@48.7996131,2.6171056,13z
n'oublis pas de changé lattitude et longitude ;)

une recherche sur $(".section-result-title-container") et c'est bon ;)

@plus

Pierre

Muxxable
Auteur

Je ne peux pas utiliser cette technique, @Pierrot01, car j'ai seulement les bars qui sont dans ma base de données

Salut,

Je pense que la base de données google est bien plus riche que la tienne ;)

@plus

Pierre

Muxxable
Auteur

@Pierrot01, Bien évidement, mais le but de l'appli c'est que derrière y'a un service Saas et seulement les bars qui ont souscris au service y seront implantées

Salut,
Et alors, fais une comparaison entre les éléments de la base de données google et la tienne.
j'vois vraiment rien d'insurmontable ;)

@plus

Pierre

Muxxable
Auteur

Yep je peux faire ça aussi ;) merci pour les infos :)