Skip to content

v0.2.54..v0.2.55 changeset SampledAngleHistogramExtractor.cpp

Garret Voltz edited this page Aug 14, 2020 · 1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/algorithms/extractors/SampledAngleHistogramExtractor.cpp b/hoot-core/src/main/cpp/hoot/core/algorithms/extractors/SampledAngleHistogramExtractor.cpp
index 50214a2..a27967b 100644
--- a/hoot-core/src/main/cpp/hoot/core/algorithms/extractors/SampledAngleHistogramExtractor.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/algorithms/extractors/SampledAngleHistogramExtractor.cpp
@@ -62,54 +62,83 @@ public:
   _sampleDistance(sampleDistance),
   _headingDelta(headingDelta)
   {
-
   }
 
   virtual void visit(const std::shared_ptr<const Element>& e)
   {
     if (e->getElementType() == ElementType::Way)
     {
-      const ConstWayPtr& way = _map->getWay(e->getElementId());
+      _addWay(_map->getWay(e->getElementId()));
+    }
+    else if (e->getElementType() == ElementType::Relation)
+    {
+      const ConstRelationPtr relation = std::dynamic_pointer_cast<const Relation>(e);
+      const std::vector<RelationData::Entry> relationMembers = relation->getMembers();
+      for (size_t i = 0; i < relationMembers.size(); i++)
+      {
+        RelationData::Entry member = relationMembers[i];
+        if (member.getElementId().getType() == ElementType::Way)
+        {
+          _addWay(_map->getWay(member.getElementId()));
+        }
+      }
+    }
+  }
+
+  virtual QString getDescription() const { return ""; }
+  virtual std::string getClassName() const { return ""; }
+
+private:
+
+  Histogram& _angleHistogram;
+  double _sampleDistance;
+  double _headingDelta;
 
+  void _addWay(const ConstWayPtr& way)
+  {
+    if (way)
+    {
       vector<long> wayNodes = way->getNodeIds();
+      LOG_VART(wayNodes.size());
       if (wayNodes[0] != wayNodes[wayNodes.size() - 1])
       {
         wayNodes.push_back(wayNodes[0]);
       }
+      LOG_VART(wayNodes.size());
+
+      LOG_VART(_sampleDistance);
+      LOG_VART(_headingDelta);
 
       vector<WayLocation> discretizedLocs;
       WayDiscretizer wayDiscretizer(_map->shared_from_this(), way);
       wayDiscretizer.discretize(_sampleDistance, discretizedLocs);
 
       WayLocation lastLoc = discretizedLocs.at(0);
+      LOG_VART(lastLoc);
       for (size_t i = 1; i < discretizedLocs.size(); i++)
       {
         //select a loc sampledDistance meters along the way
         WayLocation currentLoc = discretizedLocs.at(i);
+        LOG_VART(currentLoc);
         const double distance = currentLoc.getCoordinate().distance(lastLoc.getCoordinate());
+        LOG_VART(distance);
         //calculate the heading using some distance around the way
         const double theta = WayHeading::calculateHeading(currentLoc, _headingDelta);
+        LOG_VART(theta);
         if (! ::qIsNaN(theta))
         {
           _angleHistogram.addAngle(theta, distance);
         }
         lastLoc = currentLoc;
       }
+      LOG_VART(_angleHistogram.numBins());
     }
   }
-
-  virtual QString getDescription() const { return ""; }
-  virtual std::string getClassName() const { return ""; }
-
-private:
-
-  Histogram& _angleHistogram;
-  double _sampleDistance;
-  double _headingDelta;
 };
 
 SampledAngleHistogramExtractor::SampledAngleHistogramExtractor()
 {
+  setConfiguration(conf());
 }
 
 void SampledAngleHistogramExtractor::setConfiguration(const Settings& conf)
Clone this wiki locally