如何将OGRLineString注册为boost linestring?

时间:2012-11-02 13:46:17

标签: boost ogr boost-geometry

我想将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的内容对我没有帮助。

1 个答案:

答案 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)。