2009-12-13 7 views
17

Nehmen wir an, ich habe eine Tabelle mit Zeilen, die Koordinaten enthalten.Ermitteln, ob eine Koordinate im Radius eines anderen ist

Was wäre der beste Weg, nur die Koordinatenreihen zu ziehen, die sich im Radius einer anderen Koordinate befinden?

meine Frage zu vereinfachen, ich gebe das folgende Beispiel:

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

In einer SQL-Anweisung, wie kann ich die Zeilen von Koordinaten erhalten, die zum Beispiel im Radius von Row3 sind?

Antwort

29

Diese post zeigt, wie Sie dies in SQL Server tun.

Und hier ist, wie es in MySQL zu tun:

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

Danke, wie kann ich es in einer Access-Datenbank verwenden? –

+0

Soweit ich weiß, können Sie diese Art von Funktion nicht in einer Access-Datenbank erstellen. Sie sollten den zweiten Ansatz versuchen. (Einige Änderungen werden benötigt. Ich glaube, dass der Zugriff keine PI() -Funktion hat, zum Beispiel) – jbochi

+0

Ist das in Meilen oder Kilometern? – Pentium10

0

Was meinen Sie im Umkreis von? Willst du eine Strecke zurücklegen, sagen wir 5 Meilen, und findest alle Reihen innerhalb von 5 Meilen von Reihe x?

prüfen diese aus, wenn so http://www.microsoft.com/sqlserver/2008/en/us/spatial-data.aspx

+0

Ja, ich würde Kilometer benutzen, aber Sie haben die Idee. Die Sache ist, ich brauche es für eine Access-DB. –

+0

Verwenden Sie eine VBA-Funktion, es gibt viele googlefähige Code-Snippets da draußen, um anzupassen. –

1

sieht aus wie der Abstand Formel:

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) 

wobei Y und Z - sind Punkte jeder Zeile Sie whant zu testen, und y und z - sind Punkte, der Beispielzeile.

so könnte man so etwas machen:

  1. jede Zeile in der Tabelle auswählen und erhalten ihre lon und lat.
  2. Abfrage von this gelten, $lon und $lat Daten Form Punkt zu ändern 1.

Ich weiß nicht, wie dies in den Zugang zu machen. Aber dieser Weg ist so eng wie langsam.