void WayMergeManipulation::_removeSpans(OsmMapPtr map, set<ElementId>& impactedElements) const { WayPtr left = map->getWay(_left); WayPtr right = map->getWay(_right); set<ElementId> impactedWaysTmp = impactedElements; for (set<ElementId>::iterator it = impactedWaysTmp.begin(); it != impactedWaysTmp.end(); ++it) { ElementId eid = *it; WayPtr w = map->getWay(eid.getId()); long first = w->getNodeId(0); long last = w->getLastNodeId(); if ((left->hasNode(first) && right->hasNode(last)) || (left->hasNode(last) && right->hasNode(first))) { if (_directConnect(map, w)) { RemoveWayOp::removeWay(map, eid.getId()); impactedElements.erase(eid); } } } }
void runPartialReadTest() { //The differences in tag counts here when compared to //ServiceHootApiDbReaderTest::runPartialReadTest are due to differences between the way //HootApiDbWriter and OsmApiDbBulkInserter handle metadata tags, which is by design. populatePartialMap(); OsmApiDbReader reader; const int chunkSize = 3; reader.setMaxElementsPerMap(chunkSize); reader.open(ServicesDbTestUtils::getOsmApiDbUrl().toString()); reader.initializePartial(); int ctr = 0; OsmMapPtr map(new OsmMap()); //3 nodes CPPUNIT_ASSERT(reader.hasMoreElements()); reader.readPartial(map); CPPUNIT_ASSERT_EQUAL(3, (int)map->getNodes().size()); CPPUNIT_ASSERT_EQUAL(0, (int)map->getWays().size()); CPPUNIT_ASSERT_EQUAL(0, (int)map->getRelations().size()); NodePtr node = map->getNode(1); CPPUNIT_ASSERT_EQUAL((long)1, node->getId()); CPPUNIT_ASSERT_EQUAL(0.0, node->getX()); CPPUNIT_ASSERT_EQUAL(0.0, node->getY()); CPPUNIT_ASSERT_EQUAL(0, node->getTags().size()); node = map->getNode(2); CPPUNIT_ASSERT_EQUAL((long)2, node->getId()); CPPUNIT_ASSERT_EQUAL(0.1, node->getX()); CPPUNIT_ASSERT_EQUAL(0.0, node->getY()); CPPUNIT_ASSERT_EQUAL(1, node->getTags().size()); HOOT_STR_EQUALS("n2b", node->getTags().get("noteb")); node = map->getNode(3); CPPUNIT_ASSERT_EQUAL((long)3, node->getId()); CPPUNIT_ASSERT_EQUAL(0.2, node->getX()); CPPUNIT_ASSERT_EQUAL(0.0, node->getY()); CPPUNIT_ASSERT_EQUAL(1, node->getTags().size()); HOOT_STR_EQUALS("n3", node->getTags().get("note")); ctr++; //2 nodes, 1 way map.reset(new OsmMap()); CPPUNIT_ASSERT(reader.hasMoreElements()); reader.readPartial(map); CPPUNIT_ASSERT_EQUAL(2, (int)map->getNodes().size()); CPPUNIT_ASSERT_EQUAL(1, (int)map->getWays().size()); CPPUNIT_ASSERT_EQUAL(0, (int)map->getRelations().size()); node = map->getNode(4); CPPUNIT_ASSERT_EQUAL((long)4, node->getId()); CPPUNIT_ASSERT_EQUAL(0.3, node->getX()); CPPUNIT_ASSERT_EQUAL(0.0, node->getY()); CPPUNIT_ASSERT_EQUAL(1, node->getTags().size()); HOOT_STR_EQUALS("n4", node->getTags().get("note")); node = map->getNode(5); CPPUNIT_ASSERT_EQUAL((long)5, node->getId()); CPPUNIT_ASSERT_EQUAL(0.4, node->getX()); CPPUNIT_ASSERT_EQUAL(0.0, node->getY()); CPPUNIT_ASSERT_EQUAL(0, node->getTags().size()); WayPtr way = map->getWay(1); CPPUNIT_ASSERT_EQUAL((long)1, way->getId()); CPPUNIT_ASSERT(way->hasNode(1)); CPPUNIT_ASSERT(way->hasNode(2)); CPPUNIT_ASSERT_EQUAL(1, way->getTags().size()); HOOT_STR_EQUALS("w1b", way->getTags().get("noteb")); ctr++; //2 ways, 1 relation map.reset(new OsmMap()); CPPUNIT_ASSERT(reader.hasMoreElements()); reader.readPartial(map); CPPUNIT_ASSERT_EQUAL(0, (int)map->getNodes().size()); CPPUNIT_ASSERT_EQUAL(2, (int)map->getWays().size()); CPPUNIT_ASSERT_EQUAL(1, (int)map->getRelations().size()); way = map->getWay(2); CPPUNIT_ASSERT_EQUAL((long)2, way->getId()); CPPUNIT_ASSERT(way->hasNode(2)); CPPUNIT_ASSERT(way->hasNode(3)); CPPUNIT_ASSERT_EQUAL(1, way->getTags().size()); HOOT_STR_EQUALS("w2", way->getTags().get("note")); way = map->getWay(3); CPPUNIT_ASSERT_EQUAL((long)3, way->getId()); CPPUNIT_ASSERT(way->hasNode(2)); CPPUNIT_ASSERT_EQUAL(0, way->getTags().size()); RelationPtr relation = map->getRelation(1); CPPUNIT_ASSERT_EQUAL((long)1, relation->getId()); CPPUNIT_ASSERT_EQUAL(size_t(2), relation->getMembers().size()); CPPUNIT_ASSERT(relation->contains(ElementId::node(1))); CPPUNIT_ASSERT(relation->contains(ElementId::way(1))); RelationData::Entry member = relation->getMembers().at(0); HOOT_STR_EQUALS("n1", member.role); CPPUNIT_ASSERT_EQUAL((long)1, member.getElementId().getId()); member = relation->getMembers().at(1); HOOT_STR_EQUALS("w1", member.role); CPPUNIT_ASSERT_EQUAL((long)1, member.getElementId().getId()); CPPUNIT_ASSERT_EQUAL(1, relation->getTags().size()); HOOT_STR_EQUALS("r1", relation->getTags().get("note")); ctr++; //1 relation map.reset(new OsmMap()); CPPUNIT_ASSERT(reader.hasMoreElements()); reader.readPartial(map); CPPUNIT_ASSERT_EQUAL(0, (int)map->getNodes().size()); CPPUNIT_ASSERT_EQUAL(0, (int)map->getWays().size()); CPPUNIT_ASSERT_EQUAL(1, (int)map->getRelations().size()); relation = map->getRelation(2); CPPUNIT_ASSERT_EQUAL((long)2, relation->getId()); HOOT_STR_EQUALS("", relation->getType()); CPPUNIT_ASSERT(relation->contains(ElementId::node(2))); CPPUNIT_ASSERT_EQUAL(size_t(1), relation->getMembers().size()); member = relation->getMembers().at(0); HOOT_STR_EQUALS("n2", member.role); CPPUNIT_ASSERT_EQUAL((long)2, member.getElementId().getId()); CPPUNIT_ASSERT_EQUAL(0, relation->getTags().size()); ctr++; CPPUNIT_ASSERT(!reader.hasMoreElements()); reader.finalizePartial(); CPPUNIT_ASSERT_EQUAL(4, ctr); }