Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Access > Requêtes et SQL.
Requêtes et SQL. Tout ce qui concerne vos questions sur les requêtes et le SQL sous Access se trouve ici.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/05/2011, 08h22   #1
Invité régulier
 
Inscription : décembre 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 34
Points : 7
Points : 7
Par défaut Requete SQL sur les lat lon

Bonjour @ tous.
Problème:

- J'ai une base SQL possédant une table 'my_zip_codes' avec des champs,
zip, lat, lon. lat et lon sont approximativement les épicentres du zip concerné.

- J'ai deux vars $lat et $lon de quelque part dans ce pays.

Question: quel query écrire pour trouver le zip le plus proche de ces lat lon ???
zip est la PRIMARY KEY

$lat pourrait être: 40.81796646
$lon pourrait être: -73.04525757

Toute aide appréciée. Merci d'avance.

Cordialement @ tous.

-= Guy =-
gdlmus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 09h23   #2
Membre Expert
 
Inscription : août 2006
Messages : 1 435
Détails du profil
Informations forums :
Inscription : août 2006
Messages : 1 435
Points : 1 753
Points : 1 753
Bonjour,
cela pourrait être
Code :
1
2
3
4
5
 
SELECT TOP 1 my_zip_codes.zip, my_zip_codes.lat, my_zip_codes.lon, First(Abs([lat]-(40.81796646))+Abs([lon]-(-73.04525757))) AS Expr1
FROM my_zip_codes
GROUP BY my_zip_codes.zip, my_zip_codes.lat, my_zip_codes.lon
ORDER BY First(Abs([lat]-(40.81796646))+Abs([lon]-(-73.04525757)));
avec la demande des lat et lon
Code :
1
2
3
4
5
 
SELECT TOP 1 my_zip_codes.zip, my_zip_codes.lat, my_zip_codes.lon, First(Abs([lat]-([Entrer la latitude]))+Abs([lon]-([Entrer la longitude]))) AS Expr1
FROM my_zip_codes
GROUP BY my_zip_codes.zip, my_zip_codes.lat, my_zip_codes.lon
ORDER BY First(Abs([lat]-([Entrer la latitude]))+Abs([lon]-([Entrer la longitude])));
ou avec des variables
Code :
1
2
3
4
5
 
sql = "SELECT TOP 1 my_zip_codes.zip, my_zip_codes.lat, my_zip_codes.lon, First(Abs([lat]-(" & latitude & "))+Abs([lon]-(" & longitude & "))) AS Expr1
FROM my_zip_codes
GROUP BY my_zip_codes.zip, my_zip_codes.lat, my_zip_codes.lon
ORDER BY First(Abs([lat]-(" & latitude & "))+Abs([lon]-(" & longitude & ")));
helas est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 10h19   #3
Invité régulier
 
Inscription : décembre 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 34
Points : 7
Points : 7
Ouuuppps!

Hard pour mes faibles connaissances en SQL.

Je vais tester la version 'variables' qui me semble + appropriée à mon pb.

J'avais pensé à un truc genre:

Code :
1
2
3
4
5
6
  SELECT *,
    SQRT(POW((69.1 * (my_zip_codes.lat - $lat)) , 2 ) +
    POW((53 * (my_zip_codes.lon - $lon)), 2)) AS distance
FROM my_zip_codes
ORDER BY distance ASC
LIMIT 1
Mais cela ne marche pas.

Merci pour l'aide, j'update dés que j'ai essayé.

Bonne journée.

-= Guy =-

PS: pour moi, bonne nuit... :-)
gdlmus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/05/2011, 19h34   #4
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 895
Points : 3 895
salut helas et bienvenu gdlmus,

le sql d'access ressemblerait plutôt à ça:
Code :
1
2
3
4
SELECT TOP 1 *,
    SQR((69.1 * (my_zip_codes.lat - $lat))^2  + (53 * (my_zip_codes.lon - $lon))^ 2) AS distance
FROM my_zip_codes
ORDER BY SQR((69.1 * (my_zip_codes.lat - $lat))^2  + (53 * (my_zip_codes.lon - $lon))^ 2) ASC
cela dit une coordonnée équidistant à différent cp donnerait de faux résultat.
mais le pire dans cette formulation c'est qu'un cp n'a pas une couverture circulaire, loin de là, ce qui veut dire que cela risque de donner beaucoup d'erreur.

je te conseille plutot la géolocalisation inversé de google maps dont philben à fournit un exemple de code que tu pourrais facilement adapter pour récupérer le cp.

vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/05/2011, 08h03   #5
Invité régulier
 
Inscription : décembre 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 34
Points : 7
Points : 7
Bonjour et merci vodiem & helas,

J'ai essayé la solution de vodiem qui n'a pas fonctionné, erreur SQL.

En creusant plus profond avec mr Google, j'ai trouvé cette petite ligne qui certainement pas parfaite pour les raisons évoquées, m'a quand même impressionnée après avoir testé sur une vingtaine de villes US. De toute façon on sait que l'on récupère des lat lon de la position du DSLAM du visiteur qui peut être jusqu'à 5.0+ Kms de distance de son domicile. Faut vivre avec et nous ne sommes pas le FBI...
Dans un second temps je vais surement creuser aussi le rétroviseur de mr Google. Merci pour la suggestion.

Code :
$query = sprintf("SELECT *, ( 3959 * acos( cos( radians( %s ) ) * cos( radians( lat ) ) * cos( radians( lon ) - radians( %s ) ) + sin( radians( %s ) ) * sin( radians( lat ) ) ) ) AS distance FROM my_zip_codes ORDER BY distance LIMIT 0,5",$lat,$lon,$lat);
J'ai maintenant un autre pb avec mes CP de France. Là, la recherche se fait sur le nom de la ville donc à première vue pas de pb. Sauf quand il i y a une dizaine de petites villes qui s'appellent 'Le Pin'.

Comme je dispose des lat lon de ces villes quelle est la requête SQL pour sélectionner dans un premier temps les 10 'Le Pin' pour enfin avoir la bonne grâce à ses lat lon...???

Merci de vos conseils et patiente avec un débutant SQL, pour le PHP, on se débrouille un peu.

Cordialement @ tous.

-= Guy =-
gdlmus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/05/2011, 10h21   #6
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 895
Points : 3 895
erreur SQL... t'es sur d'être dans le bon forum ?
n'empêche tu as raison la formulation mathématique n'est pas correct lat et lon ne sont pas des distances mais des angles en degré et effectivement en trigo sphérique cette formulation est plus juste.

pour selectionner les 'Le Pin', sql de ce style:
Code SQL :
SELECT * FROM my_zip_codes WHERE ville='Le Pin'
je pense pas qu'il soit pertinent de mettre un LIMIT 10 (TOP 10 en SQL Access)
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/05/2011, 19h13   #7
Invité régulier
 
Inscription : décembre 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 34
Points : 7
Points : 7
Merci vodiem pour pour la réponse.

Il conviendrait cependant de lire la question en entier...

Code :
1
2
SELECT * FROM my_zip_codes WHERE ville='Le Pin' AND ?????????
quoi pour être le + proche de $lat et $lon
$lat & $lon étant connus of course.

J'ai déjà la moitié de la solution... L'autre moitié à mySQL épisode ||, le retour peut-être?

Bon WE @ tous.

-= Guy =-
gdlmus est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 02h46   #8
Expert Confirmé
 
Avatar de vodiem
 
Homme Diem VO
Vivre
Inscription : avril 2006
Messages : 2 644
Détails du profil
Informations personnelles :
Nom : Homme Diem VO
Âge : 40
Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Vivre
Secteur : Conseil

Informations forums :
Inscription : avril 2006
Messages : 2 644
Points : 3 895
Points : 3 895
Citation:
Envoyé par gdlmus
Comme je dispose des lat lon de ces villes quelle est la requête SQL pour sélectionner dans un premier temps les 10 'Le Pin' pour enfin avoir la bonne grâce à ses lat lon...???
puisque tu disposes des lat et lon dans my_zip_codes, la requete pour selectionner les 'Le Pin' est bien le sql précédent

tu m'excuseras de faire un peu idiot mais ca me paraissait plus logique que te répondre : si les $lat & $lon sont des critères de sélection, la requete avec les distances te donnera forcement dans les enregistrements le bon cp avec le nom de la ville qui va avec...
mais si tu veux filtrer les distances avec le nom de la ville un
Code SQL :
WHERE ville='Le Pin'
avant le order est suffisant.

mySQL... heu... t'es vraiment pas dans le bon forum Guy
vodiem est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/05/2011, 03h14   #9
Invité régulier
 
Inscription : décembre 2010
Messages : 34
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 34
Points : 7
Points : 7
J'ai réalisé ma couennerie peu de temps après avoir posté.

Sorry
gdlmus est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 12h43.


 
 
 
 
Partenaires

Hébergement Web