gpt4 book ai didi

c++ - 在 Boost.Geometry rtree 中存储 OGRPoint

转载 作者:太空狗 更新时间:2023-10-29 20:58:28 26 4
gpt4 key购买 nike

我正在尝试使用 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 ?

最佳答案

此问题存在于 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 将它视为一个范围(一个对象适合 Boost.Range 概念之一的类型)。当参数不是范围时,会在编译时生成错误消息。

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

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

如果您有一些建议或发现错误,请随时联系邮件列表中的开发人员或报告错误 here .

关于c++ - 在 Boost.Geometry rtree 中存储 OGRPoint,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27590897/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com