Мне предлагается написать функцию, которая берет «LatLon» в качестве входа (LatLon - это класс с двумя удвоениями: широта и долгота) и возвращает ID (int) ближайшего пересечения к этой позиции. Мне даны функции, которые возвращают местоположение любого пересечения, а также возвращают расстояние между двумя позициями. Из-за «тестов производительности» мои преподаватели предложили мне сохранить места всех пересечений в R-Tree (из библиотеки ускорения), где было бы быстрее найти ближайший пересечение, а не повторять все пересечения. Тем не менее, я просто изучаю, как работают R-деревья, и у меня возникают проблемы с его созданием.Как использовать Rtree библиотеки Boost в C++?
Проблема в том, что я видел несколько примеров в Интернете, где они создают R-деревья, но меня действительно смущает то, что они используют только два аргумента, а не четыре, в одном из конструкторов. Например, они используют:
bgi :: rtree < value_t, bgi :: квадратный < 16>> rtree_;
где value_t пара коробки и без знака Int, а другой аргумент размера, тем не менее, если я пытаюсь сделать:
BGI :: rtree < точка, BGI :: квадратичной < 16 >> intersectionRTree ;
где точка - это пара беззнаковых int и LatLon, компилятор жалуется, что я не использую соответствующий конструктор и что у него должно быть четыре аргумента вместо двух.
Я прочитал в Интернете, и считаю, что я должен использовать этот конструктор:
rtree (parameters_type сопзИте &, indexable_getter сопзИте &, value_equal сопзИте &, allocator_type сопзИ &)
Однако, я не» t понять описание каждого аргумента, поэтому я не знаю, как использовать этот конструктор. Итак, вы можете помочь мне понять, что делать? И если возможно, не могли бы вы привести мне короткий пример? Большое спасибо.
Это класс LatLon. Это только для чтения, так что я не могу изменить его:
class LatLon{
public:
LatLon(){}
explicit LatLon(float lat_, float lon_) : m_lat(lat_),m_lon(lon_){}
double lat() const { return m_lat; }
double lon() const { return m_lon; }
private:
float m_lat = std::numeric_limits<float>::quiet_NaN();
float m_lon = std::numeric_limits<float>::quiet_NaN();
friend class boost::serialization::access;
template<class Archive>void serialize(Archive& ar, unsigned int)
{ ar & m_lat & m_lon; }
};
std::ostream& operator<<(std::ostream& os,LatLon);
std::array<LatLon,4> bounds_to_corners(std::pair<LatLon,LatLon> bounds);
Вот почему я пытаюсь сделать:
#include "LatLon.h"
#include <string>
#include <vector>
#include <cmath>
#include <boost/geometry.hpp>
#include <boost/geometry/index/rtree.hpp>
#include <algorithm>
namespace bg = boost::geometry;
namespace bgi = boost::geometry::index;
using namespace std;
typedef pair<unsigned,LatLon> point;
bgi::rtree<point, bgi::quadratic<16>> intersectionRTree;
for (unsigned intersection = 0; intersection < intersectionNumber; intersection++)
{point intP = make_pair(intersection,getIntersectionPosition(intersection));
intersectionRTree.insert(intP);}
Функция getIntersectionPosition возвращает LatLon, intersectionNumber максимальное число пересечений, и пересечение - это индекс пересечения.
Компилятор дает мне подробную информацию об ошибке, которая отправляет меня только в другие файлы, но на самом деле никогда не говорила мне, где я ошибаюсь.
Пройдите [тур] (http://stackoverflow.com/tour) и прочитайте [страницу справки] (http://stackoverflow.com/help). Вот [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list). –
Вы уверены, что это то, о чем компилятор жалуется? Вы используете свой собственный точечный тип? Не могли бы вы вставить фрагмент кода с помощью rtree? –
Можете ли вы проверить пожалуйста? Я добавил код. –