2016-11-16 3 views
-1

Учитывая массив геокоординат и другую гео координату, я хотел бы найти ближайшую координату (ей).Поиск ближайшей координаты с другой координатой

Например, если массив:

лат                               длиной
52,525782   13,316927
52,526409   13,319083
52,525678   13.320317

И пункт: 52.525730, 13.314556, тогда будет возвращен первый пункт 52.525782, 13.316927, так как он является самым близким.


Это единственный способ совершить переход через весь массив и найти расстояние между точками? Что произойдет, если массив содержит слишком много координат?

+0

Какова структура массива точно, Lat один массив и длинный другой или это массив типа 'двойной [,]' –

+0

@AlfieGoodacre Это один массив, так же, как 'двойной [,]' –

+0

I скорее увидит дерево BSP - двоичный пространственный раздел. Они занимают много времени, чтобы сгенерировать из такого набора, но он будет искать 'O (log n)'. В основном, учитывая две точки, существует линия, вдоль которой они равноудалены, и даже если ближайшая точка к вашему запросу не является одной из этих двух, то найти, какая сторона этой линии имеет точку запроса, может исключить половину других точек и мы можем пропустить их сравнение. – sqykly

ответ

1

Вы можете попробовать его с помощью LINQ, но внутренняя работа LINQ будет по-прежнему охватывать вашу коллекцию. Например:

//Your list with coordinates 
List<GeoCoordinate> coords = new List<GeoCoordinate>(); 

//The coord you want to compare 
GeoCoordinate crd = new GeoCoordinate(); 

//Sorts the list based on the proximity of the coords to crd 
var sortedCoords = coords.OrderBy(x => x.GetDistanceTo(crd)).ToList(); 

Я знаю, что он не использует массив, но проще всего использовать списки.

Я думаю, что это должно работать, дайте мне знать, если это произойдет!

+0

'OrderyBy' не сортирует список. Он создает «IEnumerable», который при повторении передаст элементы из списка в нужном порядке. – juharr

+0

@juharr Вы правы, изменили мой ответ – 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)); 


    }