我在用Boost's我的代码中的 r 树实现。我有一个带有坐标的对象列表(比如地图上的城市,如果重要的话),我希望在 r 树中索引,以执行快速 NN 搜索等。我已经遵循了他们的迭代查询示例,其中树木存储boost::geometry::model::point
对象。
我的问题:有没有办法存储对象(i.e.城市本身)而不仅仅是它们在树中的坐标?我想到的一种解决方案是使用我自己的索引。如果这确实是我应该做的 - 是否可以按照对象插入树的顺序找到对象的索引?
因此,例如,当我查找某些城市的 KNN 时,我不仅想提取它们的坐标(或距离),就像示例中那样:
for ( rtree_t::const_query_iterator
it = rtree.qbegin(bgi::nearest(pt, N));
it != rtree.qend() ;
++it ) {
std::cout << bg::wkt(*it) << ", distance= " << bg::distance(pt, *it) << std::endl;
}
还有它们插入树中的顺序,以便我可以访问它们e.g.来自包含按插入顺序排列的对象的向量。
您可以将任何类型存储在rtree
,你只需要告诉 Boost 如何获取坐标即可。
所以第一步是创建一个带有索引和点的类型:
struct CityRef {
size_t index;
point location;
};
你可以专攻boost::geometry::index::indexable
为 Boost 提供一种找到您输入的点的方法:
template <>
struct bgi::indexable<CityRef>
{
typedef point result_type;
point operator()(const CityRef& c) const { return c.location; }
};
然后你可以使用你的类型代替point
当宣布你的rtree
:
typedef bgi::rtree< CityRef, bgi::linear<16> > rtree_t;
当你迭代时,迭代器将引用你的类型而不是point
:
for ( rtree_t::const_query_iterator
it = rtree.qbegin(bgi::nearest(pt, 100)) ;
it != rtree.qend() ;
++it )
{
// *it is a CityRef, do whatever you want
}
这是使用该示例与另一种类型的演示:https://godbolt.org/z/zT3xcf
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)