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