Математическая библиотека для работы с ГИС данными

Делаю программу для работы с OSM данными. Программа представляет собой простейший редактор для скриптов. Скриптовый язык qtscript + объекты работы с OSM данными. Сделал загрузку/сохранение. Сейчас делаю поиск по атрибутам и tag-ам. Следующий необходимый функционал - это отсечение данных по заданному полигону. Кто-нибудь может подсказать математическую библиотеку на Си/C++ для проверки попадания в полигон. Как я понимаю, тут не очень подойдет обычная математика, а требуется математика на сфере.

p.s.Пытался вытащить эту функцию из osmconvert.c/osmfilter.c, но исходники - это 400/200 Кб чистого текста, ихз которого фиг что понятно. :slight_smile:

http://trac.osgeo.org/geos/

Ну, математики здесь не так уж много, как правило, вычисление ориентированной площади. Возможно, для скорости нужно будет дополнить каким-либо дополнительным условием типа проверки ограничивающего прямоугольника либо пространственного индекса. Но это уже не математика в числом виде.

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

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

Всем спасибо. Проверка программы на использование памяти выявило проблемы. Файл OSM 12 Мб потребляет 60 Мб памяти :frowning:
Так что математика отходит на второй план. Подход к скриптованию неверный выбрал. Придется переделывать. :frowning:

В boost::geometry много вкусного, в т.ч. и для работы с геодезическими данными. Только с документацией не очень.

Спасибо. Как раз хотел boost попробовать прикрутить к Qt проекту. Теперь есть повод.

А никто не разбирался с boost::geometry, применительно к OSM?
А то никак не могу понять, что это за примитив такой ring. Кольцо, но что за кольцо - не особо понятно.

Ну, кольцо и кольцо :slight_smile: Замкнутая, непересекающаяся линия, если верить документации: A ring (aka linear ring) is a closed line which should not be selfintersecting in group geometries.
Я пытался его задействовать, но плюнул, так как не удалось подсунуть ему нужные мне типы (скажем, индекс добавить к контейнеру). В результате использую свой Loop :slight_smile:
Вы этот этот ресурс нашли по BG?
P.S. BG использую в С++'ном ядре, общем для десктопного Qt и Андроида, свою работу выполняет.

Я просто не особо понял, зачем выделять этот примитив отдельно. Есть линия, есть полигон. А это получается что среднее между ними. Для чего? Ведь можно обойтись обычной линией, просто замкнув её. А тут отдельный примитив намутили.

За ссылку спасибо, хотя вроде я на эту информацию натыкался.

Полигон топологически состоит из одного внешнего и произвольного количества внутренних “колец”.
http://geometrylibrary.geodan.nl/classboost_1_1geometry_1_1polygon.html Кольцо - тип представления замкнутой самонепересекающейся линии.

Это понятно. Но ведь кольцо можно заменить linestring, у которого первая и последняя вершина совпадает.
Хотя это уже не столь важно, но для теоретического посвящения полезно знать, почему именно отдельный примитив, а не linestring

Интересный вопрос. По результатам небольшого изыскания получается, что кроме замкнутости существенных отличий и нет. А отдельный - подозреваю для того, чтобы ему можно было делегировать операции вроде within, которые бессмыслены для незамкнутых линий. Compile-time обеспечение корректной топологии.

Вкрутил RTree из bg::experimentat::index для усекновения объектов, не попадающих на экран. Замечательная вещь.

Это вы для оптимизации отрисовки использовали?

Угу, на моей Андроидной железке теперь на крупных масштабах 60fps вместо 3.

Чтобы не плодить темы, спрошу тут.

Как я помощью boost::geometry::wkt(polygons) получить WKT представление списка полигонов? Никак не могу понять, что именно возвращает функция. :frowning:

Хотя вот так выводит

std::cout << "\t\tWKT[]: " << boost::geometry::wkt(polygons) << std::endl;

но мне нужно в строку засунуть результат.

Shasoft, что значит “засунуть результат”?
wkt() возвращает манипулятор, который единственно для чего пригоден - это для сериализации геометрии в формат WKT.

Как из этого манипулятора получить геометрию в формате WKT в виде строки std::wstring или std::string?

std::stringstream ?

Я думал, может какой-то спец метод есть для возврата строки. Но если нет, то так и сделаю.