+++ /dev/null
-#include "qgeopositioninfo.h"
+++ /dev/null
-#include "qgeopositioninfosource.h"
+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QGEOCOORDINATE_H
-#define QGEOCOORDINATE_H
-
-#include "qmobilityglobal.h"
-
-#include <QString>
-
-QT_BEGIN_NAMESPACE
-class QDebug;
-class QDataStream;
-QT_END_NAMESPACE
-
-QT_BEGIN_HEADER
-
-QTM_BEGIN_NAMESPACE
-
-class QGeoCoordinatePrivate;
-class Q_LOCATION_EXPORT QGeoCoordinate
-{
-public:
- enum CoordinateType {
- InvalidCoordinate,
- Coordinate2D,
- Coordinate3D
- };
-
- enum CoordinateFormat {
- Degrees,
- DegreesWithHemisphere,
- DegreesMinutes,
- DegreesMinutesWithHemisphere,
- DegreesMinutesSeconds,
- DegreesMinutesSecondsWithHemisphere
- };
-
- QGeoCoordinate();
- QGeoCoordinate(double latitude, double longitude);
- QGeoCoordinate(double latitude, double longitude, double altitude);
- QGeoCoordinate(const QGeoCoordinate &other);
- ~QGeoCoordinate();
-
- QGeoCoordinate &operator=(const QGeoCoordinate &other);
-
- bool operator==(const QGeoCoordinate &other) const;
- inline bool operator!=(const QGeoCoordinate &other) const {
- return !operator==(other);
- }
-
- bool isValid() const;
- CoordinateType type() const;
-
- void setLatitude(double latitude);
- double latitude() const;
-
- void setLongitude(double longitude);
- double longitude() const;
-
- void setAltitude(double altitude);
- double altitude() const;
-
- qreal distanceTo(const QGeoCoordinate &other) const;
- qreal azimuthTo(const QGeoCoordinate &other) const;
-
- QString toString(CoordinateFormat format = DegreesMinutesSecondsWithHemisphere) const;
-
-private:
- QGeoCoordinatePrivate *d;
-};
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_LOCATION_EXPORT QDebug operator<<(QDebug, const QGeoCoordinate &);
-#endif
-
-#ifndef QT_NO_DATASTREAM
-Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoCoordinate &coordinate);
-Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoCoordinate &coordinate);
-#endif
-
-QTM_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif
+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QGEOPOSITIONINFO_H
-#define QGEOPOSITIONINFO_H
-
-#include "qmobilityglobal.h"
-#include "qgeocoordinate.h"
-
-#include <QDateTime>
-
-QT_BEGIN_NAMESPACE
-class QDebug;
-class QDataStream;
-QT_END_NAMESPACE
-
-QT_BEGIN_HEADER
-
-QTM_BEGIN_NAMESPACE
-
-class QGeoPositionInfoPrivate;
-class Q_LOCATION_EXPORT QGeoPositionInfo
-{
-public:
- enum Attribute {
- Direction,
- GroundSpeed,
- VerticalSpeed,
- MagneticVariation,
- HorizontalAccuracy,
- VerticalAccuracy
- };
-
- QGeoPositionInfo();
- QGeoPositionInfo(const QGeoCoordinate &coordinate, const QDateTime &updateTime);
- QGeoPositionInfo(const QGeoPositionInfo &other);
- ~QGeoPositionInfo();
-
- QGeoPositionInfo &operator=(const QGeoPositionInfo &other);
-
- bool operator==(const QGeoPositionInfo &other) const;
- inline bool operator!=(const QGeoPositionInfo &other) const {
- return !operator==(other);
- }
-
- bool isValid() const;
-
- void setDateTime(const QDateTime &dateTime);
- QDateTime dateTime() const;
-
- void setCoordinate(const QGeoCoordinate &coordinate);
- QGeoCoordinate coordinate() const;
-
- void setAttribute(Attribute attribute, qreal value);
- qreal attribute(Attribute attribute) const;
- void removeAttribute(Attribute attribute);
- bool hasAttribute(Attribute attribute) const;
-
-private:
-#ifndef QT_NO_DEBUG_STREAM
- friend Q_LOCATION_EXPORT QDebug operator<<(QDebug dbg, const QGeoPositionInfo &update);
-#endif
-#ifndef QT_NO_DATASTREAM
- friend Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &update);
- friend Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &update);
-#endif
- QGeoPositionInfoPrivate *d;
-};
-
-#ifndef QT_NO_DEBUG_STREAM
-Q_LOCATION_EXPORT QDebug operator<<(QDebug dbg, const QGeoPositionInfo &update);
-#endif
-
-#ifndef QT_NO_DATASTREAM
-Q_LOCATION_EXPORT QDataStream &operator<<(QDataStream &stream, const QGeoPositionInfo &update);
-Q_LOCATION_EXPORT QDataStream &operator>>(QDataStream &stream, QGeoPositionInfo &update);
-#endif
-
-QTM_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif
+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QGEOPOSITIONINFOSOURCE_H
-#define QGEOPOSITIONINFOSOURCE_H
-
-#include "qmobilityglobal.h"
-#include "qgeopositioninfo.h"
-
-#include <QObject>
-
-QT_BEGIN_HEADER
-
-QTM_BEGIN_NAMESPACE
-
-class QGeoPositionInfoSourcePrivate;
-class Q_LOCATION_EXPORT QGeoPositionInfoSource : public QObject
-{
- Q_OBJECT
- Q_PROPERTY(int updateInterval READ updateInterval WRITE setUpdateInterval)
- Q_PROPERTY(int minimumUpdateInterval READ minimumUpdateInterval)
-
-public:
- enum PositioningMethod {
- SatellitePositioningMethods = 0x000000ff,
- NonSatellitePositioningMethods = 0xffffff00,
- AllPositioningMethods = 0xffffffff
- };
- Q_DECLARE_FLAGS(PositioningMethods, PositioningMethod)
-
- explicit QGeoPositionInfoSource(QObject *parent);
- virtual ~QGeoPositionInfoSource();
-
- virtual void setUpdateInterval(int msec);
- int updateInterval() const;
-
- virtual void setPreferredPositioningMethods(PositioningMethods methods);
- PositioningMethods preferredPositioningMethods() const;
-
- virtual QGeoPositionInfo lastKnownPosition(bool fromSatellitePositioningMethodsOnly = false) const = 0;
-
- virtual PositioningMethods supportedPositioningMethods() const = 0;
- virtual int minimumUpdateInterval() const = 0;
-
- static QGeoPositionInfoSource *createDefaultSource(QObject *parent);
-
-public Q_SLOTS:
- virtual void startUpdates() = 0;
- virtual void stopUpdates() = 0;
-
- virtual void requestUpdate(int timeout = 0) = 0;
-
-Q_SIGNALS:
- void positionUpdated(const QGeoPositionInfo &update);
- void updateTimeout();
-
-private:
- Q_DISABLE_COPY(QGeoPositionInfoSource)
- QGeoPositionInfoSourcePrivate *d;
-};
-
-Q_DECLARE_OPERATORS_FOR_FLAGS(QGeoPositionInfoSource::PositioningMethods)
-
-QTM_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif
+++ /dev/null
-/****************************************************************************
-**
-** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
-** All rights reserved.
-** Contact: Nokia Corporation (qt-info@nokia.com)
-**
-** This file is part of the Qt Mobility Components.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** No Commercial Usage
-** This file contains pre-release code and may not be distributed.
-** You may use this file in accordance with the terms and conditions
-** contained in the Technology Preview License Agreement accompanying
-** this package.
-**
-** GNU Lesser General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU Lesser
-** General Public License version 2.1 as published by the Free Software
-** Foundation and appearing in the file LICENSE.LGPL included in the
-** packaging of this file. Please review the following information to
-** ensure the GNU Lesser General Public License version 2.1 requirements
-** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** If you have questions regarding the use of this file, please contact
-** Nokia at qt-info@nokia.com.
-**
-**
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-#ifndef QMOBILITYGLOBAL_H
-#define QMOBILITYGLOBAL_H
-
-
-#define QTM_VERSION_STR "1.0.0"
-/*
- QTM_VERSION is (major << 16) + (minor << 8) + patch.
-*/
-#define QTM_VERSION 0x010000
-/*
- can be used like #if (QTM_VERSION >= QTM_VERSION_CHECK(1, 0, 0))
-*/
-#define QTM_VERSION_CHECK(major, minor, patch) ((major<<16)|(minor<<8)|(patch))
-
-#define QTM_PACKAGEDATE_STR "YYYY-MM-DD"
-
-#define QTM_PACKAGE_TAG ""
-
-#if defined(QTM_BUILD_UNITTESTS)
-# include <qconfig.h>
-# if !defined(QT_BUILD_INTERNAL)
-# define QT_BUILD_INTERNAL
-# endif
-#endif
-#include <QtCore/qglobal.h>
-
-#if defined(SYMBIAN_DATABASEMANAGER_SERVER)
-# define Q_SERVICEFW_EXPORT
-#else
-# if defined(Q_OS_WIN) || defined(Q_OS_SYMBIAN)
-# if defined(QT_NODLL)
-# undef QT_MAKEDLL
-# undef QT_DLL
-# elif defined(QT_MAKEDLL)
-# if defined(QT_DLL)
-# undef QT_DLL
-# endif
-# if defined(QT_BUILD_BEARER_LIB)
-# define Q_BEARER_EXPORT Q_DECL_EXPORT
-# else
-# define Q_BEARER_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_CFW_LIB)
-# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_EXPORT
-# else
-# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_CONTACTS_LIB)
-# define Q_CONTACTS_EXPORT Q_DECL_EXPORT
-# else
-# define Q_CONTACTS_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_VERSIT_LIB)
-# define Q_VERSIT_EXPORT Q_DECL_EXPORT
-# else
-# define Q_VERSIT_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_LOCATION_LIB)
-# define Q_LOCATION_EXPORT Q_DECL_EXPORT
-# else
-# define Q_LOCATION_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_MESSAGING_LIB)
-# define Q_MESSAGING_EXPORT Q_DECL_EXPORT
-# else
-# define Q_MESSAGING_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_MEDIA_LIB)
-# define Q_MEDIA_EXPORT Q_DECL_EXPORT
-# else
-# define Q_MEDIA_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_SFW_LIB)
-# define Q_SERVICEFW_EXPORT Q_DECL_EXPORT
-# else
-# define Q_SERVICEFW_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_SYSINFO_LIB)
-# define Q_SYSINFO_EXPORT Q_DECL_EXPORT
-# else
-# define Q_SYSINFO_EXPORT Q_DECL_IMPORT
-# endif
-# if defined(QT_BUILD_SENSORS_LIB)
-# define Q_SENSORS_EXPORT Q_DECL_EXPORT
-# else
-# define Q_SENSORS_EXPORT Q_DECL_IMPORT
-# endif
-# elif defined(QT_DLL) /* use a Qt DLL library */
-# define Q_BEARER_EXPORT Q_DECL_IMPORT
-# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_IMPORT
-# define Q_CONTACTS_EXPORT Q_DECL_IMPORT
-# define Q_VERSIT_EXPORT Q_DECL_IMPORT
-# define Q_LOCATION_EXPORT Q_DECL_IMPORT
-# define Q_MEDIA_EXPORT Q_DECL_IMPORT
-# define Q_MESSAGING_EXPORT Q_DECL_IMPORT
-# define Q_SERVICEFW_EXPORT Q_DECL_IMPORT
-# define Q_SYSINFO_EXPORT Q_DECL_IMPORT
-# define Q_SENSORS_EXPORT Q_DECL_IMPORT
-# endif
-# else
-# endif
-# if !defined(Q_SERVICEFW_EXPORT)
-# if defined(QT_SHARED)
-# define Q_BEARER_EXPORT Q_DECL_EXPORT
-# define Q_PUBLISHSUBSCRIBE_EXPORT Q_DECL_EXPORT
-# define Q_CONTACTS_EXPORT Q_DECL_EXPORT
-# define Q_VERSIT_EXPORT Q_DECL_EXPORT
-# define Q_LOCATION_EXPORT Q_DECL_EXPORT
-# define Q_MEDIA_EXPORT Q_DECL_EXPORT
-# define Q_MESSAGING_EXPORT Q_DECL_EXPORT
-# define Q_SERVICEFW_EXPORT Q_DECL_EXPORT
-# define Q_SYSINFO_EXPORT Q_DECL_EXPORT
-# define Q_SENSORS_EXPORT Q_DECL_EXPORT
-# else
-# define Q_BEARER_EXPORT
-# define Q_PUBLISHSUBSCRIBE_EXPORT
-# define Q_CONTACTS_EXPORT
-# define Q_VERSIT_EXPORT
-# define Q_LOCATION_EXPORT
-# define Q_MEDIA_EXPORT
-# define Q_MESSAGING_EXPORT
-# define Q_SERVICEFW_EXPORT
-# define Q_SYSINFO_EXPORT
-# define Q_SENSORS_EXPORT
-# endif
-# endif
-#endif
-
-// The namespace is hardcoded as moc has issues resolving
-// macros which would be a prerequisite for a dynmamic namespace
-#define QTM_NAMESPACE QtMobility
-
-#ifdef QTM_NAMESPACE
-# define QTM_PREPEND_NAMESPACE(name) ::QTM_NAMESPACE::name
-# define QTM_BEGIN_NAMESPACE namespace QTM_NAMESPACE {
-# define QTM_END_NAMESPACE }
-# define QTM_USE_NAMESPACE using namespace QTM_NAMESPACE;
-#else
-# define QTM_PREPEND_NAMESPACE(name) ::name
-# define QTM_BEGIN_NAMESPACE
-# define QTM_END_NAMESPACE
-# define QTM_USE_NAMESPACE
-#endif
-
-//in case Qt is in namespace
-QT_USE_NAMESPACE
-
-#endif // QMOBILITYGLOBAL_H
--- /dev/null
+The Debian Package zouba
+----------------------------
+
+Comments regarding the Package
+
+ -- Max Waterman <davidmaxwaterman@jeeves> Tue, 31 May 2011 20:40:03 +0300
--- /dev/null
+zouba (0.0.1) unstable; urgency=low
+
+ * Initial Release.
+
+ -- Max Waterman <davidmaxwaterman@jeeves> Tue, 31 May 2011 20:40:03 +0300
--- /dev/null
+Source: zouba
+Section: user/hidden
+Priority: optional
+Maintainer: Max Waterman <davidmaxwaterman@jeeves>
+Build-Depends: debhelper (>= 5), libqt4-dev
+Standards-Version: 3.7.3
+Homepage: <insert the upstream URL, if relevant>
+
+Package: zouba
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends}
+Description: <insert up to 60 chars description>
+ <insert long description, indented with spaces>
+XB-Maemo-Display-Name: zouba
--- /dev/null
+This package was debianized by Max Waterman <davidmaxwaterman@jeeves> on
+Tue, 31 May 2011 20:40:03 +0300.
+
+It was downloaded from <url://example.com>
+
+Upstream Author(s):
+
+ <put author's name and email here>
+ <likewise for another author>
+
+Copyright:
+
+ <Copyright (C) YYYY Name OfAuthor>
+ <likewise for another author>
+
+License:
+
+ This package is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This package is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this package; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+
+On Debian systems, the complete text of the GNU General
+Public License can be found in `/usr/share/common-licenses/GPL'.
+
+The Debian packaging is (C) 2011, Max Waterman <davidmaxwaterman@jeeves> and
+is licensed under the GPL, see above.
+
+
+# Please also look if there are files or directories which have a
+# different copyright/license attached and list them here.
--- /dev/null
+#!/usr/bin/make -f
+# -*- makefile -*-
+# Sample debian/rules that uses debhelper.
+# This file was originally written by Joey Hess and Craig Small.
+# As a special exception, when this file is copied by dh-make into a
+# dh-make output file, you may use that output file without restriction.
+# This special exception was added by Craig Small in version 0.37 of dh-make.
+
+# Uncomment this to turn on verbose mode.
+#export DH_VERBOSE=1
+
+
+
+
+
+configure: configure-stamp
+configure-stamp:
+ dh_testdir
+ # qmake PREFIX=/usr# Uncomment this line for use without Qt Creator
+
+ touch configure-stamp
+
+
+build: build-stamp
+
+build-stamp: configure-stamp
+ dh_testdir
+
+ # Add here commands to compile the package.
+ # $(MAKE) # Uncomment this line for use without Qt Creator
+ #docbook-to-man debian/zouba.sgml > zouba.1
+
+ touch $@
+
+clean:
+ dh_testdir
+ dh_testroot
+ rm -f build-stamp configure-stamp
+
+ # Add here commands to clean up after the build process.
+ $(MAKE) clean
+
+ dh_clean
+
+install: build
+ dh_testdir
+ dh_testroot
+ dh_clean -k
+ dh_installdirs
+
+ # Add here commands to install the package into debian/zouba.
+ $(MAKE) INSTALL_ROOT="$(CURDIR)"/debian/zouba install
+
+
+# Build architecture-independent files here.
+binary-indep: build install
+# We have nothing to do by default.
+
+# Build architecture-dependent files here.
+binary-arch: build install
+ dh_testdir
+ dh_testroot
+ dh_installchangelogs
+ dh_installdocs
+ dh_installexamples
+# dh_install
+# dh_installmenu
+# dh_installdebconf
+# dh_installlogrotate
+# dh_installemacsen
+# dh_installpam
+# dh_installmime
+# dh_python
+# dh_installinit
+# dh_installcron
+# dh_installinfo
+ dh_installman
+ dh_link
+ dh_strip
+ dh_compress
+ dh_fixperms
+# dh_perl
+# dh_makeshlibs
+ dh_installdeb
+ # dh_shlibdeps # Uncomment this line for use without Qt Creator
+ dh_gencontrol
+ dh_md5sums
+ dh_builddeb
+
+binary: binary-indep binary-arch
+.PHONY: build clean binary-indep binary-arch binary install configure
#include <QDebug>
GpsController::GpsController() :
- q( new GpsControllerPrivate() )
+ q(new GpsControllerPrivate())
{
- q->init();
- q->startGps();
+ q->init();
+ q->startGps();
+
+ connect(q, SIGNAL(locationChanged(Location*)), SIGNAL(locationChanged(Location*)));
}
-GpsController::GpsController( GpsControllerPrivate *gpsControllerPrivate ) :
- q( gpsControllerPrivate )
+GpsController::GpsController(GpsControllerPrivate *gpsControllerPrivate) :
+ q(gpsControllerPrivate)
{
- q->init();
- q->startGps();
+ q->init();
+ q->startGps();
+
+ connect(q, SIGNAL(locationChanged(Location*)), SIGNAL(locationChanged(Location*)));
}
GpsController::~GpsController()
{
- delete q;
+ delete q;
}
void GpsController::getGps()
{
- Location *location;
- Location *previousLocation = q->mostRecentlyReportedLocation();
+ qDebug() << Q_FUNC_INFO;
+ Location *location;
- if ( q->useFakeLocation() ) {
- location = q->fakeLocation();
- } else {
- location = q->liveLocation();
- }
+ if (q->useFakeLocation()) {
+ location = q->fakeLocation();
+ } else {
+ location = q->liveLocation();
+ }
- if ( location != previousLocation ) {
- emit locationChanged( location );
- }
+ if (location->isValid()) {
+ emit locationChanged(location);
+ }
}
void GpsController::useLiveGps()
{
- q->setUseFakeLocation( false );
- q->startGps();
- emit locationChanged( q->liveLocation() );
+ q->setUseFakeLocation(false);
+ q->startGps();
+ emit locationChanged(q->liveLocation());
}
-void GpsController::useFakeGps( const QString &fakeLocationLabel )
+void GpsController::useFakeGps(const QString &fakeLocationLabel)
{
- qDebug() << "using fake gps (" << fakeLocationLabel << ")";
+ qDebug() << "using fake gps (" << fakeLocationLabel << ")";
- q->setFakeLocationLabel( fakeLocationLabel );
- Location *fakeLocation = q->fakeLocation();
+ q->setFakeLocationLabel(fakeLocationLabel);
+ Location *fakeLocation = q->fakeLocation();
- if ( fakeLocation == 0 ) {
- qDebug() << "invalid fake location label; cannot use fake location";
- } else {
- q->stopGps();
- q->setUseFakeLocation( true );
- emit locationChanged( fakeLocation );
- }
+ if (fakeLocation == 0) {
+ qDebug() << "invalid fake location label; cannot use fake location";
+ } else {
+ q->stopGps();
+ q->setUseFakeLocation(true);
+ emit locationChanged(fakeLocation);
+ }
}
class GpsController : public QObject
{
- Q_OBJECT
+ Q_OBJECT
-public:
- GpsController();
- GpsController( GpsControllerPrivate *gpsControllerPrivate );
+ public:
+ GpsController();
+ GpsController(GpsControllerPrivate *gpsControllerPrivate);
- ~GpsController();
+ ~GpsController();
-public Q_SLOTS:
- void getGps();
- void useFakeGps( const QString &fakeLocationLabel );
- void useLiveGps();
+ public Q_SLOTS:
+ void getGps();
+ void useFakeGps(const QString &fakeLocationLabel);
+ void useLiveGps();
-Q_SIGNALS:
- void locationChanged( Location *newLocation );
+ Q_SIGNALS:
+ void locationChanged(Location *newLocation);
-private:
+ private:
GpsControllerPrivate *q;
};
QTM_USE_NAMESPACE
GpsControllerPrivate::GpsControllerPrivate() :
- m_gps(0),
- m_liveLocation( new Location( "livegps" ) ),
- m_fakeLocationLabel(),
- m_useFakeLocation(false)
+ m_gps(0),
+ m_liveLocation(new Location("livegps")),
+ m_fakeLocationLabel(),
+ m_useFakeLocation(false)
{
}
GpsControllerPrivate::~GpsControllerPrivate()
{
- delete m_gps;
- m_gps = 0;
- delete m_liveLocation;
- m_liveLocation = 0;
+ delete m_gps;
+ m_gps = 0;
+ delete m_liveLocation;
+ m_liveLocation = 0;
}
void GpsControllerPrivate::init()
{
- m_gps = QGeoPositionInfoSource::createDefaultSource(this);
- connect(
- m_gps, SIGNAL( positionUpdated( QGeoPositionInfo ) ),
- this, SLOT( updateLocation( QGeoPositionInfo ) )
- );
+ m_gps = QGeoPositionInfoSource::createDefaultSource(this);
+ connect(
+ m_gps, SIGNAL(positionUpdated(QGeoPositionInfo)),
+ this, SLOT(updateLocation(QGeoPositionInfo))
+ );
}
void GpsControllerPrivate::startGps()
{
- m_gps->startUpdates();
+ m_gps->startUpdates();
}
void GpsControllerPrivate::stopGps()
{
- m_gps->stopUpdates();
+ m_gps->stopUpdates();
}
QGeoPositionInfoSource *GpsControllerPrivate::gps()
{
- return m_gps;
+ return m_gps;
}
-void GpsControllerPrivate::setGps( QGeoPositionInfoSource *gps )
+void GpsControllerPrivate::setGps(QGeoPositionInfoSource *gps)
{
- m_gps = gps;
+ m_gps = gps;
}
Location *GpsControllerPrivate::liveLocation()
{
- m_mostRecentlyReportedLocation = m_liveLocation;
- return m_liveLocation;
+ m_mostRecentlyReportedLocation = m_liveLocation;
+ return m_liveLocation;
}
Location *GpsControllerPrivate::fakeLocation()
{
- Locations locations;
- Location *location = locations.location( fakeLocationLabel() );
- m_mostRecentlyReportedLocation = location;
- return location;
+ Locations locations;
+ Location *location = locations.location(fakeLocationLabel());
+ m_mostRecentlyReportedLocation = location;
+ return location;
}
QString GpsControllerPrivate::fakeLocationLabel()
{
- return m_fakeLocationLabel;
+ return m_fakeLocationLabel;
}
-void GpsControllerPrivate::setFakeLocationLabel( const QString &label )
+void GpsControllerPrivate::setFakeLocationLabel(const QString &label)
{
- m_fakeLocationLabel = label;
+ m_fakeLocationLabel = label;
}
bool GpsControllerPrivate::useFakeLocation()
{
- return m_useFakeLocation;
+ return m_useFakeLocation;
}
-void GpsControllerPrivate::setUseFakeLocation( bool useFake )
+void GpsControllerPrivate::setUseFakeLocation(bool useFake)
{
- m_useFakeLocation = useFake;
+ m_useFakeLocation = useFake;
}
-void GpsControllerPrivate::updateLocation( QGeoPositionInfo positionInfo )
+void GpsControllerPrivate::updateLocation(QGeoPositionInfo positionInfo)
{
- m_liveLocation->setLocation( positionInfo );
+ qDebug() << Q_FUNC_INFO;
+ bool wasInvalid = !m_liveLocation->isValid();
+ qDebug() << "wasInvalid/" << wasInvalid;
+
+ m_liveLocation->setLocation(positionInfo);
+ if (wasInvalid) {
+ emit locationChanged(m_liveLocation);
+ }
}
Location *GpsControllerPrivate::mostRecentlyReportedLocation()
{
- return m_mostRecentlyReportedLocation;
+ return m_mostRecentlyReportedLocation;
}
virtual void startGps();
virtual void stopGps();
- virtual void setGps( QGeoPositionInfoSource *gps );
- virtual void setFakeLocationLabel( const QString &label );
- virtual void setUseFakeLocation( bool useFake );
+ virtual void setGps(QGeoPositionInfoSource *gps);
+ virtual void setFakeLocationLabel(const QString &label);
+ virtual void setUseFakeLocation(bool useFake);
virtual QGeoPositionInfoSource *gps();
virtual Location *liveLocation();
virtual QString fakeLocationLabel();
virtual bool useFakeLocation();
+Q_SIGNALS:
+ void locationChanged(Location *newlocation);
+
private Q_SLOTS:
- virtual void updateLocation( QGeoPositionInfo positionInfo );
+ virtual void updateLocation(QGeoPositionInfo positionInfo);
private:
QGeoPositionInfoSource *m_gps;
#include <QStringRef>
#include <QGeoPositionInfo>
-#include <math.h>
-
-const double Location::KkjZoneInfo[6][2] = {
- {18.0, 500000.0},
- {21.0, 1500000.0},
- {24.0, 2500000.0},
- {27.0, 3500000.0},
- {30.0, 4500000.0},
- {33.0, 5500000.0}
-};
-
QTM_USE_NAMESPACE
-Location::Location( const QString &x, const QString &y, const QString &label ) :
- q( new LocationPrivate( x, y, label ) ),
- manager( new QNetworkAccessManager(this) )
+Location::Location(const QString &x, const QString &y, const QString &label) :
+ q(new LocationPrivate(x, y, label)),
+ manager(new QNetworkAccessManager(this))
{
- connect(
- manager, SIGNAL( finished(QNetworkReply*) ),
- this, SLOT( replyFinished(QNetworkReply*) )
- );
+ connect(
+ manager, SIGNAL(finished(QNetworkReply*)),
+ this, SLOT(replyFinished(QNetworkReply*))
+ );
}
-Location::Location( const QGeoPositionInfo &positionInfo, const QString &label ) :
- q( new LocationPrivate( label ) ),
- manager(0)
+Location::Location(const QGeoPositionInfo &positionInfo, const QString &label) :
+ q(new LocationPrivate(label)),
+ manager(0)
{
- setLocation( positionInfo );
+ setLocation(positionInfo);
}
-void Location::setLocation( const QGeoPositionInfo &positionInfo )
+void Location::setLocation(const QGeoPositionInfo &positionInfo)
{
- qreal latitude = positionInfo.coordinate().latitude();
- qreal longitude = positionInfo.coordinate().longitude();
+ double latitude = positionInfo.coordinate().latitude();
+ double longitude = positionInfo.coordinate().longitude();
- KKJ outX(0);
- KKJ outY(0);
+ qDebug() << "GPS Location/" << longitude << latitude;
- WGS84lola_to_KKJxy( longitude, latitude, &outX, &outY);
-
- q->setX( outX );
- q->setY( outY );
- q->setValid( true );
+ q->setLongitude(longitude);
+ q->setlatitude(latitude);
+ q->setValid(true);
}
-Location::Location( const Location &from ) :
- QObject(0),
- q( new LocationPrivate( from.label() ) ),
- manager(0)
+Location::Location(const Location &from) :
+ QObject(0),
+ q(new LocationPrivate(from.label())),
+ manager(0)
{
- q->setAddress( from.address() );
- q->setX( from.x() );
- q->setY( from.y() );
- q->setValid( from.isValid() );
- if ( from.manager != 0 ) {
- manager = new QNetworkAccessManager(this);
- connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
- }
+ q->setAddress(from.address());
+ q->setLongitude(from.longitude());
+ q->setlatitude(from.latitude());
+ q->setValid(from.isValid());
+ if (from.manager != 0) {
+ manager = new QNetworkAccessManager(this);
+ connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
+ }
}
-Location::Location( const QString &label ) :
- q( new LocationPrivate( label ) ),
- manager( new QNetworkAccessManager(this) )
+Location::Location(const QString &label) :
+ q(new LocationPrivate(label)),
+ manager(new QNetworkAccessManager(this))
{
- connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
+ connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}
Location::~Location()
{
- delete q;
- q=0;
- delete manager;
- manager=0;
-}
-
-Location &Location::operator=( const Location &from )
-{
- q = new LocationPrivate( from.label() );
- q->setAddress( from.address() );
- q->setX( from.x() );
- q->setY( from.y() );
- q->setValid( from.isValid() );
-
- if ( from.manager != 0 ) {
- manager = new QNetworkAccessManager(this);
- connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
- } else {
- manager = 0;
- }
-
- return *this;
-}
-
-void Location::resolveAddress( const QString &address )
-{
- qDebug() << "resolving address (" << address << ")";
-
- q->setAddress( address );
- q->setValid( false );
-
- QUrl fullUrl( Ytv::Url );
-
- fullUrl.addEncodedQueryItem( "key", address.toAscii().toPercentEncoding() );
- fullUrl.addQueryItem( "user", Ytv::Username );
- fullUrl.addQueryItem( "pass", Ytv::Password );
-
- manager->get( QNetworkRequest( fullUrl ) );
- qDebug() << "waiting for reply from Ytv";
- emit( busy( true ) );
+ delete q;
+ q=0;
+ delete manager;
+ manager=0;
}
-void Location::replyFinished( QNetworkReply * reply )
+Location &Location::operator=(const Location &from)
{
- qDebug() << "address resolved";
- q->parseReply( reply->readAll() );
+ q = new LocationPrivate(from.label());
+ q->setAddress(from.address());
+ q->setLongitude(from.longitude());
+ q->setlatitude(from.latitude());
+ q->setValid(from.isValid());
- if ( isValid() ) {
- qDebug() << label() << "becomeValid";
- emit( becomeValid() );
- } else {
- qDebug() << label() << "not valid";
- emit( becomeInValid() );
- }
+ if (from.manager != 0) {
+ manager = new QNetworkAccessManager(this);
+ connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
+ } else {
+ manager = 0;
+ }
- emit( busy( false ) );
+ return *this;
}
-QString Location::x() const
+void Location::resolveAddress(const QString &address)
{
- return q->x();
-}
+ qDebug() << "resolving address (" << address << ")";
-QString Location::y() const
-{
- return q->y();
-}
+ q->setAddress(address);
+ q->setValid(false);
-void Location::setLabel( const QString &label ) const
-{
- q->setLabel( label );
-}
+ QUrl fullUrl(Ytv::Url);
+ QByteArray encodedAddress = QUrl::toPercentEncoding(address);
+ qDebug() << "encodedAddress/" << encodedAddress;
-QString Location::label() const
-{
- return q->label();
-}
+ fullUrl.addQueryItem("user", Ytv::Username);
+ fullUrl.addQueryItem("pass", Ytv::Password);
+ fullUrl.addEncodedQueryItem("key", encodedAddress);
+ fullUrl.addQueryItem("request", Ytv::Geocode);
+ fullUrl.addQueryItem("format", Ytv::Xml);
+ fullUrl.addQueryItem("language", Ytv::English);
+ fullUrl.addQueryItem("epsg_out", Ytv::WGS84);
-void Location::setAddress( const QString &address ) const
-{
- qDebug() << "setting address to" << address;
- q->setAddress( address );
+ qDebug() << "resolveAddress/" << address << "/" << fullUrl;
+ manager->get(QNetworkRequest(fullUrl));
+ qDebug() << "waiting for reply from Ytv";
+ emit busy(true);
}
-QString Location::address() const
+void Location::replyFinished(QNetworkReply * reply)
{
- return q->address();
-}
+ qDebug() << "address resolved";
+ q->parseReply(reply->readAll());
-bool Location::isValid() const
-{
- return q->isValid();
-}
+ if (isValid()) {
+ qDebug() << label() << "becomeValid";
+ emit becomeValid();
+ } else {
+ qDebug() << label() << "not valid";
+ emit becomeInValid();
+ }
-// Degrees to radians
-double Location::radians(double deg)
-{
- return deg * M_PI / 180.0;
+ emit(busy(false));
}
-// Radians to degrees
-double Location::degrees(double rad)
+QString Location::longitude() const
{
- return rad * 180.0 / M_PI;
+ return q->longitude();
}
-// Function: KKJ_Zone_I
-int Location::KKJ_Zone_I(KKJ easting)
+QString Location::latitude() const
{
- int zoneNumber = floor(easting / 1000000.0);
- if (zoneNumber < 0 || zoneNumber > 5) {
- zoneNumber = -1;
- }
-
- return zoneNumber;
+ return q->latitude();
}
-// Function: KKJ_Zone_Lo
-int Location::KKJ_Zone_Lo(double kkjlo)
+void Location::setLabel(const QString &label) const
{
- // determine the zonenumber from KKJ easting
- // takes KKJ zone which has center meridian
- // longitude nearest (in math value) to
- // the given KKJ longitude
- int zoneNumber = 5;
- while (zoneNumber >= 0) {
- if (fabs(kkjlo - KkjZoneInfo[zoneNumber][0]) <= 1.5) {
- break;
- }
- zoneNumber--;
- }
-
- return zoneNumber;
+ q->setLabel(label);
}
-
-// Function: KKJlalo_to_WGS84lalo
-void Location::KKJlola_to_WGS84lola(double kkjlo, double kkjla, double *outLongitude, double *outLatitude)
+void Location::setValid(bool valid) const
{
- double dLa = radians(0.124867E+01 + -0.269982E+00 * kkjla + 0.191330E+00 * kkjlo + 0.356119E-02 * kkjla * kkjla + -0.122312E-02 * kkjla * kkjlo + -0.335514E-03 * kkjlo * kkjlo) / 3600.0;
- double dLo = radians(-0.286111E+02 + 0.114183E+01 * kkjla + -0.581428E+00 * kkjlo + -0.152421E-01 * kkjla * kkjla + 0.118177E-01 * kkjla * kkjlo + 0.826646E-03 * kkjlo * kkjlo) / 3600.0;
-
- *outLatitude = degrees(radians(kkjla) + dLa);
- *outLongitude = degrees(radians(kkjlo) + dLo);
+ q->setValid(valid);
}
-
-// Function: WGS84lalo_to_KKJlalo
-void Location::WGS84lola_to_KKJlola(double longitude, double latitude, double *outLongitude, double *outLatitude)
+QString Location::label() const
{
- double dLa = radians(-0.124766E+01 + 0.269941E+00 * latitude + -0.191342E+00 * longitude + -0.356086E-02 * latitude * latitude + 0.122353E-02 * latitude * longitude + 0.335456E-03 * longitude * longitude) / 3600.0;
- double dLo = radians(0.286008E+02 + -0.114139E+01 * latitude + 0.581329E+00 * longitude + 0.152376E-01 * latitude * latitude + -0.118166E-01 * latitude * longitude + -0.826201E-03 * longitude * longitude) / 3600.0;
-
- *outLatitude = degrees(radians(latitude) + dLa);
- *outLongitude = degrees(radians(longitude) + dLo);
+ return q->label();
}
-
-// Function: KKJlalo_to_KKJxy
-void Location::KKJlola_to_KKJxy(double lon, double lat, int zoneNumber, KKJ *outX, KKJ *outY)
+void Location::setAddress(const QString &address) const
{
- // Hayford ellipsoid
- double a = 6378388.0;
- double f = 1.0 / 297.0;
- double b = (1.0 - f) * a;
- double bb = b * b;
- double c = (a / b) * a;
- double ee = (a * a - bb) / bb;
- double n = (a - b) / (a + b);
- double nn = n * n;
-
- double Lo = radians(lon) - radians(KkjZoneInfo[zoneNumber][0]);
- double cosLa = cos(radians(lat));
- double NN = ee * cosLa * cosLa;
- double LaF = atan(tan(radians(lat)) / cos(Lo * sqrt(1.0 + NN)));
- double cosLaF = cos(LaF);
- double t = (tan(Lo) * cosLaF) / sqrt(1.0 + ee * cosLaF * cosLaF);
- double A = a / (1.0 + n);
- double A1 = A * (1.0 + nn / 4.0 + nn * nn / 64.0);
- double A2 = A * 1.5 * n * (1.0 - nn / 8.0);
- double A3 = A * 0.9375 * nn * (1.0 - nn / 4.0);
- double A4 = A * 35.0 / 48.0 * nn * n;
-
- *outY = A1 * LaF - A2 * sin(2.0 * LaF) + A3 * sin(4.0 * LaF) - A4 * sin(6.0 * LaF);
- *outX = c * log(t + sqrt(1.0 + t * t)) + 500000.0 + zoneNumber * 1000000.0;
+ qDebug() << "setting address to" << address;
+ q->setAddress(address);
}
-// Function: KKJxy_to_KKJlalo
-void Location::KKJxy_to_KKJlola(KKJ x, KKJ y, double *outLongitude, double *outLatitude)
-{
- // Scan iteratively the target area, until find matching
- // KKJ coordinate value. Area is defined with Hayford Ellipsoid.
- int zoneNumber = KKJ_Zone_I(x);
- double minLo = radians(18.5);
- double maxLo = radians(32.0);
- double minLa = radians(59.0);
- double maxLa = radians(70.5);
-
- int i = 1;
- KKJ tmpX, tmpY;
-
- while (i < 35) {
- double deltaLo = maxLo - minLo;
- double deltaLa = maxLa - minLa;
- *outLongitude = degrees(minLo + 0.5 * deltaLo);
- *outLatitude = degrees(minLa + 0.5 * deltaLa);
- KKJlola_to_KKJxy(*outLongitude, *outLatitude, zoneNumber, &tmpX, &tmpY);
- if (tmpY < y) {
- minLa = minLa + 0.45 * deltaLa;
- } else {
- maxLa = minLa + 0.55 * deltaLa;
- }
-
- if (tmpX < x) {
- minLo = minLo + 0.45 * deltaLo;
- } else {
- maxLo = minLo + 0.55 * deltaLo;
- }
-
- i++;
- }
-}
-
-void Location::WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY)
+QString Location::address() const
{
- double kkjlo, kkjla;
-
- WGS84lola_to_KKJlola(longitude, latitude, &kkjlo, &kkjla);
- int zoneNumber = KKJ_Zone_Lo(kkjlo);
- KKJlola_to_KKJxy(kkjlo, kkjla, zoneNumber, outX, outY);
+ return q->address();
}
-void Location::KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude)
+bool Location::isValid() const
{
- double kkjlo, kkjla;
-
- KKJxy_to_KKJlola(x, y, &kkjlo, &kkjla);
- KKJlola_to_WGS84lola(kkjlo, kkjla, outLongitude, outLatitude);
-
+ return q->isValid();
}
-
class Location : public QObject
{
-Q_OBJECT
+ Q_OBJECT
-public:
- Location( const QString &x, const QString &y, const QString &label=QString() );
- Location( const QGeoPositionInfo &positionInfo, const QString &label=QString() );
- Location( const Location &from );
- Location &operator=( const Location &from );
- Location( const QString &label=QString() );
+ Q_PROPERTY(QString longitude READ longitude())
+ Q_PROPERTY(QString latitude READ latitude())
+ Q_PROPERTY(QString address READ address() WRITE setAddress())
+ Q_PROPERTY(QString label READ label() WRITE setLabel())
+ Q_PROPERTY(bool valid READ isValid() WRITE setValid())
- ~Location();
+ public:
+ Location(const QString &longitude, const QString &latitude, const QString &label=QString());
+ Location(const QGeoPositionInfo &positionInfo, const QString &label=QString());
+ Location(const Location &from);
+ Location &operator=(const Location &from);
+ Location(const QString &label=QString());
- QString x() const;
+ ~Location();
- QString y() const;
+ QString longitude() const;
- void setLocation( const QGeoPositionInfo &positionInfo );
+ QString latitude() const;
- void setAddress( const QString &address ) const;
- QString address() const;
+ void setLocation(const QGeoPositionInfo &positionInfo);
- void setLabel( const QString &label ) const;
- QString label() const;
+ void setAddress(const QString &address) const;
+ QString address() const;
- bool isValid() const;
+ void setLabel(const QString &label) const;
+ QString label() const;
-public Q_SLOTS:
- void resolveAddress( const QString &address );
+ void setValid(bool valid) const;
+ bool isValid() const;
-Q_SIGNALS:
- void becomeValid();
- void becomeInValid();
- void busy( bool busy );
+ public Q_SLOTS:
+ void resolveAddress(const QString &address);
-private Q_SLOTS:
- void replyFinished( QNetworkReply * reply );
+ Q_SIGNALS:
+ void becomeValid();
+ void becomeInValid();
+ void busy(bool busy);
-private:
+ private Q_SLOTS:
+ void replyFinished(QNetworkReply * reply);
- LocationPrivate *q;
- QNetworkAccessManager *manager;
-
- typedef uint KKJ;
-
- /**
- * Transformes WGS84 longitude/latitude coordinates to KKJ x/y coordinates.
- * @param longitude the input longitude in degrees
- * @param latitude the input latitude in degrees
- * @param outX the result x (easting)
- * @param outY the result y (northing)
- */
- void WGS84lola_to_KKJxy(double longitude, double latitude, KKJ *outX, KKJ *outY);
-
- /**
- * Transformes KKJ x/y coordinates to WGS84 longitude/latitude coordinates.
- * @param x the input x (easting)
- * @param y the input y (northing)
- * @param outLongitude the result longitude in degrees
- * @param outLatitude the result latitude in degrees
- */
- void KKJxy_to_WGS84lola(KKJ x, KKJ y, double *outLongitude, double *outLatitude);
-
- // Degrees to radians
- double radians(double deg);
-
- // Radians to degrees
- double degrees(double rad);
-
- // Constants
- // Longitude0 and Center meridian of KKJ bands
- static const double KkjZoneInfo[][2];
-
- // Function: KKJ_Zone_I
- int KKJ_Zone_I(KKJ easting);
-
- // Function: KKJ_Zone_Lo
- int KKJ_Zone_Lo(double kkjlo);
-
- // Function: KKJlalo_to_WGS84lalo
- void KKJlola_to_WGS84lola(double kkjlo, double kkjla, double *outLongitude, double *outLatitude);
-
- // Function: WGS84lalo_to_KKJlalo
- void WGS84lola_to_KKJlola(double longitude, double latitude, double *outLongitude, double *outLatitude);
-
- // Function: KKJlalo_to_KKJxy
- void KKJlola_to_KKJxy(double lon, double lat, int zoneNumber, KKJ *outX, KKJ *outY);
-
- // Function: KKJxy_to_KKJlalo
- void KKJxy_to_KKJlola(KKJ x, KKJ y, double *outLongitude, double *outLatitude);
+ private:
+ LocationPrivate *q;
+ QNetworkAccessManager *manager;
};
#endif // LOCATION_H
#include <stdio.h>
#include "location_p.h"
+#include "xmlparser.h"
+
#include <QXmlStreamReader>
#include <QByteArray>
#include <QDebug>
#include <QMaemo5InformationBox>
-LocationPrivate::LocationPrivate( const QString &x, const QString &y, const QString &label ) :
- m_label(label),
- m_address(),
- m_x(x),
- m_y(y),
- m_valid(true)
+LocationPrivate::LocationPrivate(const QString &longitude, const QString &latitude, const QString &label) :
+ m_label(label),
+ m_address(),
+ m_longitude(longitude),
+ m_latitude(latitude),
+ m_valid(true)
{
}
-LocationPrivate::LocationPrivate( const QString &label ) :
- m_label(label),
- m_address(),
- m_x(0),
- m_y(0),
- m_valid(false)
+LocationPrivate::LocationPrivate(const QString &label) :
+ m_label(label),
+ m_address(),
+ m_longitude(QString()),
+ m_latitude(QString()),
+ m_valid(false)
{
}
LocationPrivate::~LocationPrivate()
{
- m_label="deleted";
- m_address="";
- m_x="";
- m_y="";
- m_valid=false;
+ m_label="deleted";
+ m_address="";
+ m_longitude="";
+ m_latitude="";
+ m_valid=false;
}
-void LocationPrivate::parseReply( const QByteArray &reply )
+void LocationPrivate::parseReply(const QByteArray &reply)
{
- qDebug() << "parsing";
- QXmlStreamReader xml( reply );
- bool responseHasError = false;
-
- while ( !xml.atEnd() ) {
- xml.readNext();
+ qDebug() << "parsing/" << reply;
- if ( xml.isStartElement() ) {
- QString xmlName( xml.name().toString() );
+ XmlParser parser;
+ QPair<QString,QString> parsedReply = parser.parseGeocode(reply);
- if ( xmlName == "LOC" ) {
- QXmlStreamAttributes attributes( xml.attributes() );
- QStringRef xAttribute( attributes.value("x") );
- QStringRef yAttribute( attributes.value("y") );
- QString newX( xAttribute.toString() );
- QString newY( yAttribute.toString() );
+ m_longitude = parsedReply.first;
+ m_latitude = parsedReply.second;
- m_x = newX;
- m_y = newY;
- }
+ qDebug() << "DONE parsing";
- if ( xmlName == "ERROR" ) {
- responseHasError = true;
- }
-
- }
- }
-
- if ( xml.hasError() || responseHasError ) {
- QMaemo5InformationBox::information( 0, "address resolution error - please check address" );
- qDebug() << "xml error";
- m_valid = false;
- } else {
- qDebug() << "(" << m_x << "," << m_y << ")";
- if ( m_x.isEmpty() || m_y.isEmpty() ) {
- qDebug() << "is NOT valid";
- m_valid = false;
+ if (parser.error()) {
+ QMaemo5InformationBox::information(0, "address resolution error - please check address");
+ m_valid = false;
} else {
- qDebug() << "is now valid";
- m_valid = true;
+ qDebug() << "(" << m_longitude << "," << m_latitude << ")";
+ if (m_longitude.isEmpty() || m_latitude.isEmpty()) {
+ qDebug() << "is NOT valid";
+ m_valid = false;
+ } else {
+ qDebug() << "is now valid";
+ m_valid = true;
+ }
}
- }
}
-void LocationPrivate::setLabel( const QString &label)
+void LocationPrivate::setLabel(const QString &label)
{
- m_label = label;
+ m_label = label;
}
QString LocationPrivate::label() const
{
- return m_label;
+ return m_label;
}
-void LocationPrivate::setAddress( const QString &address)
+void LocationPrivate::setAddress(const QString &address)
{
- m_address = address;
+ m_address = address;
}
QString LocationPrivate::address() const
{
- return m_address;
+ return m_address;
}
-void LocationPrivate::setX( uint x )
+void LocationPrivate::setLongitude(double longitude)
{
- m_x = QString( "%1" ).arg( x );
+ m_longitude = QString("%1").arg(longitude);
}
-void LocationPrivate::setX( const QString &x )
+void LocationPrivate::setLongitude(const QString &longitude)
{
- m_x = x;
+ m_longitude = longitude;
}
-QString LocationPrivate::x() const
+QString LocationPrivate::longitude() const
{
- return m_x;
+ return m_longitude;
}
-void LocationPrivate::setY( uint y )
+void LocationPrivate::setlatitude(double latitude)
{
- m_y = QString( "%1" ).arg( y );
+ m_latitude = QString("%1").arg(latitude);
}
-void LocationPrivate::setY( const QString &y )
+void LocationPrivate::setlatitude(const QString &latitude)
{
- m_y = y;
+ m_latitude = latitude;
}
-QString LocationPrivate::y() const
+QString LocationPrivate::latitude() const
{
- return m_y;
+ return m_latitude;
}
-void LocationPrivate::setValid( bool valid )
+void LocationPrivate::setValid(bool valid)
{
- m_valid = valid;
+ qDebug() << Q_FUNC_INFO << "/valid/" << valid;
+ m_valid = valid;
}
bool LocationPrivate::isValid() const
{
- return m_valid;
+ return m_valid;
}
Q_OBJECT
public:
- LocationPrivate( const QString &x, const QString &y, const QString &label );
- LocationPrivate( const QString &label );
- virtual ~LocationPrivate();
+ LocationPrivate(const QString &longitude, const QString &latitude, const QString &label);
+ LocationPrivate(const QString &label);
+ virtual ~LocationPrivate();
- void setX( uint x );
- void setX( const QString &x );
- QString x() const;
+ void setLongitude(double longitude);
+ void setLongitude(const QString &longitude);
+ QString longitude() const;
- void setY( uint y );
- void setY( const QString &y );
- QString y() const;
+ void setlatitude(double latitude);
+ void setlatitude(const QString &latitude);
+ QString latitude() const;
- void setAddress( const QString &address );
- QString address() const;
+ void setAddress(const QString &address);
+ QString address() const;
- void setLabel( const QString &label );
- QString label() const;
+ void setLabel(const QString &label);
+ QString label() const;
- void setValid( bool valid );
- bool isValid() const;
+ void setValid(bool valid);
+ bool isValid() const;
- void parseReply( const QByteArray &reply );
+ void parseReply(const QByteArray &reply);
- QString m_label;
- QString m_address;
- QString m_x;
- QString m_y;
- bool m_valid;
+ QString m_label;
+ QString m_address;
+ QString m_longitude;
+ QString m_latitude;
+ bool m_valid;
};
#endif // LOCATION_P_H
-
Locations::Locations()
{
- if ( !initialised ) {
- QCoreApplication::setOrganizationName("ZouBa");
- QCoreApplication::setOrganizationDomain("zouba.yi.org");
+ if (!initialised) {
+ qDebug() << "Initialising locations";
+ QCoreApplication::setOrganizationDomain("zouba.maemo.org");
QCoreApplication::setOrganizationName("ZouBa");
+ QCoreApplication::setApplicationName("ZouBa");
restoreLocations();
initialised = true;
{
}
-bool Locations::addLocation( Location *location )
+bool Locations::addLocation(Location *location)
{
- bool succeeded=false;
-
- // if it's valid now, save the setting
- if ( location->isValid() ) {
- saveLocation( location );
- }
-
- if ( !locationHash.contains( location->label() ) ) {
- qDebug() << "Adding location" << location->label();
- locationHash[ location->label() ] = location;
- succeeded = true;
- } else {
- qDebug() << "FAILED to add location" << location->label();
- }
-
- return succeeded;
+ bool succeeded=false;
+
+ // if it's valid now, save the setting
+ if (location->isValid()) {
+ saveLocation(location);
+ } else {
+ qDebug() << "Location not valid, so not saving";
+ }
+
+ if (!locationHash.contains(location->label())) {
+ qDebug() << "Adding location" << location->label();
+ locationHash[ location->label() ] = location;
+ succeeded = true;
+ } else {
+ qDebug() << "FAILED to add location" << location->label();
+ }
+
+ return succeeded;
}
void Locations::restoreLocations()
{
- QSettings settings;
+ QSettings settings;
- settings.beginGroup( "Locations" );
- QStringList labels = settings.childGroups();
+ settings.beginGroup("Locations");
+ QStringList labels = settings.childGroups();
- for( int i=0; i<labels.size(); ++i ) {
- QString label = labels[i];
- settings.beginGroup( label );
- QString x = settings.value( "x" ).toString();
- QString y = settings.value( "y" ).toString();
- QString address = settings.value( "address" ).toString();
- settings.endGroup();
+ for(int i=0; i<labels.size(); ++i) {
+ QString label = labels[i];
+ settings.beginGroup(label);
+ QString longitude = settings.value("longitude").toString();
+ QString latitude = settings.value("latitude").toString();
+ QString address = settings.value("address").toString();
+ settings.endGroup();
- qDebug() << "restoring" << label;
- Location *location = new Location( x, y, label );
- location->setAddress( address );
+ qDebug() << "restoring" << label;
+ Location *location = new Location(longitude, latitude , label);
+ location->setAddress(address);
- locationHash[ label ] = location;
- }
+ locationHash[ label ] = location;
+ }
- settings.endGroup();
+ settings.endGroup();
}
-void Locations::saveLocation( Location *location )
+void Locations::saveLocation(Location *location)
{
- qDebug() << "Saving location" << location->label();
- QSettings settings;
- settings.beginGroup( "Locations" );
- settings.beginGroup( location->label() );
- settings.setValue( "address", location->address() );
- settings.setValue( "x", location->x() );
- settings.setValue( "y", location->y() );
- settings.endGroup();
- settings.endGroup();
+ qDebug() << "Saving location" << location->label();
+ QSettings settings;
+ settings.beginGroup("Locations");
+ settings.beginGroup(location->label());
+ settings.setValue("address", location->address());
+ settings.setValue("longitude", location->longitude());
+ settings.setValue("latitude", location->latitude());
+ settings.endGroup();
+ settings.endGroup();
}
void Locations::saveLocation()
{
- Location *location = qobject_cast<Location*>(sender());
+ qDebug() << "Saving location (slot)";
+ Location *location = qobject_cast<Location*>(sender());
- saveLocation( location );
+ saveLocation(location);
}
-Location *Locations::location( const QString &label )
+Location *Locations::location(const QString &label)
{
- qDebug() << "requesting location" << label;
- Location *retVal = 0;
-
- if ( locationHash.contains( label ) ) {
- qDebug() << "found location" << label;
- retVal = locationHash[ label ];
- } else {
- qDebug() << "didn't find location" << label;
- }
+ qDebug() << "requesting location" << label;
+ Location *retVal = 0;
+
+ if (locationHash.contains(label)) {
+ qDebug() << "found location" << label;
+ retVal = locationHash[ label ];
+ } else {
+ qDebug() << "didn't find location" << label;
+ }
- return retVal;
+ return retVal;
}
class Locations: public QObject
{
- Q_OBJECT
+ Q_OBJECT
public:
- Locations();
- ~Locations();
+ Locations();
+ ~Locations();
- static Locations *instance();
- bool addLocation( Location *location );
+ static Locations *instance();
+ bool addLocation(Location *location);
- Location *location( const QString &label );
+ Location *location(const QString &label);
public Q_SLOTS:
- void saveLocation();
+ void saveLocation();
private:
- void restoreLocations();
- static QHash<QString,Location *> locationHash;
- static bool initialised;
+ void restoreLocations();
+ static QHash<QString,Location *> locationHash;
+ static bool initialised;
- void saveLocation( Location *location );
+ void saveLocation(Location *location);
};
#endif // LOCATIONS_H
#include <QApplication>
#include <QMainWindow>
-int main(int argc, char *argv[] )
+int main(int argc, char *argv[])
{
- QApplication app(argc, argv);
+ QApplication app(argc, argv);
- QMainWindow *mainWindow = new QMainWindow;
- Ui *ui = new Ui;;
- ui->setupUi(mainWindow);
+ QMainWindow *mainWindow = new QMainWindow;
+ Ui *ui = new Ui;
+ ui->setupUi(mainWindow);
- UiController *uiController = new UiController( ui );
- Route *route = new Route();
- GpsController *gpsController = new GpsController();
+ UiController *uiController = new UiController(ui);
+ Route *route = new Route();
+ GpsController *gpsController = new GpsController();
- QObject::connect(
- route, SIGNAL( routeReady( QList<RouteData> ) ),
- uiController, SLOT( displayRoute( QList<RouteData> ) )
- );
+ QObject::connect(
+ route, SIGNAL(routeReady(QList<RouteData>)),
+ uiController, SLOT(displayRoute(QList<RouteData>))
+ );
- QObject::connect(
- gpsController, SIGNAL( locationChanged( Location* ) ),
- route, SLOT( setFromLocation( Location* ) )
- );
+ QObject::connect(
+ gpsController, SIGNAL(locationChanged(Location*)),
+ route, SLOT(setFromLocation(Location*))
+ );
- QObject::connect(
- uiController, SIGNAL( destinationChanged( Location* ) ),
- route, SLOT( setToLocation( Location* ) )
- );
+ QObject::connect(
+ uiController, SIGNAL(destinationChanged(Location*)),
+ route, SLOT(setToLocation(Location*))
+ );
- QObject::connect(
- uiController, SIGNAL( buttonClicked() ),
- gpsController, SLOT( getGps() )
- );
+ QObject::connect(
+ uiController, SIGNAL(buttonClicked()),
+ gpsController, SLOT(getGps())
+ );
- QObject::connect(
- ui, SIGNAL( fakeGpsPressed( const QString & ) ),
- gpsController, SLOT( useFakeGps( const QString & ) )
- );
+ QObject::connect(
+ ui, SIGNAL(fakeGpsPressed(const QString &)),
+ gpsController, SLOT(useFakeGps(const QString &))
+ );
- QObject::connect(
- ui, SIGNAL( liveGpsPressed() ),
- gpsController, SLOT( useLiveGps() )
- );
+ QObject::connect(
+ ui, SIGNAL(liveGpsPressed()),
+ gpsController, SLOT(useLiveGps())
+ );
- QObject::connect(
- route, SIGNAL( busy( bool ) ),
- ui, SLOT( setBusy( bool ) )
- );
+ QObject::connect(
+ route, SIGNAL(busy(bool)),
+ ui, SLOT(setBusy(bool))
+ );
- mainWindow->show();
+ mainWindow->show();
- return app.exec();
+ return app.exec();
}
#include "ytv.h"
Route::Route() :
- q( new RoutePrivate( this ) ),
- manager( new QNetworkAccessManager(this) )
+ q(new RoutePrivate(this)),
+ manager(new QNetworkAccessManager(this))
{
- connect( manager, SIGNAL( finished(QNetworkReply*) ), this, SLOT( replyFinished(QNetworkReply*) ) );
+ connect(manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(replyFinished(QNetworkReply*)));
}
Route::~Route()
{
- delete manager;
- manager = 0;
+ delete manager;
+ manager = 0;
}
void Route::getRoute()
{
- qDebug() << "getting route from Ytv";
-
- QUrl fullUrl( Ytv::Url );
-
- QStringList a;
- a << q->fromLocation()->x() << q->fromLocation()->y();
- QStringList b;
- b << q->toLocation()->x() << q->toLocation()->y();
-
- fullUrl.addQueryItem( "a", a.join(",") );
- fullUrl.addQueryItem( "b", b.join(",") );
- fullUrl.addQueryItem( "show", QString::number(Ytv::ShowFiveResults) );
- fullUrl.addQueryItem( "walkspeed", QString::number(Ytv::WalkSpeedFast) );
- fullUrl.addQueryItem( "optimize", QString::number(Ytv::OptimizeLeastWalking) );
- fullUrl.addQueryItem( "user", Ytv::Username );
- fullUrl.addQueryItem( "pass", Ytv::Password );
-
- manager->get( QNetworkRequest( fullUrl ) );
- qDebug() << "getting url" << fullUrl.toEncoded();
- qDebug() << "waiting for reply from Ytv";
- emit( busy( true ) );
+ qDebug() << "getting route from Ytv";
+
+ QUrl fullUrl(Ytv::Url);
+
+ QStringList a;
+ a << q->fromLocation()->longitude() << q->fromLocation()->latitude();
+ QStringList b;
+ b << q->toLocation()->longitude() << q->toLocation()->latitude();
+
+ fullUrl.addQueryItem("user", Ytv::Username);
+ fullUrl.addQueryItem("pass", Ytv::Password);
+ fullUrl.addQueryItem("request", Ytv::Route);
+ fullUrl.addQueryItem("format", Ytv::Xml);
+ fullUrl.addQueryItem("language", Ytv::English);
+ fullUrl.addQueryItem("epsg_in", Ytv::WGS84);
+ fullUrl.addQueryItem("epsg_out", Ytv::WGS84);
+ fullUrl.addQueryItem("from", a.join(","));
+ fullUrl.addQueryItem("to", b.join(","));
+ fullUrl.addQueryItem("show", QString::number(Ytv::ShowFiveResults));
+ fullUrl.addQueryItem("walkspeed", QString::number(Ytv::WalkSpeedFast));
+ fullUrl.addQueryItem("optimize", QString::number(Ytv::OptimizeLeastWalking));
+
+ manager->get(QNetworkRequest(fullUrl));
+ qDebug() << "getting url" << fullUrl.toEncoded();
+ qDebug() << "waiting for reply from Ytv";
+ emit(busy(true));
}
-void Route::replyFinished( QNetworkReply * reply )
+void Route::replyFinished(QNetworkReply * reply)
{
- qDebug() << "have reply from Ytv";
- QList<RouteData> routeData = q->parseReply( reply->readAll() );
+ qDebug() << "have reply from Ytv";
+ QList<RouteData> routeData = q->parseReply(reply->readAll());
- emit( routeReady( routeData ) );
- emit( busy( false ) );
+ emit(routeReady(routeData));
+ emit(busy(false));
}
-void Route::setFromLocation( Location *location )
+void Route::setFromLocation(Location *location)
{
- qDebug() << "setting new From location (" << location->label() << ")";
-
- if ( location && location->isValid() ) {
- qDebug() << "From is valid";
- q->setFromLocation( location );
- if ( q->toValid() ) {
- qDebug() << "To is also valid";
- getRoute();
+ qDebug() << "setting new From location (" << location->label() << ")";
+
+ if (location && location->isValid()) {
+ qDebug() << "From is valid";
+ q->setFromLocation(location);
+ if (q->toValid()) {
+ qDebug() << "To is also valid";
+ getRoute();
+ } else {
+ qDebug() << "To not valid - waiting";
+ }
} else {
- qDebug() << "To not valid - waiting";
+ qDebug() << "ERROR:From is not valid";
+ qDebug() << "location=" << location;
+ if (location) {
+ qDebug() << "location->isValid()=" << location->isValid();
+ }
}
- } else {
- qDebug() << "ERROR:From is not valid";
- qDebug() << "location=" << location;
- if ( location ) {
- qDebug() << "location->isValid()=" << location->isValid();
- }
- }
}
Location *Route::fromLocation() const
{
- return q->fromLocation();
+ return q->fromLocation();
}
-void Route::setToLocation( Location *location )
+void Route::setToLocation(Location *location)
{
- qDebug() << "setting new To location (" << location->label() << ")";
-
- if ( location && location->isValid() ) {
- qDebug() << "To is valid";
- q->setToLocation( location );
- if ( q->fromValid() ) {
- qDebug() << "From is also valid";
- getRoute();
+ qDebug() << "setting new To location (" << location->label() << ")";
+
+ if (location && location->isValid()) {
+ qDebug() << "To is valid";
+ q->setToLocation(location);
+ if (q->fromValid()) {
+ qDebug() << "From is also valid";
+ getRoute();
+ } else {
+ qDebug() << "From not valid - waiting";
+ }
} else {
- qDebug() << "From not valid - waiting";
- }
- } else {
- qDebug() << "ERROR:From is not valid";
- qDebug() << "location=" << location;
- if ( location ) {
- qDebug() << "location->isValid()=" << location->isValid();
+ qDebug() << "ERROR:From is not valid";
+ qDebug() << "location=" << location;
+ if (location) {
+ qDebug() << "location->isValid()=" << location->isValid();
+ }
}
- }
}
Location *Route::toLocation() const
{
- return q->toLocation();
+ return q->toLocation();
}
class Route: public QObject
{
- Q_OBJECT
+ Q_OBJECT
public:
- Route();
- ~Route();
+ Route();
+ ~Route();
- /*!
+ /*!
* \brief Gets the route data from the server
*/
- void getRoute();
+ void getRoute();
- /*!
+ /*!
\brief Get the from location
\return The from location
*/
- Location *fromLocation() const;
+ Location *fromLocation() const;
- /*!
+ /*!
\brief Get the to location
\return The to location
*/
- Location *toLocation() const;
+ Location *toLocation() const;
public Q_SLOTS:
- /*!
+ /*!
* \brief Sets the from location
* \param fromLocation The from location
*/
- void setFromLocation( Location *location=0 );
+ void setFromLocation(Location *location=0);
- /*!
+ /*!
* \brief Sets the to location
* \param toLocation The to location
*/
- void setToLocation( Location *location=0 );
+ void setToLocation(Location *location=0);
Q_SIGNALS:
- void routeReady( QList<RouteData> );
- void busy( bool busy );
+ void routeReady(QList<RouteData>);
+ void busy(bool busy);
private Q_SLOTS:
- void replyFinished( QNetworkReply* );
+ void replyFinished(QNetworkReply*);
private:
- RoutePrivate *q;
- QNetworkAccessManager *manager;
+ RoutePrivate *q;
+ QNetworkAccessManager *manager;
};
#endif // ROUTE_H
#include "route_p.h"
#include "location.h"
+#include "xmlparser.h"
#include <QXmlStreamReader>
#include <QDebug>
#include <QStringList>
#include <QMaemo5InformationBox>
-RoutePrivate::RoutePrivate( QObject *parent ) :
+RoutePrivate::RoutePrivate(QObject *parent) :
m_fromValid(false),
m_toValid(false),
m_fromLocation(0),
m_toLocation(0)
{
- Q_UNUSED( parent )
+ Q_UNUSED(parent)
}
RoutePrivate::~RoutePrivate()
{
}
-QList<RouteData> RoutePrivate::parseReply( const QByteArray &reply )
+QList<RouteData> RoutePrivate::parseReply(const QByteArray &reply)
{
- qDebug() << "parsing route";
+ qDebug() << "parsing route/" << reply;
- QList<RouteData> retVal;
- RouteData routeData;
- LegData legData;
+ XmlParser parser;
+ QList<RouteData> retVal = parser.parseRouteData(reply);
- QXmlStreamReader xml( reply );
-
- QHash<QString, bool> in;
- QHash<QString, bool> have;
-
- QStringList haveKeys;
- QStringList inKeys;
-
- haveKeys
- << "LINE"
- << "TIME"
- << "TRIP"
- << "DEPARTURE"
- << "ARRIVAL"
- ;
-
- inKeys
- << "ROUTE"
- << "LINE"
- << "STOP"
- << "WALK"
- << "POINT"
- ;
-
- foreach( QString key, haveKeys ) {
- have[ key ] = false;
- }
-
- foreach( QString key, inKeys ) {
- in[ key ] = false;
- }
-
- while ( !xml.atEnd() ) {
- xml.readNext();
-
- QString xmlName = xml.name().toString();
-
- if ( xml.isStartElement() ) {
- if ( inKeys.contains( xmlName ) ) {
- in[ xmlName ] = true;
- //qDebug() << "in[" << xmlName << "] = true";
- }
-
- if ( xmlName == "ROUTE" ) {
- foreach( QString key, haveKeys ) {
- have[ key ] = false;
- }
- }
-
- if ( xmlName == "WALK" ) {
- legData.m_how = "WALK";
- have[ "DEPARTURE" ] = false;
- have[ "ARRIVAL" ] = false;
- have[ "LENGTH" ] = false;
- }
-
- if ( xmlName == "LINE" ) {
- legData.m_how = "LINE";
- QString lineCode( xml.attributes().value("code").toString() );
- legData.m_lineCode = parseJORECode( lineCode );
- have[ "DEPARTURE" ] = false;
- have[ "ARRIVAL" ] = false;
- have[ "LENGTH" ] = false;
- }
- }
-
- if ( xml.isEndElement() ) {
- if ( inKeys.contains( xmlName ) ) {
- in[ xmlName ] = false;
- //qDebug() << "in[" << xmlName << "] = false";
- }
-
- if ( xmlName == "ROUTE" ) {
- retVal.append( routeData );
- routeData.clear();
- }
-
- if ( xmlName == "WALK" || xmlName == "LINE" ) {
- routeData.m_legData.append( legData );
- legData.clear();
- have[ "LENGTH" ] = false;
- }
- }
-
- if ( !have[ "ARRIVAL" ] && ( in[ "WALK" ] || in[ "LINE" ] ) && ( in[ "STOP" ] || in[ "POINT" ] ) && xml.isStartElement() && xmlName == "ARRIVAL" ) {
- QString arrivalTime( xml.attributes().value("time").toString() );
- legData.m_arrivalTime = arrivalTime.rightJustified(4).insert(2,":");
-
- // don't set have[ "ARRIVAL" ] since we want the last one of many STOPs
- }
-
- if ( !have[ "DEPARTURE" ] && in[ "LINE" ] && in[ "STOP" ] && xml.isStartElement() && xmlName == "DEPARTURE" ) {
- QString departureTime( xml.attributes().value("time").toString() );
- legData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
-
- have[ "DEPARTURE" ] = true;
- }
-
- if ( !have[ "DEPARTURE" ] && in[ "WALK" ] && ( in[ "POINT" ] || in[ "STOP" ] ) && xml.isStartElement() && xmlName == "DEPARTURE" ) {
- QString departureTime( xml.attributes().value("time").toString() );
- legData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
-
- have[ "DEPARTURE" ] = true;
- }
-
- if ( !have[ "LENGTH" ] && ( in[ "WALK" ] || in[ "LINE" ] ) && xml.isStartElement() && xmlName == "LENGTH" ) {
- legData.m_tripTime = xml.attributes().value("time").toString();
- legData.m_tripDistance = xml.attributes().value("dist").toString();
-
- have[ "LENGTH" ] = true;
- }
-
- if ( !have[ "TRIP" ] && in[ "ROUTE" ] && xml.isStartElement() && xmlName == "LENGTH" ) {
- routeData.m_tripTime = xml.attributes().value("time").toString();
- routeData.m_tripDistance = xml.attributes().value("dist").toString();
-
- have[ "TRIP" ] = true;
- }
-
- if ( !have[ "LINE" ] && in[ "ROUTE" ] && xml.isStartElement() && xmlName == "LINE" ) {
- QString lineCode( xml.attributes().value("code").toString() );
-
- routeData.m_lineCode = parseJORECode( lineCode );
- have[ "LINE" ] = true;
- }
-
- if ( !have[ "TIME" ] && in[ "ROUTE" ] && in[ "LINE" ] && in[ "STOP" ] && xmlName == "DEPARTURE" ) {
- QString departureTime( xml.attributes().value("time").toString() );
-
- routeData.m_departureTime = departureTime.rightJustified(4).insert(2,":");
- have[ "TIME" ] = true;
+ if (retVal.isEmpty()) {
+ qDebug() << "no routes found";
+ QMaemo5InformationBox::information(0, "no routes found");
}
- }
-
- if ( xml.hasError() ) {
- qDebug() << "xml error:" << xml.errorString();
- }
-
- if ( retVal.isEmpty() ) {
- qDebug() << "no routes found";
- QMaemo5InformationBox::information( 0, "no routes found" );
- }
-
- return retVal;
+ return retVal;
}
-void RoutePrivate::setFromLocation( Location *location )
+void RoutePrivate::setFromLocation(Location *location)
{
- m_fromLocation = location;
- m_fromValid = true;
+ m_fromLocation = location;
+ m_fromValid = true;
}
Location *RoutePrivate::fromLocation() const
{
- return m_fromLocation;
-}
-
-void RoutePrivate::setToLocation( Location *toLocation )
-{
- m_toLocation = toLocation;
- m_toValid = true;
+ return m_fromLocation;
}
-QString RoutePrivate::parseJORECode( const QString &joreCode ) const
+void RoutePrivate::setToLocation(Location *toLocation)
{
- QString retVal;
-
- QString areaTransportTypeCode( joreCode.mid(0,1) );
- QString lineCode( joreCode.mid(1,3) );
- QString letterVariant( joreCode.mid(4,1) );
- QString letterNumberVariant( joreCode.mid(5,1) );
- QString direction( joreCode.mid(6,1) );
-
- lineCode.setNum( lineCode.toInt() );
-
- retVal = lineCode;
-
- if ( letterVariant != " " ) {
- retVal += letterVariant;
- }
-
- return retVal;
+ m_toLocation = toLocation;
+ m_toValid = true;
}
Location *RoutePrivate::toLocation() const
{
- return m_toLocation;
+ return m_toLocation;
}
bool RoutePrivate::fromValid()
{
- return m_fromValid;
+ return m_fromValid;
}
bool RoutePrivate::toValid()
{
- return m_toValid;
+ return m_toValid;
}
class RoutePrivate: public QObject
{
- Q_OBJECT
+ Q_OBJECT
-public:
- RoutePrivate( QObject *parent=0 );
- ~RoutePrivate();
-
- QList<RouteData> parseReply( const QByteArray &reply );
+ Q_PROPERTY(Location* fromLocation READ fromLocation WRITE setFromLocation)
+ Q_PROPERTY(Location* toLocation READ toLocation WRITE setToLocation)
- Q_PROPERTY(Location* fromLocation READ fromLocation WRITE setFromLocation);
- Q_PROPERTY(Location* toLocation READ toLocation WRITE setToLocation);
-
- void setFromLocation( Location *fromLocation );
+public:
+ RoutePrivate(QObject *parent=0);
+ ~RoutePrivate();
- Location *fromLocation() const;
+ QList<RouteData> parseReply(const QByteArray &reply);
- void setToLocation( Location *toLocation );
+ void setFromLocation(Location *fromLocation);
+ Location *fromLocation() const;
- Location *toLocation() const;
+ void setToLocation(Location *toLocation);
+ Location *toLocation() const;
- bool toValid();
- bool fromValid();
+ bool toValid();
+ bool fromValid();
private:
- bool m_fromValid;
- bool m_toValid;
- Location *m_fromLocation;
- Location *m_toLocation;
+ bool m_fromValid;
+ bool m_toValid;
+ Location *m_fromLocation;
+ Location *m_toLocation;
- QString parseJORECode( const QString &joreCode ) const;
+ QString parseJORECode(const QString &joreCode) const;
};
#endif // ROUTE_P_H
#include <QString>
#include <QList>
+#include <QDebug>
struct LegData
{
- LegData() :
- m_how(),
- m_tripTime(),
- m_tripDistance(),
- m_departureTime(),
- m_arrivalTime(),
- m_lineCode()
- {
- };
+ LegData() :
+ m_how(),
+ m_tripTime(),
+ m_tripDistance(),
+ m_departureTime(),
+ m_arrivalTime(),
+ m_lineCode()
+ {
+ }
- LegData( QString how, QString tripTime, QString tripDistance, QString departureTime, QString arrivalTime, QString lineCode=QString() ) :
- m_how(how),
- m_tripTime(tripTime),
- m_tripDistance(tripDistance),
- m_departureTime(departureTime),
- m_arrivalTime(arrivalTime),
- m_lineCode(lineCode)
- {
- };
+ LegData(QString how, QString tripTime, QString tripDistance, QString departureTime, QString arrivalTime, QString lineCode=QString()) :
+ m_how(how),
+ m_tripTime(tripTime),
+ m_tripDistance(tripDistance),
+ m_departureTime(departureTime),
+ m_arrivalTime(arrivalTime),
+ m_lineCode(lineCode)
+ {
+ }
- void clear()
- {
- m_how = "";
- m_tripTime = "";
- m_tripDistance = "";
- m_departureTime = "";
- m_arrivalTime = "";
- m_lineCode = "";
- };
+ void clear()
+ {
+ m_how = "";
+ m_tripTime = "";
+ m_tripDistance = "";
+ m_departureTime = "";
+ m_arrivalTime = "";
+ m_lineCode = "";
+ }
- QString m_how;
- QString m_tripTime;
- QString m_tripDistance;
- QString m_departureTime;
- QString m_arrivalTime;
- QString m_lineCode;
+ QString m_how;
+ QString m_tripTime;
+ QString m_tripDistance;
+ QString m_departureTime;
+ QString m_arrivalTime;
+ QString m_lineCode;
};
struct RouteData
{
- RouteData():
- m_tripTime(),
- m_tripDistance(),
- m_departureTime(),
- m_lineCode(),
- m_legData()
- {
- };
+ RouteData():
+ m_tripTime(),
+ m_tripDistance(),
+ m_departureTime(),
+ m_lineCode(),
+ m_legData()
+ {
+ }
- RouteData( QString tripTime, QString tripDistance, QString departureTime, QString lineCode ):
- m_tripTime(tripTime),
- m_tripDistance(tripDistance),
- m_departureTime(departureTime),
- m_lineCode(lineCode),
- m_legData()
- {
- };
+ RouteData(QString tripTime, QString tripDistance, QString departureTime, QString lineCode):
+ m_tripTime(tripTime),
+ m_tripDistance(tripDistance),
+ m_departureTime(departureTime),
+ m_lineCode(lineCode),
+ m_legData()
+ {
+ }
- RouteData &operator <<(const LegData &legData)
- {
- m_legData.append( legData );
- return *this;
- };
+ RouteData &operator <<(const LegData &legData)
+ {
+ m_legData.append(legData);
+ return *this;
+ }
- void clear()
- {
- m_tripTime = "";
- m_tripDistance = "";
- m_departureTime = "";
- m_lineCode = "";
- m_legData.clear();
- };
+ void clear()
+ {
+ m_tripTime = "";
+ m_tripDistance = "";
+ m_departureTime = "";
+ m_lineCode = "";
+ m_legData.clear();
+ }
- QString m_tripTime;
- QString m_tripDistance;
- QString m_departureTime;
- QString m_lineCode;
- QList<LegData> m_legData;
+ QString m_tripTime;
+ QString m_tripDistance;
+ QString m_departureTime;
+ QString m_lineCode;
+ QList<LegData> m_legData;
};
#include <QDebug>
Ui::Ui() :
- m_centralWidget(0),
- m_destinationButtons(0),
- m_routeStack(0),
- m_usingFakeGps( false ),
- m_fakeLocationLabel( "work" )
+ m_centralWidget(0),
+ m_destinationButtons(0),
+ m_routeStack(0),
+ m_usingFakeGps(false),
+ m_fakeLocationLabel("work")
{
}
{
}
-void Ui::setupUi( QMainWindow *mainWindow )
+void Ui::setupUi(QMainWindow *mainWindow)
{
- m_mainWindow = mainWindow;
- m_mainWindow->resize(800,480);
-
- m_menu = mainWindow->menuBar()->addMenu("Settings");
-
- QAction *setHomeAddressAction = new QAction("Set home address", this);
- QAction *setWorkAddressAction = new QAction("Set work address", this);
- m_toggleFakeGpsAction = new QAction("Use fake GPS", this);
- m_menu->addAction(setHomeAddressAction);
- m_menu->addAction(setWorkAddressAction);
- m_menu->addAction(m_toggleFakeGpsAction);
-
- connect(
- setHomeAddressAction, SIGNAL(triggered()),
- this, SLOT(setHomeAddress())
- );
- connect(
- setWorkAddressAction, SIGNAL(triggered()),
- this, SLOT(setWorkAddress())
- );
- connect(
- m_toggleFakeGpsAction, SIGNAL(triggered()),
- this, SLOT(toggleFakeGps())
- );
-
- m_centralWidget = new QWidget( m_mainWindow );
- m_mainWindow->setCentralWidget( m_centralWidget);
-
- QRadioButton *homeButton = new QRadioButton();
- homeButton->setObjectName( QString::fromUtf8("homeButton") );
- homeButton->setText( "GPS->HOME" );
- homeButton->setEnabled(false);
-
- QRadioButton *workButton = new QRadioButton();
- workButton->setObjectName( QString::fromUtf8("workButton") );
- workButton->setText( "GPS->WORK" );
- workButton->setEnabled(false);
-
- m_destinationButtons = new QButtonGroup();
- m_destinationButtons->addButton( homeButton, HomeButtonId );
- m_destinationButtons->addButton( workButton, WorkButtonId );
- m_destinationButtons->setExclusive( true );
-
- m_routeButtons = new QButtonGroup();
- m_routeButtons->setExclusive( true );
- m_routeStack = new QVBoxLayout();
- for ( int i=0; i<Ytv::ShowFiveResults; ++i ) {
- QRadioButton *button = new QRadioButton();
- button->setObjectName( "routeButton"+i );
- button->setEnabled( false );
-
- m_routeStack->addWidget( button, i );
- m_routeButtons->addButton( button, i );
- }
- m_routeStack->addStretch();
-
- QStringList headers( QStringList() << "How" << "Time" << "Dist" << "Dep" << "Arr" );
- m_routeDetailTable = new QTableWidget();
- m_routeDetailTable->setColumnCount( headers.count() );
- m_routeDetailTable->setHorizontalHeaderLabels( headers );
- m_routeDetailTable->resizeColumnsToContents();
- m_routeDetailTable->setSelectionMode( QAbstractItemView::NoSelection );
-
- QHBoxLayout *topLayout = new QHBoxLayout();
- topLayout->addLayout( m_routeStack );
- topLayout->addWidget( m_routeDetailTable );
-
- m_buttonLayout = new QGridLayout();
- m_buttonLayout->addWidget( homeButton, 0, 0 );
- m_buttonLayout->addWidget( workButton, 0, 1 );
-
- m_mainLayout = new QVBoxLayout();
- m_mainLayout->addLayout( topLayout );
- m_mainLayout->addLayout( m_buttonLayout );
-
- m_centralWidget->setLayout( m_mainLayout );
+ m_mainWindow = mainWindow;
+ m_mainWindow->resize(800,480);
+
+ m_menu = mainWindow->menuBar()->addMenu("Settings");
+
+ QAction *setHomeAddressAction = new QAction("Set home address", this);
+ QAction *setWorkAddressAction = new QAction("Set work address", this);
+ m_toggleFakeGpsAction = new QAction("Use fake GPS", this);
+ m_menu->addAction(setHomeAddressAction);
+ m_menu->addAction(setWorkAddressAction);
+ m_menu->addAction(m_toggleFakeGpsAction);
+
+ connect(
+ setHomeAddressAction, SIGNAL(triggered()),
+ this, SLOT(setHomeAddress())
+ );
+ connect(
+ setWorkAddressAction, SIGNAL(triggered()),
+ this, SLOT(setWorkAddress())
+ );
+ connect(
+ m_toggleFakeGpsAction, SIGNAL(triggered()),
+ this, SLOT(toggleFakeGps())
+ );
+
+ m_centralWidget = new QWidget(m_mainWindow);
+ m_mainWindow->setCentralWidget(m_centralWidget);
+
+ QRadioButton *homeButton = new QRadioButton();
+ homeButton->setObjectName(QString::fromUtf8("homeButton"));
+ homeButton->setText("GPS->HOME");
+ homeButton->setEnabled(false);
+
+ QRadioButton *workButton = new QRadioButton();
+ workButton->setObjectName(QString::fromUtf8("workButton"));
+ workButton->setText("GPS->WORK");
+ workButton->setEnabled(false);
+
+ m_destinationButtons = new QButtonGroup();
+ m_destinationButtons->addButton(homeButton, HomeButtonId);
+ m_destinationButtons->addButton(workButton, WorkButtonId);
+ m_destinationButtons->setExclusive(true);
+
+ m_routeButtons = new QButtonGroup();
+ m_routeButtons->setExclusive(true);
+ m_routeStack = new QVBoxLayout();
+ for (int i=0; i<Ytv::ShowFiveResults; ++i) {
+ QRadioButton *button = new QRadioButton();
+ button->setObjectName("routeButton"+i);
+ button->setEnabled(false);
+
+ m_routeStack->addWidget(button, i);
+ m_routeButtons->addButton(button, i);
+ }
+ m_routeStack->addStretch();
+
+ QStringList headers(QStringList() << "How" << "Time" << "Dist" << "Dep" << "Arr");
+ m_routeDetailTable = new QTableWidget();
+ m_routeDetailTable->setColumnCount(headers.count());
+ m_routeDetailTable->setHorizontalHeaderLabels(headers);
+ m_routeDetailTable->resizeColumnsToContents();
+ m_routeDetailTable->setSelectionMode(QAbstractItemView::NoSelection);
+
+ QHBoxLayout *topLayout = new QHBoxLayout();
+ topLayout->addLayout(m_routeStack);
+ topLayout->addWidget(m_routeDetailTable);
+
+ m_buttonLayout = new QGridLayout();
+ m_buttonLayout->addWidget(homeButton, 0, 0);
+ m_buttonLayout->addWidget(workButton, 0, 1);
+
+ m_mainLayout = new QVBoxLayout();
+ m_mainLayout->addLayout(topLayout);
+ m_mainLayout->addLayout(m_buttonLayout);
+
+ m_centralWidget->setLayout(m_mainLayout);
}
void Ui::setHomeAddress()
{
- setAddress( "home" );
+ setAddress("home");
}
void Ui::setWorkAddress()
{
- setAddress( "work" );
+ setAddress("work");
}
void Ui::toggleFakeGps()
{
- m_usingFakeGps = !m_usingFakeGps;
+ m_usingFakeGps = !m_usingFakeGps;
- if ( m_usingFakeGps ) {
- useFakeGps();
- } else {
- useLiveGps();
- }
+ if (m_usingFakeGps) {
+ useFakeGps();
+ } else {
+ useLiveGps();
+ }
}
void Ui::useFakeGps()
{
- emit fakeGpsPressed( m_fakeLocationLabel );
- m_toggleFakeGpsAction->setText( "Use Live GPS" );
+ emit fakeGpsPressed(m_fakeLocationLabel);
+ m_toggleFakeGpsAction->setText("Use Live GPS");
}
void Ui::useLiveGps()
{
- emit liveGpsPressed();
- m_toggleFakeGpsAction->setText( "Use Fake GPS" );
+ emit liveGpsPressed();
+ m_toggleFakeGpsAction->setText("Use Fake GPS");
}
-void Ui::setAddress( const QString &label )
+void Ui::setAddress(const QString &label)
{
- Locations locations;
- Location *location=locations.location( label );
-
- bool ok;
- QString address = QInputDialog::getText(
- m_centralWidget,
- tr("Enter address for \""+QString(label).toLatin1()+"\""),
- tr("Address"),
- QLineEdit::Normal,
- location->address(),
- &ok
- );
-
- if ( ok ) {
- qDebug() << "new address" << address;
Locations locations;
- Location *location = locations.location( label );
- qDebug() << "location" << location;
- if ( location ) {
- location->resolveAddress( address );
+ Location *location=locations.location(label);
+
+ bool ok;
+ QString address = QInputDialog::getText(
+ m_centralWidget,
+ tr("Enter address for \""+QString(label).toLatin1()+"\""),
+ tr("Address"),
+ QLineEdit::Normal,
+ location->address(),
+ &ok
+ );
+
+ if (ok) {
+ qDebug() << "new address" << address;
+ Locations locations;
+ Location *location = locations.location(label);
+ qDebug() << "location" << location;
+ if (location) {
+ location->resolveAddress(address);
+ }
}
- }
}
-void Ui::setBusy( bool busy )
+void Ui::setBusy(bool busy)
{
- m_mainWindow->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy);
+ m_mainWindow->setAttribute(Qt::WA_Maemo5ShowProgressIndicator, busy);
}
class Ui : public QObject
{
- Q_OBJECT
+ Q_OBJECT
public:
- Ui();
- ~Ui();
- void setupUi( QMainWindow *mainWindow );
+ Ui();
+ ~Ui();
+ void setupUi(QMainWindow *mainWindow);
- enum {
- HomeButtonId=0,
- WorkButtonId=1
- };
+ enum {
+ HomeButtonId=0,
+ WorkButtonId=1
+ };
- enum {
- ScreenWidth=800,
- ScreenHeight=480
- };
+ enum {
+ ScreenWidth=800,
+ ScreenHeight=480
+ };
- QMainWindow *m_mainWindow;
- QWidget *m_centralWidget;
- QButtonGroup *m_destinationButtons;
- QButtonGroup *m_routeButtons;
- QVBoxLayout *m_routeStack;
- QTableWidget *m_routeDetailTable;
- QVBoxLayout *m_mainLayout;
- QGridLayout *m_buttonLayout;
- QMenu *m_menu;
- QAction *m_toggleFakeGpsAction;
- QAction *m_useLiveGpsAction;
- bool m_usingFakeGps;
- QString m_fakeLocationLabel;
+ QMainWindow *m_mainWindow;
+ QWidget *m_centralWidget;
+ QButtonGroup *m_destinationButtons;
+ QButtonGroup *m_routeButtons;
+ QVBoxLayout *m_routeStack;
+ QTableWidget *m_routeDetailTable;
+ QVBoxLayout *m_mainLayout;
+ QGridLayout *m_buttonLayout;
+ QMenu *m_menu;
+ QAction *m_toggleFakeGpsAction;
+ QAction *m_useLiveGpsAction;
+ bool m_usingFakeGps;
+ QString m_fakeLocationLabel;
Q_SIGNALS:
- void homeAddressChanged( QString address );
- void workAddressChanged( QString address );
- void fakeGpsPressed( const QString &fakeLocationLabel );
- void liveGpsPressed();
+ void homeAddressChanged(QString address);
+ void workAddressChanged(QString address);
+ void fakeGpsPressed(const QString &fakeLocationLabel);
+ void liveGpsPressed();
private Q_SLOTS:
- void setHomeAddress();
- void setWorkAddress();
- void toggleFakeGps();
- void setBusy( bool busy );
+ void setHomeAddress();
+ void setWorkAddress();
+ void toggleFakeGps();
+ void setBusy(bool busy);
private:
- void useFakeGps();
- void useLiveGps();
- void setAddress( const QString &label );
+ void useFakeGps();
+ void useLiveGps();
+ void setAddress(const QString &label);
};
#endif //UI_H
#include <QVBoxLayout>
#include <QTableWidgetItem>
-UiController::UiController( Ui *ui ) :
- m_routeData(),
- m_destination(),
- m_ui(ui),
- m_currentDestination(-1),
- m_currentRoute(-1)
+UiController::UiController(Ui *ui) :
+ m_locations(new Locations),
+ m_routeData(),
+ m_destination(),
+ m_ui(ui),
+ m_currentDestination(-1),
+ m_currentRoute(-1)
{
- Locations locations;
- Location *homeLocation = locations.location( "home" );
- Location *workLocation = locations.location( "work" );
-
- if ( homeLocation==0 ) {
- homeLocation = new Location( "home" );
- locations.addLocation( homeLocation );
- } else if ( homeLocation->isValid() ) {
- setHomeButtonValid();
- }
-
- if ( workLocation==0 ) {
- workLocation = new Location( "work" );
- locations.addLocation( workLocation );
- } else if ( workLocation->isValid() ) {
- setWorkButtonValid();
- }
-
- connect(
- homeLocation, SIGNAL( becomeValid() ),
- this, SLOT( setHomeButtonValid() )
- );
- connect(
- homeLocation, SIGNAL( becomeInValid() ),
- this, SLOT( setHomeButtonInValid() )
- );
- connect(
- homeLocation, SIGNAL( becomeValid() ),
- &locations, SLOT( saveLocation() )
- );
- connect(
- homeLocation, SIGNAL( busy( bool ) ),
- ui, SLOT( setBusy( bool ) )
- );
-
- connect(
- workLocation, SIGNAL( becomeValid() ),
- this, SLOT( setWorkButtonValid() )
- );
- connect(
- workLocation, SIGNAL( becomeInValid() ),
- this, SLOT( setWorkButtonInValid() )
- );
- connect(
- workLocation, SIGNAL( becomeValid() ),
- &locations, SLOT( saveLocation() )
- );
- connect(
- workLocation, SIGNAL( busy( bool ) ),
- ui, SLOT( setBusy( bool ) )
- );
-
- m_destination.append( homeLocation );
- m_destination.append( workLocation );
-
- connect(
- m_ui->m_destinationButtons, SIGNAL( buttonClicked( int ) ),
- this, SLOT( changeDestination( int ) )
- );
-
- connect(
- m_ui->m_routeButtons, SIGNAL( buttonClicked( int ) ),
- this, SLOT( changeRoute( int ) )
- );
+ Location *homeLocation = m_locations->location("home");
+ Location *workLocation = m_locations->location("work");
+
+ if (homeLocation==0) {
+ homeLocation = new Location("home");
+ m_locations->addLocation(homeLocation);
+ } else if (homeLocation->isValid()) {
+ setHomeButtonValid();
+ }
+
+ if (workLocation==0) {
+ workLocation = new Location("work");
+ m_locations->addLocation(workLocation);
+ } else if (workLocation->isValid()) {
+ setWorkButtonValid();
+ }
+
+ connect(
+ homeLocation, SIGNAL(becomeValid()),
+ this, SLOT(setHomeButtonValid())
+ );
+ connect(
+ homeLocation, SIGNAL(becomeInValid()),
+ this, SLOT(setHomeButtonInValid())
+ );
+ connect(
+ homeLocation, SIGNAL(becomeValid()),
+ m_locations, SLOT(saveLocation())
+ );
+ connect(
+ homeLocation, SIGNAL(busy(bool)),
+ ui, SLOT(setBusy(bool))
+ );
+
+ connect(
+ workLocation, SIGNAL(becomeValid()),
+ this, SLOT(setWorkButtonValid())
+ );
+ connect(
+ workLocation, SIGNAL(becomeInValid()),
+ this, SLOT(setWorkButtonInValid())
+ );
+ connect(
+ workLocation, SIGNAL(becomeValid()),
+ m_locations, SLOT(saveLocation())
+ );
+ connect(
+ workLocation, SIGNAL(busy(bool)),
+ ui, SLOT(setBusy(bool))
+ );
+
+ m_destination.append(homeLocation);
+ m_destination.append(workLocation);
+
+ connect(
+ m_ui->m_destinationButtons, SIGNAL(buttonClicked(int)),
+ this, SLOT(changeDestination(int))
+ );
+
+ connect(
+ m_ui->m_routeButtons, SIGNAL(buttonClicked(int)),
+ this, SLOT(changeRoute(int))
+ );
}
UiController::~UiController()
void UiController::setHomeButtonInValid()
{
- qDebug() << "setting home button invalid";
- setButtonValid( Ui::HomeButtonId, false );
+ qDebug() << "setting home button invalid";
+ setButtonValid(Ui::HomeButtonId, false);
}
void UiController::setHomeButtonValid()
{
- qDebug() << "setting home button valid";
- setButtonValid( Ui::HomeButtonId, true );
+ qDebug() << "setting home button valid";
+ setButtonValid(Ui::HomeButtonId, true);
}
void UiController::setWorkButtonInValid()
{
- qDebug() << "setting work button invalid";
- setButtonValid( Ui::WorkButtonId, false );
+ qDebug() << "setting work button invalid";
+ setButtonValid(Ui::WorkButtonId, false);
}
void UiController::setWorkButtonValid()
{
- qDebug() << "setting work button valid";
- setButtonValid( Ui::WorkButtonId, true );
+ qDebug() << "setting work button valid";
+ setButtonValid(Ui::WorkButtonId, true);
}
-void UiController::setButtonValid( int id, bool isValid )
+void UiController::setButtonValid(int id, bool isValid)
{
- m_ui->m_destinationButtons->button( id )->setEnabled( isValid );
+ m_ui->m_destinationButtons->button(id)->setEnabled(isValid);
}
-void UiController::changeDestination( int id )
+void UiController::changeDestination(int id)
{
- bool destinationHasChanged = ( m_currentDestination != id );
- qDebug() << "Destination has changed=" << destinationHasChanged;
- if ( destinationHasChanged ) {
- qDebug() << "Emitting destination changed (" << m_destination[id]->label() << ")";
- emit destinationChanged( m_destination[id] );
- m_currentDestination = id;
- }
-
- // always want to emit this so that the gps position is updated
- // and the user gets new information
- emit buttonClicked();
+ bool destinationHasChanged = (m_currentDestination != id);
+ qDebug() << "Destination has changed=" << destinationHasChanged;
+ if (destinationHasChanged) {
+ qDebug() << "Emitting destination changed (" << m_destination[id]->label() << ")";
+ emit destinationChanged(m_destination[id]);
+ m_currentDestination = id;
+ }
+
+ // always want to emit this so that the gps position is updated
+ // and the user gets new information
+ emit buttonClicked();
}
-void UiController::changeRoute( int id )
+void UiController::changeRoute(int id)
{
- bool routeHasChanged = ( m_currentRoute != id );
- if ( routeHasChanged ) {
- displayRouteDetail( id );
- }
+ bool routeHasChanged = (m_currentRoute != id);
+ if (routeHasChanged) {
+ displayRouteDetail(id);
+ }
}
-void UiController::displayRouteDetail( int id )
+void UiController::displayRouteDetail(int id)
{
- QTableWidget *table = m_ui->m_routeDetailTable;
-
- if ( id < m_routeData.count() ) {
- QList<LegData> &legDataList = m_routeData[ id ].m_legData;
- table->setRowCount( legDataList.count() );
-
- int row=0;
- foreach( LegData thisLegData, legDataList ) {
- QString thisHow = thisLegData.m_how;
-
- bool thisIsLine = ( thisHow == "LINE" );
- if ( thisIsLine ) {
- thisHow = thisLegData.m_lineCode;
- }
-
- QStringList tableStrings;
- tableStrings
- << thisHow
- << thisLegData.m_tripTime
- << thisLegData.m_tripDistance
- << thisLegData.m_departureTime
- << thisLegData.m_arrivalTime;
-
- int col=0;
- foreach( QString thisString, tableStrings ) {
- QTableWidgetItem *newItem = new QTableWidgetItem();
- newItem->setText( thisString );
- table->setItem( row,col, newItem );
- ++col;
- }
-
- ++row;
+ QTableWidget *table = m_ui->m_routeDetailTable;
+
+ if (id < m_routeData.count()) {
+ QList<LegData> &legDataList = m_routeData[ id ].m_legData;
+ table->setRowCount(legDataList.count());
+
+ int row=0;
+ foreach(LegData thisLegData, legDataList) {
+ QString thisHow = thisLegData.m_how;
+
+ bool notWalk = (thisHow != "walk");
+ if (notWalk) {
+ thisHow = thisLegData.m_lineCode;
+ }
+
+ QStringList tableStrings;
+ tableStrings
+ << thisHow
+ << thisLegData.m_tripTime
+ << thisLegData.m_tripDistance
+ << thisLegData.m_departureTime
+ << thisLegData.m_arrivalTime;
+
+ int col=0;
+ foreach(QString thisString, tableStrings) {
+ QTableWidgetItem *newItem = new QTableWidgetItem();
+ newItem->setText(thisString);
+ table->setItem(row,col, newItem);
+ ++col;
+ }
+
+ ++row;
+ }
+ } else {
+ table->setRowCount(0);
}
- } else {
- table->setRowCount( 0 );
- }
- table->resizeColumnsToContents();
+ table->resizeColumnsToContents();
}
-void UiController::displayRoute( const QList<RouteData> &routeData )
+void UiController::displayRoute(const QList<RouteData> &routeData)
{
- m_routeData = routeData;
+ m_routeData = routeData;
- qDebug() << "displaying route";
+ qDebug() << "displaying route";
- for ( int i=0; i<Ytv::ShowFiveResults; ++i ) {
- QString label;
+ for (int i=0; i<Ytv::ShowFiveResults; ++i) {
+ QString label;
- QWidget *widget = m_ui->m_routeStack->itemAt( i )->widget();
- QRadioButton *button = qobject_cast<QRadioButton *>(widget);
+ QWidget *widget = m_ui->m_routeStack->itemAt(i)->widget();
+ QRadioButton *button = qobject_cast<QRadioButton *>(widget);
- if ( i<routeData.count() ) {
- RouteData thisRouteData = routeData.at(i);
- label = ( QStringList()
- << thisRouteData.m_departureTime
- << thisRouteData.m_lineCode ).join( "/" );
- button->setEnabled( true );
- } else {
- button->setEnabled( false );
- }
+ if (i<routeData.count()) {
+ RouteData thisRouteData = routeData.at(i);
+ label = (QStringList()
+ << thisRouteData.m_departureTime
+ << thisRouteData.m_lineCode).join("/");
+ button->setEnabled(true);
+ } else {
+ button->setEnabled(false);
+ }
- if ( i==0 ) {
- button->setChecked( true );
- } else {
- button->setChecked( false );
- }
+ if (i==0) {
+ button->setChecked(true);
+ } else {
+ button->setChecked(false);
+ }
- button->setText( label );
- }
+ button->setText(label);
+ }
- displayRouteDetail( 0 );
+ displayRouteDetail(0);
}
#include <QObject>
class Ui;
+class Locations;
class UiController : public QObject
{
- Q_OBJECT
+ Q_OBJECT
public:
- UiController( Ui *ui );
- ~UiController();
+ UiController(Ui *ui);
+ ~UiController();
public Q_SLOTS:
- void displayRoute( const QList<RouteData> &routeData );
+ void displayRoute(const QList<RouteData> &routeData);
Q_SIGNALS:
- void buttonClicked();
- void destinationChanged( Location *newDestination );
+ void buttonClicked();
+ void destinationChanged(Location *newDestination);
private Q_SLOTS:
- void changeDestination( int id );
- void changeRoute( int id );
- void setHomeButtonValid();
- void setWorkButtonValid();
- void setHomeButtonInValid();
- void setWorkButtonInValid();
- void displayRouteDetail( int id );
+ void changeDestination(int id);
+ void changeRoute(int id);
+ void setHomeButtonValid();
+ void setWorkButtonValid();
+ void setHomeButtonInValid();
+ void setWorkButtonInValid();
+ void displayRouteDetail(int id);
private:
- void setButtonValid( int id, bool isValid );
+ void setButtonValid(int id, bool isValid);
private:
- QList<RouteData> m_routeData;
- QList<Location*> m_destination;
- Ui *m_ui;
- int m_currentDestination;
- int m_currentRoute;
+ Locations *m_locations;
+ QList<RouteData> m_routeData;
+ QList<Location*> m_destination;
+ Ui *m_ui;
+ int m_currentDestination;
+ int m_currentRoute;
};
#endif // UICONTROLLER_H
-
--- /dev/null
+#include "xmlparser.h"
+#include "routedata.h"
+
+#include <QList>
+#include <QByteArray>
+#include <QStringRef>
+#include <QString>
+#include <QStringList>
+#include <QXmlStreamReader>
+#include <QDebug>
+
+XmlParser::XmlParser()
+{
+}
+
+QList<XmlParser::LocsData> XmlParser::parseLocs(QXmlStreamReader &xml)
+{
+ QList<XmlParser::LocsData> retVal;
+ retVal.clear();
+
+ QSet<QString> elements;
+ elements
+ << "coord"
+ << "x"
+ << "y"
+ << "arrTime"
+ << "depTime"
+ << "name";
+
+ QString name;
+
+ while (xml.readNextStartElement()) {
+ QHash<QString,QString> text;
+
+ while (xml.readNextStartElement()) {
+ if (xml.name() == "coord") {
+ xml.readNextStartElement();
+ // x
+ text.insert(xml.name().toString(),xml.readElementText());
+
+ xml.readNextStartElement();
+ // y
+ text.insert(xml.name().toString(),xml.readElementText());
+
+ xml.readNextStartElement(); // up a level
+ } else {
+ text.insert(xml.name().toString(),xml.readElementText());
+ }
+ }
+
+ LocsData data;
+ data.m_x = text.value("x");
+ data.m_y = text.value("y");
+ data.m_arrTime = text.value("arrTime");
+ data.m_depTime = text.value("depTime");
+ data.m_name = text.value("name");
+
+ retVal << data;
+ }
+
+ return retVal;
+}
+
+QList<LegData> XmlParser::parseLegs(QXmlStreamReader &xml)
+{
+ QList<LegData> retVal;
+
+ while (xml.readNextStartElement()) { // loop over leg <node>s
+ QString how;
+ QString tripTime;
+ QString tripDistance;
+ QString departureTime;
+ QString arrivalTime;
+ QString lineCode;
+
+ if (xml.name() == "node") { // new leg
+ xml.readNextStartElement();
+
+ if (xml.name() == "length") {
+ tripDistance = xml.readElementText();
+ }
+
+ xml.readNextStartElement();
+
+ if (xml.name() == "duration") {
+ tripTime = xml.readElementText();
+ }
+
+ xml.readNextStartElement();
+
+ if (xml.name() == "type") {
+ how = parseType(xml.readElementText());
+ }
+
+ xml.readNextStartElement();
+
+ if (xml.name() == "code") { // only if type != walk
+ lineCode = xml.readElementText();
+
+ xml.readNextStartElement();
+ }
+
+ if (xml.name() == "locs") {
+ QList<LocsData> locs = parseLocs(xml);
+ arrivalTime = parseTime(locs[0].m_arrTime);
+ departureTime = parseTime(locs[0].m_depTime);
+
+ LegData legData;
+
+ legData.m_arrivalTime = arrivalTime;
+ legData.m_departureTime = departureTime;
+ legData.m_how = how;
+ legData.m_lineCode = parseJORECode(lineCode);
+ legData.m_tripDistance = tripDistance;
+ legData.m_tripTime = tripTime;
+
+ retVal << legData;
+
+ xml.skipCurrentElement();
+ }
+ }
+ }
+
+ return retVal;
+}
+
+QList<RouteData> XmlParser::parseRouteData(const QByteArray &reply)
+{
+ QList<RouteData> retVal;
+
+ QXmlStreamReader xml(reply);
+
+ // find response
+ while (!xml.atEnd()) {
+ xml.readNext();
+
+ if (xml.name() == "response") {
+
+ while (xml.readNextStartElement()) { // loop over route <node>
+ RouteData routeData;
+
+ if (xml.name() == "node") { // ROUTE node
+
+ xml.readNextStartElement(); // redundant single <node>
+
+ xml.readNextStartElement();
+
+ if (xml.name() == "length") {
+ routeData.m_tripDistance = xml.readElementText();
+ }
+
+ xml.readNextStartElement();
+
+ if (xml.name() == "duration") {
+ routeData.m_tripTime = xml.readElementText();
+ }
+
+ xml.readNextStartElement();
+
+ if (xml.name() == "legs") {
+ QList<LegData> legData = parseLegs(xml);
+
+ foreach (LegData thisLeg, legData) {
+ // set the departure time of the Route to the departure time of the
+ // first non-walk (usually the bus)
+ if (thisLeg.m_how != "walk" && routeData.m_departureTime.isEmpty()) {
+ routeData.m_departureTime = thisLeg.m_departureTime;
+ routeData.m_lineCode = thisLeg.m_lineCode;
+ }
+
+ routeData << thisLeg;
+ }
+
+ xml.skipCurrentElement();
+ }
+ }
+
+ retVal << routeData;
+ routeData.clear();
+
+ xml.readNext();
+ }
+ }
+ }
+
+ if (xml.hasError()) {
+ qDebug() << "xml error:" << xml.errorString();
+ }
+
+ return retVal;
+}
+
+QPair<QString,QString> XmlParser::parseGeocode(const QByteArray &reply)
+{
+ QPair<QString,QString> retVal;
+
+ m_error = false;
+
+ QXmlStreamReader xml(reply);
+
+ while (!xml.atEnd()) {
+ xml.readNext();
+
+ if (xml.name() == "coords") {
+ QString text(xml.readElementText());
+
+ QStringList coords(text.split(","));
+
+ QString newLongitude(coords.at(0));
+ QString newLatitude(coords.at(1));
+
+ retVal.first = newLongitude;
+ retVal.second = newLatitude;
+
+ break;
+ }
+
+ if (xml.name() == "ERROR") {
+ qDebug() << "ERROR";
+ m_error = true;
+ }
+ }
+
+ if (m_error) {
+ qDebug() << "xml error";
+ }
+
+ return retVal;
+}
+
+QString XmlParser::parseJORECode(const QString &joreCode) const
+{
+ QString retVal;
+
+ QString areaTransportTypeCode(joreCode.mid(0,1));
+ QString lineCode(joreCode.mid(1,3));
+ QString letterVariant(joreCode.mid(4,1));
+ QString letterNumberVariant(joreCode.mid(5,1));
+ QString direction(joreCode.mid(6,1));
+
+ Q_UNUSED(areaTransportTypeCode);
+ Q_UNUSED(letterNumberVariant);
+ Q_UNUSED(direction);
+
+ lineCode.setNum(lineCode.toInt());
+
+ retVal = lineCode;
+
+ if (letterVariant != " ") {
+ retVal += letterVariant;
+ }
+
+ return retVal;
+}
+
+QString XmlParser::parseTime(const QString &time) const
+{
+ QString retVal = time.right(4).insert(2,":");
+
+ return retVal;
+}
+
+QString XmlParser::parseType(const QString &type) const
+{
+ QString retVal;
+ QStringList transportType;
+ transportType
+ << "Helsi"
+ << "Trams"
+ << "Espoo"
+ << "Vanta"
+ << "Regio"
+ << "Metro"
+ << "Ferry"
+ << "ULine"
+ << "CTrai"
+ << "HelSe"
+ << "HelNi"
+ << "EspSe"
+ << "VanSe"
+ << "RegNi"
+ << "Kirkk"
+ << "Kerav"
+ ;
+
+ if (type=="walk") {
+ retVal = "walk";
+ } else {
+ retVal = transportType.at(type.toInt()-1);
+ }
+
+ return retVal;
+}
--- /dev/null
+#ifndef XMLPARSER_H
+#define XMLPARSER_H
+
+#include "routedata.h"
+
+#include <QList>
+#include <QByteArray>
+#include <QXmlStreamReader>
+
+class XmlParser
+{
+public:
+ XmlParser();
+
+ struct LocsData {
+ QString m_x;
+ QString m_y;
+ QString m_arrTime;
+ QString m_depTime;
+ QString m_name;
+ };
+
+ QPair<QString,QString> parseGeocode(const QByteArray &reply);
+ QList<RouteData> parseRouteData(const QByteArray &reply);
+
+ bool error() {
+ return m_error;
+ }
+
+private:
+ QList<XmlParser::LocsData> parseLocs(QXmlStreamReader &xml);
+ QList<LegData> parseLegs(QXmlStreamReader &xml);
+ QString parseJORECode(const QString &joreCode) const;
+ QString parseTime(const QString &time) const;
+ QString parseType(const QString &type) const;
+
+ bool m_error;
+};
+
+#endif // XMLPARSER_H
#include <QString>
namespace Ytv {
- const QString Url( "http://api.reittiopas.fi/public-ytv/fi/api/" );
- const QString Username( "zouba" );
- const QString Password( "caf9r3ee" );
+ const QString Url("http://api.reittiopas.fi/hsl/prod/");
+ const QString Username("zouba");
+ const QString Password("caf9r3ee");
+ const QString Geocode("geocode");
+ const QString Route("route");
+ const QString Xml("xml");
+ const QString English("en");
+ const QString WGS84("wgs84");
- //const QString Home( QByteArray::fromPercentEncoding( "Taivaanvuohentie%207%2CHelsinki" ) );
- //const QString Work( QByteArray::fromPercentEncoding( "It%E4merenkatu%2011%2CHelsinki" ) );
+ enum {
+ WalkSpeedSlow=1,
+ WalkSpeedFast=2,
+ WalkSpeedNormal=3,
+ WalkSpeedRunning=4,
+ WalkSpeedCycling=5,
+ NoWalkSpeeds=5
+ };
- enum {
- WalkSpeedSlow=1,
- WalkSpeedFast=2,
- WalkSpeedNormal=3,
- WalkSpeedRunning=4,
- WalkSpeedCycling=5,
- NoWalkSpeeds=5
- };
-
- enum {
- ShowOneResult=1,
- ShowThreeResults=3,
- ShowFiveResults=5
- };
-
- enum {
- OptimizeDefault=1,
- OptimizeFastest=2,
- OptimizeLeastTransfers=3,
- OptimizeLeastWalking=4
- };
+ enum {
+ ShowOneResult=1,
+ ShowThreeResults=3,
+ ShowFiveResults=5
+ };
+ enum {
+ OptimizeDefault=1,
+ OptimizeFastest=2,
+ OptimizeLeastTransfers=3,
+ OptimizeLeastWalking=4
+ };
};
-
--- /dev/null
+#include "../../src/xmlparser.h"
+
+#include <QCoreApplication>
+#include <QFile>
+#include <QByteArray>
+#include <QDebug>
+#include <QStringList>
+
+QDebug operator <<(QDebug dbg, const RouteData &routeData)
+{
+ QStringList routeDataBits;
+ routeDataBits
+ << routeData.m_tripTime
+ << routeData.m_tripDistance
+ << routeData.m_departureTime
+ << routeData.m_lineCode;
+ QStringList legDataBits;
+
+ foreach(LegData legData, routeData.m_legData) {
+ legDataBits
+ << legData.m_arrivalTime
+ << legData.m_departureTime
+ << legData.m_how
+ << legData.m_lineCode
+ << legData.m_tripDistance
+ << legData.m_tripTime;
+ }
+
+ dbg.nospace() << "["
+ << routeDataBits.join(", ")
+ << " [" << legDataBits.join(", ") << "] "
+ << "]";
+
+ return dbg.space();
+}
+
+int main(int argc, char *argv[])
+{
+ QCoreApplication app(argc,argv);
+
+ QFile file("routeResponse.xml");
+ if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
+ return 0;
+
+ QByteArray reply = file.readAll();
+
+ XmlParser parser;
+ QList<RouteData> nodes = parser.parseRouteData(reply);
+
+ foreach(RouteData node, nodes) {
+ qDebug() << node;
+ }
+
+ return 0;
+}
--- /dev/null
+######################################################################
+# Automatically generated by qmake (2.01a) Sat May 28 12:35:33 2011
+######################################################################
+
+TEMPLATE = app
+TARGET =
+INCLUDEPATH += . ../../src
+DEPENDPATH += . $INCLUDEPATH
+
+# Input
+HEADERS += ../../src/xmlparser.h
+SOURCES += main.cpp ../../src/xmlparser.cpp
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<response>
+ <node>
+ <node>
+ <length>389.183</length>
+ <duration>240</duration>
+ <legs>
+ <node>
+ <length>389</length>
+ <duration>288.12</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291827</arrTime>
+ <depTime>201105291827</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8811518377</x>
+ <y>60.1618691039</y>
+ </coord>
+ <arrTime>201105291830</arrTime>
+ <depTime>201105291830</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8820872616</x>
+ <y>60.1624328568</y>
+ </coord>
+ <arrTime>201105291831</arrTime>
+ <depTime>201105291831</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8825483159</x>
+ <y>60.1618275013</y>
+ </coord>
+ <arrTime>201105291831</arrTime>
+ <depTime>201105291831</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+ <node>
+ <node>
+ <length>389.183</length>
+ <duration>240</duration>
+ <legs>
+ <node>
+ <length>389</length>
+ <duration>288.12</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291828</arrTime>
+ <depTime>201105291828</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8811518377</x>
+ <y>60.1618691039</y>
+ </coord>
+ <arrTime>201105291831</arrTime>
+ <depTime>201105291831</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8820872616</x>
+ <y>60.1624328568</y>
+ </coord>
+ <arrTime>201105291832</arrTime>
+ <depTime>201105291832</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8825483159</x>
+ <y>60.1618275013</y>
+ </coord>
+ <arrTime>201105291832</arrTime>
+ <depTime>201105291832</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+ <node>
+ <node>
+ <length>389.183</length>
+ <duration>240</duration>
+ <legs>
+ <node>
+ <length>389</length>
+ <duration>288.12</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291829</arrTime>
+ <depTime>201105291829</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8811518377</x>
+ <y>60.1618691039</y>
+ </coord>
+ <arrTime>201105291832</arrTime>
+ <depTime>201105291832</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8820872616</x>
+ <y>60.1624328568</y>
+ </coord>
+ <arrTime>201105291833</arrTime>
+ <depTime>201105291833</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8825483159</x>
+ <y>60.1618275013</y>
+ </coord>
+ <arrTime>201105291833</arrTime>
+ <depTime>201105291833</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+ <node>
+ <node>
+ <length>389.183</length>
+ <duration>240</duration>
+ <legs>
+ <node>
+ <length>389</length>
+ <duration>288.12</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291830</arrTime>
+ <depTime>201105291830</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8811518377</x>
+ <y>60.1618691039</y>
+ </coord>
+ <arrTime>201105291833</arrTime>
+ <depTime>201105291833</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8820872616</x>
+ <y>60.1624328568</y>
+ </coord>
+ <arrTime>201105291834</arrTime>
+ <depTime>201105291834</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8825483159</x>
+ <y>60.1618275013</y>
+ </coord>
+ <arrTime>201105291834</arrTime>
+ <depTime>201105291834</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+ <node>
+ <node>
+ <length>389.183</length>
+ <duration>240</duration>
+ <legs>
+ <node>
+ <length>389</length>
+ <duration>288.12</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291831</arrTime>
+ <depTime>201105291831</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8811518377</x>
+ <y>60.1618691039</y>
+ </coord>
+ <arrTime>201105291834</arrTime>
+ <depTime>201105291834</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8820872616</x>
+ <y>60.1624328568</y>
+ </coord>
+ <arrTime>201105291835</arrTime>
+ <depTime>201105291835</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8825483159</x>
+ <y>60.1618275013</y>
+ </coord>
+ <arrTime>201105291835</arrTime>
+ <depTime>201105291835</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+</response>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?><response><node><node><length>389.183</length><duration>240</duration><legs><node><length>389</length><duration>288.12</duration><type>walk</type><locs><node><coord><x>24.8843991291</x><y>60.1612003139</y></coord><arrTime>201105291827</arrTime><depTime>201105291827</depTime><name></name></node><node><coord><x>24.8811518377</x><y>60.1618691039</y></coord><arrTime>201105291830</arrTime><depTime>201105291830</depTime><name></name></node><node><coord><x>24.8820872616</x><y>60.1624328568</y></coord><arrTime>201105291831</arrTime><depTime>201105291831</depTime><name></name></node><node><coord><x>24.8825483159</x><y>60.1618275013</y></coord><arrTime>201105291831</arrTime><depTime>201105291831</depTime><name></name></node></locs></node></legs></node></node><node><node><length>389.183</length><duration>240</duration><legs><node><length>389</length><duration>288.12</duration><type>walk</type><locs><node><coord><x>24.8843991291</x><y>60.1612003139</y></coord><arrTime>201105291828</arrTime><depTime>201105291828</depTime><name></name></node><node><coord><x>24.8811518377</x><y>60.1618691039</y></coord><arrTime>201105291831</arrTime><depTime>201105291831</depTime><name></name></node><node><coord><x>24.8820872616</x><y>60.1624328568</y></coord><arrTime>201105291832</arrTime><depTime>201105291832</depTime><name></name></node><node><coord><x>24.8825483159</x><y>60.1618275013</y></coord><arrTime>201105291832</arrTime><depTime>201105291832</depTime><name></name></node></locs></node></legs></node></node><node><node><length>389.183</length><duration>240</duration><legs><node><length>389</length><duration>288.12</duration><type>walk</type><locs><node><coord><x>24.8843991291</x><y>60.1612003139</y></coord><arrTime>201105291829</arrTime><depTime>201105291829</depTime><name></name></node><node><coord><x>24.8811518377</x><y>60.1618691039</y></coord><arrTime>201105291832</arrTime><depTime>201105291832</depTime><name></name></node><node><coord><x>24.8820872616</x><y>60.1624328568</y></coord><arrTime>201105291833</arrTime><depTime>201105291833</depTime><name></name></node><node><coord><x>24.8825483159</x><y>60.1618275013</y></coord><arrTime>201105291833</arrTime><depTime>201105291833</depTime><name></name></node></locs></node></legs></node></node><node><node><length>389.183</length><duration>240</duration><legs><node><length>389</length><duration>288.12</duration><type>walk</type><locs><node><coord><x>24.8843991291</x><y>60.1612003139</y></coord><arrTime>201105291830</arrTime><depTime>201105291830</depTime><name></name></node><node><coord><x>24.8811518377</x><y>60.1618691039</y></coord><arrTime>201105291833</arrTime><depTime>201105291833</depTime><name></name></node><node><coord><x>24.8820872616</x><y>60.1624328568</y></coord><arrTime>201105291834</arrTime><depTime>201105291834</depTime><name></name></node><node><coord><x>24.8825483159</x><y>60.1618275013</y></coord><arrTime>201105291834</arrTime><depTime>201105291834</depTime><name></name></node></locs></node></legs></node></node><node><node><length>389.183</length><duration>240</duration><legs><node><length>389</length><duration>288.12</duration><type>walk</type><locs><node><coord><x>24.8843991291</x><y>60.1612003139</y></coord><arrTime>201105291831</arrTime><depTime>201105291831</depTime><name></name></node><node><coord><x>24.8811518377</x><y>60.1618691039</y></coord><arrTime>201105291834</arrTime><depTime>201105291834</depTime><name></name></node><node><coord><x>24.8820872616</x><y>60.1624328568</y></coord><arrTime>201105291835</arrTime><depTime>201105291835</depTime><name></name></node><node><coord><x>24.8825483159</x><y>60.1618275013</y></coord><arrTime>201105291835</arrTime><depTime>201105291835</depTime><name></name></node></locs></node></legs></node></node></response>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8" ?>
+<response>
+ <node>
+ <node>
+ <length>3972.706</length>
+ <duration>1200</duration>
+ <legs>
+ <node>
+ <length>166</length>
+ <duration>122.64</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291723</arrTime>
+ <depTime>201105291723</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8849737013</x>
+ <y>60.161135443</y>
+ </coord>
+ <arrTime>201105291724</arrTime>
+ <depTime>201105291724</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8851061757</x>
+ <y>60.1607037122</y>
+ </coord>
+ <arrTime>201105291725</arrTime>
+ <depTime>201105291725</depTime>
+ <name>Lauttasaarentie</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8840610166</x>
+ <y>60.1604800039</y>
+ </coord>
+ <arrTime>201105291726</arrTime>
+ <depTime>201105291726</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>3077</length>
+ <duration>420</duration>
+ <type>5</type>
+ <code>2103T 2</code>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8840610166</x>
+ <y>60.1604800039</y>
+ </coord>
+ <arrTime>201105291726</arrTime>
+ <depTime>201105291726</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8912987534</x>
+ <y>60.1610688341</y>
+ </coord>
+ <arrTime>201105291728</arrTime>
+ <depTime>201105291728</depTime>
+ <name>Lauttasaaren silta</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9058315134</x>
+ <y>60.1636451749</y>
+ </coord>
+ <arrTime>201105291729</arrTime>
+ <depTime>201105291729</depTime>
+ <name>Salmisaari</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9134665043</x>
+ <y>60.1642300842</y>
+ </coord>
+ <arrTime>201105291730</arrTime>
+ <depTime>201105291730</depTime>
+ <name>Lnsivyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9267577712</x>
+ <y>60.1661035862</y>
+ </coord>
+ <arrTime>201105291732</arrTime>
+ <depTime>201105291732</depTime>
+ <name>Lapinrinne</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9301475091</x>
+ <y>60.1687726522</y>
+ </coord>
+ <arrTime>201105291733</arrTime>
+ <depTime>201105291733</depTime>
+ <name>Kamppi, tulolaituri</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>728</length>
+ <duration>624.18</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.9301475091</x>
+ <y>60.1687726522</y>
+ </coord>
+ <arrTime>201105291733</arrTime>
+ <depTime>201105291733</depTime>
+ <name>Kamppi, tulolaituri</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9314926601</x>
+ <y>60.1693277999</y>
+ </coord>
+ <arrTime>201105291734</arrTime>
+ <depTime>201105291734</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9316654649</x>
+ <y>60.169386725</y>
+ </coord>
+ <arrTime>201105291734</arrTime>
+ <depTime>201105291734</depTime>
+ <name>Salomonkatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9323912416</x>
+ <y>60.1696338492</y>
+ </coord>
+ <arrTime>201105291735</arrTime>
+ <depTime>201105291735</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.932991506</x>
+ <y>60.1698378702</y>
+ </coord>
+ <arrTime>201105291735</arrTime>
+ <depTime>201105291735</depTime>
+ <name>Salomonkatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9339865173</x>
+ <y>60.1701764415</y>
+ </coord>
+ <arrTime>201105291736</arrTime>
+ <depTime>201105291736</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9356165422</x>
+ <y>60.1706720944</y>
+ </coord>
+ <arrTime>201105291738</arrTime>
+ <depTime>201105291738</depTime>
+ <name>Salomonkatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.935991995</x>
+ <y>60.1708247296</y>
+ </coord>
+ <arrTime>201105291738</arrTime>
+ <depTime>201105291738</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9363710793</x>
+ <y>60.1709782358</y>
+ </coord>
+ <arrTime>201105291739</arrTime>
+ <depTime>201105291739</depTime>
+ <name>Mannerheimintie</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9368129938</x>
+ <y>60.1708072627</y>
+ </coord>
+ <arrTime>201105291739</arrTime>
+ <depTime>201105291739</depTime>
+ <name>Postikatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9389832898</x>
+ <y>60.1709777147</y>
+ </coord>
+ <arrTime>201105291741</arrTime>
+ <depTime>201105291741</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9389572102</x>
+ <y>60.1710739428</y>
+ </coord>
+ <arrTime>201105291741</arrTime>
+ <depTime>201105291741</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410959958</x>
+ <y>60.1711494377</y>
+ </coord>
+ <arrTime>201105291743</arrTime>
+ <depTime>201105291743</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410086564</x>
+ <y>60.1712452034</y>
+ </coord>
+ <arrTime>201105291743</arrTime>
+ <depTime>201105291744</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+ <node>
+ <node>
+ <length>4375.038</length>
+ <duration>960</duration>
+ <legs>
+ <node>
+ <length>200</length>
+ <duration>148.32</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291735</arrTime>
+ <depTime>201105291735</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8849737013</x>
+ <y>60.161135443</y>
+ </coord>
+ <arrTime>201105291736</arrTime>
+ <depTime>201105291736</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8851061757</x>
+ <y>60.1607037122</y>
+ </coord>
+ <arrTime>201105291736</arrTime>
+ <depTime>201105291736</depTime>
+ <name>Lauttasaarentie</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8867859992</x>
+ <y>60.160686203</y>
+ </coord>
+ <arrTime>201105291738</arrTime>
+ <depTime>201105291738</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>3947</length>
+ <duration>660</duration>
+ <type>1</type>
+ <code>1065A 1</code>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8867859992</x>
+ <y>60.160686203</y>
+ </coord>
+ <arrTime>201105291738</arrTime>
+ <depTime>201105291738</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8912444909</x>
+ <y>60.161060223</y>
+ </coord>
+ <arrTime>201105291740</arrTime>
+ <depTime>201105291740</depTime>
+ <name>Lauttasaaren silta</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9058680229</x>
+ <y>60.1636628774</y>
+ </coord>
+ <arrTime>201105291743</arrTime>
+ <depTime>201105291743</depTime>
+ <name>Salmisaari</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.913430488</x>
+ <y>60.1642303324</y>
+ </coord>
+ <arrTime>201105291744</arrTime>
+ <depTime>201105291744</depTime>
+ <name>Lnsivyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9306289735</x>
+ <y>60.1685987294</y>
+ </coord>
+ <arrTime>201105291746</arrTime>
+ <depTime>201105291746</depTime>
+ <name>Kamppi (M)</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9322953035</x>
+ <y>60.1682818385</y>
+ </coord>
+ <arrTime>201105291748</arrTime>
+ <depTime>201105291748</depTime>
+ <name>Kampintori</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9354588292</x>
+ <y>60.168672453</y>
+ </coord>
+ <arrTime>201105291748</arrTime>
+ <depTime>201105291748</depTime>
+ <name>Simonkatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9392084131</x>
+ <y>60.1700282525</y>
+ </coord>
+ <arrTime>201105291749</arrTime>
+ <depTime>201105291749</depTime>
+ <name>Kaivokatu</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>226</length>
+ <duration>188.76</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.9392084131</x>
+ <y>60.1700282525</y>
+ </coord>
+ <arrTime>201105291749</arrTime>
+ <depTime>201105291749</depTime>
+ <name>Kaivokatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9396683488</x>
+ <y>60.1701739957</y>
+ </coord>
+ <arrTime>201105291749</arrTime>
+ <depTime>201105291749</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9393509582</x>
+ <y>60.1704150068</y>
+ </coord>
+ <arrTime>201105291749</arrTime>
+ <depTime>201105291749</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9397003895</x>
+ <y>60.1705390927</y>
+ </coord>
+ <arrTime>201105291750</arrTime>
+ <depTime>201105291750</depTime>
+ <name>Asema-aukio</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9401321312</x>
+ <y>60.1707065766</y>
+ </coord>
+ <arrTime>201105291750</arrTime>
+ <depTime>201105291750</depTime>
+ <name>Asema-aukio</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9402267451</x>
+ <y>60.1709285111</y>
+ </coord>
+ <arrTime>201105291751</arrTime>
+ <depTime>201105291751</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9403117391</x>
+ <y>60.1711289712</y>
+ </coord>
+ <arrTime>201105291751</arrTime>
+ <depTime>201105291751</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410959958</x>
+ <y>60.1711494377</y>
+ </coord>
+ <arrTime>201105291752</arrTime>
+ <depTime>201105291752</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410086564</x>
+ <y>60.1712452034</y>
+ </coord>
+ <arrTime>201105291752</arrTime>
+ <depTime>201105291752</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+ <node>
+ <node>
+ <length>4219.384</length>
+ <duration>1140</duration>
+ <legs>
+ <node>
+ <length>200</length>
+ <duration>148.32</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291736</arrTime>
+ <depTime>201105291736</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8849737013</x>
+ <y>60.161135443</y>
+ </coord>
+ <arrTime>201105291737</arrTime>
+ <depTime>201105291737</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8851061757</x>
+ <y>60.1607037122</y>
+ </coord>
+ <arrTime>201105291737</arrTime>
+ <depTime>201105291737</depTime>
+ <name>Lauttasaarentie</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.88678
+ 59992</x>
+ <y>60.160686203</y>
+ </coord>
+ <arrTime>201105291739</arrTime>
+ <depTime>201105291739</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>1861</length>
+ <duration>360</duration>
+ <type>1</type>
+ <code>1020 2</code>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8867859992</x>
+ <y>60.160686203</y>
+ </coord>
+ <arrTime>201105291739</arrTime>
+ <depTime>201105291739</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8912444909</x>
+ <y>60.161060223</y>
+ </coord>
+ <arrTime>201105291740</arrTime>
+ <depTime>201105291740</depTime>
+ <name>Lauttasaaren silta</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9058680229</x>
+ <y>60.1636628774</y>
+ </coord>
+ <arrTime>201105291743</arrTime>
+ <depTime>201105291743</depTime>
+ <name>Salmisaari</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9076974035</x>
+ <y>60.1633810852</y>
+ </coord>
+ <arrTime>201105291744</arrTime>
+ <depTime>201105291744</depTime>
+ <name>Salmisaari</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9137980243</x>
+ <y>60.1631955599</y>
+ </coord>
+ <arrTime>201105291745</arrTime>
+ <depTime>201105291745</depTime>
+ <name>Ruoholahti(M)</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>57</length>
+ <duration>49.26</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.9137980243</x>
+ <y>60.1631955599</y>
+ </coord>
+ <arrTime>201105291745</arrTime>
+ <depTime>201105291745</depTime>
+ <name>Ruoholahti(M)</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9137385246</x>
+ <y>60.1631932772</y>
+ </coord>
+ <arrTime>201105291745</arrTime>
+ <depTime>201105291745</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9138385973</x>
+ <y>60.1627105763</y>
+ </coord>
+ <arrTime>201105291745</arrTime>
+ <depTime>201105291751</depTime>
+ <name>Ruoholahti</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>1934</length>
+ <duration>180</duration>
+ <type>6</type>
+ <code>1300V 1</code>
+ <locs>
+ <node>
+ <coord>
+ <x>24.9138385973</x>
+ <y>60.1627105763</y>
+ </coord>
+ <arrTime>201105291745</arrTime>
+ <depTime>201105291751</depTime>
+ <name>Ruoholahti</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.931502109</x>
+ <y>60.1688977825</y>
+ </coord>
+ <arrTime>201105291752</arrTime>
+ <depTime>201105291752</depTime>
+ <name>Kamppi</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9411273485</x>
+ <y>60.1703557347</y>
+ </coord>
+ <arrTime>201105291754</arrTime>
+ <depTime>201105291754</depTime>
+ <name>Rautatientori</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>165</length>
+ <duration>135.78</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.9411273485</x>
+ <y>60.1703557347</y>
+ </coord>
+ <arrTime>201105291754</arrTime>
+ <depTime>201105291754</depTime>
+ <name>Rautatientori</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9414606702</x>
+ <y>60.1702312944</y>
+ </coord>
+ <arrTime>201105291754</arrTime>
+ <depTime>201105291754</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.941532741</x>
+ <y>60.1702316803</y>
+ </coord>
+ <arrTime>201105291754</arrTime>
+ <depTime>201105291754</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410959958</x>
+ <y>60.1711494377</y>
+ </coord>
+ <arrTime>201105291756</arrTime>
+ <depTime>201105291756</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410086564</x>
+ <y>60.1712452034</y>
+ </coord>
+ <arrTime>201105291756</arrTime>
+ <depTime>201105291756</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+ <node>
+ <node>
+ <length>4375.038</length>
+ <duration>960</duration>
+ <legs>
+ <node>
+ <length>200</length>
+ <duration>148.32</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291750</arrTime>
+ <depTime>201105291750</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8849737013</x>
+ <y>60.161135443</y>
+ </coord>
+ <arrTime>201105291751</arrTime>
+ <depTime>201105291751</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8851061757</x>
+ <y>60.1607037122</y>
+ </coord>
+ <arrTime>201105291751</arrTime>
+ <depTime>201105291751</depTime>
+ <name>Lauttasaarentie</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8867859992</x>
+ <y>60.160686203</y>
+ </coord>
+ <arrTime>201105291753</arrTime>
+ <depTime>201105291753</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>3947</length>
+ <duration>660</duration>
+ <type>1</type>
+ <code>1065A 1</code>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8867859992</x>
+ <y>60.160686203</y>
+ </coord>
+ <arrTime>201105291753</arrTime>
+ <depTime>201105291753</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8912444909</x>
+ <y>60.161060223</y>
+ </coord>
+ <arrTime>201105291755</arrTime>
+ <depTime>201105291755</depTime>
+ <name>Lauttasaaren silta</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9058680229</x>
+ <y>60.1636628774</y>
+ </coord>
+ <arrTime>201105291758</arrTime>
+ <depTime>201105291758</depTime>
+ <name>Salmisaari</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.913430488</x>
+ <y>60.1642303324</y>
+ </coord>
+ <arrTime>201105291759</arrTime>
+ <depTime>201105291759</depTime>
+ <name>Lnsivyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9306289735</x>
+ <y>60.1685987294</y>
+ </coord>
+ <arrTime>201105291801</arrTime>
+ <depTime>201105291801</depTime>
+ <name>Kamppi (M)</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9322953035</x>
+ <y>60.1682818385</y>
+ </coord>
+ <arrTime>201105291803</arrTime>
+ <depTime>201105291803</depTime>
+ <name>Kampintori</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9354588292</x>
+ <y>60.168672453</y>
+ </coord>
+ <arrTime>201105291803</arrTime>
+ <depTime>201105291803</depTime>
+ <name>Simonkatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9392084131</x>
+ <y>60.1700282525</y>
+ </coord>
+ <arrTime>201105291804</arrTime>
+ <depTime>201105291804</depTime>
+ <name>Kaivokatu</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>226</length>
+ <duration>188.76</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.9392084131</x>
+ <y>60.1700282525</y>
+ </coord>
+ <arrTime>201105291804</arrTime>
+ <depTime>201105291804</depTime>
+ <name>Kaivokatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9396683488</x>
+ <y>60.1701739957</y>
+ </coord>
+ <arrTime>201105291804</arrTime>
+ <depTime>201105291804</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9393509582</x>
+ <y>60.1704150068</y>
+ </coord>
+ <arrTime>201105291804</arrTime>
+ <depTime>201105291804</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9397003895</x>
+ <y>60.1705390927</y>
+ </coord>
+ <arrTime>201105291805</arrTime>
+ <depTime>201105291805</depTime>
+ <name>Asema-aukio</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9401321312</x>
+ <y>60.1707065766</y>
+ </coord>
+ <arrTime>201105291805</arrTime>
+ <depTime>201105291805</depTime>
+ <name>Asema-aukio</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9402267451</x>
+ <y>60.1709285111</y>
+ </coord>
+ <arrTime>201105291806</arrTime>
+ <depTime>201105291806</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9403117391</x>
+ <y>60.1711289712</y>
+ </coord>
+ <arrTime>201105291806</arrTime>
+ <depTime>201105291806</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410959958</x>
+ <y>60.1711494377</y>
+ </coord>
+ <arrTime>201105291807</arrTime>
+ <depTime>201105291807</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410086564</x>
+ <y>60.1712452034</y>
+ </coord>
+ <arrTime>201105291807</arrTime>
+ <depTime>201105291807</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+ <node>
+ <node>
+ <length>3972.706</length>
+ <duration>1200</duration>
+ <legs>
+ <node>
+ <length>166</length>
+ <duration>122.64</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8843991291</x>
+ <y>60.1612003139</y>
+ </coord>
+ <arrTime>201105291753</arrTime>
+ <depTime>201105291753</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8849737013</x>
+ <y>60.161135443</y>
+ </coord>
+ <arrTime>201105291754</arrTime>
+ <depTime>201105291754</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8851061757</x>
+ <y>60.1607037122</y>
+ </coord>
+ <arrTime>201105291755</arrTime>
+ <depTime>201105291755</depTime>
+ <name>Lauttasaarentie</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8840610166</x>
+ <y>60.1604800039</y>
+ </coord>
+ <arrTime>201105291756</arrTime>
+ <depTime>201105291756</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>3077</length>
+ <duration>420</duration>
+ <type>5</type>
+ <code>2160T 2</code>
+ <locs>
+ <node>
+ <coord>
+ <x>24.8840610166</x>
+ <y>60.1604800039</y>
+ </coord>
+ <arrTime>201105291756</arrTime>
+ <depTime>201105291756</depTime>
+ <name>Koillisvyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.8912987534</x>
+ <y>60.1610688341</y>
+ </coord>
+ <arrTime>201105291757</arrTime>
+ <depTime>201105291757</depTime>
+ <name>Lauttasaaren silta</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9058315134</x>
+ <y>60.1636451749</y>
+ </coord>
+ <arrTime>201105291759</arrTime>
+ <depTime>201105291759</depTime>
+ <name>Salmisaari</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9134665043</x>
+ <y>60.1642300842</y>
+ </coord>
+ <arrTime>201105291800</arrTime>
+ <depTime>201105291800</depTime>
+ <name>Lnsivyl</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9267577712</x>
+ <y>60.1661035862</y>
+ </coord>
+ <arrTime>201105291802</arrTime>
+ <depTime>201105291802</depTime>
+ <name>Lapinrinne</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9301475091</x>
+ <y>60.1687726522</y>
+ </coord>
+ <arrTime>201105291803</arrTime>
+ <depTime>201105291803</depTime>
+ <name>Kamppi, tulolaituri</name>
+ </node>
+ </locs>
+ </node>
+ <node>
+ <length>728</length>
+ <duration>624.18</duration>
+ <type>walk</type>
+ <locs>
+ <node>
+ <coord>
+ <x>24.9301475091</x>
+ <y>60.1687726522</y>
+ </coord>
+ <arrTime>201105291803</arrTime>
+ <depTime>201105291803</depTime>
+ <name>Kamppi, tulolaituri</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9314926601</x>
+ <y>60.1693277999</y>
+ </coord>
+ <arrTime>201105291804</arrTime>
+ <depTime>201105291804</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9316654649</x>
+ <y>60.169386725</y>
+ </coord>
+ <arrTime>201105291804</arrTime>
+ <depTime>201105291804</depTime>
+ <name>Salomonkatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9323912416</x>
+ <y>60.1696338492</y>
+ </coord>
+ <arrTime>201105291805</arrTime>
+ <depTime>201105291805</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.932991506</x>
+ <y>60.1698378702</y>
+ </coord>
+ <arrTime>201105291805</arrTime>
+ <depTime>201105291805</depTime>
+ <name>Salomonkatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9339865173</x>
+ <y>60.1701764415</y>
+ </coord>
+ <arrTime>201105291806</arrTime>
+ <depTime>201105291806</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9356165422</x>
+ <y>60.1706720944</y>
+ </coord>
+ <arrTime>201105291808</arrTime>
+ <depTime>201105291808</depTime>
+ <name>Salomonkatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.935991995</x>
+ <y>60.1708247296</y>
+ </coord>
+ <arrTime>201105291808</arrTime>
+ <depTime>201105291808</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9363710793</x>
+ <y>60.1709782358</y>
+ </coord>
+ <arrTime>201105291809</arrTime>
+ <depTime>201105291809</depTime>
+ <name>Mannerheimintie</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9368129938</x>
+ <y>60.1708072627</y>
+ </coord>
+ <arrTime>201105291809</arrTime>
+ <depTime>201105291809</depTime>
+ <name>Postikatu</name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9389832898</x>
+ <y>60.1709777147</y>
+ </coord>
+ <arrTime>201105291811</arrTime>
+ <depTime>201105291811</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9389572102</x>
+ <y>60.1710739428</y>
+ </coord>
+ <arrTime>201105291811</arrTime>
+ <depTime>201105291811</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410959958</x>
+ <y>60.1711494377</y>
+ </coord>
+ <arrTime>201105291813</arrTime>
+ <depTime>201105291813</depTime>
+ <name></name>
+ </node>
+ <node>
+ <coord>
+ <x>24.9410086564</x>
+ <y>60.1712452034</y>
+ </coord>
+ <arrTime>201105291813</arrTime>
+ <depTime>201105291814</depTime>
+ <name></name>
+ </node>
+ </locs>
+ </node>
+ </legs>
+ </node>
+ </node>
+</response>
--- /dev/null
+routeResponse-2.xml
\ No newline at end of file
+++ /dev/null
-#! /usr/bin/perl
-require 5.008_004; # we need at least Perl version v5.8.4
-$ENV{MALLOC_CHECK_} = 2;
-
-use Term::ANSIColor;
-
-my $startTime = time();
-
-my %opts = (
- "a" => 0, # all directories, irrespective of if they're in tests.pro
- "r" => 0, # don't reverse sort
- "s" => "D", # by default, sort by directory name
- "j" => 1, # one make job at a time by default
-);
-
-for ( my $argNo=0; $argNo<@ARGV; $argNo++ ) {
- my $arg = $ARGV[ $argNo ];
- if ( $arg eq "-h" ) {
- print "usage: $0 [-a] [-s letter] [-r] [-j number] [-h]\n";
- print " -a include all ut_*/ directories - default is just the ones in tests.pro\n";
- print " -s [DTPFS] sort by column (Dirs, Tests, P(ass), F(ail), S(kipped)\n";
- print " -r reverse sort\n";
- print " -j <number> use <number> make jobs. Default is 1\n";
- print " -h this help\n";
- exit;
- } elsif ( $arg eq "-r" ) {
- $opts{ "r" } = 1;
- } elsif ( $arg eq "-a" ) {
- $opts{ "a" } = 1;
- } elsif ( $arg eq "-s" ) {
- $opts{ "s" } = $ARGV[ ++$argNo ];
- if ( $opts{ "s" } !~ /[DTPFS]/ ) {
- print "Unrecognised column identifier\n";
- print "Must be one of [DTPFS] :\n";
- print " D = Dirs\n";
- print " T = Tests\n";
- print " P = Pass\n";
- print " F = Fail\n";
- print " S = Skipped\n";
- exit(-1);
- }
- } elsif ( $arg eq "-j" ) {
- my $jobs = $ARGV[ ++$argNo ];
- # Test that the argument is a positive integer number
- if ( $jobs * 1 eq $jobs && $jobs > 0 ) {
- $opts{ "j" } = $jobs;
- }
- }
-}
-
-# some globals to help sort be faster
-$sortCol = $opts{ "s" };
-$sortIsNumeric = ( $sortCol =~ /[PFS]/ );
-$reverseSort = $opts{ "r" };
-# helper variable for the number of jobs
-$numJobs = $opts{ "j" };
-
-%maxLen = ();
-%segFault = ();
-
-my @rowHeaders = (
- "D", # Dirs
- "T", # Tests
-);
-my @rowData = (
- "P", # Passed
- "F", # Failed
- "S", # Skipped
-);
-
-my @keys = ( @rowHeaders, @rowData );
-
-my %title = (
- "D"=>"Dirs",
- "T"=>"Tests",
- "P"=>"P",
- "F"=>"F",
- "S"=>"S",
-);
-
-my $headerLabelFormat = "%-*s";
-my $headerDataFormat = "%*s";
-
-my $labelFormat = "%s%-*s%s%*s";
-my $dataFormat = "%*s%s%*s%s";
-
-my %format = (
- "D" => $labelFormat,
- "T" => $labelFormat,
- "P" => $dataFormat,
- "F" => $dataFormat,
- "S" => $dataFormat,
-);
-
-my %separator = (
- "D" => " ",
- "T" => " : ",
- "P" => " ",
- "F" => " ",
- "S" => " ",
-);
-
-my %data = (
-);
-
-foreach $key ( @keys ) {
- $maxLen{ $key } = length( $title{ key } );
-}
-
-# set the maximum length of the directories
-if ( $opts{ "a" } ) {
- push @allDirs, <ut_*>;
- push @allDirs, <ft_*>;
- foreach ( @allDirs ) {
- setMaxLen( "D", length( $_ ) );
- $tested{ $_ } = 0;
- }
-}
-
-# Compile first with possibly multiple jobs
-print "Compiling...";
-`make -j$numJobs -k > /dev/null 2>&1`;
-print "done.\nNow checking...\n";
-
-# then check with only one job so that the parsing succeeds
-open( MAKE, "make -k check 2>&1|" ) || die( "Could not run make:$!" );
-
-#$|=1;
-
-my $thisDir = "";
-while (<MAKE>) {
- chomp;
-
- if ( /Entering directory \`.*tests\/(\w+)\'/ ) {
- $thisDir = $1;
- print STDERR "Tests: $thisDir", ' 'x( $maxLen{ "D" }-length( $thisDir )+length("Tests: ") ), "\r";
- $tested{ $thisDir } = 1;
- push @allDirs, $thisDir if ( !grep( /^$thisDir$/, @allDirs ) );
- setMaxLen( "D", length( $thisDir ) );
- } elsif ( /Segmentation fault/ ) {
- $segFault{ $thisDir } = $_;
- } elsif ( /Start testing of (\w+)/ ) {
- $thisTest = $1;
- $data{ "T" }{ $thisDir } = $thisTest;
- setMaxLen( "T", length( $data{ "T" }{ $thisDir } ) );
- } elsif ( /^Totals: (\d+) passed, (\d+) failed, (\d+) skipped/ ) {
- $data{ "P" }{ $thisDir } = "$1";
- $data{ "F" }{ $thisDir } = "$2";
- $data{ "S" }{ $thisDir } = "$3";
- setMaxLen( "P", length( $data{ "P" }{ $thisDir } ) );
- setMaxLen( "F", length( $data{ "F" }{ $thisDir } ) );
- setMaxLen( "S", length( $data{ "S" }{ $thisDir } ) );
- }
-}
-
-close( MAKE );
-
-print STDERR ' 'x( $maxLen{ "D" } + length( "Tests: " ) ), "\r";
-
-foreach $thisDir ( @allDirs ) {
- if ( !defined( $data{ "P" }{ $thisDir } ) || $data{ "P" }{ $thisDir } eq "" ) {
- $data{ "P" }{ $thisDir } = "0";
- setMaxLen( "P", length( $data{ "P" }{ $thisDir } ) );
- }
- if ( !defined( $data{ "F" }{ $thisDir } ) ) {
- $data{ "F" }{ $thisDir } = "0";
- setMaxLen( "F", length( $data{ "F" }{ $thisDir } ) );
- }
- if ( !defined( $data{ "S" }{ $thisDir } ) ) {
- $data{ "S" }{ $thisDir } = "0";
- setMaxLen( "S", length( $data{ "S" }{ $thisDir } ) );
- }
-
- $data{ "D" }{ $thisDir } = $thisDir;
-}
-
-my ( $testsPassed, $testsNeedWork ) = ( 0, 0 );
-my $noTests = scalar( @allDirs );
-my $noDigits = ($noTests>0)?int( log( $noTests )/log( 10 ) )+1:1;
-
-my $header = sprintf( "%*s ", $noDigits, "" );
-
-foreach ( @rowHeaders ) {
- $header .= sprintf( $headerLabelFormat.$separator{ $_ }, $maxLen{ $_ }, $title{ $_ } );
-}
-
-foreach ( @rowData ) {
- $header .= sprintf( $headerDataFormat.$separator{ $_ }, $maxLen{ $_ }, $title{ $_ } );
-}
-
-my $headerLen = length( $header );
-
-my $headerColor = color( 'reset' );
-
-print "P = Pass, F = Fail, S = Skip\n";
-print $headerColor, "$header\n";
-print '-'x$headerLen, "\n";
-
-my $testNo = 1;
-
-foreach $thisDir ( sort byCol @allDirs ) {
- my %colors = ();
-
- foreach $key ( @keys ) {
- $colors{ $key } = color( 'reset' );
- }
-
- if (
- ( defined( $data{ "P" }{ $thisDir } ) && $data{ "P" }{ $thisDir } ne "0" ) &&
- ( defined( $data{ "F" }{ $thisDir } ) && $data{ "F" }{ $thisDir } eq "0" ) &&
- ( defined( $data{ "S" }{ $thisDir } ) && $data{ "S" }{ $thisDir } eq "0" ) &&
- ( defined( $data{ "T" }{ $thisDir } ) && $data{ "T" }{ $thisDir } ne "" )
- ) {
- $testsPassed++;
- } else {
- $testsNeedWork++;
- }
-
- if ( defined( $data{ "P" }{ $thisDir } ) && $data{ "P" }{ $thisDir } eq "0" ) {
- $colors{ "D" } .= color( 'reverse green' );
- $colors{ "T" } .= color( 'reverse green' );
- $colors{ "P" } .= color( 'reverse green' );
- } else {
- $colors{ "D" } .= color( 'green' );
- $colors{ "T" } .= color( 'green' );
- $colors{ "P" } .= color( 'green' );
- }
-
- if ( defined( $data{ "F" }{ $thisDir} ) && $data{ "F" }{ $thisDir } eq "0" ) {
- $colors{ "F" } .= color( 'red' );
- } else {
- $colors{ "F" } .= color( 'reverse red' );
- }
-
- if ( defined( $data{ "S" }{ $thisDir } ) && $data{ "S" }{ $thisDir } eq "0" ) {
- $colors{ "S" } .= color( 'blue' );
- } else {
- $colors{ "S" } .= color( 'reverse blue' );
- }
-
- if ( !defined( $data{ "T" }{ $thisDir } ) || $data{ "T" }{ $thisDir } eq "" || $segFault{ $thisDir } ) {
- $colors{ "T" } .= color( 'reverse red' );
- }
-
- printf( "%*s ", $noDigits, $testNo );
-
- foreach ( @rowHeaders ) {
- my $thisData = $data{ $_ }{ $thisDir };
- my $dataLength = length( $thisData );
- my $spaceLength = $maxLen{ $_ }-$dataLength;
-
- printf(
- $format{ $_ }.$separator{ $_ },
- $colors{ $_ }, $dataLength, $thisData,
- color( 'reset' ), $spaceLength, "" );
- }
-
- foreach ( @rowData ) {
- my $thisData = $data{ $_ }{ $thisDir };
- my $dataLength = length( $thisData );
- my $spaceLength = $maxLen{ $_ }-$dataLength;
-
- printf(
- $format{ $_ }.$separator{ $_ },
- $spaceLength, "",
- $colors{ $_ }, $dataLength, $thisData,
- color( 'reset' ) );
- }
-
- printf( $headerColor."\n" );
-
- $testNo++;
-}
-
-print '-'x$headerLen, "\n";
-print( "Tests with zero fails/skips : $testsPassed\n" );
-print( "Tests needing further work : $testsNeedWork\n" );
-
-printf( "Elapsed time : %d seconds\n", time() - $startTime );
-
-sub setMaxLen
-{
- my ( $test, $length ) = @_;
-
- $maxLen{ $test } = $length if ( defined( $maxLen{ $test} ) && $length > $maxLen{ $test } );
-}
-
-sub byCol
-{
- my $retVal = 0;
-
- my $localA = $a;
- my $localB = $b;
-
- if ( $reverseSort ) {
- my $tmp = $localA;
- $localA = $localB;
- $localB = $tmp;
- }
-
- if ( $sortIsNumeric ) {
- # numeric comparison
- $retVal = $data{ $sortCol }{ $localA } <=> $data{ $sortCol }{ $localB };
- } else {
- # string comparison
- $retVal = $data{ $sortCol }{ $localA } cmp $data{ $sortCol }{ $localB };
- }
-
- return $retVal;
-}
+++ /dev/null
-ZOUBASRC = ../../src
-
+++ /dev/null
-TEMPLATE=subdirs
-SUBDIRS = \
- ut_location/ \
- ut_route/ \
- ut_gpscontroller/ \
-
-check.target = check
-check.CONFIG = recursive
-QMAKE_EXTRA_TARGETS += check
+++ /dev/null
-#include <QObject>
-#include <QtDebug>
-#include "ut_gpscontroller.h"
-
-#include "gpscontroller.h"
-#include "gpscontroller_p.h"
-
-class MyGpsControllerPrivate: public GpsControllerPrivate
-{
-public:
- MyGpsControllerPrivate();
- ~MyGpsControllerPrivate();
-
- void init();
- void startGps();
- void stopGps();
-
- void setGps( QGeoPositionInfoSource *gps );
- void setFakeLocationLabel( const QString &label );
- void setUseFakeLocation( bool useFake );
- void updateLocation();
-
- QGeoPositionInfoSource *gps();
- Location *liveLocation();
- Location *fakeLocation();
- bool useFakeLocation();
-
- bool m_gpsOn;
- Location *m_liveLocation;
- Location *m_fakeLocation;
- QString m_fakeLocationLabel;
- bool m_useFakeLocation;
-};
-
-MyGpsControllerPrivate::MyGpsControllerPrivate() :
- m_gpsOn(false),
- m_liveLocation( new Location( "livegps" ) ),
- m_fakeLocation( new Location( "fakegps" ) ),
- m_fakeLocationLabel(),
- m_useFakeLocation(false)
-{
-}
-
-MyGpsControllerPrivate::~MyGpsControllerPrivate()
-{
- delete m_liveLocation;
- m_liveLocation = 0;
- delete m_fakeLocation;
- m_fakeLocation = 0;
-}
-
-void MyGpsControllerPrivate::init()
-{
-}
-
-void MyGpsControllerPrivate::startGps()
-{
- m_gpsOn=true;
-}
-
-void MyGpsControllerPrivate::stopGps()
-{
- m_gpsOn=false;
-}
-
-QGeoPositionInfoSource *MyGpsControllerPrivate::gps()
-{
- return 0;
-}
-
-void MyGpsControllerPrivate::setGps( QGeoPositionInfoSource *gps )
-{
- Q_UNUSED( gps );
-}
-
-Location *MyGpsControllerPrivate::liveLocation()
-{
- return m_liveLocation;
-}
-
-Location *MyGpsControllerPrivate::fakeLocation()
-{
- return m_fakeLocation;
-}
-
-void MyGpsControllerPrivate::setFakeLocationLabel( const QString &label )
-{
- m_fakeLocationLabel = label;
- m_fakeLocation->setLabel( label );
-}
-
-bool MyGpsControllerPrivate::useFakeLocation()
-{
- return m_useFakeLocation;
-}
-
-void MyGpsControllerPrivate::setUseFakeLocation( bool useFake )
-{
- m_useFakeLocation = useFake;
-}
-
-void MyGpsControllerPrivate::updateLocation()
-{
-}
-
-void Ut_GpsController::init()
-{
- qRegisterMetaType<Location *>( "Location*" );
-
- m_subject_p = new MyGpsControllerPrivate();
- m_subject = new GpsController( m_subject_p ); // private ownership transferred
-}
-
-void Ut_GpsController::cleanup()
-{
- delete m_subject;
- m_subject = 0;
-}
-
-void Ut_GpsController::initTestCase()
-{
-}
-
-void Ut_GpsController::cleanupTestCase()
-{
-}
-
-void Ut_GpsController::testGetGpsWithNoGpsUpdates()
-{
- QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
-
- // this should start the gps,
- // one signal to invalidate the previous display
- // (which could be showing fake results, for example
- m_subject->getGps();
-
- QCOMPARE(m_subject_p->m_gpsOn, true);
- QCOMPARE(spy.count(), 1);
-}
-
-void Ut_GpsController::testGetGpsWithGpsUpdates()
-{
- QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
-
- // make test call
- m_subject->getGps();
-
- // check effect
- QCOMPARE(m_subject_p->m_gpsOn, true);
- QCOMPARE(spy.count(), 1);
- QList<QVariant> arguments = spy.takeFirst();
- QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
-}
-
-void Ut_GpsController::testFakeGps()
-{
- QSignalSpy spy(m_subject, SIGNAL(locationChanged(Location*)));
-
- Location *gpsLocation = m_subject_p->m_liveLocation; // position from GPS
-
- // make test call
- m_subject->useFakeGps( "fakegps" );
- m_subject->getGps();
-
- // check effect
- QList<QVariant> arguments;
-
- // gps should be off
- QCOMPARE(m_subject_p->m_gpsOn, false);
-
- // should get two signals, one from useFakeGps() and one from getGps()
- QVERIFY2(spy.count()==2, "Should receive two signals" );
-
- // both args should be the fake gps position supplied to useFakeGps()
- arguments = spy.takeFirst();
- QCOMPARE( arguments.at(0).value<Location*>(), m_subject_p->m_fakeLocation );
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "fakegps" ) );
- arguments = spy.takeFirst();
- QCOMPARE( arguments.at(0).value<Location*>(), m_subject_p->m_fakeLocation );
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "fakegps" ) );
-
- // switch back to GPS
- m_subject->useLiveGps();
- m_subject->getGps();
-
- // gps should be on
- QCOMPARE(m_subject_p->m_gpsOn, true);
-
- QVERIFY2(spy.count()==2, "should get two locationChanged signals" );
- arguments = spy.takeFirst();
- QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
- arguments = spy.takeFirst();
- QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
-
- // get GPS location
- m_subject->getGps();
-
- // check effect
- QCOMPARE(spy.count(), 1);
- arguments = spy.takeFirst();
- QCOMPARE(arguments.at(0).value<Location*>(), m_subject_p->m_liveLocation);
- QCOMPARE( arguments.at(0).value<Location*>()->label(), QString( "livegps" ) );
-}
-
-void Ut_GpsController::testLiveToFakeToLive()
-{
- m_subject_p->updateLocation(); // pretend GPS has given an update
-
- m_subject->useFakeGps( "fakegps" );
- m_subject->getGps();
-
- // switch back to live GPS
- m_subject->useLiveGps();
- m_subject->getGps();
-
- m_subject->useFakeGps( "fakegps" );
- m_subject->getGps();
-}
-
-QTEST_APPLESS_MAIN(Ut_GpsController)
+++ /dev/null
-#ifndef UT_GPSCONTROLLER_H
-#define UT_GPSCONTROLLER_H
-
-#include <QtTest/QtTest>
-#include <QObject>
-
-class GpsController;
-class MyGpsControllerPrivate;
-class Location;
-
-Q_DECLARE_METATYPE(GpsController*);
-Q_DECLARE_METATYPE(MyGpsControllerPrivate*);
-Q_DECLARE_METATYPE(Location*);
-
-class Ut_GpsController : public QObject
-{
-Q_OBJECT
-
-public:
-
-private slots:
- void init();
- void cleanup();
- void initTestCase();
- void cleanupTestCase();
- void testGetGpsWithNoGpsUpdates();
- void testGetGpsWithGpsUpdates();
- void testFakeGps();
- void testLiveToFakeToLive();
-
-private:
- GpsController *m_subject;
- MyGpsControllerPrivate *m_subject_p;
-};
-#endif // UT_GPSCONTROLLER_H
+++ /dev/null
-include( ../tests.pri )
-CONFIG += \
- qt \
- debug \
- mobility \
-
-MOBILITY = \
- location \
- bearer \
-
-QT += \
- testlib \
- network \
- maemo5 \
-
-INCLUDEPATH += \
- $$ZOUBASRC \
-
-DEPENDPATH += $INCLUDEPATH
-
-TEMPLATE = app
-
-LIBS += \
- /usr/lib/libQtLocation.so \
-
-SOURCES = \
- ut_gpscontroller.cpp \
- $$ZOUBASRC/gpscontroller.cpp \
- $$ZOUBASRC/gpscontroller_p.cpp \
- $$ZOUBASRC/locations.cpp \
- $$ZOUBASRC/location.cpp \
- $$ZOUBASRC/location_p.cpp \
-
-HEADERS += \
- ut_gpscontroller.h \
- $$ZOUBASRC/gpscontroller.h \
- $$ZOUBASRC/gpscontroller_p.h \
- $$ZOUBASRC/locations.h \
- $$ZOUBASRC/location.h \
- $$ZOUBASRC/location_p.h \
-
-QMAKE_EXTRA_TARGETS += check
-check.depends = $$TARGET
-check.commands = ./$$TARGET
+++ /dev/null
-#include <QObject>
-#include <QtDebug>
-#include <QByteArray>
-#include <QGeoPositionInfo>
-#include "location.h"
-#include "location_p.h"
-#include "ut_location.h"
-
-QTM_USE_NAMESPACE
-
-QByteArray sampleInput(
-"\
-<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?><MTRXML version=\"1.0\">\
-<GEOCODE key=\"taivaanvuohentie 7,helsinki\">\
-<LOC name1=\"Taivaanvuohentie\" number=\"7\" city=\"Helsinki\" code=\"\" address=\"\" type=\"900\" category=\"street\" x=\"2549182\" y=\"6672569\" lon=\"24.88256\" lat=\"60.16183\" />\
-</GEOCODE>\
-</MTRXML>\
-"
-
-);
-
-void Ut_Location::init()
-{
-}
-
-void Ut_Location::cleanup()
-{
-}
-
-void Ut_Location::initTestCase()
-{
-}
-
-void Ut_Location::cleanupTestCase()
-{
-}
-
-void Ut_Location::testParseReply()
-{
- QString label("home");
- LocationPrivate m_subject(label);
-
- m_subject.parseReply( sampleInput );
-
- QCOMPARE( m_subject.label(), label );
- QCOMPARE( m_subject.x(), QString( "2549182" ) );
- QCOMPARE( m_subject.y(), QString( "6672569" ) );
-}
-
-void Ut_Location::testSet()
-{
- QString label( "home" );
- LocationPrivate m_subject(label);
-
- label = "work";
- QString address( "Taivaanvuohentie 7 B 27, Helsinki" );
- QString x( "2549182" );
- QString y( "6672569" );
- m_subject.setAddress( address );
- m_subject.setLabel( label );
- m_subject.setX( x );
- m_subject.setY( y );
- QCOMPARE( m_subject.address(), address );
- QCOMPARE( m_subject.label(), label );
- QCOMPARE( m_subject.x(), x );
- QCOMPARE( m_subject.y(), y );
-}
-
-void Ut_Location::testConstructorQGeoPositionInfo()
-{
- QGeoPositionInfo thisPositionInfo( QGeoCoordinate( 60.16183, 24.88256 ), QDateTime( QDate( 1965, 11, 11 ) ) );
- Location subject( thisPositionInfo );
-
- QString x( "2549182" );
- QString y( "6672569" );
- QCOMPARE( subject.x(), x );
- QCOMPARE( subject.y(), y );
-}
-
-QTEST_APPLESS_MAIN(Ut_Location)
+++ /dev/null
-#ifndef UT_LOCATION_H
-#define UT_LOCATION_H
-
-#include <QtTest/QtTest>
-#include <QObject>
-
-#include <location_p.h>
-
-Q_DECLARE_METATYPE(LocationPrivate*);
-
-class Ut_Location : public QObject
-{
-Q_OBJECT
-
-public:
-
-private slots:
- void init();
- void cleanup();
- void initTestCase();
- void cleanupTestCase();
- void testParseReply();
- void testSet();
- void testConstructorQGeoPositionInfo();
-
-private:
- LocationPrivate *m_subject;
-};
-#endif // UT_LOCATION_H
+++ /dev/null
-include( ../tests.pri )
-CONFIG += \
- qt \
- debug \
- mobility \
-
-MOBILITY = \
- location \
- bearer \
-
-QT += \
- testlib \
- network \
- maemo5 \
-
-INCLUDEPATH += \
- $$ZOUBASRC \
-
-DEPENDPATH += $$INCLUDEPATH
-
-LIBS += \
- /usr/lib/libQtLocation.so \
-
-TEMPLATE = app
-
-SOURCES = \
- ut_location.cpp \
- $$ZOUBASRC/location.cpp \
- $$ZOUBASRC/location_p.cpp \
-
-HEADERS += \
- ut_location.h \
- $$ZOUBASRC/location.h \
- $$ZOUBASRC/location_p.h \
-
-QMAKE_EXTRA_TARGETS += check
-check.depends = $$TARGET
-check.commands = ./$$TARGET
+++ /dev/null
-#include <QObject>
-#include <QtDebug>
-#include <QByteArray>
-#include "ut_route.h"
-
-#include "ut_sampleinput.h"
-
-void Ut_Route::init()
-{
- m_subject = new RoutePrivate();
-}
-
-void Ut_Route::cleanup()
-{
- delete m_subject;
- m_subject = 0;
-}
-
-void Ut_Route::initTestCase()
-{
-}
-
-void Ut_Route::cleanupTestCase()
-{
-}
-
-void Ut_Route::testParseReply()
-{
- QFETCH(QByteArray, xmlInput);
- QFETCH(QList<RouteData>, expectedResults);
-
- QList<RouteData> routeData = m_subject->parseReply( xmlInput );
-
- QCOMPARE( routeData.count(), expectedResults.count() );
-
- for( int routeIndex=0; routeIndex<routeData.count(); ++routeIndex ) {
- const RouteData &thisRouteData = routeData.at( routeIndex );
- const RouteData &thisExpectedRoute = expectedResults.at( routeIndex );
-
- QCOMPARE( thisRouteData.m_tripTime, thisExpectedRoute.m_tripTime );
- QCOMPARE( thisRouteData.m_tripDistance, thisExpectedRoute.m_tripDistance );
- QCOMPARE( thisRouteData.m_departureTime, thisExpectedRoute.m_departureTime );
- QCOMPARE( thisRouteData.m_lineCode, thisExpectedRoute.m_lineCode );
- QCOMPARE( thisRouteData.m_legData.count(), thisExpectedRoute.m_legData.count() );
-
- for( int legIndex=0; legIndex<thisRouteData.m_legData.count(); ++legIndex ) {
- const LegData &thisLegData = thisRouteData.m_legData.at( legIndex );
- const LegData &thisExpectedLeg = thisExpectedRoute.m_legData.at( legIndex );
-
- QCOMPARE( thisLegData.m_how, thisExpectedLeg.m_how );
- QCOMPARE( thisLegData.m_tripTime, thisExpectedLeg.m_tripTime );
- QCOMPARE( thisLegData.m_tripDistance, thisExpectedLeg.m_tripDistance );
- QCOMPARE( thisLegData.m_departureTime, thisExpectedLeg.m_departureTime );
- QCOMPARE( thisLegData.m_arrivalTime, thisExpectedLeg.m_arrivalTime );
- QCOMPARE( thisLegData.m_lineCode, thisExpectedLeg.m_lineCode );
- }
- }
-}
-
-void Ut_Route::testParseReply_data()
-{
- QTest::addColumn<QByteArray>("xmlInput");
- QTest::addColumn< QList<RouteData> >("expectedResults");
-
- QTest::newRow("single route")
- << sampleInput[0]
- << ( QList<RouteData>()
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "14.411", "2510.063", "18:20", "65A" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "4.475", "357.069", "18:15", "18:20" )
- << LegData( "LINE", "5.000", "1760.931", "18:20", "18:25", "65A" )
- << LegData( "WALK", "4.936", "392.062", "18:25", "18:29" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "13.411", "2501.497", "18:26", "102T" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "4.475", "357.069", "18:21", "18:26" )
- << LegData( "LINE", "4.000", "1751.582", "18:26", "18:30", "102T" )
- << LegData( "WALK", "4.936", "392.846", "18:30", "18:34" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "13.411", "2501.497", "18:34", "110T" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "4.475", "357.069", "18:29", "18:34" )
- << LegData( "LINE", "4.000", "1751.582", "18:34", "18:38", "110T" )
- << LegData( "WALK", "4.936", "392.846", "18:38", "18:42" )
- )
- );
-
- QTest::newRow("route with bus change")
- << sampleInput[1]
- << ( QList<RouteData>()
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "28.633", "8902.040", "08:18", "111" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "3.479", "254.753", "08:14", "08:18" )
- << LegData( "LINE", "8.000", "5225.092", "08:18", "08:26", "111" )
- << LegData( "LINE", "5.000", "2926.431", "08:32", "08:37", "121T" )
- << LegData( "WALK", "6.154", "495.764", "08:37", "08:43" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "25.633", "8902.040", "08:33", "111" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "3.479", "254.753", "08:29", "08:33" )
- << LegData( "LINE", "8.000", "5225.092", "08:33", "08:41", "111" )
- << LegData( "LINE", "5.000", "2926.431", "08:44", "08:49", "102T" )
- << LegData( "WALK", "6.154", "495.764", "08:49", "08:55" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "33.510", "11193.458", "08:34", "111T" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "2.356", "172.693", "08:31", "08:34" )
- << LegData( "LINE", "6.000", "3392.054", "08:34", "08:40", "111T" )
- << LegData( "LINE", "5.000", "4206.516", "08:43", "08:48", "112" )
- << LegData( "LINE", "5.000", "2926.431", "08:54", "08:59", "102T" )
- << LegData( "WALK", "6.154", "495.764", "08:59", "09:05" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "29.633", "8902.040", "08:50", "111" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "3.479", "254.753", "08:46", "08:50" )
- << LegData( "LINE", "8.000", "5225.092", "08:50", "08:58", "111" )
- << LegData( "LINE", "5.000", "2926.431", "09:05", "09:10", "102T" )
- << LegData( "WALK", "6.154", "495.764", "09:10", "09:16" )
- )
- // Summary : TTime TDist First Vehicle
- << ( RouteData( "29.633", "8902.040", "09:07", "111" )
- // How TTime TDist Depart Arrive Line
- << LegData( "WALK", "3.479", "254.753", "09:03", "09:07" )
- << LegData( "LINE", "8.000", "5225.092", "09:07", "09:15", "111" )
- << LegData( "LINE", "5.000", "2926.431", "09:22", "09:27", "160T" )
- << LegData( "WALK", "6.154", "495.764", "09:27", "09:33" )
- )
- );
-}
-
-void Ut_Route::testSetFromLocation()
-{
- Location work( "2551042", "6672829" );
- QCOMPARE( m_subject->fromValid(), false );
- m_subject->setFromLocation( &work );
- QCOMPARE( m_subject->fromLocation()->x(), work.x() );
- QCOMPARE( m_subject->fromLocation()->y(), work.y() );
- QCOMPARE( m_subject->fromValid(), true );
-}
-
-void Ut_Route::testSetToLocation()
-{
- Location work( "2551042", "6672829" );
- QCOMPARE( m_subject->toValid(), false );
- m_subject->setToLocation( &work );
- QCOMPARE( m_subject->toLocation()->x(), work.x() );
- QCOMPARE( m_subject->toLocation()->y(), work.y() );
- QCOMPARE( m_subject->toValid(), true );
-}
-
-QTEST_APPLESS_MAIN(Ut_Route)
+++ /dev/null
-#ifndef UT_ROUTE_H
-#define UT_ROUTE_H
-
-#include <QtTest/QtTest>
-#include <QObject>
-
-#include <route_p.h>
-
-Q_DECLARE_METATYPE(RoutePrivate*);
-Q_DECLARE_METATYPE(QList<RouteData>);
-
-class Ut_Route : public QObject
-{
- Q_OBJECT
-
-public:
-
-private slots:
- void init();
- void cleanup();
- void initTestCase();
- void cleanupTestCase();
- void testParseReply();
- void testParseReply_data();
- void testSetFromLocation();
- void testSetToLocation();
-
-private:
- RoutePrivate *m_subject;
-};
-#endif // UT_ROUTE_H
+++ /dev/null
-include( ../tests.pri )
-CONFIG += \
- qt \
- debug \
- mobility \
-
-MOBILITY = \
- location \
- bearer \
-
-QT += \
- testlib \
- network \
- maemo5 \
-
-INCLUDEPATH += \
- $$ZOUBASRC \
-
-DEPENDPATH += $INCLUDEPATH
-
-TEMPLATE = app
-
-LIBS += \
- /usr/lib/libQtLocation.so \
-
-SOURCES = \
- ut_route.cpp \
- $$ZOUBASRC/route_p.cpp \
- $$ZOUBASRC/location.cpp \
- $$ZOUBASRC/location_p.cpp \
-
-HEADERS += \
- ut_route.h \
- $$ZOUBASRC/route_p.h \
- $$ZOUBASRC/location.h \
- $$ZOUBASRC/location_p.h \
-
-QMAKE_EXTRA_TARGETS += check
-check.depends = $$TARGET
-check.commands = ./$$TARGET
+++ /dev/null
-
-QByteArray sampleInput[2] = {
-"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\
-<MTRXML version=\"1.0\">\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"14.411\" dist=\"2510.063\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1815\"/>\
- <DEPARTURE date=\"20100207\" time=\"1815\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"4.475\" dist=\"357.069\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1815\"/>\
- <DEPARTURE date=\"20100207\" time=\"1815\"/>\
- </POINT>\
- <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1816\"/>\
- <DEPARTURE date=\"20100207\" time=\"1816\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
- <ARRIVAL date=\"20100207\" time=\"1817\"/>\
- <DEPARTURE date=\"20100207\" time=\"1817\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1817\"/>\
- <DEPARTURE date=\"20100207\" time=\"1817\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1819\"/>\
- <DEPARTURE date=\"20100207\" time=\"1819\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
- <ARRIVAL date=\"20100207\" time=\"1820\"/>\
- <DEPARTURE date=\"20100207\" time=\"1820\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <STOP code=\"6:1201129\" x=\"2550765.0\" y=\"6672886.0\" id=\"745\">\
- <ARRIVAL date=\"20100207\" time=\"1820\"/>\
- <DEPARTURE date=\"20100207\" time=\"1820\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"200\" code=\"1065A 2\" type=\"1\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"1760.931\"/>\
- <STOP code=\"6:1201129\" x=\"2550765.0\" y=\"6672886.0\" id=\"745\" ord=\"30\">\
- <ARRIVAL date=\"20100207\" time=\"1820\"/>\
- <DEPARTURE date=\"20100207\" time=\"1820\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- <STOP code=\"6:1201131\" x=\"2550385.0\" y=\"6672760.0\" id=\"747\">\
- <ARRIVAL date=\"20100207\" time=\"1821\"/>\
- <DEPARTURE date=\"20100207\" time=\"1821\"/>\
- <NAME lang=\"1\" val=\"Salmisaari\"/>\
- <NAME lang=\"2\" val=\"Sundholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310101\" x=\"2549608.0\" y=\"6672522.0\" id=\"1356\">\
- <ARRIVAL date=\"20100207\" time=\"1824\"/>\
- <DEPARTURE date=\"20100207\" time=\"1824\"/>\
- <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
- <NAME lang=\"2\" val=\"Drumsö bro\"/>\
- </STOP>\
- <STOP code=\"6:1310103\" x=\"2549247.0\" y=\"6672446.0\" id=\"1358\" ord=\"33\">\
- <ARRIVAL date=\"20100207\" time=\"1825\"/>\
- <DEPARTURE date=\"20100207\" time=\"1825\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"4.936\" dist=\"392.062\"/>\
- <STOP code=\"6:1310103\" x=\"2549247.0\" y=\"6672446.0\" id=\"1358\">\
- <ARRIVAL date=\"20100207\" time=\"1825\"/>\
- <DEPARTURE date=\"20100207\" time=\"1825\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1825\"/>\
- <DEPARTURE date=\"20100207\" time=\"1825\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1827\"/>\
- <DEPARTURE date=\"20100207\" time=\"1827\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1828\"/>\
- <DEPARTURE date=\"20100207\" time=\"1828\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1828\"/>\
- <DEPARTURE date=\"20100207\" time=\"1828\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"13.411\" dist=\"2501.497\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1821\"/>\
- <DEPARTURE date=\"20100207\" time=\"1821\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"4.475\" dist=\"357.069\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1821\"/>\
- <DEPARTURE date=\"20100207\" time=\"1821\"/>\
- </POINT>\
- <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1822\"/>\
- <DEPARTURE date=\"20100207\" time=\"1822\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
- <ARRIVAL date=\"20100207\" time=\"1823\"/>\
- <DEPARTURE date=\"20100207\" time=\"1823\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1823\"/>\
- <DEPARTURE date=\"20100207\" time=\"1823\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1825\"/>\
- <DEPARTURE date=\"20100207\" time=\"1825\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
- <ARRIVAL date=\"20100207\" time=\"1826\"/>\
- <DEPARTURE date=\"20100207\" time=\"1826\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\">\
- <ARRIVAL date=\"20100207\" time=\"1826\"/>\
- <DEPARTURE date=\"20100207\" time=\"1826\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"579\" code=\"2102T 1\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"4.000\" dist=\"1751.582\"/>\
- <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\" ord=\"3\">\
- <ARRIVAL date=\"20100207\" time=\"1826\"/>\
- <DEPARTURE date=\"20100207\" time=\"1826\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- <STOP code=\"6:1201231\" x=\"2550387.0\" y=\"6672761.0\" id=\"759\">\
- <ARRIVAL date=\"20100207\" time=\"1827\"/>\
- <DEPARTURE date=\"20100207\" time=\"1827\"/>\
- <NAME lang=\"1\" val=\"Salmisaari\"/>\
- <NAME lang=\"2\" val=\"Sundholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310201\" x=\"2549630.0\" y=\"6672524.0\" id=\"1402\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
- <NAME lang=\"2\" val=\"Drumsö bro\"/>\
- </STOP>\
- <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\" ord=\"6\">\
- <ARRIVAL date=\"20100207\" time=\"1830\"/>\
- <DEPARTURE date=\"20100207\" time=\"1830\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"4.936\" dist=\"392.846\"/>\
- <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\">\
- <ARRIVAL date=\"20100207\" time=\"1830\"/>\
- <DEPARTURE date=\"20100207\" time=\"1830\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1830\"/>\
- <DEPARTURE date=\"20100207\" time=\"1830\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1832\"/>\
- <DEPARTURE date=\"20100207\" time=\"1832\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1833\"/>\
- <DEPARTURE date=\"20100207\" time=\"1833\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1833\"/>\
- <DEPARTURE date=\"20100207\" time=\"1833\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"13.411\" dist=\"2501.497\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"4.475\" dist=\"357.069\"/>\
- <POINT uid=\"start\" x=\"2551042.0\" y=\"6672829.0\">\
- <ARRIVAL date=\"20100207\" time=\"1829\"/>\
- <DEPARTURE date=\"20100207\" time=\"1829\"/>\
- </POINT>\
- <MAPLOC x=\"2551034.9\" y=\"6672875.6\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1830\"/>\
- <DEPARTURE date=\"20100207\" time=\"1830\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550977.7\" y=\"6672869.1\" type=\"15\">\
- <ARRIVAL date=\"20100207\" time=\"1831\"/>\
- <DEPARTURE date=\"20100207\" time=\"1831\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550949.3\" y=\"6672867.5\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1831\"/>\
- <DEPARTURE date=\"20100207\" time=\"1831\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550817.2\" y=\"6672859.3\" type=\"7\">\
- <ARRIVAL date=\"20100207\" time=\"1833\"/>\
- <DEPARTURE date=\"20100207\" time=\"1833\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2550808.5\" y=\"6672889.3\" type=\"11\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- <NAME lang=\"1\" val=\"Porkkalankatu\"/>\
- </MAPLOC>\
- <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"603\" code=\"2110T 1\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"4.000\" dist=\"1751.582\"/>\
- <STOP code=\"6:1201227\" x=\"2550765.0\" y=\"6672886.0\" id=\"755\" ord=\"3\">\
- <ARRIVAL date=\"20100207\" time=\"1834\"/>\
- <DEPARTURE date=\"20100207\" time=\"1834\"/>\
- <NAME lang=\"1\" val=\"Länsiväylä\"/>\
- <NAME lang=\"2\" val=\"Västerleden\"/>\
- </STOP>\
- <STOP code=\"6:1201231\" x=\"2550387.0\" y=\"6672761.0\" id=\"759\">\
- <ARRIVAL date=\"20100207\" time=\"1835\"/>\
- <DEPARTURE date=\"20100207\" time=\"1835\"/>\
- <NAME lang=\"1\" val=\"Salmisaari\"/>\
- <NAME lang=\"2\" val=\"Sundholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310201\" x=\"2549630.0\" y=\"6672524.0\" id=\"1402\">\
- <ARRIVAL date=\"20100207\" time=\"1837\"/>\
- <DEPARTURE date=\"20100207\" time=\"1837\"/>\
- <NAME lang=\"1\" val=\"Lauttasaaren silta\"/>\
- <NAME lang=\"2\" val=\"Drumsö bro\"/>\
- </STOP>\
- <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\" ord=\"6\">\
- <ARRIVAL date=\"20100207\" time=\"1838\"/>\
- <DEPARTURE date=\"20100207\" time=\"1838\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"4.936\" dist=\"392.846\"/>\
- <STOP code=\"6:1310203\" x=\"2549248.0\" y=\"6672446.0\" id=\"1404\">\
- <ARRIVAL date=\"20100207\" time=\"1838\"/>\
- <DEPARTURE date=\"20100207\" time=\"1838\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549200.4\" y=\"6672433.4\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1838\"/>\
- <DEPARTURE date=\"20100207\" time=\"1838\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohenkuja\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549151.2\" y=\"6672527.3\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1840\"/>\
- <DEPARTURE date=\"20100207\" time=\"1840\"/>\
- <NAME lang=\"1\" val=\"Taivaanvuohentie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549105.4\" y=\"6672573.6\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1841\"/>\
- <DEPARTURE date=\"20100207\" time=\"1841\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549115.4\" y=\"6672595.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1841\"/>\
- <DEPARTURE date=\"20100207\" time=\"1841\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549162.6\" y=\"6672633.1\" type=\"0\">\
- <ARRIVAL date=\"20100207\" time=\"1842\"/>\
- <DEPARTURE date=\"20100207\" time=\"1842\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1842\"/>\
- <DEPARTURE date=\"20100207\" time=\"1842\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100207\" time=\"1842\"/>\
- <DEPARTURE date=\"20100207\" time=\"1842\"/>\
- </POINT>\
- </ROUTE>\
-</MTRXML>\
-",
-
-"<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\
-<MTRXML version=\"1.0\">\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"28.633\" dist=\"8902.040\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0814\"/>\
- <DEPARTURE date=\"20100416\" time=\"0814\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"3.479\" dist=\"254.753\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0814\"/>\
- <DEPARTURE date=\"20100416\" time=\"0814\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0815\"/>\
- <DEPARTURE date=\"20100416\" time=\"0815\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0816\"/>\
- <DEPARTURE date=\"20100416\" time=\"0816\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0816\"/>\
- <DEPARTURE date=\"20100416\" time=\"0816\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0816\"/>\
- <DEPARTURE date=\"20100416\" time=\"0816\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0817\"/>\
- <DEPARTURE date=\"20100416\" time=\"0817\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0818\"/>\
- <DEPARTURE date=\"20100416\" time=\"0818\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
- <ARRIVAL date=\"20100416\" time=\"0818\"/>\
- <DEPARTURE date=\"20100416\" time=\"0818\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0818\"/>\
- <DEPARTURE date=\"20100416\" time=\"0818\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
- <ARRIVAL date=\"20100416\" time=\"0819\"/>\
- <DEPARTURE date=\"20100416\" time=\"0819\"/>\
- <NAME lang=\"1\" val=\"Mellstenintie\"/>\
- <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
- <ARRIVAL date=\"20100416\" time=\"0819\"/>\
- <DEPARTURE date=\"20100416\" time=\"0819\"/>\
- <NAME lang=\"1\" val=\"Toppelund\"/>\
- <NAME lang=\"2\" val=\"Toppelund\"/>\
- </STOP>\
- <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
- <ARRIVAL date=\"20100416\" time=\"0820\"/>\
- <DEPARTURE date=\"20100416\" time=\"0820\"/>\
- <NAME lang=\"1\" val=\"Linnake\"/>\
- <NAME lang=\"2\" val=\"Fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
- <ARRIVAL date=\"20100416\" time=\"0821\"/>\
- <DEPARTURE date=\"20100416\" time=\"0821\"/>\
- <NAME lang=\"1\" val=\"Alalinnake\"/>\
- <NAME lang=\"2\" val=\"Nedre fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
- <ARRIVAL date=\"20100416\" time=\"0822\"/>\
- <DEPARTURE date=\"20100416\" time=\"0822\"/>\
- <NAME lang=\"1\" val=\"Westendinpolku\"/>\
- <NAME lang=\"2\" val=\"Westendstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
- <ARRIVAL date=\"20100416\" time=\"0823\"/>\
- <DEPARTURE date=\"20100416\" time=\"0823\"/>\
- <NAME lang=\"1\" val=\"Golfpolku\"/>\
- <NAME lang=\"2\" val=\"Golfstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
- <ARRIVAL date=\"20100416\" time=\"0824\"/>\
- <DEPARTURE date=\"20100416\" time=\"0824\"/>\
- <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
- <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
- <ARRIVAL date=\"20100416\" time=\"0824\"/>\
- <DEPARTURE date=\"20100416\" time=\"0824\"/>\
- <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
- <NAME lang=\"2\" val=\"Konungshamnen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0825\"/>\
- <DEPARTURE date=\"20100416\" time=\"0825\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
- <ARRIVAL date=\"20100416\" time=\"0826\"/>\
- <DEPARTURE date=\"20100416\" time=\"0832\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"642\" code=\"2121T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"13\">\
- <ARRIVAL date=\"20100416\" time=\"0826\"/>\
- <DEPARTURE date=\"20100416\" time=\"0832\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0835\"/>\
- <DEPARTURE date=\"20100416\" time=\"0835\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"17\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0838\"/>\
- <DEPARTURE date=\"20100416\" time=\"0838\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0840\"/>\
- <DEPARTURE date=\"20100416\" time=\"0840\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0843\"/>\
- <DEPARTURE date=\"20100416\" time=\"0843\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0843\"/>\
- <DEPARTURE date=\"20100416\" time=\"0843\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"25.633\" dist=\"8902.040\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0829\"/>\
- <DEPARTURE date=\"20100416\" time=\"0829\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"3.479\" dist=\"254.753\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0829\"/>\
- <DEPARTURE date=\"20100416\" time=\"0829\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0830\"/>\
- <DEPARTURE date=\"20100416\" time=\"0830\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0832\"/>\
- <DEPARTURE date=\"20100416\" time=\"0832\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Mellstenintie\"/>\
- <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Toppelund\"/>\
- <NAME lang=\"2\" val=\"Toppelund\"/>\
- </STOP>\
- <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
- <ARRIVAL date=\"20100416\" time=\"0835\"/>\
- <DEPARTURE date=\"20100416\" time=\"0835\"/>\
- <NAME lang=\"1\" val=\"Linnake\"/>\
- <NAME lang=\"2\" val=\"Fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
- <ARRIVAL date=\"20100416\" time=\"0836\"/>\
- <DEPARTURE date=\"20100416\" time=\"0836\"/>\
- <NAME lang=\"1\" val=\"Alalinnake\"/>\
- <NAME lang=\"2\" val=\"Nedre fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Westendinpolku\"/>\
- <NAME lang=\"2\" val=\"Westendstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
- <ARRIVAL date=\"20100416\" time=\"0838\"/>\
- <DEPARTURE date=\"20100416\" time=\"0838\"/>\
- <NAME lang=\"1\" val=\"Golfpolku\"/>\
- <NAME lang=\"2\" val=\"Golfstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
- <ARRIVAL date=\"20100416\" time=\"0839\"/>\
- <DEPARTURE date=\"20100416\" time=\"0839\"/>\
- <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
- <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
- <ARRIVAL date=\"20100416\" time=\"0839\"/>\
- <DEPARTURE date=\"20100416\" time=\"0839\"/>\
- <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
- <NAME lang=\"2\" val=\"Konungshamnen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0840\"/>\
- <DEPARTURE date=\"20100416\" time=\"0840\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
- <ARRIVAL date=\"20100416\" time=\"0841\"/>\
- <DEPARTURE date=\"20100416\" time=\"0844\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
- <ARRIVAL date=\"20100416\" time=\"0841\"/>\
- <DEPARTURE date=\"20100416\" time=\"0844\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0845\"/>\
- <DEPARTURE date=\"20100416\" time=\"0845\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0846\"/>\
- <DEPARTURE date=\"20100416\" time=\"0846\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0847\"/>\
- <DEPARTURE date=\"20100416\" time=\"0847\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
- <ARRIVAL date=\"20100416\" time=\"0849\"/>\
- <DEPARTURE date=\"20100416\" time=\"0849\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0849\"/>\
- <DEPARTURE date=\"20100416\" time=\"0849\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0850\"/>\
- <DEPARTURE date=\"20100416\" time=\"0850\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0852\"/>\
- <DEPARTURE date=\"20100416\" time=\"0852\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0855\"/>\
- <DEPARTURE date=\"20100416\" time=\"0855\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0855\"/>\
- <DEPARTURE date=\"20100416\" time=\"0855\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"33.510\" dist=\"11193.458\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"2.356\" dist=\"172.693\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0831\"/>\
- <DEPARTURE date=\"20100416\" time=\"0831\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0832\"/>\
- <DEPARTURE date=\"20100416\" time=\"0832\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543528.9\" y=\"6672567.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0833\"/>\
- <DEPARTURE date=\"20100416\" time=\"0833\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232219\" x=\"2543533.0\" y=\"6672532.0\" id=\"3374\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"621\" code=\"2111T 1\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"6.000\" dist=\"3392.054\"/>\
- <STOP code=\"6:2232219\" x=\"2543533.0\" y=\"6672532.0\" id=\"3374\" ord=\"20\">\
- <ARRIVAL date=\"20100416\" time=\"0834\"/>\
- <DEPARTURE date=\"20100416\" time=\"0834\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232236\" x=\"2543282.0\" y=\"6672594.0\" id=\"3390\">\
- <ARRIVAL date=\"20100416\" time=\"0835\"/>\
- <DEPARTURE date=\"20100416\" time=\"0835\"/>\
- <NAME lang=\"1\" val=\"Haukilahden keskus\"/>\
- <NAME lang=\"2\" val=\"Gäddvik centrum\"/>\
- </STOP>\
- <STOP code=\"6:2232221\" x=\"2543195.0\" y=\"6672532.0\" id=\"3376\">\
- <ARRIVAL date=\"20100416\" time=\"0835\"/>\
- <DEPARTURE date=\"20100416\" time=\"0835\"/>\
- <NAME lang=\"1\" val=\"Pattisten pelto\"/>\
- <NAME lang=\"2\" val=\"Battisåker\"/>\
- </STOP>\
- <STOP code=\"6:2232227\" x=\"2543123.0\" y=\"6672283.0\" id=\"3381\">\
- <ARRIVAL date=\"20100416\" time=\"0836\"/>\
- <DEPARTURE date=\"20100416\" time=\"0836\"/>\
- <NAME lang=\"1\" val=\"Haukitie\"/>\
- <NAME lang=\"2\" val=\"Gäddvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232229\" x=\"2542938.0\" y=\"6672081.0\" id=\"3383\">\
- <ARRIVAL date=\"20100416\" time=\"0836\"/>\
- <DEPARTURE date=\"20100416\" time=\"0836\"/>\
- <NAME lang=\"1\" val=\"Haukiverkko\"/>\
- <NAME lang=\"2\" val=\"Gäddnätet\"/>\
- </STOP>\
- <STOP code=\"6:2232209\" x=\"2542708.0\" y=\"6672127.0\" id=\"3364\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Hauenkita\"/>\
- <NAME lang=\"2\" val=\"Gäddgapet\"/>\
- </STOP>\
- <STOP code=\"6:2232211\" x=\"2542513.0\" y=\"6672237.0\" id=\"3366\">\
- <ARRIVAL date=\"20100416\" time=\"0837\"/>\
- <DEPARTURE date=\"20100416\" time=\"0837\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenranta 25\"/>\
- <NAME lang=\"2\" val=\"Gäddviksstranden 25\"/>\
- </STOP>\
- <STOP code=\"6:2232212\" x=\"2542467.0\" y=\"6672399.0\" id=\"3367\">\
- <ARRIVAL date=\"20100416\" time=\"0838\"/>\
- <DEPARTURE date=\"20100416\" time=\"0838\"/>\
- <NAME lang=\"1\" val=\"Telamäentie\"/>\
- <NAME lang=\"2\" val=\"Kavelbackavägen\"/>\
- </STOP>\
- <STOP code=\"6:2232213\" x=\"2542470.0\" y=\"6672451.0\" id=\"3368\">\
- <ARRIVAL date=\"20100416\" time=\"0838\"/>\
- <DEPARTURE date=\"20100416\" time=\"0838\"/>\
- <NAME lang=\"1\" val=\"Telamäentie\"/>\
- <NAME lang=\"2\" val=\"Kavelbackavägen\"/>\
- </STOP>\
- <STOP code=\"6:2232239\" x=\"2542955.0\" y=\"6672526.0\" id=\"3393\">\
- <ARRIVAL date=\"20100416\" time=\"0839\"/>\
- <DEPARTURE date=\"20100416\" time=\"0839\"/>\
- <NAME lang=\"1\" val=\"Hauenkallio\"/>\
- <NAME lang=\"2\" val=\"Gäddberget\"/>\
- </STOP>\
- <STOP code=\"6:2232223\" x=\"2543096.0\" y=\"6672983.0\" id=\"3378\" ord=\"30\">\
- <ARRIVAL date=\"20100416\" time=\"0840\"/>\
- <DEPARTURE date=\"20100416\" time=\"0843\"/>\
- <NAME lang=\"1\" val=\"Kuhatie\"/>\
- <NAME lang=\"2\" val=\"Gösvägen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"624\" code=\"2112 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"4206.516\"/>\
- <STOP code=\"6:2232223\" x=\"2543096.0\" y=\"6672983.0\" id=\"3378\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0840\"/>\
- <DEPARTURE date=\"20100416\" time=\"0843\"/>\
- <NAME lang=\"1\" val=\"Kuhatie\"/>\
- <NAME lang=\"2\" val=\"Gösvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231202\" x=\"2544838.0\" y=\"6673305.0\" id=\"3333\">\
- <ARRIVAL date=\"20100416\" time=\"0846\"/>\
- <DEPARTURE date=\"20100416\" time=\"0846\"/>\
- <NAME lang=\"1\" val=\"Westendinasema\"/>\
- <NAME lang=\"2\" val=\"Westendstationen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0847\"/>\
- <DEPARTURE date=\"20100416\" time=\"0847\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"15\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0854\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0854\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0855\"/>\
- <DEPARTURE date=\"20100416\" time=\"0855\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0856\"/>\
- <DEPARTURE date=\"20100416\" time=\"0856\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0857\"/>\
- <DEPARTURE date=\"20100416\" time=\"0857\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
- <ARRIVAL date=\"20100416\" time=\"0859\"/>\
- <DEPARTURE date=\"20100416\" time=\"0859\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0859\"/>\
- <DEPARTURE date=\"20100416\" time=\"0859\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0900\"/>\
- <DEPARTURE date=\"20100416\" time=\"0900\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0902\"/>\
- <DEPARTURE date=\"20100416\" time=\"0902\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"29.633\" dist=\"8902.040\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0846\"/>\
- <DEPARTURE date=\"20100416\" time=\"0846\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"3.479\" dist=\"254.753\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0846\"/>\
- <DEPARTURE date=\"20100416\" time=\"0846\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0847\"/>\
- <DEPARTURE date=\"20100416\" time=\"0847\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0848\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0848\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0848\"/>\
- <DEPARTURE date=\"20100416\" time=\"0848\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0849\"/>\
- <DEPARTURE date=\"20100416\" time=\"0849\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0850\"/>\
- <DEPARTURE date=\"20100416\" time=\"0850\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
- <ARRIVAL date=\"20100416\" time=\"0850\"/>\
- <DEPARTURE date=\"20100416\" time=\"0850\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0850\"/>\
- <DEPARTURE date=\"20100416\" time=\"0850\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
- <ARRIVAL date=\"20100416\" time=\"0851\"/>\
- <DEPARTURE date=\"20100416\" time=\"0851\"/>\
- <NAME lang=\"1\" val=\"Mellstenintie\"/>\
- <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
- <ARRIVAL date=\"20100416\" time=\"0851\"/>\
- <DEPARTURE date=\"20100416\" time=\"0851\"/>\
- <NAME lang=\"1\" val=\"Toppelund\"/>\
- <NAME lang=\"2\" val=\"Toppelund\"/>\
- </STOP>\
- <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
- <ARRIVAL date=\"20100416\" time=\"0852\"/>\
- <DEPARTURE date=\"20100416\" time=\"0852\"/>\
- <NAME lang=\"1\" val=\"Linnake\"/>\
- <NAME lang=\"2\" val=\"Fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
- <ARRIVAL date=\"20100416\" time=\"0853\"/>\
- <DEPARTURE date=\"20100416\" time=\"0853\"/>\
- <NAME lang=\"1\" val=\"Alalinnake\"/>\
- <NAME lang=\"2\" val=\"Nedre fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
- <ARRIVAL date=\"20100416\" time=\"0854\"/>\
- <DEPARTURE date=\"20100416\" time=\"0854\"/>\
- <NAME lang=\"1\" val=\"Westendinpolku\"/>\
- <NAME lang=\"2\" val=\"Westendstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
- <ARRIVAL date=\"20100416\" time=\"0855\"/>\
- <DEPARTURE date=\"20100416\" time=\"0855\"/>\
- <NAME lang=\"1\" val=\"Golfpolku\"/>\
- <NAME lang=\"2\" val=\"Golfstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
- <ARRIVAL date=\"20100416\" time=\"0856\"/>\
- <DEPARTURE date=\"20100416\" time=\"0856\"/>\
- <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
- <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
- <ARRIVAL date=\"20100416\" time=\"0856\"/>\
- <DEPARTURE date=\"20100416\" time=\"0856\"/>\
- <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
- <NAME lang=\"2\" val=\"Konungshamnen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0857\"/>\
- <DEPARTURE date=\"20100416\" time=\"0857\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
- <ARRIVAL date=\"20100416\" time=\"0858\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"592\" code=\"2102T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"10\">\
- <ARRIVAL date=\"20100416\" time=\"0858\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0906\"/>\
- <DEPARTURE date=\"20100416\" time=\"0906\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0907\"/>\
- <DEPARTURE date=\"20100416\" time=\"0907\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0908\"/>\
- <DEPARTURE date=\"20100416\" time=\"0908\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"14\">\
- <ARRIVAL date=\"20100416\" time=\"0910\"/>\
- <DEPARTURE date=\"20100416\" time=\"0910\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0910\"/>\
- <DEPARTURE date=\"20100416\" time=\"0910\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0911\"/>\
- <DEPARTURE date=\"20100416\" time=\"0911\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0913\"/>\
- <DEPARTURE date=\"20100416\" time=\"0913\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0916\"/>\
- <DEPARTURE date=\"20100416\" time=\"0916\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0916\"/>\
- <DEPARTURE date=\"20100416\" time=\"0916\"/>\
- </POINT>\
- </ROUTE>\
- <ROUTE from=\"start\" to=\"dest\">\
- <LENGTH time=\"29.633\" dist=\"8902.040\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0903\"/>\
- <DEPARTURE date=\"20100416\" time=\"0903\"/>\
- </POINT>\
- <WALK>\
- <LENGTH time=\"3.479\" dist=\"254.753\"/>\
- <POINT uid=\"start\" x=\"2543560.0\" y=\"6672630.0\">\
- <ARRIVAL date=\"20100416\" time=\"0903\"/>\
- <DEPARTURE date=\"20100416\" time=\"0903\"/>\
- </POINT>\
- <MAPLOC x=\"2543588.4\" y=\"6672573.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0904\"/>\
- <DEPARTURE date=\"20100416\" time=\"0904\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.4\" y=\"6672574.0\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- <NAME lang=\"1\" val=\"Haukilahdenkatu\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543529.0\" y=\"6672569.9\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543494.7\" y=\"6672557.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0905\"/>\
- <DEPARTURE date=\"20100416\" time=\"0905\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543506.2\" y=\"6672490.4\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0906\"/>\
- <DEPARTURE date=\"20100416\" time=\"0906\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2543496.2\" y=\"6672492.1\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0907\"/>\
- <DEPARTURE date=\"20100416\" time=\"0907\"/>\
- <NAME lang=\"1\" val=\"Toppelundintie\"/>\
- </MAPLOC>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\">\
- <ARRIVAL date=\"20100416\" time=\"0907\"/>\
- <DEPARTURE date=\"20100416\" time=\"0907\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- </WALK>\
- <LINE id=\"620\" code=\"2111 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"8.000\" dist=\"5225.092\"/>\
- <STOP code=\"6:2232220\" x=\"2543501.0\" y=\"6672486.0\" id=\"3375\" ord=\"12\">\
- <ARRIVAL date=\"20100416\" time=\"0907\"/>\
- <DEPARTURE date=\"20100416\" time=\"0907\"/>\
- <NAME lang=\"1\" val=\"Säynävätie\"/>\
- <NAME lang=\"2\" val=\"Idvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232218\" x=\"2543666.0\" y=\"6672186.0\" id=\"3373\">\
- <ARRIVAL date=\"20100416\" time=\"0908\"/>\
- <DEPARTURE date=\"20100416\" time=\"0908\"/>\
- <NAME lang=\"1\" val=\"Mellstenintie\"/>\
- <NAME lang=\"2\" val=\"Mellstensvägen\"/>\
- </STOP>\
- <STOP code=\"6:2232216\" x=\"2543877.0\" y=\"6672218.0\" id=\"3371\">\
- <ARRIVAL date=\"20100416\" time=\"0909\"/>\
- <DEPARTURE date=\"20100416\" time=\"0909\"/>\
- <NAME lang=\"1\" val=\"Toppelund\"/>\
- <NAME lang=\"2\" val=\"Toppelund\"/>\
- </STOP>\
- <STOP code=\"6:2231232\" x=\"2544055.0\" y=\"6672304.0\" id=\"3353\">\
- <ARRIVAL date=\"20100416\" time=\"0909\"/>\
- <DEPARTURE date=\"20100416\" time=\"0909\"/>\
- <NAME lang=\"1\" val=\"Linnake\"/>\
- <NAME lang=\"2\" val=\"Fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231230\" x=\"2544152.0\" y=\"6672559.0\" id=\"3351\">\
- <ARRIVAL date=\"20100416\" time=\"0910\"/>\
- <DEPARTURE date=\"20100416\" time=\"0910\"/>\
- <NAME lang=\"1\" val=\"Alalinnake\"/>\
- <NAME lang=\"2\" val=\"Nedre fortet\"/>\
- </STOP>\
- <STOP code=\"6:2231220\" x=\"2544059.0\" y=\"6672912.0\" id=\"3350\">\
- <ARRIVAL date=\"20100416\" time=\"0911\"/>\
- <DEPARTURE date=\"20100416\" time=\"0911\"/>\
- <NAME lang=\"1\" val=\"Westendinpolku\"/>\
- <NAME lang=\"2\" val=\"Westendstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231218\" x=\"2544263.0\" y=\"6673139.0\" id=\"3348\">\
- <ARRIVAL date=\"20100416\" time=\"0912\"/>\
- <DEPARTURE date=\"20100416\" time=\"0912\"/>\
- <NAME lang=\"1\" val=\"Golfpolku\"/>\
- <NAME lang=\"2\" val=\"Golfstigen\"/>\
- </STOP>\
- <STOP code=\"6:2231212\" x=\"2544835.0\" y=\"6673222.0\" id=\"3343\">\
- <ARRIVAL date=\"20100416\" time=\"0913\"/>\
- <DEPARTURE date=\"20100416\" time=\"0913\"/>\
- <NAME lang=\"1\" val=\"Ankkurisaarentie\"/>\
- <NAME lang=\"2\" val=\"Ankarholmsvägen\"/>\
- </STOP>\
- <STOP code=\"6:2231211\" x=\"2544938.0\" y=\"6673277.0\" id=\"3342\">\
- <ARRIVAL date=\"20100416\" time=\"0913\"/>\
- <DEPARTURE date=\"20100416\" time=\"0913\"/>\
- <NAME lang=\"1\" val=\"Kuninkaansatama\"/>\
- <NAME lang=\"2\" val=\"Konungshamnen\"/>\
- </STOP>\
- <STOP code=\"6:2231201\" x=\"2546031.0\" y=\"6673305.0\" id=\"3332\">\
- <ARRIVAL date=\"20100416\" time=\"0914\"/>\
- <DEPARTURE date=\"20100416\" time=\"0914\"/>\
- <NAME lang=\"1\" val=\"Karhusaari\"/>\
- <NAME lang=\"2\" val=\"Björnholm\"/>\
- </STOP>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"22\">\
- <ARRIVAL date=\"20100416\" time=\"0915\"/>\
- <DEPARTURE date=\"20100416\" time=\"0922\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- </LINE>\
- <LINE id=\"696\" code=\"2160T 2\" type=\"5\" mobility=\"3\">\
- <LENGTH time=\"5.000\" dist=\"2926.431\"/>\
- <STOP code=\"6:2232204\" x=\"2546939.0\" y=\"6672964.0\" id=\"3360\" ord=\"20\">\
- <ARRIVAL date=\"20100416\" time=\"0915\"/>\
- <DEPARTURE date=\"20100416\" time=\"0922\"/>\
- <NAME lang=\"1\" val=\"Hanasaari\"/>\
- <NAME lang=\"2\" val=\"Hanaholmen\"/>\
- </STOP>\
- <STOP code=\"6:1310299\" x=\"2547953.0\" y=\"6672552.0\" id=\"1424\">\
- <ARRIVAL date=\"20100416\" time=\"0923\"/>\
- <DEPARTURE date=\"20100416\" time=\"0923\"/>\
- <NAME lang=\"1\" val=\"Katajaharju\"/>\
- <NAME lang=\"2\" val=\"Enåsen\"/>\
- </STOP>\
- <STOP code=\"6:1310225\" x=\"2548497.0\" y=\"6672477.0\" id=\"1411\">\
- <ARRIVAL date=\"20100416\" time=\"0925\"/>\
- <DEPARTURE date=\"20100416\" time=\"0925\"/>\
- <NAME lang=\"1\" val=\"Lahnalahdentie\"/>\
- <NAME lang=\"2\" val=\"Braxviksvägen\"/>\
- </STOP>\
- <STOP code=\"6:1310223\" x=\"2548836.0\" y=\"6672441.0\" id=\"1409\">\
- <ARRIVAL date=\"20100416\" time=\"0926\"/>\
- <DEPARTURE date=\"20100416\" time=\"0926\"/>\
- <NAME lang=\"1\" val=\"Lahnalahden puisto\"/>\
- <NAME lang=\"2\" val=\"Braxviksparken\"/>\
- </STOP>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\" ord=\"24\">\
- <ARRIVAL date=\"20100416\" time=\"0927\"/>\
- <DEPARTURE date=\"20100416\" time=\"0927\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- </LINE>\
- <WALK>\
- <LENGTH time=\"6.154\" dist=\"495.764\"/>\
- <STOP code=\"6:1310204\" x=\"2549393.0\" y=\"6672438.0\" id=\"1405\">\
- <ARRIVAL date=\"20100416\" time=\"0927\"/>\
- <DEPARTURE date=\"20100416\" time=\"0927\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- <NAME lang=\"2\" val=\"Nordostpassagen\"/>\
- </STOP>\
- <MAPLOC x=\"2549326.7\" y=\"6672446.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0928\"/>\
- <DEPARTURE date=\"20100416\" time=\"0928\"/>\
- <NAME lang=\"1\" val=\"Koillisväylä\"/>\
- </MAPLOC>\
- <MAPLOC x=\"2549376.8\" y=\"6672603.7\" type=\"0\">\
- <ARRIVAL date=\"20100416\" time=\"0930\"/>\
- <DEPARTURE date=\"20100416\" time=\"0930\"/>\
- </MAPLOC>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0933\"/>\
- <DEPARTURE date=\"20100416\" time=\"0933\"/>\
- </POINT>\
- </WALK>\
- <POINT uid=\"dest\" x=\"2549183.0\" y=\"6672570.0\">\
- <ARRIVAL date=\"20100416\" time=\"0933\"/>\
- <DEPARTURE date=\"20100416\" time=\"0933\"/>\
- </POINT>\
- </ROUTE>\
-</MTRXML>\
-"
-};
-