Skip to content

v0.2.55..v0.2.56 changeset AddHilbertReviewSortOrderOp.cpp

Garret Voltz edited this page Aug 14, 2020 · 3 revisions
diff --git a/hoot-core/src/main/cpp/hoot/core/ops/AddHilbertReviewSortOrderOp.cpp b/hoot-core/src/main/cpp/hoot/core/ops/AddHilbertReviewSortOrderOp.cpp
index 0c06748..1462c2c 100644
--- a/hoot-core/src/main/cpp/hoot/core/ops/AddHilbertReviewSortOrderOp.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/ops/AddHilbertReviewSortOrderOp.cpp
@@ -22,7 +22,7 @@
  * This will properly maintain the copyright information. DigitalGlobe
  * copyrights will be updated automatically.
  *
- * @copyright Copyright (C) 2015, 2016, 2017, 2018, 2019 DigitalGlobe (http://www.digitalglobe.com/)
+ * @copyright Copyright (C) 2015, 2016, 2017, 2018, 2019, 2020 DigitalGlobe (http://www.digitalglobe.com/)
  */
 #include "AddHilbertReviewSortOrderOp.h"
 
@@ -43,6 +43,8 @@ using namespace std;
 namespace hoot
 {
 
+int AddHilbertReviewSortOrderOp::logWarnCount = 0;
+
 HOOT_FACTORY_REGISTER(OsmMapOperation, AddHilbertReviewSortOrderOp)
 
 bool reviewLess(const pair<ElementId, int64_t>& p1, const pair<ElementId, int64_t>& p2)
@@ -61,10 +63,6 @@ bool reviewLess(const pair<ElementId, int64_t>& p1, const pair<ElementId, int64_
   }
 }
 
-AddHilbertReviewSortOrderOp::AddHilbertReviewSortOrderOp()
-{
-}
-
 void AddHilbertReviewSortOrderOp::apply(OsmMapPtr& map)
 {
   if (!ConfigOptions().getWriterIncludeConflateReviewDetailTags())
@@ -82,7 +80,7 @@ void AddHilbertReviewSortOrderOp::apply(OsmMapPtr& map)
   const RelationMap& relations = map->getRelations();
 
   vector<pair<ElementId, int64_t>> reviewOrder;
-  // reserves at least as much as we need.
+  // reserves at least as much as we need
   reviewOrder.reserve(relations.size());
 
   for (RelationMap::const_iterator it = relations.begin(); it != relations.end(); ++it)
@@ -97,14 +95,27 @@ void AddHilbertReviewSortOrderOp::apply(OsmMapPtr& map)
       if (eids.size() > 0)
       {
         int64_t hv = _calculateHilbertValue(map, eids);
-
-        pair<ElementId, int64_t> p(r->getElementId(), hv);
-        reviewOrder.push_back(p);
+        if (hv != -1)
+        {
+          pair<ElementId, int64_t> p(r->getElementId(), hv);
+          reviewOrder.push_back(p);
+        }
       }
       else
       {
-        throw HootException(
-          "No review elements returned for relation with ID: " + r->getElementId().toString());
+        // don't think this really needs to be an exceptional situation
+//        throw HootException(
+//          "No review elements returned for relation with ID: " + r->getElementId().toString());
+        LOG_WARN("No review elements returned for relation with ID: " << r->getElementId());
+        if (logWarnCount < Log::getWarnMessageLimit())
+        {
+          LOG_WARN("No review elements returned for relation with ID: " << r->getElementId());
+        }
+        else if (logWarnCount == Log::getWarnMessageLimit())
+        {
+          LOG_WARN(className() << ": " << Log::LOG_WARN_LIMIT_REACHED_MESSAGE);
+        }
+        logWarnCount++;
       }
     }
   }
@@ -120,22 +131,31 @@ void AddHilbertReviewSortOrderOp::apply(OsmMapPtr& map)
   }
 }
 
-int64_t AddHilbertReviewSortOrderOp::_calculateHilbertValue(const ConstOsmMapPtr &map,
-  const set<ElementId> eids)
+int64_t AddHilbertReviewSortOrderOp::_calculateHilbertValue(
+  const ConstOsmMapPtr& map, const set<ElementId> eids)
 {
   std::shared_ptr<Envelope> env;
   for (set<ElementId>::const_iterator it = eids.begin(); it != eids.end(); ++it)
   {
-    Envelope::AutoPtr te(map->getElement(*it)->getEnvelope(map));
-    if (env.get() == 0)
-    {
-      env.reset(new Envelope(*te));
-    }
-    else
+    ConstElementPtr element = map->getElement(*it);
+    if (element)
     {
-      env->expandToInclude(te.get());
+      Envelope::AutoPtr te(element->getEnvelope(map));
+      LOG_VART(env.get());
+      if (env.get() == 0)
+      {
+        env.reset(new Envelope(*te));
+      }
+      else
+      {
+        env->expandToInclude(te.get());
+      }
     }
   }
+  if (!env)
+  {
+    return -1;
+  }
   LOG_VART(env->toString());
 
   if (_mapEnvelope.get() == 0)
@@ -152,7 +172,7 @@ int64_t AddHilbertReviewSortOrderOp::_calculateHilbertValue(const ConstOsmMapPtr
 
   // 31 bits is the most supported for 2 dimensions.
   int order = min(31, max(xorder, yorder));
-  // always 2 dimensions.
+  // always 2 dimensions
   Tgs::HilbertCurve c(2, order);
   int64_t maxRange = 1 << order;
   int point[2];
@@ -162,7 +182,7 @@ int64_t AddHilbertReviewSortOrderOp::_calculateHilbertValue(const ConstOsmMapPtr
   point[1] = max<int64_t>(0, min<int64_t>(maxRange - 1,
     round((center.y - _mapEnvelope->getMinY()) / cellSize)));
 
-  // pad with zeros to make sorting a little easier.
+  // Pad with zeros to make sorting a little easier.
   return c.encode(point);
 }
 
Clone this wiki locally