2009-12-13 6 views
17

Disons que j'ai un tableau de lignes contenant des coordonnées.Déterminez si une coordonnée est dans le rayon d'une autre

Quelle serait la meilleure façon de tirer uniquement les lignes de coordonnées qui se trouvent dans le rayon d'une autre coordonnée?

Pour simplifier ma question, je donne l'exemple suivant:

Table like: 
Columns: Latitude, Longitude. 
Row1: 23.44444 24.55555 
Row2: 32.44444 28.22222 
Row3: 35.11111 32.12345 

Dans une instruction SQL, comment puis-je obtenir les lignes de coordonnées qui se trouvent dans le rayon de Row3 par exemple?

Répondre

29

Cette post montre comment faire cela dans SQL Server.

Et voici comment le faire dans MySQL:

SELECT ((ACOS(SIN($lat * PI()/180) * SIN(lat * PI()/180) + 
     COS($lat * PI()/180) * COS(lat * PI()/180) * COS(($lon - lon) * 
     PI()/180)) * 180/PI()) * 60 * 1.1515) AS distance 
FROM members 
HAVING distance<='10' ORDER BY distance ASC 
+0

Merci, comment puis-je l'utiliser dans une base de données Access? –

+0

Pour autant que je sache, vous ne pouvez pas créer ce type de fonction dans une base de données Access. Vous devriez essayer la deuxième approche. (Certaines modifications seront nécessaires, je crois que l'accès n'a pas de fonction PI(), par exemple) – jbochi

+0

Est-ce en miles ou en kilomètres? – Pentium10

0

Que voulez-vous dire par dans le rayon de? Voulez-vous passer à distance, disons 5 miles, et trouver toutes les lignes dans les 5 miles de la ligne x?

Check this out si oui http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

+0

Oui, j'utiliserais des kilomètres mais vous avez eu l'idée. Le truc c'est que j'en ai besoin pour un accès db. –

+0

Utilisez une fonction VBA, il existe de nombreux extraits de code googleable à adapter. –

1

ressemble à la formule de distance est:

D = 60* 1.1515 * acos (sin(pi*y/180) * sin(pi*Y/180) + 
         cos(pi*y/180) * cos(pi*Y/180) * cos((z-Z) *pi/180) 
       ) * 180/pi) 

où Y et Z - sont des points de chaque ligne que vous whant à tester, et y et z - sont des points de la ligne d'exemple.

vous pourriez donc faire une telle chose:

  1. sélectionner chaque ligne dans le tableau et obtenir son lon et lat.
  2. appliquer la requête de this, en changeant $lon et $lat au point sous forme de données 1.

Je ne sais pas comment faire cela dans l'accès. Mais cette voie est aussi étroite que lente.

Questions connexes