2009-07-25 4 views
2

У меня есть база данных точек карты, и я хочу ограничить отображение показом не более ~ 50 точек за раз. Когда пользователь увеличивает масштаб изображения, может отображаться больше точек.Как фильтровать пространственные данные

В настоящее время я просто беру случайный образец результирующего набора. Это не очень удобно, так как могут быть пустые области, которые при увеличенном увеличении отображают точку.

Следующей мыслью я мог бы создать сетку 10x5 и перебрать результаты. Если место в сетке было пустым, я бы показал точку. Это устраняет предыдущую проблему, но также не дает пользователю понять, где сосредоточены области. Кроме того, это довольно медленно, если пользователь решает уменьшить масштаб для всего мира.

Прямо сейчас, я не использую какой-либо пространственный алгоритм для сортировки данных. Мой план состоит в том, чтобы заставить его работать в первую очередь, а затем быстро получить его. Читая немного в RTress, kd-деревьях и квадроциклах, я не мог найти ничего, что помогло бы мне выбрать «умное» подмножество образца. Кажется, должен быть какой-то широкий поиск по первой части, что бы решить эту проблему довольно легко.

+0

Я рекомендую вам искать термин «алгоритмы кластеров», многие пространственные библиотеки реализуют его или есть какой-то пример для его реализации, например http://openlayers.org/dev/examples/strategy-cluster-threshold.html – phipex

ответ

0

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

  1. Я начинаю со случайной точкой из моего набора, дать ему оценку п = 1, и добавить его в список выбрано.
  2. Я затем ищу точку, которая далее из любой точки в выбрана.
  3. Я беру эту точку, даю ей оценку n + 1, добавьте ее в список , отобранный, а затем повторите шаг два, пока не будут выбраны все точки.

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

3

Как насчет расширения оригинальной идеи. Разделите его на сетки, затем используйте анализ плотности для создания точек разного размера, основанных на количестве функций в этой области. Таким образом, пользователь более визуально осознает плотность объектов, просто просматривая большие (или меньшие) точки.

Что касается ускорения работы, возможно, вы можете установить порог для каждой сетки. Если счетчик достигнет определенной суммы, перейдите к следующей сетке. Таким образом, вы можете иметь «максимальную» точку и ускорить работу, игнорируя точки выше этого искусственно заданного порога (который вы можете определить на основе эмпирического анализа ваших данных).

1

Майкл Тодд сделал несколько хороших предложений. +1 для этого.

Я хотел бы добавить, что (в зависимости от типа данных) вы могли бы добавить дополнительное свойство к своим точкам карты.

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

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

Смежные вопросы