powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм отбора геокоординат из массива (no database)
6 сообщений из 6, страница 1 из 1
Алгоритм отбора геокоординат из массива (no database)
    #39574215
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дано: есть большой массив геокоординат точек и полилиний
Код: pascal
1.
2.
Poi: array[0..1788500] of Double = (68.94989, 33.10013, 69.00689, 33.08681, ....);
Polyline: array[0..508300] of Double = (69.02257, 33.0729,69.02223, 33.0729,69.02223, 33.07318,69.02257, 33.07318,69.02257, 33.0729,0, ....);


Вопрос: необходимо максимально быстро отобрать точки массива входящий в BoundingBox (например: [68.0,32.0,70.0,34.0]) текущей области просмотра
Варианты реализации:
1. сейчас я делаю это перебором и сравнением вхождения координат в область, это медленно.
2. можно было бы воспользоваться тайловой системой координат используемой в OSM, Google, Yandex. Т.е. сгруппировать все координаты по x,y тайла. И проверять вхождение координат тайла в требуемый BoundingBox. Это работает быстрее, но мне нужно еще вращать карту, при таком подходе прямоугольный тайловый подход теряет свой смысл (наверное все замечали, что в основном в web картах нет вращения).

Текущие тесты проводятся в Delphi, но это не принципиально, интересует возможный алгоритм построения системы индексации, не знаю как это можно назвать.
Спасибо.
...
Рейтинг: 0 / 0
Алгоритм отбора геокоординат из массива (no database)
    #39574459
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
xMailer1. сейчас я делаю это перебором и сравнением вхождения координат в область, это медленно.
Самое время почитать третий том Кнута.
...
Рейтинг: 0 / 0
Алгоритм отбора геокоординат из массива (no database)
    #39574484
авторно мне нужно еще вращать карту, при таком подходе прямоугольный тайловый подход теряет свой смыслне теряет, вращение это простое преобразование и можно делать обратное

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

с учетом поворота на произвольный угол просто нужно будет проверять пересечение с BoundingBox окружности, описанной вокруг тайла (или проще - попадание центра тайла в немного расширенный BoundingBox, где немного = сторона тайла, деленная на корень из двух)
...
Рейтинг: 0 / 0
Алгоритм отбора геокоординат из массива (no database)
    #39574496
вообще, для индексации точек на плоскости используют quad-tree , то есть иерархию квадратных тайлов

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

практически это сделать лучше так:
выразить 2 координаты точки целыми 32-битными числами
свести 2 этих 32-битных числа в одно 64-битное, чередуя их биты (старшие биты двух 32-битных станут двумя старшими битами 64-битного и т.д.)
(может хватить двух 16-битных координат, сведенных в одно 32-битное индексное число)

имейте в виду, что ваш BoundingBox может попасть во все 4 самых больших квадранта (тайла) -
если в него попадает центр карты
в общем, искомые точки будут кучковаться в 4 разных местах отсортированного списка
...
Рейтинг: 0 / 0
Алгоритм отбора геокоординат из массива (no database)
    #39574633
xMailer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Парни, все объяснили, большое спасибо!!!
...
Рейтинг: 0 / 0
Алгоритм отбора геокоординат из массива (no database)
    #39574773
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
После quad-tree можно почитать про r-tree.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / Алгоритм отбора геокоординат из массива (no database)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]