Skip to content

v0.2.52..v0.2.53 changeset OsmSchema.cpp

Garret Voltz edited this page Feb 12, 2020 · 1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/schema/OsmSchema.cpp b/hoot-core/src/main/cpp/hoot/core/schema/OsmSchema.cpp
index a5a8eac..ebefb14 100644
--- a/hoot-core/src/main/cpp/hoot/core/schema/OsmSchema.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/schema/OsmSchema.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 <hoot/core/HootConfig.h>
@@ -60,6 +60,7 @@
 #include <QHash>
 #include <QSet>
 #include <QDir>
+#include <QStringBuilder>
 
 // Standard
 #include <iostream>
@@ -186,7 +187,7 @@ private:
   const TagGraph _graph;
 };
 
-OsmSchemaCategory OsmSchemaCategory::fromStringList(const QStringList &s)
+OsmSchemaCategory OsmSchemaCategory::fromStringList(const QStringList& s)
 {
   OsmSchemaCategory result;
   for (int i = 0; i < s.size(); i++)
@@ -283,7 +284,6 @@ public:
     return pair<EdgeId, EdgeId>(e1, e2);
   }
 
-
   QString average(QString kvp1, double w1, QString kvp2, double w2, double& score)
   {
     QString result;
@@ -481,6 +481,32 @@ public:
     return result;
   }
 
+  QSet<QString> getAllTypeKeys()
+  {
+    QSet<QString> typeTagKeys;
+
+    QSet<QString> allTagKeysTemp = OsmSchema::getInstance().getAllTagKeys();
+    // not completely sure what should be in this list; would be nice to have access to isMetadata
+    // here
+    allTagKeysTemp.remove(MetadataTags::Ref1());
+    allTagKeysTemp.remove(MetadataTags::Ref2());
+    allTagKeysTemp.remove("uuid");
+    allTagKeysTemp.remove("name");
+    allTagKeysTemp.remove("ele");
+    for (QSet<QString>::const_iterator it = allTagKeysTemp.begin(); it != allTagKeysTemp.end();
+         ++it)
+    {
+      const QString tagKey = *it;
+      //address tags aren't really type tags
+      if (!tagKey.startsWith("addr:"))
+      {
+        typeTagKeys.insert(tagKey);
+      }
+    }
+
+    return typeTagKeys;
+  }
+
   vector<SchemaVertex> getAssociatedTags(QString name)
   {
     set<VertexId> vids;
@@ -1436,10 +1462,21 @@ QSet<QString> OsmSchema::getAllTagKeys()
   if (_allTagKeysCache.isEmpty())
   {
     _allTagKeysCache = d->getAllTagKeys();
+    //LOG_VART(_allTagKeysCache);
   }
   return _allTagKeysCache;
 }
 
+QSet<QString> OsmSchema::getAllTypeKeys()
+{
+  if (_allTypeKeysCache.isEmpty())
+  {
+    _allTypeKeysCache = d->getAllTypeKeys();
+    //LOG_VART(_allTypeKeysCache);
+  }
+  return _allTypeKeysCache;
+}
+
 bool OsmSchema::hasTagKey(const QString& key)
 {
   return getAllTagKeys().contains(key);
@@ -1737,12 +1774,10 @@ bool OsmSchema::isMetaData(const QString& key, const QString& /*value*/)
   }
   else
   {
-    // for now all metadata tags are text so they're referenced by the key only. If that changes then
-    // we'll need some logic here to check if a vertex is a text vertex.
+    // for now all metadata tags are text so they're referenced by the key only. If that changes
+    // then we'll need some logic here to check if a vertex is a text vertex.
     bool metadata = isAncestor(key, "metadata");
-
     _metadataKey[key] = metadata;
-
     return metadata;
   }
 }
@@ -1795,6 +1830,54 @@ double OsmSchema::score(const QString& kvp, const Tags& tags)
   return maxScore;
 }
 
+double OsmSchema::scoreTypes(const Tags& tags1, const Tags& tags2)
+{
+  double maxScore = 0.0;
+  for (Tags::const_iterator tags1Itr = tags1.begin(); tags1Itr != tags1.end(); ++tags1Itr)
+  {
+    const QString key1 = tags1Itr.key().trimmed();
+    const QString val1 = tags1Itr.value().trimmed();
+    const QString kvp1 = toKvp(key1, val1);
+    LOG_VART(key1);
+    LOG_VART(val1);
+    LOG_VART(kvp1);
+    LOG_VART(isMetaData(key1, val1));
+    LOG_VART(isTypeKey(key1));
+    if (!key1.isEmpty() && !val1.isEmpty() && !isMetaData(key1, val1) &&
+        (isTypeKey(key1) || isTypeKey(kvp1)))
+    {
+      for (Tags::const_iterator tags2Itr = tags2.begin(); tags2Itr != tags2.end(); ++tags2Itr)
+      {
+        const QString key2 = tags2Itr.key().trimmed();
+        const QString val2 = tags2Itr.value().trimmed();
+        const QString kvp2 = toKvp(key2, val2);
+        LOG_VART(key2);
+        LOG_VART(val2);
+        LOG_VART(kvp2);
+        LOG_VART(isMetaData(key2, val2));
+        LOG_VART(isTypeKey(key2));
+        if (!key2.isEmpty() && !val2.isEmpty() && !isMetaData(key2, val2) &&
+            (isTypeKey(key2) || isTypeKey(kvp2)))
+        {
+          const double score = OsmSchema::getInstance().score(kvp1, kvp2);
+          LOG_VART(score);
+          if (score > maxScore)
+          {
+            maxScore = score;
+          }
+        }
+      }
+    }
+  }
+  LOG_VART(maxScore);
+  return maxScore;
+}
+
+bool OsmSchema::isTypeKey(const QString& key)
+{
+  return getAllTypeKeys().contains(key);
+}
+
 double OsmSchema::scoreOneWay(const QString& kvp1, const QString& kvp2)
 {
   return d->score(kvp1, kvp2);
@@ -1818,7 +1901,7 @@ QString OsmSchema::toKvp(const QString& key, const QString& value)
   }
   else
   {
-    return key + "=" + value;
+    return key % "=" % value;
   }
 }
 
Clone this wiki locally