что-нибудь лучше ограничивающих рамок?

У меня есть сценарий, в котором у меня есть x миллионов точек долготы и широты.

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

есть что-нибудь лучше ограничивающих рамок?

Я хотел бы увидеть алгоритмы, ссылки и несколько реализаций;) большое спасибо!


person Setori    schedule 04.12.2009    source источник
comment
Ответ на этот вопрос был дан здесь несколько минут назад: stackoverflow.com/questions/1847310/   -  person Gunther Piez    schedule 04.12.2009
comment
Помните, что долгота / широта - это странно, потому что расстояния меняются в зависимости от широты. Если все данные находятся внутри страны, это не имеет большого значения. Но я видел, как люди забывают иметь дело с этим в глобальных наборах данных.   -  person Nosredna    schedule 04.12.2009
comment
Да, и не забывайте, что долгота, конечно же, циклическая. :-)   -  person Nosredna    schedule 04.12.2009
comment
@drhirsch Верно, но есть несколько интересных моментов в контексте геолокации.   -  person PeterAllenWebb    schedule 05.12.2009


Ответы (3)


Есть довольно много вариантов, которые лучше, в основном основанные на разделении пространства.

Распространенный и часто очень хороший вариант (который не слишком сложно реализовать) - использовать KD-Tree. Дерева квадратов реализовать проще, но медленнее для поиска. В зависимости от распределения ваших данных и ваших требований другие алгоритмы разделения пространства могут работать лучше, иметь более низкие требования к памяти или другие связанные проблемы.

person Reed Copsey    schedule 04.12.2009
comment
Я определенно согласен, что он хочет разделить пространство. Однако ему придется изменить концепцию квадродерева, чтобы заставить ее работать, поскольку она предназначена для двумерного пространства, в котором области прямоугольные. Также ему нужно будет побеспокоиться об упаковке, как справедливо отмечает Носредна. - person PeterAllenWebb; 05.12.2009
comment
Да, но в этих ситуациях можно использовать квадродеревья и деревья kd. Quadtree проще, так как в этом случае становится намного проще обрабатывать упаковку. Однако, как правило, в подобных ситуациях вы имеете дело не с глобальным случаем, а с регионом меньшего размера, и в этом случае большинство из этих проблем менее проблематично. - person Reed Copsey; 05.12.2009

Коллега сказал мне, что у него хороший опыт использования Morton-Code в качестве пространственного индекса для данных ГИС, возможно, это стоит изучить.

person André    schedule 04.12.2009
comment
Я использовал коды Мортона в базе данных с десятками миллионов записей - они хорошо работают. - person Stephen Nutt; 19.12.2009

Этот быстрый и грязный подход может избавить вас от некоторых неприятностей: разделите поверхность земли на прямоугольники по 1 градусу. Тогда у вас будет массив элементов 180x360, и вам нужно будет выполнить поиск только в небольшом количестве ящиков, включая поле, содержащее новую точку, и все прямоугольники непосредственно вокруг нее, для которых один из углов находится в пределах заданного пользователем расстояния. Вы обнаружите, что есть несколько уловок, которые можно использовать, чтобы быстро определить, какие коробки использовать, не рассматривая их все. Только не забудьте про широту и долготу.

Если у вашего «всего» есть миллионы точек, и они не сгруппированы в горячие точки, это может помочь вам.

Теоретически лучший способ: вы можете отобразить каждую точку в трехмерном пространстве, а затем сохранить их в октодереве, что позволит вам быстро находить близлежащие точки с точностью до произвольного расстояния. Конечно, расстояние в трехмерном пространстве будет немного отличаться от расстояния по большому кругу на земном шаре, поэтому вам придется рассчитать коэффициент преобразования. Однако это должно быть просто. Вы не упоминаете язык реализации, но почти наверняка будет хорошо протестированная реализация октодерева для любого языка, на котором вы работаете. Если вы не возражаете вставить сторонний код, это решение - способ идти.

person PeterAllenWebb    schedule 04.12.2009