[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-commits
Subject:    [marble] src/plugins/runner/osm: Don't create further items from ways that are part of multipolygons
From:       Dennis_Nienhüser <nienhueser () kde ! org>
Date:       2015-10-31 21:04:15
Message-ID: E1ZsdJv-00046m-UC () scm ! kde ! org
[Download RAW message or body]

Git commit 90cfcdd5805bd3bd697051ad51e08796d29e70f7 by Dennis Nienhüser.
Committed on 31/10/2015 at 21:02.
Pushed by nienhueser into branch 'master'.

Don't create further items from ways that are part of multipolygons

M  +5    -1    src/plugins/runner/osm/OsmParser.cpp
M  +5    -4    src/plugins/runner/osm/OsmRelation.cpp
M  +3    -2    src/plugins/runner/osm/OsmRelation.h

http://commits.kde.org/marble/90cfcdd5805bd3bd697051ad51e08796d29e70f7

diff --git a/src/plugins/runner/osm/OsmParser.cpp \
b/src/plugins/runner/osm/OsmParser.cpp index de19e3d..30b9135 100644
--- a/src/plugins/runner/osm/OsmParser.cpp
+++ b/src/plugins/runner/osm/OsmParser.cpp
@@ -114,8 +114,12 @@ GeoDataDocument *OsmParser::createDocument(OsmNodes &nodes, \
OsmWays &ways, OsmRe  backgroundStyle->setId( "background" );
     document->addStyle( backgroundStyle );
 
+    QSet<qint64> usedWays;
     foreach(OsmRelation const &relation, relations) {
-        relation.create(document, ways, nodes);
+        relation.create(document, ways, nodes, usedWays);
+    }
+    foreach(qint64 id, usedWays) {
+        ways.remove(id);
     }
 
     foreach(OsmWay const &way, ways) {
diff --git a/src/plugins/runner/osm/OsmRelation.cpp \
b/src/plugins/runner/osm/OsmRelation.cpp index 27be7dc..8a4ed47 100644
--- a/src/plugins/runner/osm/OsmRelation.cpp
+++ b/src/plugins/runner/osm/OsmRelation.cpp
@@ -41,14 +41,14 @@ void OsmRelation::parseMember(const QXmlStreamAttributes \
&attributes)  m_members << member;
 }
 
-void OsmRelation::create(GeoDataDocument *document, const OsmWays &ways, const \
OsmNodes &nodes) const +void OsmRelation::create(GeoDataDocument *document, const \
OsmWays &ways, const OsmNodes &nodes, QSet<qint64> &usedWays) const  {
     if (!m_osmData.containsTag("type", "multipolygon")) {
         return;
     }
 
     QStringList const outerRoles = QStringList() << "outer" << "";
-    QList<GeoDataLinearRing> outer = rings(outerRoles, ways, nodes);
+    QList<GeoDataLinearRing> outer = rings(outerRoles, ways, nodes, usedWays);
     if (outer.isEmpty()) {
         return;
     } else if (outer.size() > 1) {
@@ -69,7 +69,7 @@ void OsmRelation::create(GeoDataDocument *document, const OsmWays \
&ways, const O  // placemark->osmData().addMemberReference(-1, );
 
     QStringList const innerRoles = QStringList() << "inner";
-    QList<GeoDataLinearRing> inner = rings(innerRoles, ways, nodes);
+    QList<GeoDataLinearRing> inner = rings(innerRoles, ways, nodes, usedWays);
     foreach(const GeoDataLinearRing &ring, inner) {
         // @todo: How to get the reference here?
         // placemark->osmData().addMemberReference(polygon->innerBoundaries().size(), \
); @@ -81,7 +81,7 @@ void OsmRelation::create(GeoDataDocument *document, const \
OsmWays &ways, const O  document->append(placemark);
 }
 
-QList<GeoDataLinearRing> OsmRelation::rings(const QStringList &roles, const OsmWays \
&ways, const OsmNodes &nodes) const +QList<GeoDataLinearRing> \
OsmRelation::rings(const QStringList &roles, const OsmWays &ways, const OsmNodes \
&nodes, QSet<qint64> &usedWays) const  {
     QList<qint64> roleMembers;
     foreach(const OsmMember &member, m_members) {
@@ -110,6 +110,7 @@ QList<GeoDataLinearRing> OsmRelation::rings(const QStringList \
&roles, const OsmW  }
             ring << nodes[id].coordinates();
         }
+        usedWays << wayId;
         result << ring;
     }
 
diff --git a/src/plugins/runner/osm/OsmRelation.h \
b/src/plugins/runner/osm/OsmRelation.h index 48d668f..75a41aa 100644
--- a/src/plugins/runner/osm/OsmRelation.h
+++ b/src/plugins/runner/osm/OsmRelation.h
@@ -19,6 +19,7 @@
 
 #include <QString>
 #include <QXmlStreamAttributes>
+#include <QSet>
 
 namespace Marble {
 
@@ -30,7 +31,7 @@ public:
 
     const OsmPlacemarkData & osmData() const;
 
-    void create(GeoDataDocument* document, const OsmWays &ways, const OsmNodes \
&nodes) const; +    void create(GeoDataDocument* document, const OsmWays &ways, const \
OsmNodes &nodes, QSet<qint64> &usedWays) const;  
 private:
     struct OsmMember
@@ -42,7 +43,7 @@ private:
         OsmMember();
     };
 
-    QList<GeoDataLinearRing> rings(const QStringList &roles, const OsmWays &ways, \
const OsmNodes &nodes) const; +    QList<GeoDataLinearRing> rings(const QStringList \
&roles, const OsmWays &ways, const OsmNodes &nodes, QSet<qint64> &usedWays) const;  
     OsmPlacemarkData m_osmData;
     QVector<OsmMember> m_members;


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic