• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.12
  • kdeedu
  • marble
  • src
  • plugins
  • runner
  • routino
RoutinoRunner.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2010 Dennis Nienhüser <earthwings@gentoo.org>
9 // Copyright 2010 Niko Sams <niko.sams@gmail.com>
10 //
11 
12 #include "RoutinoRunner.h"
13 
14 #include "MarbleDebug.h"
15 #include "MarbleDirs.h"
16 #include "routing/RouteRequest.h"
17 #include "routing/instructions/WaypointParser.h"
18 #include "routing/instructions/InstructionTransformation.h"
19 #include "GeoDataDocument.h"
20 #include "GeoDataExtendedData.h"
21 
22 #include <QProcess>
23 #include <QMap>
24 #include <QTemporaryFile>
25 #include <MarbleMap.h>
26 #include <MarbleModel.h>
27 #include <routing/RoutingManager.h>
28 #include <routing/RoutingModel.h>
29 #include <routing/RoutingProfilesModel.h>
30 
31 namespace Marble
32 {
33 
34 class RoutinoRunnerPrivate
35 {
36 public:
37  QDir m_mapDir;
38 
39  WaypointParser m_parser;
40 
41  QByteArray retrieveWaypoints( const QStringList &params ) const;
42 
43  GeoDataDocument* createDocument( GeoDataLineString* routeWaypoints, const QVector<GeoDataPlacemark*> instructions ) const;
44 
45  GeoDataLineString* parseRoutinoOutput( const QByteArray &content ) const;
46 
47  QVector<GeoDataPlacemark*> parseRoutinoInstructions( const QByteArray &content ) const;
48 
49  RoutinoRunnerPrivate();
50 };
51 
52 RoutinoRunnerPrivate::RoutinoRunnerPrivate()
53 {
54  m_parser.setLineSeparator("\n");
55  m_parser.setFieldSeparator('\t');
56  m_parser.setFieldIndex( WaypointParser::RoadName, 10 );
57 }
58 
59 class TemporaryDir
60 {
61 public:
62  TemporaryDir() {
63  QTemporaryFile f;
64  f.setAutoRemove( false );
65  f.open();
66  m_dirName = f.fileName();
67  f.close();
68  f.remove();
69  QFileInfo( m_dirName ).dir().mkdir( m_dirName );
70  }
71 
72  ~TemporaryDir() {
73  QDir dir( m_dirName );
74  QFileInfoList entries = dir.entryInfoList( QDir::Files );
75  foreach ( const QFileInfo &file, entries ) {
76  QFile( file.absoluteFilePath() ).remove();
77  }
78  dir.rmdir( dir.absolutePath() );
79  }
80 
81  QString dirName() const
82  {
83  return m_dirName;
84  }
85 private:
86  QString m_dirName;
87 };
88 
89 QByteArray RoutinoRunnerPrivate::retrieveWaypoints( const QStringList &params ) const
90 {
91  TemporaryDir dir;
92  QProcess routinoProcess;
93  routinoProcess.setWorkingDirectory( dir.dirName() );
94 
95  QStringList routinoParams;
96  routinoParams << params;
97  routinoParams << "--dir=" + m_mapDir.absolutePath();
98  routinoParams << "--output-text-all";
99  mDebug() << routinoParams;
100  routinoProcess.start( "routino-router", routinoParams );
101  if ( !routinoProcess.waitForStarted( 5000 ) ) {
102  mDebug() << "Couldn't start routino-router from the current PATH. Install it to retrieve routing results from routino.";
103  return 0;
104  }
105 
106  if ( routinoProcess.waitForFinished(60 * 1000) ) {
107  mDebug() << routinoProcess.readAll();
108  mDebug() << "routino finished";
109  QFile file( routinoProcess.workingDirectory() + "/shortest-all.txt" );
110  if ( !file.exists() ) {
111  file.setFileName( routinoProcess.workingDirectory() + "/quickest-all.txt" );
112  }
113  if ( !file.exists() ) {
114  mDebug() << "Can't get results";
115  } else {
116  file.open( QIODevice::ReadOnly );
117  return file.readAll();
118  }
119  }
120  else {
121  mDebug() << "Couldn't stop routino";
122  }
123  return 0;
124 }
125 
126 GeoDataLineString* RoutinoRunnerPrivate::parseRoutinoOutput( const QByteArray &content ) const
127 {
128  GeoDataLineString* routeWaypoints = new GeoDataLineString;
129 
130  QStringList lines = QString::fromUtf8( content ).split( '\n' );
131  mDebug() << lines.count() << "lines";
132  foreach( const QString &line, lines ) {
133  if ( line.left(1) == QString('#') ) {
134  //skip comment
135  continue;
136  }
137  QStringList fields = line.split('\t');
138  if ( fields.size() >= 10 ) {
139  qreal lon = fields.at(1).trimmed().toDouble();
140  qreal lat = fields.at(0).trimmed().toDouble();
141  GeoDataCoordinates coordinates( lon, lat, 0.0, GeoDataCoordinates::Degree );
142  routeWaypoints->append( coordinates );
143  }
144  }
145 
146  return routeWaypoints;
147 }
148 
149 QVector<GeoDataPlacemark*> RoutinoRunnerPrivate::parseRoutinoInstructions( const QByteArray &content ) const
150 {
151  QVector<GeoDataPlacemark*> result;
152  QTextStream stream( content );
153  stream.setCodec("UTF8");
154  stream.setAutoDetectUnicode( true );
155 
156  RoutingInstructions directions = InstructionTransformation::process( m_parser.parse( stream ) );
157  for( int i=0; i<directions.size(); ++i ) {
158  GeoDataPlacemark* placemark = new GeoDataPlacemark( directions[i].instructionText() );
159  GeoDataExtendedData extendedData;
160  GeoDataData turnType;
161  turnType.setName( "turnType" );
162  turnType.setValue( qVariantFromValue<int>( int( directions[i].turnType() ) ) );
163  extendedData.addValue( turnType );
164  GeoDataData roadName;
165  roadName.setName( "roadName" );
166  roadName.setValue( directions[i].roadName() );
167  extendedData.addValue( roadName );
168  placemark->setExtendedData( extendedData );
169  Q_ASSERT( !directions[i].points().isEmpty() );
170  GeoDataLineString* geometry = new GeoDataLineString;
171  QVector<RoutingWaypoint> items = directions[i].points();
172  for (int j=0; j<items.size(); ++j ) {
173  RoutingPoint point = items[j].point();
174  GeoDataCoordinates coordinates( point.lon(), point.lat(), 0.0, GeoDataCoordinates::Degree );
175  geometry->append( coordinates );
176  }
177  placemark->setGeometry( geometry );
178  result.push_back( placemark );
179  }
180 
181  return result;
182 }
183 
184 GeoDataDocument* RoutinoRunnerPrivate::createDocument( GeoDataLineString* routeWaypoints, const QVector<GeoDataPlacemark*> instructions ) const
185 {
186  if ( !routeWaypoints || routeWaypoints->isEmpty() ) {
187  return 0;
188  }
189 
190  GeoDataDocument* result = new GeoDataDocument();
191  GeoDataPlacemark* routePlacemark = new GeoDataPlacemark;
192  routePlacemark->setName( "Route" );
193  routePlacemark->setGeometry( routeWaypoints );
194  result->append( routePlacemark );
195 
196  QString name = "%1 %2 (Routino)";
197  QString unit = QLatin1String( "m" );
198  qreal length = routeWaypoints->length( EARTH_RADIUS );
199  if (length >= 1000) {
200  length /= 1000.0;
201  unit = "km";
202  }
203  result->setName( name.arg( length, 0, 'f', 1 ).arg( unit ) );
204 
205  foreach( GeoDataPlacemark* placemark, instructions )
206  {
207  result->append( placemark );
208  }
209 
210  return result;
211 }
212 
213 RoutinoRunner::RoutinoRunner( QObject *parent ) :
214  RoutingRunner( parent ),
215  d( new RoutinoRunnerPrivate )
216 {
217  // Check installation
218  d->m_mapDir = QDir( MarbleDirs::localPath() + "/maps/earth/routino/" );
219 }
220 
221 RoutinoRunner::~RoutinoRunner()
222 {
223  delete d;
224 }
225 
226 void RoutinoRunner::retrieveRoute( const RouteRequest *route )
227 {
228  mDebug();
229 
230  if ( ! QFileInfo( d->m_mapDir, "nodes.mem" ).exists() )
231  {
232  emit routeCalculated( 0 );
233  return;
234  }
235 
236  QStringList params;
237  for( int i=0; i<route->size(); ++i )
238  {
239  double fLon = route->at(i).longitude( GeoDataCoordinates::Degree );
240  double fLat = route->at(i).latitude( GeoDataCoordinates::Degree );
241  params << QString("--lat%1=%2").arg(i+1).arg(fLat, 0, 'f', 8);
242  params << QString("--lon%1=%2").arg(i+1).arg(fLon, 0, 'f', 8);
243  }
244 
245  QHash<QString, QVariant> settings = route->routingProfile().pluginSettings()["routino"];
246  QString transport = settings["transport"].toString();
247  params << QString( "--transport=%0" ).arg( transport );
248 
249  if ( settings["method"] == "shortest" ) {
250  params << "--shortest";
251  } else {
252  params << "--quickest";
253  }
254  /*
255  if ( route->avoidFeatures() & RouteRequest::AvoidHighway ) {
256  params << "--highway-motorway=0";
257  }
258  */
259 
260  QByteArray output = d->retrieveWaypoints( params );
261  GeoDataLineString* wayPoints = d->parseRoutinoOutput( output );
262  QVector<GeoDataPlacemark*> instructions = d->parseRoutinoInstructions( output );
263 
264  GeoDataDocument* result = d->createDocument( wayPoints, instructions );
265  mDebug() << this << "routeCalculated";
266  emit routeCalculated( result );
267 }
268 
269 } // namespace Marble
270 
271 #include "RoutinoRunner.moc"
GeoDataDocument.h
Marble::RouteRequest::size
int size() const
Number of points in the route.
Definition: RouteRequest.cpp:126
RoutingModel.h
Marble::GeoDataDocument
A container for Features, Styles and in the future Schemas.
Definition: GeoDataDocument.h:64
Marble::WaypointParser::RoadName
Definition: WaypointParser.h:33
Marble::RoutinoRunner::RoutinoRunner
RoutinoRunner(QObject *parent=0)
Definition: RoutinoRunner.cpp:213
MarbleModel.h
This file contains the headers for MarbleModel.
Marble::RoutinoRunner::retrieveRoute
virtual void retrieveRoute(const RouteRequest *request)
Start a route download orw calculation.
Definition: RoutinoRunner.cpp:226
Marble::RoutinoRunner::~RoutinoRunner
~RoutinoRunner()
Definition: RoutinoRunner.cpp:221
Marble::MarbleDirs::localPath
static QString localPath()
Definition: MarbleDirs.cpp:217
GeoDataExtendedData.h
Marble::RoutingInstructions
QVector< RoutingInstruction > RoutingInstructions
Definition: RoutingInstruction.h:157
Marble::GeoDataCoordinates::latitude
qreal latitude(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
retrieves the latitude of the GeoDataCoordinates object use the unit parameter to switch between Radi...
Definition: GeoDataCoordinates.cpp:751
QObject
InstructionTransformation.h
MarbleDebug.h
Marble::GeoDataCoordinates::Degree
Definition: GeoDataCoordinates.h:66
Marble::RouteRequest
Points to be included in a route.
Definition: RouteRequest.h:31
Marble::RouteRequest::routingProfile
RoutingProfile routingProfile() const
Definition: RouteRequest.cpp:321
MarbleMap.h
This file contains the headers for MarbleMap.
RoutingManager.h
Marble::EARTH_RADIUS
const qreal EARTH_RADIUS
Definition: MarbleGlobal.h:238
Marble::InstructionTransformation::process
static RoutingInstructions process(const RoutingWaypoints &waypoints)
Transforms waypoints and metadata into driving directions.
Definition: InstructionTransformation.cpp:18
MarbleDirs.h
WaypointParser.h
Marble::GeoDataLineString
A LineString that allows to store a contiguous set of line segments.
Definition: GeoDataLineString.h:75
Marble::GeoDataCoordinates::longitude
qreal longitude(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
retrieves the longitude of the GeoDataCoordinates object use the unit parameter to switch between Rad...
Definition: GeoDataCoordinates.cpp:739
Marble::RoutingProfile::pluginSettings
const QHash< QString, QHash< QString, QVariant > > & pluginSettings() const
Definition: RoutingProfile.cpp:33
Marble::RoutingRunner::routeCalculated
void routeCalculated(GeoDataDocument *route)
Route download/calculation is finished, result in the given route object.
Marble::RoutingRunner
Definition: RoutingRunner.h:27
RouteRequest.h
RoutinoRunner.h
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:31
RoutingProfilesModel.h
Marble::RouteRequest::at
GeoDataCoordinates at(int index) const
Accessor for the n-th position.
Definition: RouteRequest.cpp:149
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:38:52 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • kstars
  • libkdeedu
  •   keduvocdocument
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal