diff --git a/src/CRoute.cpp b/src/CRoute.cpp index 05cae270..a5104b4e 100644 --- a/src/CRoute.cpp +++ b/src/CRoute.cpp @@ -294,6 +294,7 @@ CRoute::CRoute(QObject * parent) , highlight(false) , firstTime(true) , calcRoutePending(false) +, routeIdx(0) { setIcon("Small City"); } @@ -449,6 +450,9 @@ void CRoute::loadSecondaryRoute(QDomDocument& xml, service_e service) case eMapQuest: loadSecondaryRouteMQ(xml); break; + case eBRouter: + loadSecondaryRouteBR(xml); + break; } calcDistance(); @@ -591,6 +595,47 @@ void CRoute::loadSecondaryRouteORS(QDomDocument& xml) } } +void CRoute::loadSecondaryRouteBR(QDomDocument& xml) +{ +// +// +// brouter_fastbike_0 +// +// 466.75 + + QDomElement root = xml.documentElement(); + QDomNodeList nodes = root.childNodes(); + for (int i = 0; i < nodes.size(); i++) + { + QDomNode node = nodes.item(i); + if (node.isComment()) + { + //TODO parse comment to set dist and ttime + } + } + QDomNodeList tracks = root.elementsByTagName("trk"); + for(int i = 0; i < tracks.size(); i++) + { + QDomElement track = tracks.item(i).toElement(); + QDomNodeList segments = track.elementsByTagName("trkseg"); + for (int j = 0; j < segments.size(); j++) + { + QDomElement segment = segments.item(j).toElement(); + QDomNodeList points = segment.elementsByTagName("trkpt"); + const qint32 M = points.size(); + for(int k = 0; k < M; k++) + { + pt_t rtept; + QDomElement point = points.item(k).toElement(); + rtept.lon = point.attribute("lon").toFloat(); + rtept.lat = point.attribute("lat").toFloat(); + //QString elevation = point.firstChildElement("ele").text(); + secRoute << rtept; + } + } + } + routeIdx++; +} void CRoute::reset() { diff --git a/src/CRoute.h b/src/CRoute.h index 6f38a6c1..4036ee52 100644 --- a/src/CRoute.h +++ b/src/CRoute.h @@ -41,6 +41,7 @@ class CRoute : public IItem { eOpenRouteService ,eMapQuest + ,eBRouter }; enum type_e {eEnd, eBase, eRtePts, eRteSec}; @@ -97,6 +98,10 @@ class CRoute : public IItem void setCalcPending(){calcRoutePending = true;} + void resetRouteIdx(){routeIdx = 0;} + + int getRouteIdx(){return routeIdx;} + private: friend class CRouteDB; friend QDataStream& operator >>(QDataStream& s, CRoute& route); @@ -104,6 +109,8 @@ class CRoute : public IItem void loadSecondaryRouteORS(QDomDocument& xml); void loadSecondaryRouteMQ(QDomDocument& xml); + void loadSecondaryRouteBR(QDomDocument& xml); + void calcDistance(); /// primary route, just the basic points like A to B via C @@ -127,6 +134,8 @@ class CRoute : public IItem bool calcRoutePending; + int routeIdx; + }; QDataStream& operator >>(QDataStream& s, CRoute& route); diff --git a/src/CRouteDB.cpp b/src/CRouteDB.cpp index f8d90238..629c07d1 100644 --- a/src/CRouteDB.cpp +++ b/src/CRouteDB.cpp @@ -752,6 +752,7 @@ void CRouteDB::reset(const QString& key) if(routes.contains(key)) { routes[key]->reset(); + routes[key]->resetRouteIdx(); } } diff --git a/src/CRouteToolWidget.cpp b/src/CRouteToolWidget.cpp index 04ed2aa7..52a6ae3e 100644 --- a/src/CRouteToolWidget.cpp +++ b/src/CRouteToolWidget.cpp @@ -81,6 +81,7 @@ CRouteToolWidget::CRouteToolWidget(QTabWidget * parent) comboService->addItem("OpenRouteService (Europe)", CRoute::eOpenRouteService); comboService->addItem("MapQuest (World)", CRoute::eMapQuest); + comboService->addItem("BRouter", CRoute::eBRouter); connect(comboService, SIGNAL(currentIndexChanged(int)), this, SLOT(slotServiceChanged(int))); // ------------ ORS Setup ------------ @@ -168,6 +169,19 @@ CRouteToolWidget::CRouteToolWidget(QTabWidget * parent) checkMQAvoidCountryBorder->setChecked(cfg.value("avoidCountryBorder", false).toBool()); comboMQLanguage->setCurrentIndex(cfg.value("language", langIdx).toInt()); cfg.endGroup(); + + // ------------ BR Setup ------------ + cfg.beginGroup("BR"); + routingBRProfiles = cfg.value("profiles", "car-test|fastbike|moped|shortest|trekking").toString(); + foreach(const QString& key, routingBRProfiles.split('|')) + { + comboBRPreference->addItem(key,key); + } + comboBRPreference->setCurrentIndex(cfg.value("preference", 0).toInt()); + connect(comboBRPreference, SIGNAL(currentIndexChanged(int)), this, SLOT(slotBRPreferenceChanged(int))); + routingBRHost = cfg.value("host","127.0.0.1").toString(); + routingBRPort = cfg.value("port",17777).toInt(); + cfg.endGroup(); cfg.endGroup(); m_networkAccessManager->setProxy(QNetworkProxy(QNetworkProxy::DefaultProxy)); @@ -208,6 +222,7 @@ void CRouteToolWidget::slotServiceChanged(int idx) { groupORS->hide(); groupMQ->hide(); + groupBR->hide(); labelCopyrightMapQuest->hide(); labelCopyrightOpenRoute->hide(); @@ -221,6 +236,10 @@ void CRouteToolWidget::slotServiceChanged(int idx) groupMQ->show(); labelCopyrightMapQuest->show(); } + else if(comboService->itemData(idx).toInt() == CRoute::eBRouter) + { + groupBR->show(); + } } @@ -392,6 +411,9 @@ void CRouteToolWidget::slotCalcRoute() cfg.setValue("avoidCountryBorder", checkMQAvoidCountryBorder->isChecked()); cfg.setValue("language", comboMQLanguage->currentIndex()); cfg.endGroup(); + cfg.beginGroup("BR"); + cfg.setValue("preference", comboBRPreference->currentIndex()); + cfg.endGroup(); cfg.endGroup(); originator = true; @@ -414,6 +436,10 @@ void CRouteToolWidget::slotCalcRoute() { startMapQuest(*route); } + else if(service == CRoute::eBRouter) + { + startBRouterService(*route); + } } originator = false; @@ -638,6 +664,15 @@ void CRouteToolWidget::slotRequestFinished(QNetworkReply* reply) return; } } + else if (service == CRoute::eBRouter) + { + QDomElement response = xml.firstChildElement("gpx"); + if(response.isNull()) + { + QMessageBox::warning(0,tr("Failed..."), tr("Bad response from server:\n%1").arg(xml.toString()), QMessageBox::Abort); + return; + } + } CRouteDB::self().loadSecondaryRoute(key, xml, (CRoute::service_e)service); } @@ -966,3 +1001,52 @@ void CRouteToolWidget::addMapQuestLocations(QDomDocument& xml, QDomElement& loca locations.appendChild(location); } } + +void CRouteToolWidget::startBRouterService(CRoute& rte) +{ + // /brouter?lonlats=11.626453,48.298498|9.942884,49.798885&nogos=&profile=fastbike&alternativeidx=0&format=gpx + + QUrl url(QString("http://").append(routingBRHost)); + url.setPort(routingBRPort); + url.setPath("/brouter"); + + QVector wpts = rte.getPriRtePoints(); + bool isNext = false; + QString lonlats; + foreach(const CRoute::pt_t& wpt, wpts) + { + if (isNext) + { + lonlats.append(QString("|%1,%2").arg(wpt.lon).arg(wpt.lat)); + } else { + lonlats = QString("%1,%2").arg(wpt.lon).arg(wpt.lat); + isNext = true; + } + } + + QList< QPair > queryItems; + queryItems << QPair(QByteArray("lonlats"),QByteArray(lonlats.toAscii())); + queryItems << QPair(QByteArray("nogos"), QByteArray("")); + queryItems << QPair(QByteArray("profile"), comboBRPreference->itemData(comboBRPreference->currentIndex()).toByteArray()); + queryItems << QPair(QByteArray("alternativeidx"), QVariant(rte.getRouteIdx()).toByteArray()); + queryItems << QPair(QByteArray("format"), QByteArray("gpx")); + url.setEncodedQueryItems(queryItems); + + QNetworkRequest request; + + request.setUrl(url); + + QNetworkReply* reply = m_networkAccessManager->get(request); + pendingRequests[reply] = rte.getKey(); + + timer->start(20000); +} + +void CRouteToolWidget::slotBRPreferenceChanged(int idx) +{ + for(int i = 0; icount(); i++) + { + QString key = listRoutes->item(i)->data(Qt::UserRole).toString(); + CRouteDB::self().getRouteByKey(key)->resetRouteIdx(); + } +} diff --git a/src/CRouteToolWidget.h b/src/CRouteToolWidget.h index 96306975..0d1b62b9 100644 --- a/src/CRouteToolWidget.h +++ b/src/CRouteToolWidget.h @@ -68,6 +68,7 @@ class CRouteToolWidget : public QWidget, private Ui::IRouteToolWidget void slotTimeout(); void slotServiceChanged(int); + void slotBRPreferenceChanged(int); void slotProxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*); @@ -79,6 +80,8 @@ class CRouteToolWidget : public QWidget, private Ui::IRouteToolWidget void startMapQuest(CRoute& rte); void addMapQuestLocations(QDomDocument& xml, QDomElement& locations, CRoute& rte); + void startBRouterService(CRoute& rte); + bool originator; enum tab_e @@ -102,5 +105,9 @@ class CRouteToolWidget : public QWidget, private Ui::IRouteToolWidget QMap pendingRequests; + QString routingBRProfiles; + QString routingBRHost; + int routingBRPort; + }; #endif //CROUTETOOLWIDGET_H diff --git a/src/IRouteToolWidget.ui b/src/IRouteToolWidget.ui index 9b057c1e..e6b6eab9 100644 --- a/src/IRouteToolWidget.ui +++ b/src/IRouteToolWidget.ui @@ -219,6 +219,18 @@ + + + + + + + + + + + +