在Boost.Geometry中存储OGRPoint

时间:2014-12-21 15:39:33

标签: c++ boost-geometry ogr

我试图用Boost.Geometry注册OGR几何类,最终在Boost.Geometry RTree中使用它们。为此,我已经按照Boost.Geometry文档中的教程/示例使用BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET宏注册了OGRPoint:

BOOST_GEOMETRY_REGISTER_POINT_2D_GET_SET(
    OGRPoint,
    double,
    boost::geometry::cs::spherical_equatorial<boost::geometry::degree>,
    getX,
    getY,
    setX,
    setY)

我的简单测试驱动程序只是创建一个带有boost::geometry::model::box可转换的RTree:

typedef bg::model::box<OGRPoint> OGRBox;
typedef std::pair <OGRBox, unsigned> Value;

bgi::rtree<Value, bgi::rstar<16>> rtree;
OGRPoint testP0(12.0, 18.0),
        testP1(1.2, 1.8);

rtree.insert(std::make_pair(OGRBox(testP0, testP0), 0));
rtree.insert(std::make_pair(OGRBox(testP1, testP1), 1));

然而,我遇到了编译错误,归结为Boost中的断言:

../../../../include/boost/geometry/index/rtree.hpp:576:398: note:   cannot convert 'boost::geometry::index::rtree<Value, Options, IndexableGetter, EqualTo, Allocator>::insert(const Range&)::PASSED_OBJECT_IS_NOT_A_RANGE576::assert_arg<std::pair<boost::geometry::model::box<OGRPoint>, int> >()' (type 'mpl_::failed************ (boost::geometry::index::rtree<Value, Options, IndexableGetter, EqualTo, Allocator>::insert(const Range&) [with Range = std::pair<boost::geometry::model::box<OGRPoint>, int>; Value = std::pair<boost::geometry::model::box<OGRPoint>, unsigned int>; Parameters = boost::geometry::index::rstar<16ul>; IndexableGetter = boost::geometry::index::indexable<std::pair<boost::geometry::model::box<OGRPoint>, unsigned int> >; EqualTo = boost::geometry::index::equal_to<std::pair<boost::geometry::model::box<OGRPoint>, unsigned int> >; Allocator = std::allocator<std::pair<boost::geometry::model::box<OGRPoint>, unsigned int> >]::PASSED_OBJECT_IS_NOT_A_RANGE::************)(std::pair<boost::geometry::model::box<OGRPoint>, int>)') to type 'mpl_::assert<false>::type {aka mpl_::assert<false>}'
     BOOST_MPL_ASSERT_MSG((detail::is_range<Range>::value), PASSED_OBJECT_IS_NOT_A_RANGE, (Range));

还有什么我需要做的,比如为boost::geometry::model::box<OGRPoint>实施Boost.Range吗?

2 个答案:

答案 0 :(得分:3)

此问题存在于Boost 1.56及更早版本中。

rtree::insert()有3次重载:

rtree::insert(value_type const&)
rtree::insert(Iter first, Iter last)
rtree::insert(Range const&) // 1.56 and older

在Boost 1.56及更早版本中,当一个类型不同于value_type的对象传递到insert()成员函数时,rtree将其视为一个Range(一个适合于其中一个Boost类型的对象) 。范围概念)。当参数不是Range时,错误消息在编译时生成。

在Boost 1.57中,您的代码应该有效,因为该函数现在可以识别可转换为value_type的参数。现在第三个重载是:

rtree::insert(ConvertibleOrRange const&) // 1.57

如果您有任何建议或发现错误,请不要犹豫与邮件列表上的开发人员联系或报告错误here

答案 1 :(得分:1)

在这种特殊情况下,我的适配器代码没有错误。实际上,它始于错误消息:

typedef std::pair <OGRBox, unsigned> Value;

请注意unsigned

错误,但是说明:

std::pair<boost::geometry::model::box<OGRPoint>, int>

是, int 。解决方案是直接使用std::pair<OGRBox, unsigned>的构造函数,或将u附加到数字文字,如下所示:

rtree.insert(std::make_pair(OGRBox(testP0, testP0), 0u));

我无法相信这只会让我三个小时的搜索。我希望它有所帮助。