コード例 #1
0
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;
}
コード例 #2
0
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;
}
コード例 #3
0
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;
}
コード例 #4
0
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