From 5b1981a36d1ee3fbf0104bb3a7e7667408d7126a Mon Sep 17 00:00:00 2001 From: Volker Hilsheimer Date: Fri, 28 Oct 2022 11:35:20 +0200 Subject: Clean up: move QGeoRouteParserOsrmV4 into OSM plugin It's only used there. Need to privately export QGeoRouteParserPrivate for this. Change-Id: I0342dc31836a9db731f495434b9d4c7dd5973af2 Reviewed-by: Qt CI Bot Reviewed-by: Ivan Solovev --- src/location/maps/qgeorouteparserosrmv4.cpp | 411 ---------------------------- 1 file changed, 411 deletions(-) delete mode 100644 src/location/maps/qgeorouteparserosrmv4.cpp (limited to 'src/location/maps/qgeorouteparserosrmv4.cpp') diff --git a/src/location/maps/qgeorouteparserosrmv4.cpp b/src/location/maps/qgeorouteparserosrmv4.cpp deleted file mode 100644 index a69920aa..00000000 --- a/src/location/maps/qgeorouteparserosrmv4.cpp +++ /dev/null @@ -1,411 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtLocation module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include "qgeorouteparserosrmv4_p.h" -#include "qgeorouteparser_p_p.h" -#include "qgeoroutesegment.h" -#include "qgeomaneuver.h" - -#include -#include -#include -#include -#include - -QT_BEGIN_NAMESPACE - -static QList parsePolyline(const QByteArray &data) -{ - QList path; - - bool parsingLatitude = true; - - int shift = 0; - int value = 0; - - QGeoCoordinate coord(0, 0); - - for (int i = 0; i < data.length(); ++i) { - unsigned char c = data.at(i) - 63; - - value |= (c & 0x1f) << shift; - shift += 5; - - // another chunk - if (c & 0x20) - continue; - - int diff = (value & 1) ? ~(value >> 1) : (value >> 1); - - if (parsingLatitude) { - coord.setLatitude(coord.latitude() + (double)diff/1e6); - } else { - coord.setLongitude(coord.longitude() + (double)diff/1e6); - path.append(coord); - } - - parsingLatitude = !parsingLatitude; - - value = 0; - shift = 0; - } - - return path; -} - -static QGeoManeuver::InstructionDirection osrmInstructionDirection(const QString &instructionCode, QGeoRouteParser::TrafficSide trafficSide) -{ - if (instructionCode == QLatin1String("0")) - return QGeoManeuver::NoDirection; - else if (instructionCode == QLatin1String("1")) - return QGeoManeuver::DirectionForward; - else if (instructionCode == QLatin1String("2")) - return QGeoManeuver::DirectionBearRight; - else if (instructionCode == QLatin1String("3")) - return QGeoManeuver::DirectionRight; - else if (instructionCode == QLatin1String("4")) - return QGeoManeuver::DirectionHardRight; - else if (instructionCode == QLatin1String("5")) { - switch (trafficSide) { - case QGeoRouteParser::RightHandTraffic: - return QGeoManeuver::DirectionUTurnLeft; - case QGeoRouteParser::LeftHandTraffic: - return QGeoManeuver::DirectionUTurnRight; - } - return QGeoManeuver::DirectionUTurnLeft; - } else if (instructionCode == QLatin1String("6")) - return QGeoManeuver::DirectionHardLeft; - else if (instructionCode == QLatin1String("7")) - return QGeoManeuver::DirectionLeft; - else if (instructionCode == QLatin1String("8")) - return QGeoManeuver::DirectionBearLeft; - else if (instructionCode == QLatin1String("9")) - return QGeoManeuver::NoDirection; - else if (instructionCode == QLatin1String("10")) - return QGeoManeuver::DirectionForward; - else if (instructionCode == QLatin1String("11")) - return QGeoManeuver::NoDirection; - else if (instructionCode == QLatin1String("12")) - return QGeoManeuver::NoDirection; - else if (instructionCode == QLatin1String("13")) - return QGeoManeuver::NoDirection; - else if (instructionCode == QLatin1String("14")) - return QGeoManeuver::NoDirection; - else if (instructionCode == QLatin1String("15")) - return QGeoManeuver::NoDirection; - else - return QGeoManeuver::NoDirection; -} - -static QString osrmInstructionText(const QString &instructionCode, const QString &wayname) -{ - if (instructionCode == QLatin1String("0")) { - return QString(); - } else if (instructionCode == QLatin1String("1")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Go straight."); - else - return QGeoRouteParserOsrmV4::tr("Go straight onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("2")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Turn slightly right."); - else - return QGeoRouteParserOsrmV4::tr("Turn slightly right onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("3")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Turn right."); - else - return QGeoRouteParserOsrmV4::tr("Turn right onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("4")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Make a sharp right."); - else - return QGeoRouteParserOsrmV4::tr("Make a sharp right onto %1.").arg(wayname); - } - else if (instructionCode == QLatin1String("5")) { - return QGeoRouteParserOsrmV4::tr("When it is safe to do so, perform a U-turn."); - } else if (instructionCode == QLatin1String("6")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Make a sharp left."); - else - return QGeoRouteParserOsrmV4::tr("Make a sharp left onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("7")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Turn left."); - else - return QGeoRouteParserOsrmV4::tr("Turn left onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("8")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Turn slightly left."); - else - return QGeoRouteParserOsrmV4::tr("Turn slightly left onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("9")) { - return QGeoRouteParserOsrmV4::tr("Reached waypoint."); - } else if (instructionCode == QLatin1String("10")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Head on."); - else - return QGeoRouteParserOsrmV4::tr("Head onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11")) { - return QGeoRouteParserOsrmV4::tr("Enter the roundabout."); - } else if (instructionCode == QLatin1String("11-1")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the first exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the first exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11-2")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the second exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the second exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11-3")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the third exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the third exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11-4")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the fourth exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the fourth exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11-5")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the fifth exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the fifth exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11-6")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the sixth exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the sixth exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11-7")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the seventh exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the seventh exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11-8")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the eighth exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the eighth exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("11-9")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("At the roundabout take the ninth exit."); - else - return QGeoRouteParserOsrmV4::tr("At the roundabout take the ninth exit onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("12")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Leave the roundabout."); - else - return QGeoRouteParserOsrmV4::tr("Leave the roundabout onto %1.").arg(wayname); - } else if (instructionCode == QLatin1String("13")) { - return QGeoRouteParserOsrmV4::tr("Stay on the roundabout."); - } else if (instructionCode == QLatin1String("14")) { - if (wayname.isEmpty()) - return QGeoRouteParserOsrmV4::tr("Start at the end of the street."); - else - return QGeoRouteParserOsrmV4::tr("Start at the end of %1.").arg(wayname); - } else if (instructionCode == QLatin1String("15")) { - return QGeoRouteParserOsrmV4::tr("You have reached your destination."); - } else { - return QGeoRouteParserOsrmV4::tr("Don't know what to say for '%1'").arg(instructionCode); - } -} - -static QGeoRoute constructRoute(const QByteArray &geometry, const QJsonArray &instructions, - const QJsonObject &summary, QGeoRouteParser::TrafficSide trafficSide) -{ - QGeoRoute route; - - const QList path = parsePolyline(geometry); - - QGeoRouteSegment firstSegment; - int firstPosition = -1; - - for (qsizetype i = instructions.count() - 1; i >= 0; --i) { - const QJsonArray instruction = instructions.at(i).toArray(); - - if (instruction.count() < 8) { - qWarning("Instruction does not contain enough fields."); - continue; - } - - const QString instructionCode = instruction.at(0).toString(); - const QString wayname = instruction.at(1).toString(); - double segmentLength = instruction.at(2).toDouble(); - int position = instruction.at(3).toDouble(); - int time = instruction.at(4).toDouble(); - //const QString segmentLengthString = instruction.at(5).toString(); - //const QString direction = instruction.at(6).toString(); - //double azimuth = instruction.at(7).toDouble(); - - QGeoRouteSegment segment; - segment.setDistance(segmentLength); - - QGeoManeuver maneuver; - maneuver.setDirection(osrmInstructionDirection(instructionCode, trafficSide)); - maneuver.setDistanceToNextInstruction(segmentLength); - maneuver.setInstructionText(osrmInstructionText(instructionCode, wayname)); - maneuver.setPosition(path.at(position)); - maneuver.setTimeToNextInstruction(time); - - segment.setManeuver(maneuver); - - if (firstPosition == -1) - segment.setPath(path.mid(position)); - else - segment.setPath(path.mid(position, firstPosition - position)); - - segment.setTravelTime(time); - - segment.setNextRouteSegment(firstSegment); - - firstSegment = segment; - firstPosition = position; - } - - route.setDistance(summary.value(QStringLiteral("total_distance")).toDouble()); - route.setTravelTime(summary.value(QStringLiteral("total_time")).toDouble()); - route.setFirstRouteSegment(firstSegment); - route.setPath(path); - - return route; -} - -class QGeoRouteParserOsrmV4Private : public QGeoRouteParserPrivate -{ - Q_DECLARE_PUBLIC(QGeoRouteParserOsrmV4) -public: - QGeoRouteParserOsrmV4Private(); - virtual ~QGeoRouteParserOsrmV4Private(); - - QGeoRouteReply::Error parseReply(QList &routes, QString &errorString, const QByteArray &reply) const override; - QUrl requestUrl(const QGeoRouteRequest &request, const QString &prefix) const override; -}; - -QGeoRouteParserOsrmV4Private::QGeoRouteParserOsrmV4Private() : QGeoRouteParserPrivate() -{ -} - -QGeoRouteParserOsrmV4Private::~QGeoRouteParserOsrmV4Private() -{ -} - -QGeoRouteReply::Error QGeoRouteParserOsrmV4Private::parseReply(QList &routes, QString &errorString, const QByteArray &reply) const -{ - // OSRM v4 specs: https://github.com/Project-OSRM/osrm-backend/wiki/Server-API---v4,-old - QJsonDocument document = QJsonDocument::fromJson(reply); - - if (document.isObject()) { - QJsonObject object = document.object(); - - //double version = object.value(QStringLiteral("version")).toDouble(); - int status = object.value(QStringLiteral("status")).toDouble(); - QString statusMessage = object.value(QStringLiteral("status_message")).toString(); - - // status code 0 or 200 are case of success - // status code is 207 if no route was found - // an error occurred when trying to find a route - if (0 != status && 200 != status) { - errorString = statusMessage; - return QGeoRouteReply::UnknownError; - } - - QJsonObject routeSummary = object.value(QStringLiteral("route_summary")).toObject(); - - QByteArray routeGeometry = - object.value(QStringLiteral("route_geometry")).toString().toLatin1(); - - QJsonArray routeInstructions = object.value(QStringLiteral("route_instructions")).toArray(); - - QGeoRoute route = constructRoute(routeGeometry, routeInstructions, routeSummary, trafficSide); - - routes.append(route); - - const QJsonArray alternativeSummaries = - object.value(QStringLiteral("alternative_summaries")).toArray(); - const QJsonArray alternativeGeometries = - object.value(QStringLiteral("alternative_geometries")).toArray(); - const QJsonArray alternativeInstructions = - object.value(QStringLiteral("alternative_instructions")).toArray(); - - if (alternativeSummaries.count() == alternativeGeometries.count() && - alternativeSummaries.count() == alternativeInstructions.count()) { - for (qsizetype i = 0; i < alternativeSummaries.count(); ++i) { - route = constructRoute(alternativeGeometries.at(i).toString().toLatin1(), - alternativeInstructions.at(i).toArray(), - alternativeSummaries.at(i).toObject(), - trafficSide); - //routes.append(route); - } - } - - return QGeoRouteReply::NoError; - } else { - errorString = QStringLiteral("Couldn't parse json."); - return QGeoRouteReply::ParseError; - } -} - -QUrl QGeoRouteParserOsrmV4Private::requestUrl(const QGeoRouteRequest &request, const QString &prefix) const -{ - QUrl url(prefix); - QUrlQuery query; - - query.addQueryItem(QStringLiteral("instructions"), QStringLiteral("true")); - - for (const QGeoCoordinate &c : request.waypoints()) { - query.addQueryItem(QStringLiteral("loc"), QString::number(c.latitude()) + QLatin1Char(',') + - QString::number(c.longitude())); - } - - url.setQuery(query); - return url; -} - -QGeoRouteParserOsrmV4::QGeoRouteParserOsrmV4(QObject *parent) - : QGeoRouteParser(*new QGeoRouteParserOsrmV4Private(), parent) -{ -} - -QGeoRouteParserOsrmV4::~QGeoRouteParserOsrmV4() -{ -} - -QT_END_NAMESPACE -- cgit v1.2.1