Как зарегистрировать OGRLineString в качестве стимулирующей линии?
Я хотел бы использовать boost::geometry::simplify
метод с OGRLineString
s. Хотя я могу зарегистрировать 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).