что-нибудь лучше, чем ограничительные рамки? - PullRequest
2 голосов
/ 04 декабря 2009

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

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

есть что-нибудь лучше, чем ограничительные рамки?

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

Ответы [ 3 ]

3 голосов
/ 04 декабря 2009

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

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

1 голос
/ 05 декабря 2009

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

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

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

1 голос
/ 04 декабря 2009

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

...