bool QGeoCodeParser::parsePlace(QGeoPlace *place) { Q_ASSERT(m_reader->isStartElement() && (m_reader->name() == "place" || m_reader->name() == "addressparts")); if (m_reader->name() == "place") { QGeoBoundingBox bounds; if (!parseBoundingBox(&bounds,m_reader->attributes().value("boundingbox").toString())) return false; place->setViewport(bounds); place->setCoordinate( QGeoCoordinate(m_reader->attributes().value("lat").toString().toDouble(), m_reader->attributes().value("lon").toString().toDouble()) ); } QGeoAddress address; m_reader->readNext(); while (!(m_reader->tokenType() == QXmlStreamReader::EndElement && (m_reader->name() == "place" || m_reader->name() == "addressparts"))) { if (m_reader->tokenType() == QXmlStreamReader::StartElement) { if (m_reader->name() == "house") { } else if (m_reader->name() == "road") { address.setStreet(m_reader->readElementText()); } else if (m_reader->name() == "village") { address.setDistrict(m_reader->readElementText()); } else if (m_reader->name() == "state") { address.setState(m_reader->readElementText()); } else if (m_reader->name() == "town") { } else if (m_reader->name() == "city") { address.setCity(m_reader->readElementText()); } else if (m_reader->name() == "county") { address.setCounty(m_reader->readElementText()); } else if (m_reader->name() == "postcode") { address.setPostcode(m_reader->readElementText()); } else if (m_reader->name() == "country") { address.setCountry(m_reader->readElementText()); } else if (m_reader->name() == "country_code") { address.setCountryCode(m_reader->readElementText()); } else { m_reader->skipCurrentElement(); } } m_reader->readNext(); } place->setAddress(address); return true; }
bool QGeoRouteXmlParser::parseRoute(QGeoRoute *route) { Q_ASSERT(m_reader->isStartElement() && m_reader->name() == "Route"); maneuvers.clear(); segments.clear(); m_reader->readNext(); bool succeeded = true; while (!(m_reader->tokenType() == QXmlStreamReader::EndElement && m_reader->name() == "Route")) { if (m_reader->tokenType() == QXmlStreamReader::StartElement && succeeded) { if (m_reader->name() == "RouteId") { route->setRouteId(m_reader->readElementText()); } //else if (m_reader->name() == "Waypoint") { // succeeded = parseWaypoint(route); //} else if (m_reader->name() == "Mode") { succeeded = parseMode(route); } else if (m_reader->name() == "Shape") { QString elementName = m_reader->name().toString(); QList<QGeoCoordinate> path; succeeded = parseGeoPoints(m_reader->readElementText(), &path, elementName); if (succeeded) route->setPath(path); } else if (m_reader->name() == "BoundingBox") { QGeoBoundingBox bounds; succeeded = parseBoundingBox(bounds); if (succeeded) route->setBounds(bounds); } else if (m_reader->name() == "Leg") { succeeded = parseLeg(); } else if (m_reader->name() == "Summary") { succeeded = parseSummary(route); } else { m_reader->skipCurrentElement(); } } m_reader->readNext(); } if (succeeded) succeeded = postProcessRoute(route); return succeeded; }
bool QGeoCodeXmlParser::parseLocation(QGeoPlace *place) { /* <xsd:complexType name="Location"> <xsd:all> <xsd:element name="position" type="gc:GeoCoord"/> <xsd:element minOccurs="0" name="boundingBox" type="gc:GeoBox"/> </xsd:all> </xsd:complexType> <xsd:complexType name="GeoBox"> <xsd:sequence> <xsd:element name="northWest" type="gc:GeoCoord"/> <xsd:element name="southEast" type="gc:GeoCoord"/> </xsd:sequence> </xsd:complexType> */ Q_ASSERT(m_reader->isStartElement() && m_reader->name() == "location"); bool parsedPosition = false; bool parsedBounds = false; while (m_reader->readNextStartElement()) { QString name = m_reader->name().toString(); if (name == "position") { if (parsedPosition) { m_reader->raiseError("The element \"location\" has multiple child elements named \"position\" (exactly one expected)"); return false; } QGeoCoordinate coord; if (!parseCoordinate(&coord, "position")) return false; place->setCoordinate(coord); parsedPosition = true; } else if (name == "boundingBox") { if (parsedBounds) { m_reader->raiseError("The element \"location\" has multiple child elements named \"boundingBox\" (at most one expected)"); return false; } QGeoBoundingBox bounds; if (!parseBoundingBox(&bounds)) return false; place->setViewport(bounds); parsedBounds = true; } else { m_reader->raiseError(QString("The element \"location\" did not expect a child element named \"%1\".").arg(m_reader->name().toString())); return false; } } if (!parsedPosition) { m_reader->raiseError("The element \"location\" has no child elements named \"position\" (exactly one expected)"); return false; } return true; }
void XMLIndata::parseMapSupCoverage( const DOMNode* mapSupCovNode, uint32 parentSupIdx, int32 parentHierarchyLevel, MapModuleNoticeContainer::mapSupCoverage_t& mapSupCov, mapSupAndCountries_t& supAndCntrListVec, vector< vector<pair<uint32, uint32> > >& covTreeByLevel ) { uint32 hierarchyLevel = parentHierarchyLevel+1; // Set to this level. mc2dbg << "Parsing map sup coverage of parent: " << parentSupIdx << " on level " << hierarchyLevel << endl; // If first time on this level, add it to hierarchy. if ( hierarchyLevel >= covTreeByLevel.size() ){ vector<pair<uint32, uint32> > tmpVector; covTreeByLevel.push_back(tmpVector); mc2dbg8 << "covTreeByLevel levels size: " << covTreeByLevel.size() << endl; MC2_ASSERT(hierarchyLevel < covTreeByLevel.size()); } pair<MC2BoundingBox, MapGenEnums::mapSupplier> boxAndSup; pair<MapGenEnums::mapSupplier, set<StringTable::countryCode> > supAndCntrList; set<DOMNode*> mapSupCovChildNodes; // Get attributes DOMNamedNodeMap* attributes = mapSupCovNode->getAttributes(); DOMNode* attribute = attributes->getNamedItem( X( "map_supplier" ) ); MC2_ASSERT( attribute != NULL ); char* tmpStr = XMLString::transcode( attribute->getNodeValue() ); MapGenEnums::mapSupplier mapSup = MapGenUtil::getMapSupFromString(tmpStr); mc2dbg8 << "Map sup str:" << tmpStr << " map sup code:" << mapSup << endl; boxAndSup.second = mapSup; supAndCntrList.first = mapSup; delete[] tmpStr; // Get parent bounding box MC2BoundingBox* parentBox = NULL; if ( parentSupIdx != MAX_UINT32 ){ // We end up here if this is not the top most box. parentBox = &mapSupCov[parentSupIdx].first; } // Get child nodes. const DOMNodeList* childNodes = mapSupCovNode->getChildNodes(); //(*mapSupConvIt)->getChildNodes(); MC2BoundingBox bbox; for (XMLSize_t i=0; i<childNodes->getLength(); i++){ DOMNode* node = childNodes->item(i); DOMNode::NodeType nodeType = static_cast<DOMNode::NodeType>(node->getNodeType()); const XMLCh* name = node->getNodeName(); if ( nodeType == DOMNode::ELEMENT_NODE ){ if ( WFXMLStr::equals(name,"bounding_box") ){ bbox = parseBoundingBox(node); // Check that this box is actually inside parent box. if ((parentBox != NULL) && (!bbox.inside(*parentBox)) ){ mc2log << error << "Problem with geometry of nested boxes. " << "A child box should never cover an area outside " << "the parent box." << endl; mc2dbg << "Parent box: " << *parentBox << endl; mc2dbg << "Child box: " << bbox << endl; exit(1); } // Make sure this box does not overlap any other boxes of this // parent for (uint32 i=0; i<covTreeByLevel[hierarchyLevel].size(); i++){ if (covTreeByLevel[hierarchyLevel][i].first == parentSupIdx){ // This is a sibling uint32 siblingIdx = covTreeByLevel[hierarchyLevel][i].second; MC2BoundingBox& siblingBox = mapSupCov[siblingIdx].first; bool overlaps = true; // Change this test if adjecent boxes are not allowed. if ( ( bbox.getMinLat() >= siblingBox.getMaxLat() || bbox.getMinLon() >= siblingBox.getMaxLon() || bbox.getMaxLat() <= siblingBox.getMinLat() || bbox.getMaxLon() <= siblingBox.getMinLon() ) ){ overlaps = false; } if ( overlaps ) { mc2log << error << "Problem with geometry of sibling " << "boxes. A sibling box should never overlap one " << "of its siblings." << endl; mc2dbg << "New sibling box: " << bbox << endl; mc2dbg << "Added sibling box: " << siblingBox << endl; exit(1); } } } boxAndSup.first = bbox; mc2dbg8 << "Parsed bbox: " << bbox << endl; mapSupCov.push_back(boxAndSup); } else if ( WFXMLStr::equals(name,"country_list") ){ const set<StringTable::countryCode>& cntrList = parseCountryList(node); supAndCntrList.second = cntrList; supAndCntrListVec.push_back(supAndCntrList); } else if ( WFXMLStr::equals(name,"map_supplier_coverage") ){ mapSupCovChildNodes.insert(node); // Handled recursively when // all child elements have been read. } else { mc2log << error << "Strange element name: " << name << endl; MC2_ASSERT(false); } } else if ( nodeType == DOMNode::COMMENT_NODE ){ // Don't bother with comments. } else { mc2log << error << "Strange node type: " << nodeType << endl; MC2_ASSERT(false); } } // Update coverage tree. MC2_ASSERT(mapSupCov.size() > 0); uint32 supplierIdx = mapSupCov.size() - 1; // This index. covTreeByLevel[hierarchyLevel].push_back(make_pair(parentSupIdx, supplierIdx)); mc2dbg << " Parsed " << parentSupIdx << " -> " << supplierIdx << endl; mc2dbg8 << "Level: " << hierarchyLevel << " size: " << covTreeByLevel[hierarchyLevel].size() << endl; // Handle map supplier coverage child nodes. set<DOMNode*>::const_iterator childIt = mapSupCovChildNodes.begin(); while ( childIt != mapSupCovChildNodes.end() ){ // Recursive call. parseMapSupCoverage( *childIt, supplierIdx, hierarchyLevel, mapSupCov, supAndCntrListVec, covTreeByLevel ); ++childIt; } } // parseMapSupCoverage