Используйте Boost Rtree с координатами geographi c - PullRequest
0 голосов
/ 27 мая 2020

Чтобы найти ближайшие узлы, я использую boost rtree следующим образом:

typedef boost::geometry::model::point<double, 2,  boost::geometry::cs::geographic<boost::geometry::degree>> RtreePoint;
typedef boost::geometry::model::box<RtreePoint> RtreeBox;
typedef std::pair<RtreePoint, node_id_t> RtreePointValue;
typedef boost::geometry::index::rtree<RtreePointValue, boost::geometry::index::rstar<16>> Rtree;

// building tree
for(const auto& node: nodes) {
  rtree.insert(std::make_pair(RtreePoint { node.latitude, node.longitude }, node.id));
}

// then search for nearest neighbours for particular node
std::vector<RtreePointValue> closest;
const auto& query = boost::geometry::index::nearest(RtreePoint { node.latitude, node.longitude }, limit);
std::copy(rtree.qbegin(query), rtree.qend(), std::back_inserter(closest));

На первый взгляд кажется, что это работает, но узлы не отсортированы точно по расстоянию до узла. Можно ли это улучшить? В общем, могу ли я использовать boost Rtree для географических c координат? Если нет, что я могу использовать вместо этого? Версия Boost - 1.72.

Примечание: в конце концов я решил эту проблему, преобразовав узлы в декартовы координаты.

...