我想将boost::geometry::simplify
方法与OGRLineString
一起使用。
虽然我可以通过宏注册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的内容对我没有帮助。
答案 0 :(得分:3)
Boost.Geometry linestring必须符合Boost.Range概念。例如,std :: vector会这样做。但开箱即用的OGRLineString。
首先,应该定义一个迭代器,遍历OGRLineString包含的点。使用OGRLineString :: getPoint(...)这基本上是可行的。
其次,如果实现了迭代器,这可能是最难的部分,那么OGRLineString应该适用于Boost.Range,例如:正如here所述。
如果这样做,Boost.Geometry应该将OGRLineString识别为线串并且可以读取它。
但是,要写入OGRLineString,应该执行额外的步骤。它应该是一个“可变范围”。因为它还没有在Boost.Range中定义,所以它现在只是一个几何体,可以通过在boost :: geometry :: traits命名空间中专门化三个类来实现(clear,push_back和resize)。