Skip to content

v0.2.48..v0.2.49 changeset NetworkMatch.cpp

Garret Voltz edited this page Oct 2, 2019 · 1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/conflate/network/NetworkMatch.cpp b/hoot-core/src/main/cpp/hoot/core/conflate/network/NetworkMatch.cpp
index 6000f41..aa24121 100644
--- a/hoot-core/src/main/cpp/hoot/core/conflate/network/NetworkMatch.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/conflate/network/NetworkMatch.cpp
@@ -96,35 +96,53 @@ void NetworkMatch::_discoverWayPairs(ConstOsmMapPtr map, ConstEdgeMatchPtr edgeM
   Meters length2 = string2->calculateLength(map);
 
   // TODO: These loops assume that equal portions of a line equal the same point on the line.
-  // Said another way if you're 10% down line 1, then that is equivalent to 10% down line 2.
+  // Said another way, if you're 10% down line 1, then that is equivalent to 10% down line 2.
   // Unfortunately, this can be a very coarse estimate. Something like Frechet distance may
   // improve this matching. - see #3158
+
+  // Its not why we would allow node/way match pairs here, but forcing way/way match pairs does
+  // lead to worse snapping at some road intersections as was found while working on #3386.
+  // NetworkMatchCreator does have a candidate check for highways, so its also not completely
+  // clear when nodes would be getting into the mix here.
+
   Meters d1 = 0.0;
   for (int i = 0; i < string1->getMembers().size(); ++i)
-  {
-    _pairs.insert(pair<ElementId, ElementId>(
-      _toElement(string1->getEdge(i))->getElementId(),
-      _toElement(string2->getEdgeAtOffset(map, d1 / length1 * length2))->getElementId()));
+  {     
+    ElementId element1Id = _toElement(string1->getEdge(i))->getElementId();
+    LOG_VART(element1Id);
+    ElementId element2Id =
+      _toElement(string2->getEdgeAtOffset(map, d1 / length1 * length2))->getElementId();
+    LOG_VART(element2Id);
+    _pairs.insert(pair<ElementId, ElementId>(element1Id, element2Id));
 
     d1 += string1->getEdge(i)->calculateLength(map);
 
-    _pairs.insert(pair<ElementId, ElementId>(
-      _toElement(string1->getEdge(i))->getElementId(),
-      _toElement(string2->getEdgeAtOffset(map, d1 / length1 * length2))->getElementId()));
+    element1Id = _toElement(string1->getEdge(i))->getElementId();
+    LOG_VART(element1Id);
+    element2Id =
+      _toElement(string2->getEdgeAtOffset(map, d1 / length1 * length2))->getElementId();
+    LOG_VART(element2Id);
+    _pairs.insert(pair<ElementId, ElementId>(element1Id, element2Id));
   }
 
   Meters d2 = 0.0;
   for (int i = 0; i < string2->getMembers().size(); ++i)
   {
-    _pairs.insert(pair<ElementId, ElementId>(
-      _toElement(string1->getEdgeAtOffset(map, d2 / length2 * length2))->getElementId(),
-      _toElement(string2->getEdge(i))->getElementId()));
+    ElementId element1Id =
+      _toElement(string1->getEdgeAtOffset(map, d2 / length2 * length2))->getElementId();
+    LOG_VART(element1Id);
+    ElementId element2Id = _toElement(string2->getEdge(i))->getElementId();
+    LOG_VART(element2Id);
+    _pairs.insert(pair<ElementId, ElementId>(element1Id, element2Id));
 
     d2 += string2->getEdge(i)->calculateLength(map);
 
-    _pairs.insert(pair<ElementId, ElementId>(
-      _toElement(string1->getEdgeAtOffset(map, d2 / length2 * length2))->getElementId(),
-      _toElement(string2->getEdge(i))->getElementId()));
+    element1Id =
+      _toElement(string1->getEdgeAtOffset(map, d2 / length2 * length2))->getElementId();
+    LOG_VART(element1Id);
+    element2Id = _toElement(string2->getEdge(i))->getElementId();
+    LOG_VART(element2Id);
+    _pairs.insert(pair<ElementId, ElementId>(element1Id, element2Id));
   }
 
   LOG_VART(_pairs);
@@ -176,12 +194,10 @@ bool NetworkMatch::contains(const NetworkMatch* other) const
 ConstElementPtr NetworkMatch::_toElement(ConstNetworkEdgePtr edge) const
 {
   QList<ConstElementPtr> members = edge->getMembers();
-
   if (members.size() != 1)
   {
     throw NotImplementedException("Only one member is support in the network edge at this time.");
   }
-
   return members[0];
 }
 
Clone this wiki locally