Работа с базой данных ОСМ

Предлагаю уйти сюда с обсуждением вопросов анализа данных ОСМ.

Итак.

Структура бызы (грубо)

таблица 1 - ид_точки лат лон
таблица 2 - ид_пути ид_точки порядковый_номер_точки_в_пути
таблица 3 ид_пути тип_тега значение_тэга

Проверяем 136 000 путей (272 000 точек).

Полигон лежит в базе в виде обычного пути с тегом boundary.

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

Про выпуклые полигоны ничего сказать не могу, вообще не математик :frowning:

Как сейчас происходит обработка? Выкачивается вся база, затем выполняется проверка, какие-то результат сохраняются? На что уходит бОльшее количество времени - на выкачивание или на обработку? Известно, сколько всего точек в путях, не только конечных?

База = полный дамп россии.
Схема базы - http://wiki.openstreetmap.org/wiki/Database/Model
Нас интересуют только
current_ways
current_way_nodes
current_way_tags
current_nodes

Задача: по указанному ID замнкутого way определить перечень точек, которые в него попадают.

Прошу прощения, что-то я упустил. Вы мою задачу рассматриваете, или уже свою?

Все точки в пути пронумерованы. Соответственно номер последней = количеству точек. Обработка идет как запрос всех точек, запрос координат полигона, обработка. Следующий полингон, обработка и так доконца. Данные есть путь в полигоне или нет пишутся в отдельную таблицу.

Больше всего тратится на обработку.

Для оптимизации процесса обработаные точки пишутся в отдельную таблицу и при следующих прогонах при неизменных координатах полигона и точки не проверяются. Это дало существенный прирост скорости, но это касается только точек ВНУТРИ полигона, а остальные все равно приходится проверять.

А ваша какая была? :slight_smile:

А эту шумиху вообще я своим постом спровоцировал :slight_smile:

Где-то близко к задаче поиска выхода из лабиринта. Выхода нет - значит внутри! :slight_smile:

А в чем трудность?
http://algolist.manual.ru/maths/geom/belong/poly2d.php

  1. Вычисляем габаритный прямоугольник нашего way (тупо по максимумам и минимумам составляющих его точек);
  2. Берем точку A заведомо вне его (а значит, и вне way);
  3. Берем список точек, входящих в габаритный прямоугольник (O1, O2, …, On);
  4. Цикл(i, i <= n, i++). Проверяем, сколько сегментов нашего way пересекает отрезок AOi. Получаем количество пересечений с границей way. Если количество пересечений нечетное - точка Oi внутри way, если четное - снаружи. (КонецЦикла)

Это я и пытаюсь выяснить :slight_smile: Говорят, долго. Что имено долго - обработка на клиенте или лопачение базы пока выяснить не удается :slight_smile: Мы стали синьорами :beer:

В целом норм.
Эммм. а частный случай когда линия пересекает угловую точку Вея? Касание - одно, но точка снаружи.

Хммм. Получить по ID точки вэя - элементарно.
Потом точки в пределах габаритного прямоугольника - столь же просто. База, конечно, поюзается - но не больше, чем при любом другом запросе региона.

Вычисления вообще никакие и могут выполняться несколько раз в секунду.
Я недавно писал код одной трехмерной игры и ужасался, КАКОЙ объем вычислений проделывает ЦП каждую секунду. Конкретной в той игре каждую секунду обрабатываются МИЛЛИОНЫ вокселей. И с каждым из них проделываются не самые тривиальные операции.
И ведь геймплей-то простенький.

На этом форуме пива не пьют, похоже :smiley:

По ссылке всё написано. Там даже проще описано, кстати - выбран луч, направленный вправо. То есть то, о чем я писал, только для облегчения вычислений точка A выбрана точно справа от O. Отдельно обрабатываются нестандартные ситуации. Весь код занимает всего ничего.

Не вопрос, просто еще одна реализация алгоритма с лучем из точки. ВОпрос в том, что обработка получается долгая. И с ростом количества полигонов и количества точек она будет идти еще дольше. Для Москвы получается что нужно проверить 130 000+ отрезков на пересечение с 1000+ сторонами полигона. То есть это 130 000 000 итераций по несколько шагов внутри. Полигонов сейчас почти 100, большинство из нескольких десятков точек, но есть и больше, не только Москва.

Можно попробовать скормить всю геометрию видеокарте NVidia, там же есть CUDA.

вычислительную сложность алгоритма можно снизить, применив техники BSP/quadtree сотоварищи. Только у меня бооольшие сомнения, что это стоит реализовывать на серверной стороне. Удобно, конечно, но ведь сдохнет, бедолага, под запросами.

Угу. Осталось найти сервер с видеокартой нвидиа свежих поколений и написать дллку для пхп. которая бы работала с кудой… Вот у меня это все бегает на домашнем серваке, там ATI, причем простенькая :slight_smile:

Вы к чему, вообще, хотите прийти? К тому, что это сделать просто, а значит, можно делать каждый раз, когда нужно определить, в каком городе находится улица/дом? Зачем, если KekcuHa каждый день для каждого города России?
Всё, что можно посчитать заранее, нужно посчитать заранее.

Или вам просто был интересен алгоритм? Тогда прошу прощения, что влез.

Вот и я про то же.
Тем более, что обрабатывая окрестности своей деревни, грузить planet.osm (ну ладно, даже russia.osm) крайне накладно по вычислительным (и по памяти - что все равно сведется к времени вычислений, если не загнется вообще) ресурсам.

А алгоритмы можно и нужно оптимизировать.
Варианты оптимизации следующие (что пришло сразу в голову):

  1. Уже упомянутый boundbox.
  2. “полувыпуклые” (т.е. те у которых по любой горизонтали односвязная область) полигоны - тогда можно отсортировать ребра и проверять точку на попадание между двух ребер.
  3. Целочисленные расчеты (в свете быстрых сопроцессоров может быть не очень актуально - но требует оценки). Оптимизация сравнений (уход от делений и т.д.)
  4. Более экономные тыпы данных (4 байта вместо 8) даст выгоду по памяти/кэшу/свопу → дополнительное быстродействие.
  5. Повторное использоваение предыдущих расчетов - т.е. не проводить расчеты для полигона/точки(дороги), которые не менялись с прошлого расчета (Очень большая выгода - но требует хранения базы - к вопросу о постоянном повторе расчетов).

И вообще, можно сделать доступными для народа исходники, тогда кто-угодно сможет по месту посмотреть, что подлежит оптимизации.

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

Я уже писал, что каждый новый полингон в разы увеличивает количество операций по провеоке. Сколько в РФ городов? Сейчас прогон занимает полтора-два часа, сколько он будет занимать завтра?

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

Из предложеных методов оптимизации алгоритма:

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

Про полувыпуклые вообще не понял :frowning: Для меня это темный лес…

Можно чуть поподробнее? Никак не соображу в чем прикол :confused: