void OsmApiDbReader::_addNodesForWay(vector<long> nodeIds, OsmMap& map) { for (unsigned int i = 0; i < nodeIds.size(); i++) { QStringList tags; if (map.containsNode(nodeIds[i]) == false) { shared_ptr<QSqlQuery> queryIterator = _database.selectNodeById(nodeIds[i]); while (queryIterator->next()) { shared_ptr<Node> node = _resultToNode(*queryIterator.get(), map); QString result = _database.extractTagFromRow(queryIterator, ElementType::Node); if(result != "") { tags << result; } if(tags.size()>0) { node->setTags(ApiDb::unescapeTags(tags.join(", ")) ); ApiDbReader::addTagsToElement(node); } if (_status != Status::Invalid) { node->setStatus(_status); } map.addElement(node); } } } }
void OsmApiDbReader::_processRelation(const QSqlQuery& resultIterator, OsmMap& map, const Envelope& env) { QStringList tags; long long relId = resultIterator.value(0).toLongLong(); vector<RelationData::Entry> members = _database.selectMembersForRelation( relId ); for(vector<RelationData::Entry>::iterator it = members.begin(); it != members.end(); ++it) { ElementId eid = (*it).getElementId(); QString type = eid.getType().toString(); long idFromRelation = eid.getId(); if(type=="Node") { shared_ptr<QSqlQuery> nodeIterator = _database.selectBoundedElements(idFromRelation, ElementType::Node, _bbox); if( nodeIterator->next() ) // we found a relation in the bounds { // process the relation into a data structure shared_ptr<Element> element = _resultToRelation(resultIterator, map); // get the way tags shared_ptr<QSqlQuery> relationTagIterator = _database.selectTagsForRelation( relId ); while( relationTagIterator->next() ) { // test for blank tag QString val1 = relationTagIterator->value(1).toString(); QString val2 = relationTagIterator->value(2).toString(); QString tag = ""; if(val1!="" || val2!="") tag = "\""+val1+"\"=>\""+val2+"\""; if(tag != "") tags << tag; } if(tags.size()>0) { element->setTags(ApiDb::unescapeTags(tags.join(", ")) ); ApiDbReader::addTagsToElement( element ); } if (_status != Status::Invalid) {element->setStatus(_status); } map.addElement(element); tags.clear(); } } else if(type == "Way") { shared_ptr<QSqlQuery> nodeInfoIterator = _database.selectNodesForWay( idFromRelation ); bool foundOne = false; while( nodeInfoIterator->next() && !foundOne) { // do the bounds check double lat = nodeInfoIterator->value(ApiDb::NODES_LATITUDE).toLongLong()/(double)ApiDb::COORDINATE_SCALE; double lon = nodeInfoIterator->value(ApiDb::NODES_LONGITUDE).toLongLong()/(double)ApiDb::COORDINATE_SCALE; Coordinate c(lon, lat); if (env.contains(c)) { foundOne = true; } } if( foundOne ) // we found a relation in the bounds { // process the relation into a data structure shared_ptr<Element> element = _resultToRelation(resultIterator, map); // get the way tags shared_ptr<QSqlQuery> relationTagIterator = _database.selectTagsForRelation( relId ); while( relationTagIterator->next() ) { // test for blank tag QString val1 = relationTagIterator->value(1).toString(); QString val2 = relationTagIterator->value(2).toString(); QString tag = ""; if(val1!="" || val2!="") tag = "\""+val1+"\"=>\""+val2+"\""; if(tag != "") tags << tag; } if(tags.size()>0) { element->setTags( ApiDb::unescapeTags(tags.join(", ")) ); ApiDbReader::addTagsToElement( element ); } if (_status != Status::Invalid) { element->setStatus(_status); } map.addElement(element); tags.clear(); } } else if(type == "Relation") { shared_ptr<QSqlQuery> relIterator = _database.selectBoundedElements(idFromRelation, ElementType::Relation, _bbox); while(relIterator->next()) { _processRelation(*relIterator, map, env); } } } }