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);
  }
}