как сгруппировать достопримечательности по широте для моего приложения WP7 - PullRequest
0 голосов
/ 30 марта 2011

У меня есть коллекция моих собственных PointOfInterest классов (около 1500), каждый из которых имеет свои двойные свойства Latitude и Longitude.

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

Как я могу очень эффективно сгруппировать POI по их свойствам?

У меня есть такие вещи:

var pointOfInterests = (from p in PointsOfInterest select p).Distinct(new EqualityComparer()).ToList();

, где EqualityComparer:

public class EqualityComparer : IEqualityComparer<PointOfInterest>
{
    public bool Equals(PointOfInterest x, PointOfInterest y)
    {
        return Math.Round(x.Latitude.Value, PointOfInterest.DecimalPlaceFilterLevel) == Math.Round(y.Latitude.Value, PointOfInterest.DecimalPlaceFilterLevel) &&
            Math.Round(x.Longitude.Value, PointOfInterest.DecimalPlaceFilterLevel) == Math.Round(y.Longitude.Value, PointOfInterest.DecimalPlaceFilterLevel);
    }

    public int GetHashCode(PointOfInterest obj)
    {
        return Math.Round(obj.Latitude.Value, PointOfInterest.DecimalPlaceFilterLevel).GetHashCode() ^ Math.Round(obj.Longitude.Value, PointOfInterest.DecimalPlaceFilterLevel).GetHashCode();
    }
}

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

Но это не работает, я продолжаю получать перекрывающиеся POI, и это не оченьбыстро ... так как я разговариваю по телефону, мне нужно, чтобы он работал очень хорошо.

Спасибо за любую помощь, которую вы можете оказать

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Возможно, вы захотите рассмотреть квадри.Эти деревья представляют прямоугольное пространство (широта / долгота будет хорошо, если у вас нет большого количества POI вокруг северного / южного полюса :)), и дочерние узлы подразделяют его на четыре равные части.Дерево квадратов хорошо документировано, и у вас не должно возникнуть проблем с поиском алгоритма, который делает то, что вам нужно.

С другой стороны, более простое решение может быть просто набором.Представьте мир как большую сетку.Ячейки сетки можно сделать такими большими или маленькими, как вы хотите, но в конце концов это просто сетка, и каждая ячейка сетки содержит коллекцию объектов PointOfInterest.Вставьте ваши POI в их подходящее место на сетке, и когда вам потребуется, будет легко найти все POI, которые вы хотите отфильтровать.

0 голосов
/ 16 сентября 2011

Я сделал пример версии корзины (сетки) с кодом C #.Это должно быть в состоянии обрабатывать много точек (быстрый код времени выполнения).

http://kunuk.wordpress.com/2011/09/15/clustering-grid-cluster

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...