void Coordinates_test:: t_readonly() { Coordinates c; QCOMPARE(c.size(), 0u); QCOMPARE(c.count(), 0); QVERIFY(c.empty()); QVERIFY(c.isEmpty()); c << 1.0 << -2.0; QCOMPARE(c.size(), 2u); QCOMPARE(c.count(), 2); QVERIFY(!c.empty()); QVERIFY(!c.isEmpty()); }//t_readonly
/// For algorithm details, see http://wiki.openstreetmap.org/wiki/Relation:multipolygon/Algorithm void MultipolygonProcessor::process() { bool allClosed = true; // NOTE do not count multipolygon tag itself bool hasNoTags = relation_.tags.size() < 2; Ints outerIndecies; Ints innerIndecies; CoordinateSequences sequences; for (const auto &member : members_) { if (member.type!="w") continue; Coordinates coordinates; auto wayPair = context_.wayMap.find(member.refId); if (wayPair!=context_.wayMap.end()) { coordinates = wayPair->second->coordinates; } else { auto areaPair = context_.areaMap.find(member.refId); if (areaPair!=context_.areaMap.end()) { coordinates = areaPair->second->coordinates; // NOTE make coordinates to be closed ring coordinates.push_back(coordinates[0]); // NOTE merge tags to relation // hasNoTags prevents the case where relation has members with their own tags // which should be processed independently (geometry reusage) if (member.role=="outer" && hasNoTags) mergeTags(areaPair->second->tags); } else { auto relationPair = context_.relationMap.find(member.refId); if (relationPair==context_.relationMap.end()) return; // NOTE cannot fill relation: incomplete data resolve_(*relationPair->second); } } if (coordinates.empty()) continue; if (member.role=="outer") outerIndecies.push_back(static_cast<int>(sequences.size())); else if (member.role=="inner") innerIndecies.push_back(static_cast<int>(sequences.size())); else continue; auto sequence = std::make_shared<CoordinateSequence>(member.refId, coordinates); if (!sequence->isClosed()) allClosed = false; sequences.push_back(sequence); } if (outerIndecies.size()==1 && allClosed) simpleCase(sequences, outerIndecies, innerIndecies); else complexCase(sequences); }
// see http://wiki.openstreetmap.org/wiki/Relation:multipolygon/Algorithm void MultipolygonProcessor::process() { bool allClosed = true; Ints outerIndecies; Ints innerIndecies; CoordinateSequences sequences; for (const auto& member : members_) { if (member.type != "way") continue; Coordinates coordinates; auto wayPair = context_.wayMap.find(member.refId); if (wayPair != context_.wayMap.end()) { coordinates = wayPair->second->coordinates; } else { auto areaPair = context_.areaMap.find(member.refId); if (areaPair != context_.areaMap.end()) { coordinates = areaPair->second->coordinates; // NOTE merge tags to relation if (member.role == "outer") mergeTags(areaPair->second->tags); } else { auto relationPair = context_.relationMap.find(member.refId); if (relationPair == context_.relationMap.end()) return; // NOTE cannot fill relation: incomplete data resolve_(*relationPair->second); } } if (coordinates.empty()) continue; if (member.role == "outer") outerIndecies.push_back(static_cast<int>(sequences.size())); else if (member.role == "inner") innerIndecies.push_back(static_cast<int>(sequences.size())); else continue; auto sequence = std::make_shared<CoordinateSequence>(member.refId, coordinates); if (!sequence->isClosed()) allClosed = false; sequences.push_back(sequence); } if (outerIndecies.size() == 1 && allClosed) simpleCase(sequences, outerIndecies, innerIndecies); else complexCase(sequences); }