Как зарегистрировать OGRLineString в качестве стимулирующей линии?

Я хотел бы использовать boost::geometry::simplify метод с OGRLineStrings. Хотя я могу зарегистрировать OGRPointчерез макрос:

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(OGRPoint, double, cs::cartesian, OGRPoint::getX, OGRPoint::getY, OGRPoint::setX, OGRPoint::setY)

В настоящее время я не могу использовать следующий код:

#include <boost/geometry/geometry.hpp>
#include <boost/geometry/geometries/register/point.hpp>
#include <boost/geometry/geometries/register/linestring.hpp>
#include <boost/geometry/geometries/linestring.hpp>
#include <boost/geometry/geometries/point_xy.hpp>

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(OGRPoint, double, cs::cartesian, OGRPoint::getX, OGRPoint::getY, OGRPoint::setX, OGRPoint::setY)
BOOST_GEOMETRY_REGISTER_LINESTRING(OGRLineString)

void example()
{
  OGRLineString test;
  OGRLineString simplified;
  boost::geometry::simplify(test, simplified, 0.5);
}

Метод Simplyfy не компилируется, и я получаю ошибки, сообщающие что-то о boost:mpl::eval_if_c, который мне не помогает.

1 ответ

Решение

Линия Boost.Geometry должна соответствовать концепции Boost.Range. Например, это может сделать std::vector. Но OGRLineString, из коробки,.

Во-первых, должен быть определен итератор, проходящий по точкам, которые содержит OGRLineString. Используя OGRLineString::getPoint(...) это должно быть в принципе возможно.

Во-вторых, если реализован итератор, который, вероятно, является самой сложной частью, OGRLineString следует адаптировать к Boost.Range, например, как описано здесь.

Если это сделано, Boost.Geometry должен распознать OGRLineString как строку и может прочитать ее.

Однако для записи в OGRLineString необходимо выполнить дополнительный шаг. Это должен быть "изменчивый диапазон". Поскольку это (пока) не определено в Boost.Range, до сих пор это вещь только для геометрии, и ее можно реализовать, специализируя три класса в пространстве имен boost::geometry::traits (clear, push_back и resize).

Другие вопросы по тегам