3

我想用s的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 的错误,这对我没有帮助。

4

1 回答 1

3

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

于 2012-11-02T18:59:39.960 回答