void NetworkMatcher::_createEdge2Index() { // No tuning was done, I just copied these settings from OsmMapIndex. // 10 children = 368 bytes shared_ptr<MemoryPageStore> mps(new MemoryPageStore(728)); _edge2Index.reset(new HilbertRTree(mps, 2)); std::vector<Box> boxes; std::vector<int> fids; const OsmNetwork::EdgeMap& em = _n2->getEdgeMap(); for (OsmNetwork::EdgeMap::const_iterator it = em.begin(); it != em.end(); ++it) { fids.push_back((int)_index2Edge.size()); _index2Edge.push_back(it.value()); Box b(2); Meters searchRadius = _details2->getSearchRadius(it.value()); Envelope env(_details2->getEnvelope(it.value())); env.expandBy(searchRadius); b.setBounds(0, env.getMinX(), env.getMaxX()); b.setBounds(1, env.getMinY(), env.getMaxY()); boxes.push_back(b); } _edge2Index->bulkInsert(boxes, fids); }
void IterativeEdgeMatcher::_seedEdgeScores() { // go through all the n1 edges const OsmNetwork::EdgeMap& em = _n1->getEdgeMap(); for (OsmNetwork::EdgeMap::const_iterator it = em.begin(); it != em.end(); ++it) { ConstNetworkEdgePtr e1 = it.value(); // find all the n2 edges that are in range of this one Envelope env = _details->getEnvelope(it.value()); env.expandBy(_details->getSearchRadius(it.value())); IntersectionIterator iit = _createIterator(env, _edge2Index); while (iit.next()) { ConstNetworkEdgePtr e2 = _index2Edge[iit.getId()]; double score = _scoreEdges(it.value(), e2); bool reversed = _details->isReversed(e1, e2); if (score > 0) { _edge12Scores[e1][e2] = DirectedEdgeScore(score, reversed); _edge21Scores[e2][e1] = DirectedEdgeScore(score, reversed); } } } }