LINUX.ORG.RU

Задача поиска ближайшего соседа для гео-данных

 ,


0

2

Решаю такую задачку на Си: есть набор город России (~ 2.5k) представленных двумя координатами его центра, соответственно широтой и долготой. На вход подаются точки опять же с широтой и долготой и нужно каждую точку отнести к некоторому городу по простому правилу - точку относим к тому городу, расстояние до центра которого минимально. То есть по сути, решается задача поиска ближайшего соседа. Данные о городах статичны, входных точек может быть порядка нескольких миллионов. Необходимо чтобы программа отрабатывала достаточно быстро. Возникает вопрос: какие алгоритмы (и может быть библиотеки) здесь использовать?

Проверять все 2.5к городов брутфорсом - не вариант, нужно построить какой-нибудь индекс типа k-D дерева или R-дерева. Какой индекс в моей задаче будет работать лучше? Как лучше работать с исходными данными: считать расстояние между точками на сферойде и соотвественно строить дерево с расчетом на то, что пространство не евклидово или же перевести координаты в какую-то проекцию? Города расположены по всей России, не будет ли перевод в какую-то проекцию давать настолько большие погрешности, что точку можно будет отнести не к тому городу?

Какие библиотеки на Си (не С++, именно С) посоветуете для работы с гео-данными в рамках указанной задачи (основной вопрос - работа именно с гео-данными, представленными широтой и долготой, найти нужно именно один ближайший город, может ли это упростить задачу?)

★★

Последнее исправление: cetjs2 (всего исправлений: 2)

Именно для ответа на запросы типа «ближайшая точка из заданного множества к данной» вроде строят диаграмму Вороного (тебе даже индекс не нужен — сложные алгоритмы строят ее за NlogN).

metar ★★★
()
Последнее исправление: metar (всего исправлений: 1)

перевести координаты в какую-то проекцию?

Думаю стоит почитать об отродромии (кратчайшее расстояние между двумя точками) и меркаторской проекции (проекции на цилиндр).

invy ★★★★★
()
Ответ на: комментарий от malbolge

для пограничных случаев любой ответ сойдет

Goganchic ★★
() автор топика
Ответ на: комментарий от invy

то есть вы считаете что все же стоит работать с проекцией меркатора а не с широтой и долготой? насколько большую погрешность это даст если речь идет о городах России, которые расположены на половине Евразии?

Goganchic ★★
() автор топика
Ответ на: комментарий от mashina

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

Goganchic ★★
() автор топика
Ответ на: комментарий от metar

время построения исходной структуры, будь то R-дерево, k-D дерево или диаграмма Вороного не так важно, потому что структура будет построена разово и из относительно небольшого числа элементов, намного важнее скорость и точность ответов на вопрос «к какому городу ближе данная точка». Таких точек будет намного больше чем исходных данных о городах.

Goganchic ★★
() автор топика
Ответ на: комментарий от Goganchic

Может тогда расчитать многоугольники для каждого города, внутри которых любая точка ближе к данному городу, а потом уже просто проверять вхождение точки в многоугольник?

unC0Rr ★★★★★
()
Ответ на: комментарий от Goganchic

не с широтой и долготой

потому что «расстояние в градусах» (что это?) которое вы собираетесь считать и «длина дуги» - расстояние в киломатрах на поверхности эллипсоида не пропорциональны.

Deleted
()

Плюсую Вороного.

Только ТС, что-то у тебя с логикой не так:

нужно каждую точку отнести к некоторому городу по простому правилу - точку относим к тому городу, расстояние до центра которого минимально

Может, таки стоит учитывать границы субъектов федерации?

А насчет погрешностей — зависит от точности задания координат. Ясен пень, если там точность не превышает угловой минуты, то и аппроксимация геоида сферой даст нормальные результаты.

Eddy_Em ☆☆☆☆☆
()
Ответ на: комментарий от Goganchic

Ну задумка такая: В проекции Меркатора меридианы и параллели перпендикулярны/параллельны, а значит к координатам в таком случае в принципе можно применить kd-tree.

invy ★★★★★
()
Ответ на: комментарий от invy

то есть идея такая: переводим координаты в меркатора и работаем как с декартовым пространством с использованием двумерного kd-tree?

Goganchic ★★
() автор топика
Ответ на: комментарий от invy

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

Goganchic ★★
() автор топика

попробуй minimal matching. Емнип алгоритм работает за полиномиальное время.

dikiy ★★☆☆☆
()
Ответ на: комментарий от Goganchic

Может быть... Тут ещё вопрос... поскольку надо искать ближайшего соседа(ближайший город), то расстояния небольшие. И вот думаю, а имеет ли вообще смысл с проекциями возиться.

invy ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.