2016-04-22 12 views

Antwort

2

Erstens haben wir eine grundlegende Funktion zu schreiben, um den Abstand zwischen zwei Punkten zu berechnen:

function distance(lat1, lon1, lat2, lon2) {} 

Für dieses Beispiel , Ich werde die Funktion auf die Formel einer sphärischen Erde projiziert auf eine Ebene basieren (here) Zuerst müssen wir die Deltas (der Abstand in Grad zwischen den Lat und Longs) und die mittlere Breite (Durchschnitt der Breiten) berechnen:

Jetzt

dLat = dLat * 180/3.1415926535; 
dLon = dLon * 180/3.1415926535; 
mLat = mLat * 180/3.1415926535; 

, verwenden wir die Formel unsere Daten in Abstand zu verwandeln:

var dLat = lat1 - lat2; 
var dLon = lon1 - lon2; 
var mLat = (lat1 + lat2)/2; 
var earthRadius = 3959; //in miles 

Dann wandeln wir diejenigen zu Radiant mit d=180/PI rad

var distance = earthRadius * (dLat * dLat + Math.pow(Math.cos(mLat) * dLon, 2)); 

und gibt die Entfernung

return distance; 

Jetzt, nur durch alle Punkte und ch wenn die Entfernung für jeden in Ordnung ist. Nehmen sich an einem Punkt, auf diese Weise beschrieben wird:

var p = { 
    lat = ... 
    lon = ... 
} 

Und vorausgesetzt, es gibt eine Liste von Punkten (zum Beispiel genannten Punkte) und ein Bezugspunkt (zum Beispiel genannt ref).

Sie können auch nach der Breite-Grenze-Box suchen - Longitude erfordert komplexere Berechnungen und es ist nur eine Verschwendung von Zeit. Sie können eine Meile in Grad ist 1/69 deg/mile (etwa 0,1449 Grad) bestimmen. So können Sie überprüfen, welche Punkte außerhalb dieses Grenzkasten sind:

var result = [] 
var maxLat = ref.lat + 0.1449; 
var minLat = ref.lat - 0.1449; 
points.forEach(function (d) { 
    if (d.lat > maxLat || d.lat < minLat) continue; 
    if (distance(d.lat, d.lon, ref.lat, ref.lon) <= 1) { 
     result.push(d); 
    } 
}; 

Dazu sollte Finish mit einer Reihe von Punkten, die näher als 1 Meile vom Referenzpunkt sind.

Ich könnte einen Fehler in der Formel Dinge haben (Ich bin eher wie ein Programmierer als ein Mathematiker). Also überprüfe, ob sie mit dem Wikipedia-Artikel arbeiten, zu dem ich einen Link hinzugefügt habe.

+0

Wäre es nicht schneller, die 1-Meilen-Distanz in eine "Grad-Distanz" umzuwandeln, anstatt jeden Koordinatenpunkt umzurechnen? Nehmen wir an, 1 Meile entspricht einer Entfernung von 0,001 Grad, dann müssen wir nur überprüfen, dass "(d.lat - ref.lat) ** 2 + (d.lon - ref.lon) ** 2 <0.001 ** 2 ', was weniger ganzzahlige Berechnungen erfordert. Ich könnte mich in meinem Vorschlag irren, nur fragen. – Delgan

+0

Für zusätzliche Geschwindigkeit können Sie eine einfache "frühzeitige" Bounding-Box-Prüfung basierend auf min/max lat und long durchführen, um die meisten Punkte zu verwerfen und nur die teure Distanzberechnung für diejenigen zu machen, die sie passieren. – samgak

+0

@Delgan nicht genau - eine Meile Abstand ist in verschiedenen Breiten unterschiedlich. Zum Beispiel - bei einem Breitengrad von 38 N/S - ist ein Längengrad von 69 Meilen, während bei einem Breitengrad von 90 N/S ein Längengrad von 0 Meilen erreicht. –

Verwandte Themen