Skip to content

v0.2.47..v0.2.48 changeset OsmJsonWriter.cpp

Garret Voltz edited this page Sep 27, 2019 · 1 revision
diff --git a/hoot-core/src/main/cpp/hoot/core/io/OsmJsonWriter.cpp b/hoot-core/src/main/cpp/hoot/core/io/OsmJsonWriter.cpp
index c17dcb7..c6bca6f 100644
--- a/hoot-core/src/main/cpp/hoot/core/io/OsmJsonWriter.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/io/OsmJsonWriter.cpp
@@ -39,6 +39,7 @@
 #include <hoot/core/util/Exception.h>
 #include <hoot/core/util/Factory.h>
 #include <hoot/core/util/StringUtils.h>
+#include <hoot/core/elements/OsmUtils.h>
 
 // Qt
 #include <QBuffer>
@@ -56,6 +57,7 @@ HOOT_FACTORY_REGISTER(OsmMapWriter, OsmJsonWriter)
 
 OsmJsonWriter::OsmJsonWriter(int precision)
   : _includeDebug(ConfigOptions().getWriterIncludeDebugTags()),
+    _includeCompatibilityTags(true),
     _precision(precision),
     _out(0),
     _pretty(ConfigOptions().getJsonPrettyPrint()),
@@ -161,8 +163,49 @@ void OsmJsonWriter::_writeKvp(const QString& key, double value)
   _write(markupString(key) % ":" % QString::number(value, 'g', _precision), false);
 }
 
+void OsmJsonWriter::_writeMetadata(const Element& element)
+{
+  if (_includeCompatibilityTags)
+  {
+    _writeKvp("timestamp", OsmUtils::toTimeString(element.getTimestamp())); _write(",");
+    long version = element.getVersion();
+    if (version == ElementData::VERSION_EMPTY)
+    {
+      version = 1;
+    }
+    _writeKvp("version", version); _write(",");
+  }
+  else
+  {
+    if (element.getTimestamp() != ElementData::TIMESTAMP_EMPTY)
+    {
+      _writeKvp("timestamp", OsmUtils::toTimeString(element.getTimestamp())); _write(",");
+    }
+    if (element.getVersion() != ElementData::VERSION_EMPTY)
+    {
+      _writeKvp("version", element.getVersion()); _write(",");
+    }
+  }
+  if (element.getChangeset() != ElementData::CHANGESET_EMPTY &&
+      //  Negative IDs are considered "new" elements and shouldn't have a changeset
+      element.getId() > 0)
+  {
+    _writeKvp("changeset", element.getChangeset()); _write(",");
+  }
+  if (element.getUser() != ElementData::USER_EMPTY)
+  {
+    _writeKvp("user", element.getUser()); _write(",");
+  }
+  if (element.getUid() != ElementData::UID_EMPTY)
+  {
+    _writeKvp("uid", element.getUid()); _write(",");
+  }
+}
+
 void OsmJsonWriter::_writeNodes()
 {
+  const long debugId = 0;
+
   QList<long> nids;
   const NodeMap& nodes = _map->getNodes();
   for (NodeMap::const_iterator it = nodes.begin(); it != nodes.end(); ++it)
@@ -170,15 +213,29 @@ void OsmJsonWriter::_writeNodes()
     nids.append(it->first);
   }
   // sort the values to give consistent results.
