7#include <QGeoRectangle>
9#include <QGeoRouteSegment>
52GeoRouteJsonParserEsri::GeoRouteJsonParserEsri(
const QJsonDocument &document)
54 if (!document.isObject())
60 m_json = document.object();
61 if (m_json.contains(kErrorKey))
63 QJsonObject error = m_json.value(kErrorKey).toObject();
64 int code = error.value(kErrorCodeKey).toInt();
65 QString message = error.value(kErrorMessageKey).toString();
67 m_error = kErrorMessage.arg(code).arg(message);
75QList<QGeoRoute> GeoRouteJsonParserEsri::routes()
const
77 return m_routes.values();
80bool GeoRouteJsonParserEsri::isValid()
const
82 return (m_error.isEmpty());
85QString GeoRouteJsonParserEsri::errorString()
const
90void GeoRouteJsonParserEsri::parseDirections()
92 QJsonArray directions = m_json.value(kDirectionsKey).toArray();
93 for (
const QJsonValueRef direction : directions)
94 parseDirection(direction.toObject());
97void GeoRouteJsonParserEsri::parseDirection(
const QJsonObject &direction)
99 QGeoRoute &geoRoute = m_routes[direction.value(kDirectionsRouteIdKey).toInt()];
102 geoRoute.setRouteId(direction.value(kDirectionsRouteNameKey).toString());
104 QJsonObject summary = direction.value(kDirectionsSummaryKey).toObject();
105 geoRoute.setDistance(summary.value(kDirectionsTotalLengthKey).toDouble());
107 geoRoute.setTravelTime(summary.value(kDirectionsTotalTimeKey).toDouble() * 60);
110 geoRoute.setTravelMode(QGeoRouteRequest::CarTravel);
113 QJsonObject enveloppe = summary.value(kDirectionsEnvelopeKey).toObject();
115 QGeoCoordinate topLeft(enveloppe.value(kDirectionsEnvelopeXminKey).toDouble(),
116 enveloppe.value(kDirectionsEnvelopeYmaxKey).toDouble());
117 QGeoCoordinate bottomRight(enveloppe.value(kDirectionsEnvelopeXmaxKey).toDouble(),
118 enveloppe.value(kDirectionsEnvelopeYminKey).toDouble());
119 geoRoute.setBounds(QGeoRectangle(topLeft, bottomRight));
122 QJsonArray features = direction.value(kDirectionsFeaturesKey).toArray();
124 static const QMap<QString, QGeoManeuver::InstructionDirection> esriDirectionsManeuverTypes
126 { QStringLiteral(
"esriDMTUnknown"), QGeoManeuver::NoDirection },
127 { QStringLiteral(
"esriDMTStop"), QGeoManeuver::NoDirection },
128 { QStringLiteral(
"esriDMTStraight"), QGeoManeuver::DirectionForward },
129 { QStringLiteral(
"esriDMTBearLeft"), QGeoManeuver::DirectionBearLeft },
130 { QStringLiteral(
"esriDMTBearRight"), QGeoManeuver::DirectionBearRight },
131 { QStringLiteral(
"esriDMTTurnLeft"), QGeoManeuver::DirectionLeft },
132 { QStringLiteral(
"esriDMTTurnRight"), QGeoManeuver::DirectionRight },
133 { QStringLiteral(
"esriDMTSharpLeft"), QGeoManeuver::DirectionLightLeft },
134 { QStringLiteral(
"esriDMTSharpRight"), QGeoManeuver::DirectionLightRight },
135 { QStringLiteral(
"esriDMTUTurn"), QGeoManeuver::DirectionUTurnRight },
136 { QStringLiteral(
"esriDMTFerry"), QGeoManeuver::NoDirection },
137 { QStringLiteral(
"esriDMTRoundabout"), QGeoManeuver::NoDirection },
138 { QStringLiteral(
"esriDMTHighwayMerge"), QGeoManeuver::NoDirection },
139 { QStringLiteral(
"esriDMTHighwayExit"), QGeoManeuver::NoDirection },
140 { QStringLiteral(
"esriDMTHighwayChange"), QGeoManeuver::NoDirection },
141 { QStringLiteral(
"esriDMTForkCenter"), QGeoManeuver::NoDirection },
142 { QStringLiteral(
"esriDMTForkLeft"), QGeoManeuver::NoDirection },
143 { QStringLiteral(
"esriDMTForkRight"), QGeoManeuver::NoDirection },
144 { QStringLiteral(
"esriDMTDepart"), QGeoManeuver::NoDirection },
145 { QStringLiteral(
"esriDMTTripItem"), QGeoManeuver::NoDirection },
146 { QStringLiteral(
"esriDMTEndOfFerry"), QGeoManeuver::NoDirection }
149 QGeoRouteSegment firstSegment;
150 for (qsizetype i = features.size() - 1; i >= 0; --i)
152 QJsonObject feature = features.at(i).toObject();
153 QJsonObject attributes = feature.value(kDirectionsFeaturesAttributesKey).toObject();
155 QGeoRouteSegment segment;
156 double length = attributes.value(kDirectionsFeaturesAttributesLengthKey).toDouble();
157 segment.setDistance(length);
159 double time = attributes.value(kDirectionsFeaturesAttributesTimeKey).toDouble() * 60;
161 segment.setTravelTime(time);
163 QGeoManeuver maneuver;
164 QString type = attributes.value(kDirectionsFeaturesAttributesManeuverTypeKey).toString();
165 maneuver.setDirection(esriDirectionsManeuverTypes.value(type));
167 maneuver.setInstructionText(attributes.value(kDirectionsFeaturesAttributesTextKey).toString() +
".");
168 maneuver.setDistanceToNextInstruction(length);
169 maneuver.setTimeToNextInstruction(time);
171 segment.setManeuver(maneuver);
173 segment.setNextRouteSegment(firstSegment);
174 firstSegment = segment;
176 geoRoute.setFirstRouteSegment(firstSegment);
179void GeoRouteJsonParserEsri::parseRoutes()
181 QJsonObject routes = m_json.value(kRoutesKey).toObject();
182 QJsonArray features = routes.value(kRoutesFeaturesKey).toArray();
183 for (
const QJsonValueRef feature : features)
184 parseRoute(feature.toObject());
187void GeoRouteJsonParserEsri::parseRoute(
const QJsonObject &route)
189 QJsonObject attributes = route.value(kRoutesFeaturesAttributesKey).toObject();
190 QGeoRoute &geoRoute = m_routes[attributes.value(kRoutesFeaturesObjectIdKey).toInt()];
192 QJsonObject geometry = route.value(kRoutesFeaturesGeometryKey).toObject();
193 QJsonArray paths = geometry.value(kRoutesFeaturesGeometryPathsKey).toArray();
195 if (!paths.isEmpty())
197 QList<QGeoCoordinate> geoCoordinates;
198 for (
const QJsonValueRef value : paths.first().toArray())
200 QJsonArray geoCoordinate = value.toArray();
201 if (geoCoordinate.size() == 2)
203 geoCoordinates.append(QGeoCoordinate(geoCoordinate[1].toDouble(),
204 geoCoordinate[0].toDouble()));
207 geoRoute.setPath(geoCoordinates);
static const QString kErrorCodeKey(QStringLiteral("code"))
static const QString kDirectionsFeaturesAttributesManeuverTypeKey(QStringLiteral("maneuverType"))
static const QString kDirectionsFeaturesAttributesTextKey(QStringLiteral("text"))
static const QString kRoutesFeaturesAttributesKey(QStringLiteral("attributes"))
static const QString kErrorKey(QStringLiteral("error"))
static const QString kMessagesKey(QStringLiteral("messages"))
static const QString kDirectionsSummaryKey(QStringLiteral("summary"))
static const QString kDirectionsKey(QStringLiteral("directions"))
static const QString kDirectionsEnvelopeYmaxKey(QStringLiteral("ymax"))
static const QString kBarriersKey(QStringLiteral("barriers"))
static const QString kDirectionsFeaturesAttributesTimeKey(QStringLiteral("time"))
static const QString kRoutesKey(QStringLiteral("routes"))
static const QString kDirectionsRouteNameKey(QStringLiteral("routeName"))
static const QString kDirectionsFeaturesAttributesKey(QStringLiteral("attributes"))
static const QString kDirectionsFeaturesCompressedGeometryKey(QStringLiteral("compressedGeometry"))
static const QString kDirectionsFeaturesAttributesEtaKey(QStringLiteral("ETA"))
static const QString kDirectionsEnvelopeXmaxKey(QStringLiteral("xmax"))
static const QString kDirectionsRouteIdKey(QStringLiteral("routeId"))
static const QString kErrorJson(QStringLiteral("Error: invalide JSON document."))
static const QString kDirectionsEnvelopeYminKey(QStringLiteral("ymin"))
static const QString kRoutesFeaturesObjectIdKey(QStringLiteral("ObjectID"))
static const QString kDirectionsEnvelopeKey(QStringLiteral("envelope"))
static const QString kDirectionsTotalTimeKey(QStringLiteral("totalTime"))
static const QString kDirectionsFeaturesAttributesLengthKey(QStringLiteral("length"))
static const QString kRoutesFeaturesKey(QStringLiteral("features"))
static const QString kRoutesFeaturesGeometryKey(QStringLiteral("geometry"))
static const QString kDirectionsFeaturesKey(QStringLiteral("features"))
static const QString kErrorMessageKey(QStringLiteral("message"))
static const QString kDirectionsTotalLengthKey(QStringLiteral("totalLength"))
static const QString kDirectionsEnvelopeXminKey(QStringLiteral("xmin"))
static QT_BEGIN_NAMESPACE const QString kErrorMessage(QStringLiteral("Error %1: %2."))
static const QString kErrorDetailsKey(QStringLiteral("details"))
static const QString kDirectionsTotalDriveTimeKey(QStringLiteral("totalDriveTime"))
static const QString kRoutesFeaturesGeometryPathsKey(QStringLiteral("paths"))