Делаю программу для работы с OSM данными. Программа представляет собой простейший редактор для скриптов. Скриптовый язык qtscript + объекты работы с OSM данными. Сделал загрузку/сохранение. Сейчас делаю поиск по атрибутам и tag-ам. Следующий необходимый функционал - это отсечение данных по заданному полигону. Кто-нибудь может подсказать математическую библиотеку на Си/C++ для проверки попадания в полигон. Как я понимаю, тут не очень подойдет обычная математика, а требуется математика на сфере.
p.s.Пытался вытащить эту функцию из osmconvert.c/osmfilter.c, но исходники - это 400/200 Кб чистого текста, ихз которого фиг что понятно.
Ну, математики здесь не так уж много, как правило, вычисление ориентированной площади. Возможно, для скорости нужно будет дополнить каким-либо дополнительным условием типа проверки ограничивающего прямоугольника либо пространственного индекса. Но это уже не математика в числом виде.
Почему же не подойдет? Погрешность в любом случае будет существенно меньше, чем погрешность в исходных данных (т.е. в координатах узлов).
А если хочется избавиться и от этой погрешности - преобразовать координаты по Меркатору.
Вот именно.
Практика показывает, что такие простые вещи намного рациональнее писать самому, чем пытаться разобраться в чем-то существующем.
Всем спасибо. Проверка программы на использование памяти выявило проблемы. Файл OSM 12 Мб потребляет 60 Мб памяти
Так что математика отходит на второй план. Подход к скриптованию неверный выбрал. Придется переделывать.
А никто не разбирался с boost::geometry, применительно к OSM?
А то никак не могу понять, что это за примитив такой ring. Кольцо, но что за кольцо - не особо понятно.
Ну, кольцо и кольцо Замкнутая, непересекающаяся линия, если верить документации: A ring (aka linear ring) is a closed line which should not be selfintersecting in group geometries.
Я пытался его задействовать, но плюнул, так как не удалось подсунуть ему нужные мне типы (скажем, индекс добавить к контейнеру). В результате использую свой Loop
Вы этот этот ресурс нашли по BG?
P.S. BG использую в С++'ном ядре, общем для десктопного Qt и Андроида, свою работу выполняет.
Я просто не особо понял, зачем выделять этот примитив отдельно. Есть линия, есть полигон. А это получается что среднее между ними. Для чего? Ведь можно обойтись обычной линией, просто замкнув её. А тут отдельный примитив намутили.
За ссылку спасибо, хотя вроде я на эту информацию натыкался.
Это понятно. Но ведь кольцо можно заменить linestring, у которого первая и последняя вершина совпадает.
Хотя это уже не столь важно, но для теоретического посвящения полезно знать, почему именно отдельный примитив, а не linestring
Интересный вопрос. По результатам небольшого изыскания получается, что кроме замкнутости существенных отличий и нет. А отдельный - подозреваю для того, чтобы ему можно было делегировать операции вроде within, которые бессмыслены для незамкнутых линий. Compile-time обеспечение корректной топологии.
Shasoft, что значит “засунуть результат”?
wkt() возвращает манипулятор, который единственно для чего пригоден - это для сериализации геометрии в формат WKT.