我正在使用
Rtree实现的boost :: geometry来存储(很多)2D点.现在我需要做距离最近的neigbour查询.
然而,手册only describes queries为矩形框(即“获取我在这个矩形内的所有点”)或“KNN”查询(“从这里得到我最近的”n“点).
我想要的就是“给我一些距离小于’n”的点数.
我注意到你可以定义一个一元的谓词,但是是一元的(因此,不适合两点的条件).
手册记录了我以前认为可能适合一个圆圈的一些model::ring
课程,但它实际上更像是一种分段线(多边形).这个假设是否正确?
解决方法
last example in the documented “User-defined queries”显示了如何在谓词中使用lambda.此lambda可以绑定范围中的其他变量,例如,您要查找的邻居点.
这是一个小例子.该示例查找距离(5,5)更接近于2个单位的点,用于位于直线y = x处的点的集合.如果搜索点在R树中,或者将其直接从R树中取出,那么首先要检查它是否容易进行修改.
#include <iostream> #include <boost/geometry.hpp> #include <boost/geometry/geometries/point.hpp> #include <boost/geometry/index/rtree.hpp> namespace bg = boost::geometry; namespace bgi = boost::geometry::index; typedef bg::model::point<float,2,bg::cs::cartesian> point; typedef std::pair<point,unsigned> value; int main(int argc,char *argv[]) { bgi::rtree< value,bgi::quadratic<16> > rtree; // create some values for ( unsigned i = 0 ; i < 10 ; ++i ) { point p = point(i,i); rtree.insert(std::make_pair(p,i)); } // search for nearest neighbours std::vector<value> returned_values; point sought = point(5,5); rtree.query(bgi::satisfies([&](value const& v) {return bg::distance(v.first,sought) < 2;}),std::back_inserter(returned_values)); // print returned values value to_print_out; for (size_t i = 0; i < returned_values.size(); i++) { to_print_out = returned_values[i]; float x = to_print_out.first.get<0>(); float y = to_print_out.first.get<1>(); std::cout << "Select point: " << to_print_out.second << std::endl; std::cout << "x: " << x << ",y: " << y << std::endl; } return 0; }
通过OS X上的Macports安装的Boost进行编译和运行:
$c++ -std=c++11 -I/opt/local/include -L/opt/local/lib main.cpp -o geom && ./geom Select point: 4 x: 4,y: 4 Select point: 5 x: 5,y: 5 Select point: 6 x: 6,y: 6