52 QJsonArray restApiAvoidArray;
54 auto features = request.featureTypes();
55 auto travelModes = request.travelModes();
57 for (
auto feature : features) {
58 if (travelModes != QGeoRouteRequest::CarTravel && feature != QGeoRouteRequest::FerryFeature)
61 auto featureWeight = request.featureWeight(feature);
64 case QGeoRouteRequest::TollFeature:
65 if (featureWeight == QGeoRouteRequest::AvoidFeatureWeight
66 || featureWeight == QGeoRouteRequest::DisallowFeatureWeight)
67 restApiAvoidArray.push_back(
static_cast<
int>(RestApiRoutingPolicy::AvoidToolRoads));
69 case QGeoRouteRequest::HighwayFeature:
70 if (featureWeight == QGeoRouteRequest::AvoidFeatureWeight
71 || featureWeight == QGeoRouteRequest::DisallowFeatureWeight) {
72 restApiAvoidArray.push_back(
static_cast<
int>(RestApiRoutingPolicy::AvoidHighways));
73 }
else if (featureWeight == QGeoRouteRequest::PreferFeatureWeight
74 || featureWeight == QGeoRouteRequest::RequireFeatureWeight) {
75 restApiAvoidArray.push_back(
static_cast<
int>(RestApiRoutingPolicy::PrioritizeHighways));
78 case QGeoRouteRequest::FerryFeature:
79 if (featureWeight == QGeoRouteRequest::AvoidFeatureWeight
80 || featureWeight == QGeoRouteRequest::DisallowFeatureWeight)
81 restApiAvoidArray.push_back(
static_cast<
int>(RestApiRoutingPolicy::AvoidFerries));
88 if (travelModes == QGeoRouteRequest::CarTravel) {
89 auto routeOptimizations = request.routeOptimization();
90 if (routeOptimizations.testFlag(QGeoRouteRequest::ShortestRoute))
92 else if (routeOptimizations.testFlag(QGeoRouteRequest::FastestRoute))
96 return restApiAvoidArray;
101 QJsonArray waypointsArray;
103 constexpr int minNumOfWaypointsToCreateRouteMidpoints = 3;
104 if (waypoints.size() < minNumOfWaypointsToCreateRouteMidpoints)
105 return waypointsArray;
106 constexpr int secondElementIndex = 1;
107 const int penultimateElementIndex = waypoints.size() - 2;
108 for (
const auto &waypoint: waypoints.mid(secondElementIndex, penultimateElementIndex))
109 waypointsArray.push_back(OhosMapKit::CoordinateJson::tryConvertFromQGeoCoordinate(waypoint));
111 return waypointsArray;
116 constexpr int minNumOfWaypoints = 2;
117 constexpr int restApiWaypointsLimitation = 25;
118 auto waypoints = request.waypoints();
119 if (waypoints.size() < minNumOfWaypoints || waypoints.size() > restApiWaypointsLimitation) {
121 "%s: Invalid number of waypoints: %d. Cannot create route request.",
122 Q_FUNC_INFO,
int(waypoints.size()));
126 QJsonObject routeRequestBody;
128 routeRequestBody.insert(
129 QStringLiteral(
"origin"),
130 OhosMapKit::CoordinateJson::tryConvertFromQGeoCoordinate(waypoints.first()));
131 routeRequestBody.insert(
132 QStringLiteral(
"destination"),
133 OhosMapKit::CoordinateJson::tryConvertFromQGeoCoordinate(waypoints.last()));
135 auto restApiAvoidArray = createRestApiAvoidArray(request);
136 if (!restApiAvoidArray.isEmpty())
137 routeRequestBody.insert(QStringLiteral(
"avoid"), restApiAvoidArray);
139 if (request.travelModes() == QGeoRouteRequest::CarTravel) {
140 auto waypointsArray = createWaypointsJsonArray(waypoints);
141 if (!waypointsArray.empty())
142 routeRequestBody.insert(QStringLiteral(
"waypoints"), waypointsArray);
145 return QJsonDocument(routeRequestBody).toJson(QJsonDocument::Compact);
180 auto travelModes = request.travelModes();
182 if (!isSingleTravelMode(travelModes)) {
183 return new QGeoRouteReply(
184 QGeoRouteReply::UnsupportedOptionError,
185 tr(
"Selection of multiple travel modes is not supported by OHOS Map Kit plugin"));
188 if (!routingApiUrl.contains(travelModes)) {
189 return new QGeoRouteReply(
190 QGeoRouteReply::UnsupportedOptionError,
191 tr(
"Selected travel mode: %1 is not supported by OHOS Map Kit plugin")
192 .arg(travelModes.toInt()));
195 auto *reply = makeQGeoRouteReplyOhosMapKit(
196 m_networkManager.post(
197 OhosMapKit::createOhosMapKitNetworkRequestWithJsonBody(
198 routingApiUrl.value(travelModes), m_userAgent, m_authenticationKey),
199 createRouteRequestBody(request)),
203 reply, &QGeoRouteReply::finished,
206 reply, &QGeoRouteReply::errorOccurred,
207 this, &QGeoRoutingManagerEngineOhosMapKit::onReplyError);