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