Skip to content

Commit

Permalink
add support for route-calculation by brouter
Browse files Browse the repository at this point in the history
  • Loading branch information
ntruchsess committed Jan 4, 2015
1 parent 1eae8df commit 486d315
Show file tree
Hide file tree
Showing 6 changed files with 158 additions and 0 deletions.
45 changes: 45 additions & 0 deletions src/CRoute.cpp
Expand Up @@ -294,6 +294,7 @@ CRoute::CRoute(QObject * parent)
, highlight(false)
, firstTime(true)
, calcRoutePending(false)
, routeIdx(0)
{
setIcon("Small City");
}
Expand Down Expand Up @@ -449,6 +450,9 @@ void CRoute::loadSecondaryRoute(QDomDocument& xml, service_e service)
case eMapQuest:
loadSecondaryRouteMQ(xml);
break;
case eBRouter:
loadSecondaryRouteBR(xml);
break;
}

calcDistance();
Expand Down Expand Up @@ -591,6 +595,47 @@ void CRoute::loadSecondaryRouteORS(QDomDocument& xml)
}
}

void CRoute::loadSecondaryRouteBR(QDomDocument& xml)
{
// <!-- track-length = 253153 filtered ascend = 888 plain-ascend = -282 cost=296476 -->
// <trk>
// <name>brouter_fastbike_0</name>
// <trkseg>
// <trkpt lon="11.626430" lat="48.298522"><ele>466.75</ele></trkpt>

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()
{
Expand Down
9 changes: 9 additions & 0 deletions src/CRoute.h
Expand Up @@ -41,6 +41,7 @@ class CRoute : public IItem
{
eOpenRouteService
,eMapQuest
,eBRouter
};

enum type_e {eEnd, eBase, eRtePts, eRteSec};
Expand Down Expand Up @@ -97,13 +98,19 @@ 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);
friend QDataStream& operator <<(QDataStream& s, CRoute& route);

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
Expand All @@ -127,6 +134,8 @@ class CRoute : public IItem

bool calcRoutePending;

int routeIdx;

};

QDataStream& operator >>(QDataStream& s, CRoute& route);
Expand Down
1 change: 1 addition & 0 deletions src/CRouteDB.cpp
Expand Up @@ -752,6 +752,7 @@ void CRouteDB::reset(const QString& key)
if(routes.contains(key))
{
routes[key]->reset();
routes[key]->resetRouteIdx();
}
}

Expand Down
84 changes: 84 additions & 0 deletions src/CRouteToolWidget.cpp
Expand Up @@ -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 ------------
Expand Down Expand Up @@ -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));
Expand Down Expand Up @@ -208,6 +222,7 @@ void CRouteToolWidget::slotServiceChanged(int idx)
{
groupORS->hide();
groupMQ->hide();
groupBR->hide();
labelCopyrightMapQuest->hide();
labelCopyrightOpenRoute->hide();

Expand All @@ -221,6 +236,10 @@ void CRouteToolWidget::slotServiceChanged(int idx)
groupMQ->show();
labelCopyrightMapQuest->show();
}
else if(comboService->itemData(idx).toInt() == CRoute::eBRouter)
{
groupBR->show();
}
}


Expand Down Expand Up @@ -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;
Expand All @@ -414,6 +436,10 @@ void CRouteToolWidget::slotCalcRoute()
{
startMapQuest(*route);
}
else if(service == CRoute::eBRouter)
{
startBRouterService(*route);
}
}

originator = false;
Expand Down Expand Up @@ -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);
}
Expand Down Expand Up @@ -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<CRoute::pt_t> 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<QByteArray, QByteArray> > queryItems;
queryItems << QPair<QByteArray, QByteArray>(QByteArray("lonlats"),QByteArray(lonlats.toAscii()));
queryItems << QPair<QByteArray, QByteArray>(QByteArray("nogos"), QByteArray(""));
queryItems << QPair<QByteArray, QByteArray>(QByteArray("profile"), comboBRPreference->itemData(comboBRPreference->currentIndex()).toByteArray());
queryItems << QPair<QByteArray, QByteArray>(QByteArray("alternativeidx"), QVariant(rte.getRouteIdx()).toByteArray());
queryItems << QPair<QByteArray, QByteArray>(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; i<listRoutes->count(); i++)
{
QString key = listRoutes->item(i)->data(Qt::UserRole).toString();
CRouteDB::self().getRouteByKey(key)->resetRouteIdx();
}
}
7 changes: 7 additions & 0 deletions src/CRouteToolWidget.h
Expand Up @@ -68,6 +68,7 @@ class CRouteToolWidget : public QWidget, private Ui::IRouteToolWidget

void slotTimeout();
void slotServiceChanged(int);
void slotBRPreferenceChanged(int);

void slotProxyAuthenticationRequired(const QNetworkProxy&, QAuthenticator*);

Expand All @@ -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
Expand All @@ -102,5 +105,9 @@ class CRouteToolWidget : public QWidget, private Ui::IRouteToolWidget

QMap<QNetworkReply*, QString> pendingRequests;

QString routingBRProfiles;
QString routingBRHost;
int routingBRPort;

};
#endif //CROUTETOOLWIDGET_H
12 changes: 12 additions & 0 deletions src/IRouteToolWidget.ui
Expand Up @@ -219,6 +219,18 @@
</layout>
</widget>
</item>
<item>
<widget class="QGroupBox" name="groupBR">
<property name="title">
<string/>
</property>
<layout class="QVBoxLayout" name="verticalLayout_7">
<item>
<widget class="QComboBox" name="comboBRPreference"/>
</item>
</layout>
</widget>
</item>
<item>
<widget class="QLabel" name="labelCopyrightMapQuest">
<property name="text">
Expand Down

0 comments on commit 486d315

Please sign in to comment.