void AddHilbertReviewSortOrderOp::apply(shared_ptr<OsmMap>& map) { _mapEnvelope.reset(); MapReprojector::reprojectToPlanar(map); const RelationMap& relations = map->getRelationMap(); Envelope e = map->calculateEnvelope(); vector< pair<ElementId, int64_t> > reviewOrder; // reserves at least as much as we need. reviewOrder.reserve(relations.size()); for (RelationMap::const_iterator it = relations.begin(); it != relations.end(); ++it) { RelationPtr r = it->second; if (ReviewMarker::isReviewUid(map, r->getElementId())) { int64_t hv = _calculateHilbertValue(map, ReviewMarker::getReviewElements(map, r->getElementId())); pair<ElementId, int64_t> p(r->getElementId(), hv); reviewOrder.push_back(p); } } sort(reviewOrder.begin(), reviewOrder.end(), reviewLess); for (size_t i = 0; i < reviewOrder.size(); ++i) { RelationPtr r = map->getRelation(reviewOrder[i].first.getId()); r->getTags().set(ReviewMarker::reviewSortOrderKey, (long)i); } }