39 if (!m_accessToken.isEmpty())
40 query.addQueryItem(QLatin1String(
"access_token"), m_accessToken);
42 query.addQueryItem(QLatin1String(
"annotations"), QLatin1String(
"duration,distance,speed,congestion"));
44 query.addQueryItem(QLatin1String(
"voice_instructions"), QLatin1String(
"true"));
45 query.addQueryItem(QLatin1String(
"banner_instructions"), QLatin1String(
"true"));
46 query.addQueryItem(QLatin1String(
"roundabout_exits"), QLatin1String(
"true"));
48 QLocale::MeasurementSystem unit = QLocale::system().measurementSystem();
49 query.addQueryItem(QLatin1String(
"voice_units"), unit == QLocale::MetricSystem ? QLatin1String(
"metric") : QLatin1String(
"imperial"));
56 if (voiceInstruction.value(QLatin1String(
"distanceAlongGeometry")).isDouble())
57 map.insert(QLatin1String(
"distance_along_geometry"), voiceInstruction.value(QLatin1String(
"distanceAlongGeometry")).toDouble());
59 if (voiceInstruction.value(QLatin1String(
"announcement")).isString())
60 map.insert(QLatin1String(
"announcement"), voiceInstruction.value(QLatin1String(
"announcement")).toString());
62 if (voiceInstruction.value(QLatin1String(
"ssmlAnnouncement")).isString())
63 map.insert(QLatin1String(
"ssml_announcement"), voiceInstruction.value(QLatin1String(
"ssmlAnnouncement")).toString());
82 if (bannerComponent.value(QLatin1String(
"type")).isString())
83 map.insert(QLatin1String(
"type"), bannerComponent.value(QLatin1String(
"type")).toString());
85 if (bannerComponent.value(QLatin1String(
"text")).isString())
86 map.insert(QLatin1String(
"text"), bannerComponent.value(QLatin1String(
"text")).toString());
88 if (bannerComponent.value(QLatin1String(
"abbr")).isString())
89 map.insert(QLatin1String(
"abbr"), bannerComponent.value(QLatin1String(
"abbr")).toString());
91 if (bannerComponent.value(QLatin1String(
"abbr_priority")).isDouble())
92 map.insert(QLatin1String(
"abbr_priority"), bannerComponent.value(QLatin1String(
"abbr_priority")).toInt());
111 if (banner.value(QLatin1String(
"text")).isString())
112 map.insert(QLatin1String(
"text"), banner.value(QLatin1String(
"text")).toString());
114 if (banner.value(QLatin1String(
"components")).isArray())
115 map.insert(QLatin1String(
"components"), parseMapboxBannerComponents(banner.value(QLatin1String(
"components")).toArray()));
117 if (banner.value(QLatin1String(
"type")).isString())
118 map.insert(QLatin1String(
"type"), banner.value(QLatin1String(
"type")).toString());
120 if (banner.value(QLatin1String(
"modifier")).isString())
121 map.insert(QLatin1String(
"modifier"), banner.value(QLatin1String(
"modifier")).toString());
123 if (banner.value(QLatin1String(
"degrees")).isDouble())
124 map.insert(QLatin1String(
"degrees"), banner.value(QLatin1String(
"degrees")).toDouble());
126 if (banner.value(QLatin1String(
"driving_side")).isString())
127 map.insert(QLatin1String(
"driving_side"), banner.value(QLatin1String(
"driving_side")).toString());
136 if (bannerInstruction.value(QLatin1String(
"distanceAlongGeometry")).isDouble())
137 map.insert(QLatin1String(
"distance_along_geometry"), bannerInstruction.value(QLatin1String(
"distanceAlongGeometry")).toDouble());
139 if (bannerInstruction.value(QLatin1String(
"primary")).isObject())
140 map.insert(QLatin1String(
"primary"), parseMapboxBanner(bannerInstruction.value(QLatin1String(
"primary")).toObject()));
142 if (bannerInstruction.value(QLatin1String(
"secondary")).isObject())
143 map.insert(QLatin1String(
"secondary"), parseMapboxBanner(bannerInstruction.value(QLatin1String(
"secondary")).toObject()));
145 if (bannerInstruction.value(QLatin1String(
"then")).isObject())
146 map.insert(QLatin1String(
"then"), parseMapboxBanner(bannerInstruction.value(QLatin1String(
"then")).toObject()));
163 QGeoManeuver m = segment.maneuver();
164 QVariantMap extendedAttributes = m.extendedAttributes();
166 QString maneuverInstructionText = maneuver.value(QLatin1String(
"instruction")).toString();
167 if (!maneuverInstructionText.isEmpty())
168 m.setInstructionText(maneuverInstructionText);
171 if (step.value(QLatin1String(
"voiceInstructions")).isArray())
172 extendedAttributes.insert(QLatin1String(
"mapbox.voice_instructions"),
173 parseMapboxVoiceInstructions(step.value(QLatin1String(
"voiceInstructions")).toArray()));
174 if (step.value(QLatin1String(
"bannerInstructions")).isArray())
175 extendedAttributes.insert(QLatin1String(
"mapbox.banner_instructions"),
176 parseMapboxBannerInstructions(step.value(QLatin1String(
"bannerInstructions")).toArray()));
178 m.setExtendedAttributes(extendedAttributes);
179 segment.setManeuver(m);
184 QGeoServiceProvider::Error *error,
185 QString *errorString)
186 : QGeoRoutingManagerEngine(parameters),
187 m_networkManager(
new QNetworkAccessManager(
this)),
188 m_userAgent(mapboxDefaultUserAgent)
190 if (parameters.contains(QStringLiteral(
"mapbox.useragent"))) {
191 m_userAgent = parameters.value(QStringLiteral(
"mapbox.useragent")).toString().toLatin1();
194 if (parameters.contains(QStringLiteral(
"mapbox.access_token"))) {
195 m_accessToken = parameters.value(QStringLiteral(
"mapbox.access_token")).toString();
198 bool use_mapbox_text_instructions =
true;
199 if (parameters.contains(QStringLiteral(
"mapbox.routing.use_mapbox_text_instructions"))) {
200 use_mapbox_text_instructions = parameters.value(QStringLiteral(
"mapbox.routing.use_mapbox_text_instructions")).toBool();
203 QGeoRouteParserOsrmV5 *parser =
new QGeoRouteParserOsrmV5(
this);
204 parser->setExtension(
new QGeoRouteParserOsrmV5ExtensionMapbox(m_accessToken, use_mapbox_text_instructions));
205 if (parameters.contains(QStringLiteral(
"mapbox.routing.traffic_side"))) {
206 QString trafficSide = parameters.value(QStringLiteral(
"mapbox.routing.traffic_side")).toString();
207 if (trafficSide == QStringLiteral(
"right"))
208 parser->setTrafficSide(QGeoRouteParser::RightHandTraffic);
209 else if (trafficSide == QStringLiteral(
"left"))
210 parser->setTrafficSide(QGeoRouteParser::LeftHandTraffic);
212 m_routeParser = parser;
214 *error = QGeoServiceProvider::NoError;
215 errorString->clear();
224 QNetworkRequest networkRequest;
225 networkRequest.setHeader(QNetworkRequest::UserAgentHeader, m_userAgent);
227 QString url = mapboxDirectionsApiPath;
229 QGeoRouteRequest::TravelModes travelModes = request.travelModes();
230 if (travelModes.testFlag(QGeoRouteRequest::PedestrianTravel)) {
231 url += QStringLiteral(
"walking/");
232 }
else if (travelModes.testFlag(QGeoRouteRequest::BicycleTravel)) {
233 url += QStringLiteral(
"cycling/");
234 }
else if (travelModes.testFlag(QGeoRouteRequest::CarTravel)) {
235 const QList<QGeoRouteRequest::FeatureType> &featureTypes = request.featureTypes();
236 int trafficFeatureIdx = featureTypes.indexOf(QGeoRouteRequest::TrafficFeature);
237 QGeoRouteRequest::FeatureWeight trafficWeight = request.featureWeight(QGeoRouteRequest::TrafficFeature);
238 if (trafficFeatureIdx >= 0 &&
239 (trafficWeight == QGeoRouteRequest::AvoidFeatureWeight || trafficWeight == QGeoRouteRequest::DisallowFeatureWeight)) {
240 url += QStringLiteral(
"driving-traffic/");
242 url += QStringLiteral(
"driving/");
246 networkRequest.setUrl(m_routeParser->requestUrl(request, url));
248 QNetworkReply *reply = m_networkManager->get(networkRequest);
250 QGeoRouteReplyMapbox *routeReply =
new QGeoRouteReplyMapbox(reply, request,
this);
252 connect(routeReply, &QGeoRouteReplyMapbox::finished,
253 this, &QGeoRoutingManagerEngineMapbox::replyFinished);
254 connect(routeReply, &QGeoRouteReplyMapbox::errorOccurred,
255 this, &QGeoRoutingManagerEngineMapbox::replyError);