-  qSort(nids.begin(), nids.end(), qGreater<long>());
+  qSort(nids.begin(), nids.end(), qLess<long>());
   for (int i = 0; i < nids.size(); i++)
   {
     ConstNodePtr n = _map->getNode(nids[i]);
+    const QString msg = "Writing node: " + n->toString() + "...";
+    if (n->getId() == debugId)
+    {
+      LOG_VARD(msg);
+    }
+    else
+    {
+      LOG_VART(msg);
+    }
+
     if (!_firstElement) _write(",", true);
     _firstElement = false;
+
     _write("{");
     _writeKvp("type", "node"); _write(",");
     _writeKvp("id", n->getId()); _write(",");
+
+    _writeMetadata(*n);
+
     _writeKvp("lat", n->getY()); _write(",");
     _writeKvp("lon", n->getX());
     if (_hasTags(n)) _write(",");
@@ -254,16 +311,40 @@ void OsmJsonWriter::_writeTags(const ConstElementPtr& e)
 
 void OsmJsonWriter::_writeWays()
 {
-  WayMap::const_iterator it = _map->getWays().begin();
-  while (it != _map->getWays().end())
+  const long debugId = 0;
+
+  QList<long> wids;
+  const WayMap& ways = _map->getWays();
+  for (WayMap::const_iterator it = ways.begin(); it != ways.end(); ++it)
   {
+    wids.append(it->first);
+  }
+  // sort the values to give consistent results.
+  qSort(wids.begin(), wids.end(), qLess<long>());
+
+  for (int i = 0; i < wids.size(); i++)
+  {
+    ConstWayPtr w = _map->getWay(wids[i]);
+    const QString msg = "Writing way: " + w->toString() + "...";
+
+    if (w->getId() == debugId)
+    {
+      LOG_VARD(msg);
+    }
+    else
+    {
+      LOG_VART(msg);
+    }
+
     if (!_firstElement) _write(",", true);
     _firstElement = false;
-    ConstWayPtr w = it->second;
+
     _write("{");
     _writeKvp("type", "way"); _write(",");
     _writeKvp("id", w->getId()); _write(",");
 
+    _writeMetadata(*w);
+
     _write("\"nodes\":[");
     for (size_t j = 0; j < w->getNodeCount(); j++)
     {
@@ -276,6 +357,7 @@ void OsmJsonWriter::_writeWays()
     _write("]");
     if (_hasTags(w)) _write(",");
     _writeTags(w);
+    _write("}", false);
 
     _numWritten++;
     if (_numWritten % (_statusUpdateInterval) == 0)
@@ -283,24 +365,45 @@ void OsmJsonWriter::_writeWays()
       PROGRESS_INFO(
         "Wrote " << StringUtils::formatLargeNumber(_numWritten) << " elements to output.");
     }
-
-    ++it;
   }
 }
 
 void OsmJsonWriter::_writeRelations()
 {
-  RelationMap::const_iterator it = _map->getRelations().begin();
-  while (it != _map->getRelations().end())
+  const long debugId = 0;
+
+  QList<long> rids;
+  const RelationMap& relations = _map->getRelations();
+  for (RelationMap::const_iterator it = relations.begin(); it != relations.end(); ++it)
+  {
+    rids.append(it->first);
+  }
+
+  // sort the values to give consistent results.
+  qSort(rids.begin(), rids.end(), qLess<long>());
+
+  for (int i = 0; i < rids.size(); i++)
   {
+    ConstRelationPtr r = _map->getRelation(rids[i]);
+    const QString msg = "Writing relation: " + r->toString() + "...";
+    if (r->getId() == debugId)
+    {
+      LOG_VARD(msg);
+    }
+    else
+    {
+      LOG_VART(msg);
+    }
+
     if (!_firstElement) _write(",", true);
     _firstElement = false;
-    ConstRelationPtr r = it->second;
 
     _write("{");
     _writeKvp("type", "relation"); _write(",");
     _writeKvp("id", r->getId()); _write(",");
 
+    _writeMetadata(*r);
+
     const vector<RelationData::Entry>& members = r->getMembers();
     _write("\"members\":[");
     for (size_t j = 0; j < members.size(); j++)
@@ -323,6 +426,7 @@ void OsmJsonWriter::_writeRelations()
     _write("]");
     if (_hasTags(r)) _write(",");
     _writeTags(r);
+    _write("}", false);
 
     _numWritten++;
     if (_numWritten % (_statusUpdateInterval) == 0)
@@ -330,8 +434,6 @@ void OsmJsonWriter::_writeRelations()
       PROGRESS_INFO(
         "Wrote " << StringUtils::formatLargeNumber(_numWritten) << " elements to output.");
     }
-
-    ++it;
   }
 }
 
Clone this wiki locally