QGeoSearchReply* QGeoSearchManagerEngineNokia::reverseGeocode(const QGeoCoordinate &coordinate, QGeoBoundingArea *bounds) { if (!supportsReverseGeocoding()) { QGeoSearchReply *reply = new QGeoSearchReply(QGeoSearchReply::UnsupportedOptionError, "Reverse geocoding is not supported by this service provider.", this); emit error(reply, reply->error(), reply->errorString()); return reply; } QString requestString = "http://"; requestString += m_host; requestString += "/geocoder/rgc/2.0?referer=" + m_referer; if (!m_token.isNull()) requestString += "&token=" + m_token; if (!m_applicationId.isEmpty()) { requestString += "&app_id="; requestString += m_applicationId; } requestString += "&long="; requestString += trimDouble(coordinate.longitude()); requestString += "&lat="; requestString += trimDouble(coordinate.latitude()); requestString += "&lg="; requestString += languageToMarc(locale().language()); return search(requestString, bounds); }
QStringList QGeoRoutingManagerEngineNokia::calculateRouteRequestString(const QGeoRouteRequest &request) { bool supported = checkEngineSupport(request, request.travelModes()); if (!supported) return QStringList(); QStringList requests; QString baseRequest = QStringLiteral("http://"); baseRequest += m_uriProvider->getCurrentHost(); baseRequest += QStringLiteral("/routing/7.2/calculateroute.xml"); baseRequest += QStringLiteral("?alternatives="); baseRequest += QString::number(request.numberAlternativeRoutes()); if (!m_appId.isEmpty() && !m_token.isEmpty()) { baseRequest += QStringLiteral("&app_id="); baseRequest += m_appId; baseRequest += QStringLiteral("&token="); baseRequest += m_token; } int numWaypoints = request.waypoints().size(); if (numWaypoints < 2) return QStringList(); for (int i = 0;i < numWaypoints;++i) { baseRequest += QStringLiteral("&waypoint"); baseRequest += QString::number(i); baseRequest += QStringLiteral("=geo!"); baseRequest += trimDouble(request.waypoints().at(i).latitude()); baseRequest += ','; baseRequest += trimDouble(request.waypoints().at(i).longitude()); } QGeoRouteRequest::RouteOptimizations optimization = request.routeOptimization(); QStringList types; if (optimization.testFlag(QGeoRouteRequest::ShortestRoute)) types.append("shortest"); if (optimization.testFlag(QGeoRouteRequest::FastestRoute)) types.append("fastest"); foreach (const QString &optimization, types) { QString requestString = baseRequest; requestString += modesRequestString(request, request.travelModes(), optimization); requestString += routeRequestString(request); requests << requestString; }
QString QGeoRoutingManagerEngineNokia::calculateRouteRequestString(const QGeoRouteRequest &request) { bool supported = checkEngineSupport(request, request.travelModes()); if ((request.numberAlternativeRoutes() != 0) && !supportsAlternativeRoutes()) supported = false; if (!supported) return ""; QString requestString = "http://"; requestString += m_host; requestString += "/routing/6.2/calculateroute.xml?referer=" + m_referer; if (!m_token.isNull()) requestString += "&token=" + m_token; int numWaypoints = request.waypoints().size(); if (numWaypoints < 2) return ""; for (int i = 0;i < numWaypoints;++i) { requestString += "&waypoint"; requestString += QString::number(i); requestString += "="; requestString += trimDouble(request.waypoints().at(i).latitude()); requestString += ","; requestString += trimDouble(request.waypoints().at(i).longitude()); } requestString += modesRequestString(request, request.travelModes()); requestString += "&alternatives="; requestString += QString::number(request.numberAlternativeRoutes()); requestString += routeRequestString(request); return requestString; }
QString QGeoRoutingManagerEngineNokia::routeRequestString(const QGeoRouteRequest &request) const { QString requestString; int numAreas = request.excludeAreas().count(); if (numAreas > 0) { requestString += "&avoidareas"; for (int i = 0;i < numAreas;++i) { requestString += i == 0 ? "=" : ";"; QGeoBoundingBox box = request.excludeAreas().at(i); requestString += trimDouble(box.topLeft().latitude()); requestString += ","; requestString += trimDouble(box.topLeft().longitude()); requestString += ","; requestString += trimDouble(box.bottomRight().latitude()); requestString += ","; requestString += trimDouble(box.bottomRight().longitude()); } } // TODO: work out what was going on here // - segment and instruction/maneuever functions are mixed and matched // - tried to implement sensible equivalents below // QStringList legAttributes; // if (request.instructionDetail() & QGeoRouteRequest::BasicSegmentData) { // requestString += "&linkattributes=sh,le"; //shape,length // legAttributes.append("links"); // } // // if (request.instructionDetail() & QGeoRouteRequest::BasicInstructions) { // legAttributes.append("maneuvers"); // requestString += "&maneuverattributes=po,tt,le,di"; //position,traveltime,length,direction // if (!(request.instructionDetail() & QGeoRouteRequest::NoSegmentData)) // requestString += ",li"; //link // } QStringList legAttributes; if (request.segmentDetail() & QGeoRouteRequest::BasicSegmentData) { requestString += "&linkattributes=sh,le"; //shape,length legAttributes.append("links"); } if (request.maneuverDetail() & QGeoRouteRequest::BasicManeuvers) { legAttributes.append("maneuvers"); requestString += "&maneuverattributes=po,tt,le,di"; //position,traveltime,length,direction if (!(request.segmentDetail() & QGeoRouteRequest::NoSegmentData)) requestString += ",li"; //link } requestString += "&routeattributes=sm,sh,bb,lg"; //summary,shape,boundingBox,legs if (legAttributes.count() > 0) { requestString += "&legattributes="; requestString += legAttributes.join(","); } requestString += "&departure="; requestString += QDateTime::currentDateTime().toUTC().toString("yyyy-MM-ddThh:mm:ssZ"); requestString += "&instructionformat=text"; requestString += "&language="; requestString += locale().name(); return requestString; }