Skip to content

v0.2.49..v0.2.50 changeset WayGeneralizeVisitor.cpp

Garret Voltz edited this page Nov 6, 2019 · 1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/visitors/WayGeneralizeVisitor.cpp b/hoot-core/src/main/cpp/hoot/core/visitors/WayGeneralizeVisitor.cpp
index 0361444..635275f 100644
--- a/hoot-core/src/main/cpp/hoot/core/visitors/WayGeneralizeVisitor.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/visitors/WayGeneralizeVisitor.cpp
@@ -31,6 +31,7 @@
 #include <hoot/core/util/ConfigOptions.h>
 #include <hoot/core/algorithms/RdpWayGeneralizer.h>
 #include <hoot/core/util/MapProjector.h>
+#include <hoot/core/ops/SuperfluousNodeRemover.h>
 
 namespace hoot
 {
@@ -38,32 +39,44 @@ namespace hoot
 HOOT_FACTORY_REGISTER(ElementVisitor, WayGeneralizeVisitor)
 
 WayGeneralizeVisitor::WayGeneralizeVisitor() :
-_epsilon(1.0)
+_epsilon(1.0),
+_removeNodesSharedByWays(false),
+_totalNodesRemoved(0)
 {
-  //setConfiguration(conf());
 }
 
 void WayGeneralizeVisitor::setConfiguration(const Settings& conf)
 {
   ConfigOptions configOptions(conf);
   setEpsilon(configOptions.getWayGeneralizerEpsilon());
+  _removeNodesSharedByWays = configOptions.getWayGeneralizerRemoveNodesSharedByWays();
+  const QString critClass = configOptions.getWayGeneralizerCriterion().trimmed();
+  if (!critClass.isEmpty())
+  {
+    addCriterion(
+      ElementCriterionPtr(Factory::getInstance().constructObject<ElementCriterion>(critClass)));
+  }
 }
 
 void WayGeneralizeVisitor::setOsmMap(OsmMap* map)
 {
   _map = map;
-  //MapProjector::projectToPlanar(_map->shared_from_this());
+  MapProjector::projectToPlanar(_map->shared_from_this());
 
   assert(_epsilon != -1.0);
   _generalizer.reset(new RdpWayGeneralizer(_epsilon));
   _generalizer->setOsmMap(_map);
+  _generalizer->setRemoveNodesSharedByWays(_removeNodesSharedByWays);
 }
 
-void WayGeneralizeVisitor::visit(const std::shared_ptr<Element>& element)
+void WayGeneralizeVisitor::addCriterion(const ElementCriterionPtr& crit)
 {
-  MapProjector::projectToPlanar(_map->shared_from_this());
+  _crit = crit;
+}
 
-  if (element->getElementType() == ElementType::Way)
+void WayGeneralizeVisitor::visit(const std::shared_ptr<Element>& element)
+{
+  if (element->getElementType() == ElementType::Way && (!_crit || _crit->isSatisfied(element)))
   {
     if (!_map)
     {
@@ -74,8 +87,14 @@ void WayGeneralizeVisitor::visit(const std::shared_ptr<Element>& element)
       throw IllegalArgumentException("Input map must be projected to planar.");
     }
 
-    _generalizer->generalize(std::dynamic_pointer_cast<Way>(element));
+    const int numNodesRemoved = _generalizer->generalize(std::dynamic_pointer_cast<Way>(element));
+    if (numNodesRemoved > 0)
+    {
+      _totalNodesRemoved += numNodesRemoved;
+      _numAffected++;
+    }
   }
+  _numProcessed++;
 }
 
 }
Clone this wiki locally