C # Хранение и фильтрация списка, содержащего массив значений типа double - PullRequest
0 голосов
/ 08 марта 2012

У меня есть серия двойников в формате значений десятичной широты / долготы.Я хочу сохранить эти значения, и когда дело доходит до добавления нового значения в список, посмотрите, есть ли уже значение в списке, которое является ± 0,0001 по широте, а затем по долготе.Если значение находится в пределах ± 0,0001 от широты или долготы, я не хочу его сохранять.

Я хотел бы воссоздать версию команды MongoDB Geospatial $ near.

Может ли кто-нибудь предложить какие-либо советы о том, как это сделать?Существуют ли какие-либо бесплатные геопространственные библиотеки c #, которые помогли бы мне достичь этой цели?

Большое спасибо за совет.

Ответы [ 3 ]

0 голосов
/ 08 марта 2012

Если я правильно понимаю, что-то вроде этого должно работать для вас, при условии, что координаты заключены в какой-то контейнер.

public class Coordinates
{
    public double Latitude { get; set; }
    public double Longitude { get; set; }
}
public bool IsNear(List<Coordinates> coords, double lat, double lon, double tolerance)
{
    return coords.Any(p => Math.Abs(p.Latitude - lat) < tolerance || Math.Abs(p.Longitude - lon) < tolerance);
}
0 голосов
/ 08 марта 2012

Вам необходимо рассчитать расстояние между двумя точками:

if (Math.Abs(Math.Sqrt((longitude - longitude_before) * (longitude - longitude_before) + (latitude - latitude_before) * (latitude - latitude_before))) > 0.0001)
{
   // Record new point
}

где latitude_before и longitude_before - последние записи в записанном пути - мне кажется, что проверять предыдущие точки не нужно. Если выясняется, что это так, и производительность становится проблемой, вам придется взглянуть на поиск диапазона .

0 голосов
/ 08 марта 2012

Я не знаю ни одной библиотеки, но вы могли бы использовать LINQ.Вот один для List<Tuple<double, double>>:

var y = new Tuple<double, double>(15.25, 18.700001);

if(!coordinates.Any(x => Math.Abs(x.Item1 - y.Item1) <= 0.0001 || Math.Abs(x.Item2 - y.Item2) <= 0.0001)) {
    // No coordinate in the list is within ±0.0001 of either the latitude or the longitude
    coordinates.Add(y);
}
...