Git commit 90cfcdd5805bd3bd697051ad51e08796d29e70f7 by Dennis Nienh=C3=BCse= r. 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 &n= odes, OsmWays &ways, OsmRe backgroundStyle->setId( "background" ); document->addStyle( backgroundStyle ); = + QSet 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/os= m/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 QXmlStreamAttribute= s &attributes) m_members << member; } = -void OsmRelation::create(GeoDataDocument *document, const OsmWays &ways, c= onst OsmNodes &nodes) const +void OsmRelation::create(GeoDataDocument *document, const OsmWays &ways, c= onst OsmNodes &nodes, QSet &usedWays) const { if (!m_osmData.containsTag("type", "multipolygon")) { return; } = QStringList const outerRoles =3D QStringList() << "outer" << ""; - QList outer =3D rings(outerRoles, ways, nodes); + QList outer =3D rings(outerRoles, ways, nodes, used= Ways); 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 =3D QStringList() << "inner"; - QList inner =3D rings(innerRoles, ways, nodes); + QList inner =3D rings(innerRoles, ways, nodes, used= Ways); foreach(const GeoDataLinearRing &ring, inner) { // @todo: How to get the reference here? // placemark->osmData().addMemberReference(polygon->innerBoundarie= s().size(), ); @@ -81,7 +81,7 @@ void OsmRelation::create(GeoDataDocument *document, const= OsmWays &ways, const O document->append(placemark); } = -QList OsmRelation::rings(const QStringList &roles, cons= t OsmWays &ways, const OsmNodes &nodes) const +QList OsmRelation::rings(const QStringList &roles, cons= t OsmWays &ways, const OsmNodes &nodes, QSet &usedWays) const { QList roleMembers; foreach(const OsmMember &member, m_members) { @@ -110,6 +110,7 @@ QList OsmRelation::rings(const QStri= ngList &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 #include +#include = namespace Marble { = @@ -30,7 +31,7 @@ public: = const OsmPlacemarkData & osmData() const; = - void create(GeoDataDocument* document, const OsmWays &ways, const OsmN= odes &nodes) const; + void create(GeoDataDocument* document, const OsmWays &ways, const OsmN= odes &nodes, QSet &usedWays) const; = private: struct OsmMember @@ -42,7 +43,7 @@ private: OsmMember(); }; = - QList rings(const QStringList &roles, const OsmWays= &ways, const OsmNodes &nodes) const; + QList rings(const QStringList &roles, const OsmWays= &ways, const OsmNodes &nodes, QSet &usedWays) const; = OsmPlacemarkData m_osmData; QVector m_members;