2016-11-16 3 views
-1

Angesichts einer Anordnung von Geokoordinaten und einer anderen Geokoordinate möchte ich die nächste (n) Koordinate (n) finden.Suche nach der nächsten Koordinate zu einer anderen Koordinate

beispielsweise angesichts der Array:

lat                               lang
52,525782   13,316927
52,526409   13,319083
52,525678.

Und der Punkt: 52.525730, 13.314556, dann der erste Punkt 52.525782, 13.316927 wird zurückgegeben, da es in der Nähe ist.


Ist die einzige Möglichkeit, es durch das gesamte Array zu durchlaufen und den Abstand zwischen den Punkten zu finden? Was passiert, wenn das Array zu viele Koordinaten enthält?

+0

Was ist der Array-Struktur genau, ist lat ein Array und lange eine andere oder ist es ein Array wie 'double [,]' –

+0

@AlfieGoodacre Es ist ein Array, genau wie 'double [,]' –

+0

I würde lieber eine BSP-Baum - Binärraum-Partition sehen. Sie brauchen eine lange Zeit, um aus einem Satz wie diesem zu generieren, aber es wird 'O (log n)' suchen. Grundsätzlich gibt es bei zwei Punkten eine Linie, entlang der sie äquidistant sind, und selbst wenn der nächste Punkt zu Ihrer Abfrage nicht einer dieser beiden Punkte ist, kann die Hälfte der anderen Punkte und ausgeschlossen werden, auf welcher Seite der Zeile der Abfragepunkt liegt Wir können sie überspringen. – sqykly

Antwort

1

Sie können es mit LINQ versuchen, aber die inneren Funktionen von LINQ würden immer noch über Ihre Sammlung schleifen. Zum Beispiel:

Ich weiß, dass es kein Array verwendet, aber ich finde die Verwendung von Listen ist einfacher.

Ich denke, das sollte funktionieren, lass es mich wissen, wenn es das tut!

+0

'OrderyBy' sortiert die Liste nicht. Es erzeugt ein "IEnumerable", das beim Iterieren die Elemente aus der Liste in der gewünschten Reihenfolge ergibt. – juharr

+0

@juharr hast du recht, habe meine antwort geändert – RandomStranger

0
struct coord 
    { 
     public double lat; 
     public double lon; 
    } 

    public void Main(coord coord) 
    { 

     var coords = new[]{ new coord(){lat=1, lon=1} }; 
     var closest = coords.Min(p => Math.Abs(p.lat - coord.lat) + Math.Abs(p.lon - coord.lon)); 


    } 
Verwandte Themen