summaryrefslogtreecommitdiff
path: root/doc
diff options
context:
space:
mode:
authorPeter Yard <peter.yard@nokia.com>2011-08-15 13:31:40 +1000
committerQt by Nokia <qt-info@nokia.com>2011-09-23 08:09:46 +0200
commit33a7f66bf3c1fca16fab6303cbc104d5141e7321 (patch)
treeb8ec95b6adfd70d670f33bbce8be8d5db8bc0ba1 /doc
parentaacffd31b7f84c9977e6b0a873825d63b89a2af4 (diff)
downloadqtlocation-33a7f66bf3c1fca16fab6303cbc104d5141e7321.tar.gz
Location docs.
Change-Id: I8e80f3c963e54ccf693c785385b0136d2f2f33b5 Reviewed-on: http://codereview.qt-project.org/3134 Reviewed-by: Peter Yard <peter.yard@nokia.com> Reviewed-by: Aaron McCarthy <aaron.mccarthy@nokia.com>
Diffstat (limited to 'doc')
-rw-r--r--doc/src/examples/declarative-flickr.qdoc41
-rw-r--r--doc/src/examples/declarative-mapviewer.qdoc38
-rw-r--r--doc/src/examples/lightmaps.qdoc38
-rw-r--r--doc/src/examples/logfilepositionsource.qdoc39
-rw-r--r--doc/src/images/flickr-demo.jpgbin0 -> 35647 bytes
-rw-r--r--doc/src/images/mapsdemo-finished.pngbin0 -> 65434 bytes
-rw-r--r--doc/src/images/mapsdemo-routing.pngbin0 -> 55176 bytes
-rw-r--r--doc/src/images/mapsdemo-searchgui.pngbin0 -> 80027 bytes
-rw-r--r--doc/src/images/mapsdemo-verybasic.pngbin0 -> 63947 bytes
-rw-r--r--doc/src/images/qml-flickr-1.jpgbin0 -> 58111 bytes
-rw-r--r--doc/src/location.qdoc471
-rw-r--r--doc/src/plugins/qml-location.qdoc94
-rw-r--r--doc/src/snippets/declarative/content/Cell.qml68
-rw-r--r--doc/src/snippets/declarative/declarative-location.qml84
-rw-r--r--doc/src/snippets/declarative/declarative-map.qml168
-rwxr-xr-xdoc/src/snippets/declarative/nmealog.txt1403
-rw-r--r--doc/src/snippets/declarative/testpolymapobjects.qml411
-rw-r--r--doc/src/snippets/snippets.pro13
-rw-r--r--doc/src/tutorials/maps.qdoc2147
19 files changed, 5015 insertions, 0 deletions
diff --git a/doc/src/examples/declarative-flickr.qdoc b/doc/src/examples/declarative-flickr.qdoc
new file mode 100644
index 00000000..164bbcea
--- /dev/null
+++ b/doc/src/examples/declarative-flickr.qdoc
@@ -0,0 +1,41 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example declarative/flickr
+ \title Declarative Flickr
+
+ This example illustrates the positioning elements of declarative location.
+
+ \image qml-flickr-1.jpg
+
+ The basic idea is to fetch public images from the Flickr service based on
+ your current location. In case there is no default positioning provider on the platform
+ the application is being run on, the example defaults to use a small NMEA log file
+ (recorded in Australia).
+
+*/
diff --git a/doc/src/examples/declarative-mapviewer.qdoc b/doc/src/examples/declarative-mapviewer.qdoc
new file mode 100644
index 00000000..4c7dde3a
--- /dev/null
+++ b/doc/src/examples/declarative-mapviewer.qdoc
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example declarative/mapviewer
+ \title Declarative Map Viewer Example
+
+ This example demonstrates the basic use of the QML Map element.
+
+ Moving the mouse while holding down the left mouse button pans the map.
+ Double-clicking the mouse centers and zooms in on the point that was clicked.
+ The '+' and '-' keys can be used to change the zoom level.
+
+*/
diff --git a/doc/src/examples/lightmaps.qdoc b/doc/src/examples/lightmaps.qdoc
new file mode 100644
index 00000000..0d6bc29d
--- /dev/null
+++ b/doc/src/examples/lightmaps.qdoc
@@ -0,0 +1,38 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example lightmaps
+ \title LightMaps Example
+
+ This demo shows a lookup of the local street map based on the users
+ location as determined by GPS. If no GPS is detected a default location
+ is selected. Also from the Options menu the user can select a sample
+ city. There is also an option to select night view.
+
+ \image lightmaps-oslo.png
+*/
diff --git a/doc/src/examples/logfilepositionsource.qdoc b/doc/src/examples/logfilepositionsource.qdoc
new file mode 100644
index 00000000..b14a5bb6
--- /dev/null
+++ b/doc/src/examples/logfilepositionsource.qdoc
@@ -0,0 +1,39 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \example logfilepositionsource
+ \title Log File Position Source Example
+
+ This example demonstrates the replaying of position data from a log file.
+
+ The data is read from a file which has positional data in NMEA format. The resulting
+ time and position information is then displayed to the screen as simple text in
+ date/time and latitude/longitude format.
+
+ A detailed analysis is given in the overview documentation for the \l {Location API}.
+*/
diff --git a/doc/src/images/flickr-demo.jpg b/doc/src/images/flickr-demo.jpg
new file mode 100644
index 00000000..cfd12819
--- /dev/null
+++ b/doc/src/images/flickr-demo.jpg
Binary files differ
diff --git a/doc/src/images/mapsdemo-finished.png b/doc/src/images/mapsdemo-finished.png
new file mode 100644
index 00000000..cadee4a3
--- /dev/null
+++ b/doc/src/images/mapsdemo-finished.png
Binary files differ
diff --git a/doc/src/images/mapsdemo-routing.png b/doc/src/images/mapsdemo-routing.png
new file mode 100644
index 00000000..3c2d0cad
--- /dev/null
+++ b/doc/src/images/mapsdemo-routing.png
Binary files differ
diff --git a/doc/src/images/mapsdemo-searchgui.png b/doc/src/images/mapsdemo-searchgui.png
new file mode 100644
index 00000000..a307e68a
--- /dev/null
+++ b/doc/src/images/mapsdemo-searchgui.png
Binary files differ
diff --git a/doc/src/images/mapsdemo-verybasic.png b/doc/src/images/mapsdemo-verybasic.png
new file mode 100644
index 00000000..9d92a74c
--- /dev/null
+++ b/doc/src/images/mapsdemo-verybasic.png
Binary files differ
diff --git a/doc/src/images/qml-flickr-1.jpg b/doc/src/images/qml-flickr-1.jpg
new file mode 100644
index 00000000..14fc5c92
--- /dev/null
+++ b/doc/src/images/qml-flickr-1.jpg
Binary files differ
diff --git a/doc/src/location.qdoc b/doc/src/location.qdoc
new file mode 100644
index 00000000..6e972372
--- /dev/null
+++ b/doc/src/location.qdoc
@@ -0,0 +1,471 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+
+
+
+/*!
+ \group location
+ \title Location Classes
+
+ The Location API provides a library for location positioning, mapping and navigation.
+*/
+
+/*!
+\page location-overview.html
+
+\title Location API
+
+\brief The Location API provides a library for location positioning, mapping and navigation.
+
+\ingroup technology-apis
+
+The Location API provides a library for location positioning, mapping and navigation.
+
+\tableofcontents
+
+\section1 Location Positioning
+
+Location data involves a precisely specified position on the Earth's
+surface \unicode {0x2014} as provided by a latitude-longitude coordinate
+\unicode {0x2014} along with associated data, such as:
+
+ \list
+ \o The date and time at which the position was reported
+ \o The velocity of the device that reported the position
+ \o The altitude of the reported position (height above sea level)
+ \o The bearing of the device in degrees, relative to true north
+ \endlist
+
+This data can be extracted through a variety of methods. One of the most
+well known methods of positioning is GPS (Global Positioning System), a
+publicly available system that uses radiowave signals received from
+Earth-orbiting satellites to calculate the precise position and time of
+the receiver. Another popular method is Cell ID positioning, which uses
+the cell ID of the cell site that is currently serving the receiving
+device to calculate its approximate location. These and other positioning
+methods can all be used with the Location API; the only requirement for a
+location data source within the API is that it provides a
+latitude-longitude coordinate with a date/time value, with the option of
+providing the other attributes listed above.
+
+
+Location data sources are created by subclassing QGeoPositionInfoSource and
+providing QGeoPositionInfo objects through the
+QGeoPositionInfoSource::positionUpdated() signal. Clients that require
+location data can connect to the
+\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal and
+call \l{QGeoPositionInfoSource::startUpdates()}{startUpdates()} or
+\l{QGeoPositionInfoSource::requestUpdate()}{requestUpdate()} to trigger the
+distribution of location data.
+
+A default position source may be available on some platforms. Call
+QGeoPositionInfoSource::createDefaultSource() to create an instance of the default
+position source; the method returns 0 if no default source is available for
+the platform.
+
+The QGeoAreaMonitor class enables client applications to be notified when
+the receiving device has moved in or out of a particular area, as specified
+by a coordinate and radius. If the platform provides built-in support for
+area monitoring, QGeoAreaMonitor::createDefaultMonitor() returns an instance of
+the default area monitor.
+
+Satellite information can also be distributed through the
+QGeoSatelliteInfoSource class. Call QGeoSatelliteInfoSource::createDefaultSource() to
+create an instance of the default satellite data source for the platform,
+if one is available. Alternatively, clients can subclass it to provide a
+custom satellite data source.
+
+
+\section2 Requesting location data from data sources
+
+To receive data from a source, connect to its
+\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal,
+then call either \l{QGeoPositionInfoSource::startUpdates()}{startUpdates()}
+or \l{QGeoPositionInfoSource::requestUpdate()}{requestUpdate()} to begin.
+
+Here is an example of a client that receives data from the default location
+data source, as returned by QGeoPositionInfoSource::createDefaultSource():
+
+\code
+class MyClass : public QObject
+{
+ Q_OBJECT
+public:
+ MyClass(QObject *parent = 0)
+ : QObject(parent)
+ {
+ QGeoPositionInfoSource *source = QGeoPositionInfoSource::createDefaultSource(this);
+ if (source) {
+ connect(source, SIGNAL(positionUpdated(QGeoPositionInfo)),
+ this, SLOT(positionUpdated(QGeoPositionInfo)));
+ source->startUpdates();
+ }
+ }
+
+private slots:
+ void positionUpdated(const QGeoPositionInfo &info)
+ {
+ qDebug() << "Position updated:" << info;
+ }
+};
+
+\endcode
+
+\section2 Controlling aspects of data sources
+
+The QGeoPositionInfoSource::setUpdateInterval() method can be used to
+control the rate at which position updates are received. For example, if
+the client application only requires updates once every 30 seconds, it can
+call \c setUpdateInterval(30000). (If no update interval is set, or
+\l {QGeoPositionInfoSource::}{setUpdateInterval()} is called with a value of 0, the source uses a default
+interval or some other internal logic to determine when updates should be
+provided.)
+
+QGeoPositionInfoSource::setPreferredPositioningMethods() enables client
+applications to request that a certain type of positioning method be used.
+For example, if the application prefers to use only satellite positioning,
+which offers fairly precise outdoor positioning but can be a heavy user of
+power resources, it can call this method with the
+QGeoPositionInfoSource::SatellitePositioningMethods value. However, this
+method should only be used in specialized client applications; in most
+cases, the default positioning methods should not be changed, as a source
+may internally use a variety of positioning methods that can be useful to
+the application.
+
+\section2 Reading NMEA data
+
+\l {http://en.wikipedia.org/wiki/NMEA_0183}{NMEA} is a common text-based
+protocol for specifying navigational data. For convenience, the
+QNmeaPositionInfoSource is provided to enable client applications to read
+and distribute NMEA data in either real-time mode (for example, when
+streaming from a GPS device) or simulation mode (for example, when reading
+from a NMEA log file). In simulation mode, the source will emit updates
+according to the time stamp of each NMEA sentence to produce a "replay"
+of the recorded data.
+
+
+\section2 Example: Creating a custom location data source
+
+Generally, the capabilities provided by the default position source as
+returned by QGeoPositionInfoSource::createDefaultSource(), along with the
+QNmeaPositionInfoSource class, are sufficient for retrieving location
+data. However, in some cases developers may wish to write their own custom
+location data sources.
+
+The \c LogFilePositionSource class in \c examples/logfilepositionsource
+shows how to subclass QGeoPositionInfoSource to create a custom location
+data source.
+
+This example class reads location data from a text file, \e log.txt. The
+file specifies location data using a simple text format: it contains one
+location update per line, where each line contains a date/time, a latitude
+and a longitude, separated by spaces. The date/time is in ISO 8601 format
+and the latitude and longitude are in degrees decimal format. Here is an
+excerpt from \e log.txt:
+
+ \code
+ 2009-08-24T22:25:01 -27.576082 153.092415
+ 2009-08-24T22:25:02 -27.576223 153.092530
+ 2009-08-24T22:25:03 -27.576364 153.092648
+ \endcode
+
+The class reads this data and distributes it via the
+\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal.
+
+Here is the definition of the \c LogFilePositionSource class:
+
+ \quotefromfile logfilepositionsource/logfilepositionsource.h
+ \skipto class LogFilePositionSource
+ \printuntil };
+
+The main methods overrided by the subclass are:
+
+ \list
+ \o \l{QGeoPositionInfoSource::startUpdates()}{startUpdates()}: called by client applications to start regular position updates
+ \o \l{QGeoPositionInfoSource::stopUpdates()}{stopUpdates()}: called by client applications to stop regular position updates
+ \o \l{QGeoPositionInfoSource::requestUpdate()}{requestUpdate()}: called by client applications to request a single update, with a specified timeout
+ \endlist
+
+When a position update is available, the subclass emits the
+\l{QGeoPositionInfoSource::positionUpdated()}{positionUpdated()} signal.
+
+Here are the key methods in the class implementation:
+
+ \quotefromfile logfilepositionsource/logfilepositionsource.cpp
+ \skipto LogFilePositionSource::LogFilePositionSource
+ \printuntil /^\}/
+ \skipto LogFilePositionSource::startUpdates
+ \printuntil /^\}/
+ \skipto LogFilePositionSource::stopUpdates
+ \printuntil /^\}/
+ \skipto LogFilePositionSource::requestUpdate
+ \printuntil /^\}/
+ \printuntil LogFilePositionSource::readNextPosition
+ \printuntil /^\}/
+
+
+The \l {Log File Position Source Example}{example} includes a \c ClientApplication class that requests updates
+from the \c LogFilePositionSource class. Run the example to see the data
+that is received by \c ClientApplication.
+
+Before running the example, make sure you have done both \tt make
+and \tt {make install}.
+
+\section2 QML Elements
+
+For details on the QML support provided for the Location API see the documentation for the
+\l {Location QML Plugin}.
+
+\section2 Examples
+
+\section3 \bold{Flickr Example}
+
+The \l{Declarative Flickr}{Flickr Example} uses the Location to download thumbnail
+images from Flickr relevant to the current location.
+
+
+\section2 Location classes
+
+\annotatedlist location
+
+
+
+
+
+
+
+\section1 Maps and Navigation
+
+The Maps and Navigation API is based on plugins.
+
+Since most providers of mapping, geocoding and routing information offer
+no guarantees that their data is interoperable with the data provided by
+other services, the plugins are used to group the functionality per
+service provider.
+
+The plugins are accessed via QGeoServiceProvider, and a Nokia based plugin.
+See the section \l{The Nokia plugin} for more details.
+
+\code
+ QGeoMappingManager *mappingManager = 0;
+ QGeoRoutingManager *routingManager = 0;
+ QGeoSearchManager *searchManager = 0;
+
+ QGeoServiceProvider serviceProvider("plugin name");
+
+ if (serviceProvider.error() == QGeoServiceProvider::NoError) {
+ mappingManager = serviceProvider.mappingManager();
+ routingManager = serviceProvider.routingManager();
+ searchManager = serviceProvider.searchManager();
+ }
+\endcode
+
+\bold {Important notice:} \e {The map data provided by the offline plug-in is
+place-shifted for the area of the People’s Republic of China. To provide
+un-shifted maps of China in an application, the application developer must
+first obtain permission from Chinese officials. The Qt Location
+API cannot offer this on the API level.}
+
+
+\section2 Common classes
+
+\annotatedlist maps
+
+\section2 Mapping
+
+The QGraphicsGeoMap class is the main class used for displaying and interacting
+with maps. It is designed for use within the Graphics View Framework, and is
+a subclass of QGraphicsWidget.
+
+The QGeoMappingManager provides most of the functionality required by
+QGraphicsGeoMap. The details of QGeoMappingManager are mostly only important
+to plugin implementers, as regular users should not need to make use of
+QGeoMappingManager outside of the QGraphicsGeoMap constructor:
+\code
+ QGraphicsGeoMap *map = new QGraphicsGeoMap(mappingManager);
+\endcode
+
+\annotatedlist maps-mapping
+
+\section3 \bold{Map objects}
+
+QGeoMapObject and its subclasses provide the ability to add graphics to the map
+specified in terms of coordinates and distances. QGeoMapObject instances can
+also be grouped into hierarchies in order to simplify the process of creating
+compound objects and managing groups of objects.
+
+\annotatedlist maps-mapping-objects
+
+\section2 Routing
+
+QGeoRoutingManager handles requests for routing information.
+
+The requests are created as QGeoRouteRequest instances, which are
+passed to QGeoRoutingManager::calculateRoute(). The returned
+QGeoRouteReply instance will contain the result of the request when
+it is completed.
+
+The QGeoRoute class describes the resulting route. Each route is
+broken up into a number of QGeoRouteSegment instances, with the division
+usually occurring at either user specified waypoints or at changes in the
+mode of transport, like when changing from a train to a bus.
+
+Each QGeoRouteSegment has a QGeoNavigationInstruction instance which
+describes the instructions that would be issued to a user attempting
+to follow a route. These instructions a location, which is typically
+somewhere near the end of the associated QGeoRouteSegment, and
+instruction text describing how the next QGeoRouteSegment should be reached.
+
+\annotatedlist maps-routing
+
+\section2 Geocoding and searching for places
+
+QGeoSearchManager handles geocoding, reverse geocoding and free-text
+search for places.
+
+The free-text search will attempt to geocode text that looks like an
+address while simultaneously searching any landmark databases that the
+service provides.
+
+\annotatedlist maps-places
+
+\section2 The Nokia plugin
+
+Included with the Qt Location API is a Maps and Navigation API plugin which accesses
+the relevant Ovi services provided Nokia. The use of these services
+is governed by the terms and conditions available in the file
+plugins/geoservices/nokia/OVI_SERVICES_TERMS_AND_CONDITIONS.txt.
+
+The Ovi services plugin can be loaded by using the plugin key "nokia".
+
+Note that accepting the terms and conditions only applies those terms and conditions to the use of the Ovi Maps Services plugin and does not limit the use of the other maps and navigation API plugins that may be included with Qt.
+
+On Symbian platforms the applications using the Nokia plugin will need NetworkServices capability to access the online services.
+
+The online plugin uses the tiled map classes, which cache tile data in heap memory (currently up to 10 MB on Symbian and Maemo5 and Harmattan platforms). Because default heap size for Qt application on Symbian is 4 MB, it may be good idea to increase the application's heap size (depending on the app of course). Otherwise somewhat misleading error popups may appear, e.g. "<application name>: Memory full. Close some applications and try again." See e.g. \l {http://library.forum.nokia.com/index.jsp?topic=/Qt_for_Symbian_Developers_Library/GUID-4427F6F8-AB72-489B-BB9C-3261A0568E4E.html}{Forum Nokia documentation.}
+
+The following table lists optional parameters that can be passed to the Nokia plugin.
+\table
+\header
+ \o Parameter
+ \o Description
+\row
+ \o mapping.proxy
+ \o Proxy server URL used by mapping manager.
+\row
+ \o mapping.host
+ \o Map tile service URL used by mapping manager.
+\row
+ \o mapping.referer
+ \o Referer for the mapping token used for authentication by mapping manager.
+\row
+ \o mapping.token
+ \o Client token for the service used for authentication by mapping manager.
+\row
+ \o mapping.cache.directory
+ \o Map tile cache directory used as network disk cache.
+
+ Default place for the cache is "maptiles" directory in system temp.
+
+ On Symbian platform by default the cache is placed into internal mass memory drive directory "/data/nokia/maptiles".
+
+ If no internal mass memory is present on Symbian device caching is not used by default.
+
+ Changing the cache directory on Symbian may cause additional capability needs depending on where the new directory is placed.
+
+ Map tile caching is disabled on Maemo, Meego and Windows CE platforms. Using the parameter on these platforms will have no effect.
+
+ Map tiles will expire and are refetched 14 days after download.
+\row
+ \o mapping.cache.size
+ \o Map tile cache size. Maximum size of the cache is 50MB.
+\row
+ \o routing.proxy
+ \o Proxy server URL used by routing manager.
+\row
+ \o routing.host
+ \o Routing service URL used by routing manager.
+\row
+ \o routing.referer
+ \o Referer for the routing token used for authentication by routing manager.
+\row
+ \o routing.token
+ \o Client token for the service used for authentication by routing manager.
+\row
+ \o places.proxy
+ \o Proxy server URL used by search manager.
+\row
+ \o places.host
+ \o Search service URL used by search manager.
+\row
+ \o places.referer
+ \o Referer for the places token used for authentication by search manager.
+\row
+ \o places.token
+ \o Client token for the service used for authentication by search manager.
+\endtable
+
+\section2 Implementing plugins
+
+A plugin implementer needs to subclass QGeoServiceProviderFactory and as
+many of the ManagerEngine classes as they want to provide implementations for.
+
+Subclassing QGeoServiceProviderFactory will only involve exposing a name and
+a version by overriding QGeoServiceProviderFactory::providerName() and
+QGeoServiceProviderFactory::providerVersion(), and overriding
+QGeoServiceProviderFactory::createSearchManagerEngine(),
+QGeoServiceProviderFactory::createMappingManagerEngine() and
+QGeoServiceProviderFactory::createRoutingManagerEngine() as appropriate.
+
+\annotatedlist maps-impl
+
+\section3 Tile-based map convenience classes
+
+Most of the current tile based mapping APIs are very similar, and so we
+provide a number of classes intended to make writing tile based mapping
+plugins much simpler.
+
+If the Mercator projection and the most common tile addressing scheme is used this will mainly involve subclassing QGeoTiledMappingManagerEngine and providing an implementation of QGeoTiledMappingManagerEngine::getTileImage().
+
+\annotatedlist maps-impl-tiled
+
+\section1 QML Elements
+
+For details on the QML support provided for the Location API see the documentation for the \l {Location QML Plugin}.
+
+\section1 Map Examples
+
+\l {Declarative Map Viewer Example}
+
+\l {LightMaps Example}
+
+
+*/
+
+
+
diff --git a/doc/src/plugins/qml-location.qdoc b/doc/src/plugins/qml-location.qdoc
new file mode 100644
index 00000000..767ca323
--- /dev/null
+++ b/doc/src/plugins/qml-location.qdoc
@@ -0,0 +1,94 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \group qml-location
+ \title QML Location Plugin
+ QML Support for the Qt Location API.
+*/
+
+/*!
+ \page qml-location-plugin.html
+
+ \title Location QML Plugin
+
+ \brief A QML plugin for the Qt Location API.
+
+
+ \section1 Overview
+
+ The Qt Location API gives users the capability to write applications that understand a geographical location and movement of the position coordinates. Backend services can be called by the API to detect landmarks and display appropriate information. The QML Location Plugin delivers these capabilities in an easy to use form.
+
+ \section1 Positioning
+
+ \section2 Coordinate
+
+ The \l Coordinate is a basic unit of geographical information. The \l Coordinate element includes properties to hold the coordinate values for \l {Coordinate::latitude}{latitude}, \l {Coordinate::longitude}{longitude} and \l {Coordinate::altitude}{altitude}.
+
+ \section2 Position
+
+ The three dimensional position of an object such as a mobile device can be specified by giving the latitude, longitude and altitude. That is the values held in the Coordinate element. Additionally for computation of future positions we would like to know if the object is moving, what \l {Position::speed}{speed} it is doing and what is the \l {Position::timestamp}{timestamp} of the last position data. Position therefore includes values for \l {Coordinate::latitude}{latitude}, \l {Coordinate::longitude}{longitude}, \l {Coordinate::altitude}{altitude}, \l {Position::speed}{speed} and a \l {Position::timestamp}{timestamp}. \l Position also takes responsibility for validation of sensible values for these properties: just as there is a \l {Coordinate::latitude}{latitude} there is a property \l {Position::latitudeValid}{latitudeValid}. Similarly for the other properties with the exception of the timestamp.
+
+
+ \section2 PositionSource
+
+ We have a Position element, a Coordinate element but where do we get the
+ data from? It is a good idea to be able to indicate alternative sources.
+ Perhaps instead of directly picking up GPS satellites you want to do
+ some testing using a datafile. We may also need to manage our
+ interaction with the source.
+
+ The \l PositionSource element provides the developer with control,
+ within the limits allowed by the platform, of the source of the
+ geographical data. The positional data can be sourced from a logfile
+ which is in NMEA format.
+
+ \l {http://en.wikipedia.org/wiki/NMEA}{NMEA} is a common text-based protocol for specifying navigational data. For convenience, the \l {PositionSource::nmeaSource}{nmeaSource} property is provided to enable QML applications to read NMEA data from a log file, the source will emit updates according to the time stamp of each NMEA sentence to produce a "replay" of the recorded data.
+
+ \section2 Positioning Elements
+
+
+ \annotatedlist qml-location
+
+ \section1 Maps
+
+ The Map element can be used be used to display a map of the world. The
+ bulk of the functionality is provided by a mapping plugin described
+ by the plugin element associated with the Map.
+
+ Various map objects can be added to the map. These map objects are
+ specified in terms of coordinates and meters.
+
+ Interaction with the map objects is done via the MapMouseArea item.
+
+ \section2 Map Elements
+
+ \annotatedlist qml-location-maps
+
+*/
+
+
diff --git a/doc/src/snippets/declarative/content/Cell.qml b/doc/src/snippets/declarative/content/Cell.qml
new file mode 100644
index 00000000..10330774
--- /dev/null
+++ b/doc/src/snippets/declarative/content/Cell.qml
@@ -0,0 +1,68 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt 4.7
+
+Item {
+ id: container
+ property string action: "no-op"
+ signal clicked(string action)
+
+ width: 100; height:30
+
+ Rectangle {
+ id: rectangle
+ border.color: "white"
+ border.width: 2
+ anchors.fill: parent // Fill the whole container
+ }
+ Text {
+ id: text
+ text: container.action
+ color: "black"
+ anchors.left: parent.left
+ anchors.leftMargin: 5
+ anchors.verticalCenter: parent.verticalCenter
+ }
+ MouseArea {
+ anchors.fill: parent // Whole container is clickable
+ onClicked: container.clicked(container.action)
+ }
+}
diff --git a/doc/src/snippets/declarative/declarative-location.qml b/doc/src/snippets/declarative/declarative-location.qml
new file mode 100644
index 00000000..73e7991a
--- /dev/null
+++ b/doc/src/snippets/declarative/declarative-location.qml
@@ -0,0 +1,84 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+//![0]
+import Qt 4.7
+import QtMobility.location 1.1
+
+Rectangle {
+ id: page
+ width: 350
+ height: 350
+ PositionSource {
+ id: positionSource
+ updateInterval: 1000
+ active: true
+ // nmeaSource: "nmealog.txt"
+ }
+ Column {
+ Text {text: "<==== PositionSource ====>"}
+ Text {text: "positioningMethod: " + printableMethod(positionSource.positioningMethod)}
+ Text {text: "nmeaSource: " + positionSource.nmeaSource}
+ Text {text: "updateInterval: " + positionSource.updateInterval}
+ Text {text: "active: " + positionSource.active}
+ Text {text: "<==== Position ====>"}
+ Text {text: "latitude: " + positionSource.position.coordinate.latitude}
+ Text {text: "longitude: " + positionSource.position.coordinate.longitude}
+ Text {text: "altitude: " + positionSource.position.coordinate.altitude}
+ Text {text: "speed: " + positionSource.position.speed}
+ Text {text: "timestamp: " + positionSource.position.timestamp}
+ Text {text: "altitudeValid: " + positionSource.position.altitudeValid}
+ Text {text: "longitudeValid: " + positionSource.position.longitudeValid}
+ Text {text: "latitudeValid: " + positionSource.position.latitudeValid}
+ Text {text: "speedValid: " + positionSource.position.speedValid}
+ }
+ function printableMethod(method) {
+ if (method == PositionSource.SatellitePositioningMethod)
+ return "Satellite";
+ else if (method == PositionSource.NoPositioningMethod)
+ return "Not available"
+ else if (method == PositionSource.NonSatellitePositioningMethod)
+ return "Non-satellite"
+ else if (method == PositionSource.AllPositioningMethods)
+ return "All/multiple"
+ return "source error";
+ }
+ }
+//![0]
diff --git a/doc/src/snippets/declarative/declarative-map.qml b/doc/src/snippets/declarative/declarative-map.qml
new file mode 100644
index 00000000..9b4055a9
--- /dev/null
+++ b/doc/src/snippets/declarative/declarative-map.qml
@@ -0,0 +1,168 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt 4.7
+import QtMobility.location 1.2
+
+Item {
+ id: page
+ width: 320
+ height: 480
+ focus: true
+
+ PositionSource {
+ id: myPositionSource
+ active: true
+ updateInterval: 2000
+ nmeaSource: 'nmealog.txt'
+ onPositionChanged: console.log("Position changed in PositionSource")
+ }
+ LandmarkBoxFilter {
+ id: boxFilter
+ topLeft: map.toCoordinate(Qt.point(0,0))
+ bottomRight: map.toCoordinate(Qt.point(page.width, page.height))
+ }
+
+ LandmarkProximityFilter {
+ id: proximityFilter
+ center: myPositionSource.position.coordinate
+ //center: Coordinate {latitude: -27; longitude: 153}
+ radius: 500000
+ }
+
+ LandmarkModel {
+ id: landmarkModelAll
+ autoUpdate: true
+ filter: boxFilter
+ limit: 50
+ onModelChanged: {
+ console.log("All landmark model changed, landmark count: " + count)
+ }
+ }
+
+ //! [LandmarkModel proximity filter]
+ LandmarkModel {
+ id: landmarkModelNear
+ autoUpdate: true
+ filter: proximityFilter
+ limit: 50
+ onModelChanged: {
+ console.log("Near landmark model changed, landmark count: " + count)
+ }
+ }
+ //! [LandmarkModel proximity filter]
+
+ Rectangle {
+ id: dataArea
+ anchors.fill: parent
+ color: "#343434"
+
+ //![Basic MapObjects and View on Map]
+ Map {
+ id: map
+ plugin : Plugin {name : "nokia"}
+ anchors.fill: parent
+ size.width: parent.width
+ size.height: parent.height
+ zoomLevel: 10
+
+ MapObjectView {
+ id: allLandmarks
+ model: landmarkModelAll
+ delegate: Component {
+ MapCircle {
+ color: "green"
+ radius: 1000
+ center: Coordinate {
+ latitude: landmark.coordinate.latitude
+ longitude: landmark.coordinate.longitude
+ }
+ }
+ }
+ }
+
+ MapCircle {
+ id: myPosition
+ color: "yellow"
+ radius: 1000
+ center: myPositionSource.position.coordinate
+ }
+ //![Basic MapObjects and View on Map]
+
+ MapObjectView {
+ id: landmarksNearMe
+ model: landmarkModelNear
+ delegate: Component {
+ MapGroup {
+ MapCircle {
+ color: "red"
+ radius: 1000
+ center: Coordinate {
+ latitude: landmark.coordinate.latitude
+ longitude: landmark.coordinate.longitude
+ }
+ }
+ }
+ }
+ }
+
+ // center: Coordinate {latitude: -27; longitude: 153}
+ center: myPositionSource.position.coordinate
+
+ onZoomLevelChanged: {
+ console.log("Zoom changed")
+ updateFilters();
+ }
+ onCenterChanged: {
+ console.log("Center changed")
+ updateFilters();
+ }
+ function updateFilters () {
+ // The pixel coordinates used are the map's pixel coordinates, not
+ // the absolute pixel coordinates of the application. Hence e.g. (0,0) is always
+ // the top left point
+ var topLeftCoordinate = map.toCoordinate(Qt.point(0,0))
+ var bottomRightCoordinate = map.toCoordinate(Qt.point(map.size.width, map.size.height))
+ boxFilter.topLeft = topLeftCoordinate;
+ boxFilter.bottomRight = bottomRightCoordinate;
+ }
+ } // map
+ } // dataArea
+} // page
diff --git a/doc/src/snippets/declarative/nmealog.txt b/doc/src/snippets/declarative/nmealog.txt
new file mode 100755
index 00000000..8c8286dd
--- /dev/null
+++ b/doc/src/snippets/declarative/nmealog.txt
@@ -0,0 +1,1403 @@
+$GPGGA,222437.000,2734.33926,S,15305.44310,E,1,07,1.3,50.6,M,39.2,M,,*72
+$GPGLL,2734.33926,S,15305.44310,E,222437.000,A,A*49
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222437.000,13.3,7.4,6.6,85.1,6.0,6.8,13.7*56
+$GPGSV,3,1,10,16,49,115,42,25,39,269,36,23,58,176,29,20,72,335,35*75
+$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,30,223,30,27,19,284,35*78
+$GPGSV,3,3,10,11,06,337,30,03,13,055,25*7C
+$GPRMC,222437.000,A,2734.33926,S,15305.44310,E,33.9,157.8,030308,11.2,W,A*0F
+$GPVTG,157.8,T,169.0,M,33.9,N,62.9,K,A*22
+$GPGGA,222438.000,2734.34821,S,15305.44697,E,1,07,1.2,50.8,M,39.2,M,,*79
+$GPGLL,2734.34821,S,15305.44697,E,222438.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222438.000,12.4,6.4,9.3,16.2,6.1,8.3,16.4*5F
+$GPGSV,3,1,10,16,49,115,41,25,39,269,36,23,58,176,28,20,72,335,36*74
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,28,27,19,284,35*73
+$GPGSV,3,3,10,11,06,337,28,03,13,055,25*75
+$GPRMC,222438.000,A,2734.34821,S,15305.44697,E,33.8,158.3,030308,11.2,W,A*0E
+$GPVTG,158.3,T,169.5,M,33.8,N,62.5,K,A*2E
+$GPGGA,222439.000,2734.35696,S,15305.45072,E,1,06,1.7,51.2,M,39.2,M,,*78
+$GPGLL,2734.35696,S,15305.45072,E,222439.000,A,A*43
+$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A
+$GPGST,222439.000,10.3,9.1,12.2,44.6,9.8,9.9,25.2*62
+$GPGSV,3,1,10,16,49,115,34,25,39,269,36,23,58,175,29,20,72,335,35*77
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,27,27,19,284,32*7B
+$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72
+$GPRMC,222439.000,A,2734.35696,S,15305.45072,E,33.2,158.7,030308,11.2,W,A*0E
+$GPVTG,158.7,T,169.9,M,33.2,N,61.5,K,A*2F
+$GPGGA,222440.000,2734.36580,S,15305.45446,E,1,07,1.3,52.0,M,39.2,M,,*76
+$GPGLL,2734.36580,S,15305.45446,E,222440.000,A,A*49
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222440.000,13.0,8.0,13.4,6.2,7.4,12.2,20.9*64
+$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,31,20,72,335,34*72
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,30*78
+$GPGSV,3,3,10,11,06,337,26,03,14,055,25*7C
+$GPRMC,222440.000,A,2734.36580,S,15305.45446,E,33.7,159.1,030308,11.2,W,A*06
+$GPVTG,159.1,T,170.3,M,33.7,N,62.4,K,A*2D
+$GPGGA,222441.000,2734.37483,S,15305.45825,E,1,07,1.3,52.7,M,39.2,M,,*7A
+$GPGLL,2734.37483,S,15305.45825,E,222441.000,A,A*42
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222441.000,14.0,7.6,14.1,17.6,7.7,12.5,21.0*51
+$GPGSV,3,1,10,16,49,115,41,25,39,269,39,23,58,175,29,20,72,335,35*7A
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,24,27,19,284,30*7A
+$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72
+$GPRMC,222441.000,A,2734.37483,S,15305.45825,E,34.6,159.4,030308,11.2,W,A*0E
+$GPVTG,159.4,T,170.6,M,34.6,N,64.1,K,A*28
+$GPGGA,222442.000,2734.38407,S,15305.46216,E,1,06,1.3,53.3,M,39.2,M,,*77
+$GPGLL,2734.38407,S,15305.46216,E,222442.000,A,A*4B
+$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C
+$GPGST,222442.000,16.6,7.0,14.4,14.6,7.0,12.8,21.6*5A
+$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,22,20,72,335,35*71
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,25,27,19,284,29*73
+$GPGSV,3,3,10,11,06,337,27,03,14,055,25*7D
+$GPRMC,222442.000,A,2734.38407,S,15305.46216,E,35.5,159.3,030308,11.2,W,A*02
+$GPVTG,159.3,T,170.5,M,35.5,N,65.8,K,A*26
+$GPGGA,222443.000,2734.39347,S,15305.46609,E,1,05,1.8,53.8,M,39.2,M,,*7D
+$GPGLL,2734.39347,S,15305.46609,E,222443.000,A,A*42
+$GPGSA,A,3,16,25,20,27,11,,,,,,,,2.8,1.8,2.1*35
+$GPGST,222443.000,11.3,6.5,14.6,14.5,6.6,13.0,18.4*5A
+$GPGSV,3,1,10,16,49,115,40,25,39,269,38,23,58,175,22,20,72,335,36*72
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,31*79
+$GPGSV,3,3,10,11,06,337,28,03,14,055,25*72
+$GPRMC,222443.000,A,2734.39347,S,15305.46609,E,36.2,159.4,030308,11.2,W,A*08
+$GPVTG,159.4,T,170.6,M,36.2,N,67.0,K,A*2C
+$GPGGA,222444.000,2734.40297,S,15305.47000,E,1,06,1.3,54.1,M,39.2,M,,*70
+$GPGLL,2734.40297,S,15305.47000,E,222444.000,A,A*49
+$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C
+$GPGST,222444.000,17.6,6.3,12.7,14.4,6.3,11.4,16.2*55
+$GPGSV,3,1,10,16,49,115,38,25,39,269,38,23,58,175,22,20,72,335,35*7E
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,25,27,19,284,29*73
+$GPGSV,3,3,10,11,06,337,25,03,14,055,23*79
+$GPRMC,222444.000,A,2734.40297,S,15305.47000,E,36.5,159.5,030308,11.2,W,A*05
+$GPVTG,159.5,T,170.8,M,36.5,N,67.5,K,A*21
+$GPGGA,222445.000,2734.41247,S,15305.47390,E,1,07,1.3,54.2,M,39.2,M,,*75
+$GPGLL,2734.41247,S,15305.47390,E,222445.000,A,A*4E
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222445.000,16.0,7.0,14.4,10.4,6.7,13.0,20.7*52
+$GPGSV,3,1,10,16,49,115,36,25,39,269,36,23,58,175,22,20,72,335,34*7F
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,30,223,26,27,19,284,31*79
+$GPGSV,3,3,10,11,06,337,26,03,14,055,23*7A
+$GPRMC,222445.000,A,2734.41247,S,15305.47390,E,36.6,159.7,030308,11.2,W,A*03
+$GPVTG,159.7,T,170.9,M,36.6,N,67.8,K,A*2C
+$GPGGA,222446.000,2734.42201,S,15305.47790,E,1,07,1.3,54.4,M,39.2,M,,*75
+$GPGLL,2734.42201,S,15305.47790,E,222446.000,A,A*48
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222446.000,13.0,7.4,12.3,6.6,6.9,11.2,17.9*60
+$GPGSV,3,1,10,16,49,115,36,25,39,269,37,23,58,175,27,20,72,335,35*7A
+$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,30,223,30,27,19,284,32*7E
+$GPGSV,3,3,10,11,06,337,27,03,14,055,23*7B
+$GPRMC,222446.000,A,2734.42201,S,15305.47790,E,36.6,159.3,030308,11.2,W,A*01
+$GPVTG,159.3,T,170.5,M,36.6,N,67.7,K,A*2B
+$GPGGA,222447.000,2734.43157,S,15305.48195,E,1,07,1.3,54.3,M,39.2,M,,*7E
+$GPGLL,2734.43157,S,15305.48195,E,222447.000,A,A*44
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222447.000,10.7,6.7,10.5,6.6,6.2,9.6,15.5*5B
+$GPGSV,3,1,11,16,49,115,32,25,39,269,37,23,58,175,28,20,72,335,33*76
+$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,30,27,19,284,32*7F
+$GPGSV,3,3,11,11,06,337,29,01,,,19,03,14,055,23*7D
+$GPRMC,222447.000,A,2734.43157,S,15305.48195,E,36.7,159.1,030308,11.2,W,A*0E
+$GPVTG,159.1,T,170.3,M,36.7,N,67.9,K,A*20
+$GPGGA,222448.000,2734.44111,S,15305.48610,E,1,08,1.1,54.1,M,39.2,M,,*71
+$GPGLL,2734.44111,S,15305.48610,E,222448.000,A,A*44
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222448.000,20.4,10.5,8.8,52.5,8.7,9.1,15.2*6C
+$GPGSV,3,1,11,16,49,115,27,25,39,269,38,23,58,175,26,20,72,335,31*71
+$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,37,27,19,284,27*7C
+$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,23*73
+$GPRMC,222448.000,A,2734.44111,S,15305.48610,E,36.8,158.7,030308,11.2,W,A*06
+$GPVTG,158.7,T,169.9,M,36.8,N,68.2,K,A*2E
+$GPGGA,222449.000,2734.45068,S,15305.49044,E,1,08,1.1,53.6,M,39.2,M,,*78
+$GPGLL,2734.45068,S,15305.49044,E,222449.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222449.000,17.1,8.8,10.2,14.2,8.2,9.3,17.4*6D
+$GPGSV,3,1,11,16,49,115,28,25,39,269,37,23,58,175,25,20,72,335,28*7A
+$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,30,223,37,27,19,284,32*78
+$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,24*74
+$GPRMC,222449.000,A,2734.45068,S,15305.49044,E,37.2,157.8,030308,11.2,W,A*04
+$GPVTG,157.8,T,169.0,M,37.2,N,68.9,K,A*27
+$GPGGA,222450.000,2734.46041,S,15305.49485,E,1,08,1.1,53.3,M,39.2,M,,*74
+$GPGLL,2734.46041,S,15305.49485,E,222450.000,A,A*44
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222450.000,17.4,8.9,12.7,10.1,11.5,8.2,16.5*5E
+$GPGSV,3,1,11,16,49,115,25,25,39,269,36,23,58,175,30,20,72,336,28*71
+$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,38,27,19,284,34*73
+$GPGSV,3,3,11,11,06,337,27,01,,,19,03,14,055,22*72
+$GPRMC,222450.000,A,2734.46041,S,15305.49485,E,37.7,157.9,030308,11.2,W,A*09
+$GPVTG,157.9,T,169.1,M,37.7,N,69.8,K,A*22
+$GPGGA,222451.000,2734.47033,S,15305.49924,E,1,08,1.1,53.1,M,39.2,M,,*75
+$GPGLL,2734.47033,S,15305.49924,E,222451.000,A,A*47
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222451.000,14.1,8.0,10.5,14.3,9.5,7.5,15.0*61
+$GPGSV,3,1,11,16,49,115,27,25,39,269,38,23,58,175,28,20,72,336,25*79
+$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,38,27,19,284,34*73
+$GPGSV,3,3,11,11,06,337,24,01,,,19,03,14,055,25*76
+$GPRMC,222451.000,A,2734.47033,S,15305.49924,E,38.1,158.1,030308,11.2,W,A*04
+$GPVTG,158.1,T,169.3,M,38.1,N,70.5,K,A*2B
+$GPGGA,222452.000,2734.48022,S,15305.50375,E,1,08,1.1,52.5,M,39.2,M,,*7A
+$GPGLL,2734.48022,S,15305.50375,E,222452.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222452.000,24.1,13.9,9.7,80.6,12.7,9.0,21.0*54
+$GPGSV,3,1,11,16,49,115,29,25,39,269,38,23,58,175,27,20,72,336,30*7C
+$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,35,27,19,284,34*7E
+$GPGSV,3,3,11,11,06,337,22,01,,,19,03,14,055,24*71
+$GPRMC,222452.000,A,2734.48022,S,15305.50375,E,38.3,157.9,030308,11.2,W,A*0B
+$GPVTG,157.9,T,169.1,M,38.3,N,70.9,K,A*20
+$GPGGA,222453.000,2734.49019,S,15305.50802,E,1,06,1.7,52.1,M,39.2,M,,*75
+$GPGLL,2734.49019,S,15305.50802,E,222453.000,A,A*4E
+$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A
+$GPGST,222453.000,10.4,15.4,9.3,66.3,13.4,9.6,24.6*52
+$GPGSV,3,1,11,16,49,115,31,25,39,269,36,23,58,175,28,20,71,336,25*73
+$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,33,27,19,284,31*7D
+$GPGSV,3,3,11,11,06,337,22,01,,,19,03,14,055,24*71
+$GPRMC,222453.000,A,2734.49019,S,15305.50802,E,38.3,159.1,030308,11.2,W,A*0E
+$GPVTG,159.1,T,170.3,M,38.3,N,70.9,K,A*2C
+$GPGGA,222454.000,2734.50008,S,15305.51221,E,1,07,1.3,52.1,M,39.2,M,,*75
+$GPGLL,2734.50008,S,15305.51221,E,222454.000,A,A*4B
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222454.000,12.5,11.7,8.3,70.6,10.4,8.0,19.0*5E
+$GPGSV,3,1,11,16,49,115,30,25,39,269,36,23,58,175,26,20,71,336,28*71
+$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,32,27,19,284,30*7D
+$GPGSV,3,3,11,11,06,337,24,01,,,18,03,14,055,24*76
+$GPRMC,222454.000,A,2734.50008,S,15305.51221,E,38.1,159.4,030308,11.2,W,A*0C
+$GPVTG,159.4,T,170.6,M,38.1,N,70.5,K,A*22
+$GPGGA,222455.000,2734.50992,S,15305.51642,E,1,07,1.3,52.2,M,39.2,M,,*7C
+$GPGLL,2734.50992,S,15305.51642,E,222455.000,A,A*41
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222455.000,11.5,10.8,9.3,83.5,9.9,8.6,23.3*65
+$GPGSV,3,1,11,16,49,115,33,25,39,269,36,23,58,175,32,20,71,336,31*7F
+$GPGSV,3,2,11,19,02,028,,04,06,241,21,13,30,223,29,27,19,284,29*7F
+$GPGSV,3,3,11,11,06,337,28,01,,,18,03,14,055,24*7A
+$GPRMC,222455.000,A,2734.50992,S,15305.51642,E,37.8,159.0,030308,11.2,W,A*04
+$GPVTG,159.0,T,170.2,M,37.8,N,70.0,K,A*21
+$GPGGA,222456.000,2734.51963,S,15305.52059,E,1,07,1.3,52.5,M,39.2,M,,*78
+$GPGLL,2734.51963,S,15305.52059,E,222456.000,A,A*42
+$GPGSA,A,3,16,25,23,20,13,27,11,,,,,,2.3,1.3,1.9*3D
+$GPGST,222456.000,11.3,9.0,13.1,11.0,8.4,11.9,20.9*55
+$GPGSV,3,1,11,16,49,115,31,25,39,269,37,23,58,175,27,20,71,336,33*7A
+$GPGSV,3,2,11,19,02,028,,04,06,241,19,13,30,223,29,27,19,284,32*7E
+$GPGSV,3,3,11,11,06,337,30,01,,,18,03,14,055,24*73
+$GPRMC,222456.000,A,2734.51963,S,15305.52059,E,37.3,158.8,030308,11.2,W,A*05
+$GPVTG,158.8,T,170.0,M,37.3,N,69.1,K,A*28
+$GPGGA,222457.000,2734.52908,S,15305.52467,E,1,06,1.3,53.2,M,39.2,M,,*79
+$GPGLL,2734.52908,S,15305.52467,E,222457.000,A,A*44
+$GPGSA,A,3,16,25,20,13,27,11,,,,,,,2.3,1.3,1.9*3C
+$GPGST,222457.000,20.4,7.8,12.0,8.1,7.3,10.9,17.9*63
+$GPGSV,3,1,11,16,49,115,37,25,39,269,37,23,58,175,24,20,71,336,35*79
+$GPGSV,3,2,11,19,02,028,,04,06,241,19,13,30,223,29,27,19,284,32*7E
+$GPGSV,3,3,11,11,06,337,28,01,,,18,03,14,055,23*7D
+$GPRMC,222457.000,A,2734.52908,S,15305.52467,E,36.2,158.7,030308,11.2,W,A*0C
+$GPVTG,158.7,T,169.9,M,36.2,N,67.1,K,A*28
+$GPGGA,222458.000,2734.53845,S,15305.52866,E,1,06,1.6,54.2,M,39.2,M,,*70
+$GPGLL,2734.53845,S,15305.52866,E,222458.000,A,A*4F
+$GPGSA,A,3,16,25,23,20,27,11,,,,,,,2.6,1.6,2.1*34
+$GPGST,222458.000,16.7,7.3,13.9,11.0,7.0,12.5,17.9*5D
+$GPGSV,3,1,11,16,49,115,36,25,39,269,37,23,58,175,24,20,71,336,35*78
+$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,26,27,19,284,31*7A
+$GPGSV,3,3,11,11,06,337,23,01,,,18,03,14,055,23*76
+$GPRMC,222458.000,A,2734.53845,S,15305.52866,E,35.9,159.1,030308,11.2,W,A*08
+$GPVTG,159.1,T,170.3,M,35.9,N,66.5,K,A*20
+$GPGGA,222459.000,2734.54772,S,15305.53309,E,1,08,1.1,55.6,M,39.2,M,,*72
+$GPGLL,2734.54772,S,15305.53309,E,222459.000,A,A*41
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222459.000,17.5,6.5,9.3,15.5,6.1,8.3,15.2*5C
+$GPGSV,3,1,11,16,49,115,38,25,39,268,36,23,58,175,35,20,71,336,35*76
+$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,33,27,19,284,34*7B
+$GPGSV,3,3,11,11,06,337,29,01,,,18,03,14,055,22*7D
+$GPRMC,222459.000,A,2734.54772,S,15305.53309,E,35.9,156.8,030308,11.2,W,A*00
+$GPVTG,156.8,T,168.0,M,35.9,N,66.4,K,A*2D
+$GPGGA,222500.000,2734.55655,S,15305.53845,E,1,08,1.1,56.1,M,39.2,M,,*7D
+$GPGLL,2734.55655,S,15305.53845,E,222500.000,A,A*4A
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222500.000,14.5,9.8,7.9,83.3,7.3,9.0,14.3*5C
+$GPGSV,3,1,11,16,49,115,36,25,39,268,31,23,58,175,39,20,71,336,33*75
+$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,30,27,19,284,29*7F
+$GPGSV,3,3,11,11,06,337,25,01,,,18,03,14,055,28*7B
+$GPRMC,222500.000,A,2734.55655,S,15305.53845,E,35.9,151.6,030308,11.2,W,A*02
+$GPVTG,151.6,T,162.8,M,35.9,N,66.5,K,A*27
+$GPGGA,222501.000,2734.56495,S,15305.54489,E,1,08,1.1,57.0,M,39.2,M,,*7A
+$GPGLL,2734.56495,S,15305.54489,E,222501.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222501.000,14.3,8.0,10.9,27.0,8.0,9.5,15.6*64
+$GPGSV,3,1,11,16,49,115,41,25,39,268,31,23,58,175,36,20,71,336,31*78
+$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,27,27,19,284,29*79
+$GPGSV,3,3,11,11,06,337,22,01,,,18,03,14,055,31*74
+$GPRMC,222501.000,A,2734.56495,S,15305.54489,E,36.5,145.7,030308,11.2,W,A*0E
+$GPVTG,145.7,T,156.9,M,36.5,N,67.5,K,A*2B
+$GPGGA,222502.000,2734.57337,S,15305.55181,E,1,06,1.5,57.9,M,39.2,M,,*78
+$GPGLL,2734.57337,S,15305.55181,E,222502.000,A,A*4C
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222502.000,14.5,7.0,11.9,20.7,7.1,10.5,15.0*5F
+$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,37,20,71,336,34*7A
+$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,23,27,19,284,33*76
+$GPGSV,3,3,11,11,06,337,22,01,,,18,03,14,055,34*71
+$GPRMC,222502.000,A,2734.57337,S,15305.55181,E,37.4,143.8,030308,11.2,W,A*06
+$GPVTG,143.8,T,155.0,M,37.4,N,69.3,K,A*20
+$GPGGA,222503.000,2734.58184,S,15305.55887,E,1,08,1.1,58.5,M,39.2,M,,*7A
+$GPGLL,2734.58184,S,15305.55887,E,222503.000,A,A*47
+$GPGSA,A,3,16,25,23,20,13,27,11,03,,,,,2.0,1.1,1.6*30
+$GPGST,222503.000,13.4,6.4,14.1,0.3,5.9,12.9,21.5*60
+$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,38,20,71,336,35*74
+$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,23,27,19,284,32*7C
+$GPGSV,3,3,11,11,06,337,26,01,,,17,03,14,055,34*7A
+$GPRMC,222503.000,A,2734.58184,S,15305.55887,E,37.8,143.4,030308,11.2,W,A*0D
+$GPVTG,143.4,T,154.6,M,37.8,N,70.0,K,A*2C
+$GPGGA,222504.000,2734.59032,S,15305.56580,E,1,07,1.2,58.9,M,39.2,M,,*79
+$GPGLL,2734.59032,S,15305.56580,E,222504.000,A,A*44
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222504.000,24.6,6.2,13.3,3.6,5.7,12.2,20.2*67
+$GPGSV,3,1,11,16,49,115,43,25,39,268,35,23,58,175,39,20,71,336,35*75
+$GPGSV,3,2,11,19,02,028,19,04,06,241,19,13,30,223,22,27,19,284,31*7E
+$GPGSV,3,3,11,11,06,337,25,01,,,17,03,14,055,30*7D
+$GPRMC,222504.000,A,2734.59032,S,15305.56580,E,37.6,143.6,030308,11.2,W,A*02
+$GPVTG,143.6,T,154.8,M,37.6,N,69.7,K,A*21
+$GPGGA,222505.000,2734.59874,S,15305.57271,E,1,06,1.5,59.4,M,39.2,M,,*70
+$GPGLL,2734.59874,S,15305.57271,E,222505.000,A,A*47
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222505.000,17.4,5.5,11.8,3.4,5.0,10.8,17.3*61
+$GPGSV,3,1,11,16,49,115,44,25,39,268,35,23,58,175,39,20,71,336,36*71
+$GPGSV,3,2,11,19,02,028,21,04,06,241,19,13,30,223,24,27,19,284,31*73
+$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72
+$GPRMC,222505.000,A,2734.59874,S,15305.57271,E,37.3,143.7,030308,11.2,W,A*05
+$GPVTG,143.7,T,154.9,M,37.3,N,69.1,K,A*22
+$GPGGA,222506.000,2734.60703,S,15305.57943,E,1,07,1.2,60.1,M,39.2,M,,*75
+$GPGLL,2734.60703,S,15305.57943,E,222506.000,A,A*4B
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222506.000,16.1,6.2,11.7,15.3,6.1,10.4,17.4*54
+$GPGSV,3,1,11,16,49,115,43,25,39,268,34,23,58,175,37,20,71,336,36*79
+$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,24,27,19,284,31*7B
+$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,28*73
+$GPRMC,222506.000,A,2734.60703,S,15305.57943,E,36.5,143.9,030308,11.2,W,A*00
+$GPVTG,143.9,T,155.1,M,36.5,N,67.6,K,A*2B
+$GPGGA,222507.000,2734.61507,S,15305.58593,E,1,07,1.2,60.9,M,39.2,M,,*75
+$GPGLL,2734.61507,S,15305.58593,E,222507.000,A,A*43
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222507.000,14.0,6.8,11.8,10.9,6.4,10.7,18.5*54
+$GPGSV,3,1,11,16,49,115,43,25,39,268,34,23,58,175,37,20,71,336,34*7B
+$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,29,27,19,284,34*73
+$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72
+$GPRMC,222507.000,A,2734.61507,S,15305.58593,E,35.4,143.9,030308,11.2,W,A*0A
+$GPVTG,143.9,T,155.1,M,35.4,N,65.5,K,A*28
+$GPGGA,222508.000,2734.62275,S,15305.59221,E,1,06,1.7,61.8,M,39.2,M,,*70
+$GPGLL,2734.62275,S,15305.59221,E,222508.000,A,A*42
+$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A
+$GPGST,222508.000,12.5,9.3,16.3,19.5,9.4,14.4,27.5*51
+$GPGSV,3,1,11,16,49,115,43,25,39,268,33,23,58,175,38,20,71,336,31*76
+$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,30,27,19,284,35*7A
+$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,28*73
+$GPRMC,222508.000,A,2734.62275,S,15305.59221,E,33.9,143.9,030308,11.2,W,A*00
+$GPVTG,143.9,T,155.1,M,33.9,N,62.9,K,A*28
+$GPGGA,222509.000,2734.63006,S,15305.59817,E,1,06,1.7,62.7,M,39.2,M,,*75
+$GPGLL,2734.63006,S,15305.59817,E,222509.000,A,A*4B
+$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A
+$GPGST,222509.000,10.4,8.1,14.2,21.9,8.4,12.3,23.7*52
+$GPGSV,3,1,11,16,49,115,44,25,39,268,32,23,58,175,37,20,71,336,29*76
+$GPGSV,3,2,11,19,02,028,21,04,06,241,,13,30,223,28,27,19,284,35*73
+$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,30*7A
+$GPRMC,222509.000,A,2734.63006,S,15305.59817,E,32.2,143.9,030308,11.2,W,A*03
+$GPVTG,143.9,T,155.1,M,32.2,N,59.7,K,A*24
+$GPGGA,222510.000,2734.63706,S,15305.60376,E,1,06,1.7,63.5,M,39.2,M,,*7F
+$GPGLL,2734.63706,S,15305.60376,E,222510.000,A,A*42
+$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.8*3A
+$GPGST,222510.000,12.4,8.3,12.9,28.0,8.7,11.0,21.6*57
+$GPGSV,3,1,11,16,48,115,43,25,39,268,32,23,58,175,37,20,71,336,29*70
+$GPGSV,3,2,11,19,02,028,20,04,06,241,,13,30,223,31,27,19,284,35*7A
+$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,25*7E
+$GPRMC,222510.000,A,2734.63706,S,15305.60376,E,30.6,144.3,030308,11.2,W,A*01
+$GPVTG,144.3,T,155.5,M,30.6,N,56.7,K,A*24
+$GPGGA,222511.000,2734.64376,S,15305.60904,E,1,07,1.2,64.4,M,39.2,M,,*77
+$GPGLL,2734.64376,S,15305.60904,E,222511.000,A,A*48
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222511.000,14.6,5.7,10.5,2.7,5.2,9.6,15.0*5C
+$GPGSV,3,1,11,16,48,115,44,25,39,268,32,23,58,175,37,20,71,336,28*76
+$GPGSV,3,2,11,19,02,028,20,04,06,241,23,13,30,223,29,27,19,284,36*71
+$GPGSV,3,3,11,11,06,337,,01,,,17,03,14,055,29*72
+$GPRMC,222511.000,A,2734.64376,S,15305.60904,E,29.1,144.2,030308,11.2,W,A*05
+$GPVTG,144.2,T,155.4,M,29.1,N,53.9,K,A*20
+$GPGGA,222512.000,2734.64992,S,15305.61405,E,1,07,1.2,65.4,M,39.2,M,,*78
+$GPGLL,2734.64992,S,15305.61405,E,222512.000,A,A*46
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222512.000,13.4,17.0,5.7,85.6,5.3,15.5,23.6*5A
+$GPGSV,3,1,11,16,48,115,45,25,39,268,33,23,58,175,38,20,71,336,28*79
+$GPGSV,3,2,11,19,02,028,20,04,06,241,23,13,30,223,26,27,19,284,33*7B
+$GPGSV,3,3,11,11,06,337,24,01,,,17,03,14,055,27*7A
+$GPRMC,222512.000,A,2734.64992,S,15305.61405,E,27.2,143.6,030308,11.2,W,A*05
+$GPVTG,143.6,T,154.8,M,27.2,N,50.5,K,A*2C
+$GPGGA,222513.000,2734.65572,S,15305.61884,E,1,07,1.2,66.2,M,39.2,M,,*7A
+$GPGLL,2734.65572,S,15305.61884,E,222513.000,A,A*41
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222513.000,12.3,7.0,14.8,2.4,6.5,13.5,21.4*6D
+$GPGSV,3,1,10,16,48,115,44,25,39,268,35,23,58,175,38,20,71,336,28*7F
+$GPGSV,3,2,10,19,02,028,20,04,06,241,23,13,30,223,23,27,19,284,33*7F
+$GPGSV,3,3,10,11,06,337,24,03,14,055,28*73
+$GPRMC,222513.000,A,2734.65572,S,15305.61884,E,25.8,143.6,030308,11.2,W,A*0A
+$GPVTG,143.6,T,154.8,M,25.8,N,47.9,K,A*2E
+$GPGGA,222514.000,2734.66155,S,15305.62364,E,1,06,1.5,67.0,M,39.2,M,,*7C
+$GPGLL,2734.66155,S,15305.62364,E,222514.000,A,A*42
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222514.000,25.5,6.1,14.4,3.1,5.6,13.2,19.2*6A
+$GPGSV,3,1,10,16,48,115,44,25,39,268,33,23,58,175,38,20,71,336,26*77
+$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,23,27,19,284,34*73
+$GPGSV,3,3,10,11,06,337,28,03,14,055,29*7E
+$GPRMC,222514.000,A,2734.66155,S,15305.62364,E,25.9,143.6,030308,11.2,W,A*08
+$GPVTG,143.6,T,154.8,M,25.9,N,48.0,K,A*29
+$GPGGA,222515.000,2734.66761,S,15305.62860,E,1,06,1.5,67.5,M,39.2,M,,*76
+$GPGLL,2734.66761,S,15305.62860,E,222515.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222515.000,20.1,5.5,13.0,3.0,5.1,11.8,17.4*68
+$GPGSV,3,1,10,16,48,115,44,25,39,268,32,23,58,175,38,20,71,336,26*76
+$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,24,27,19,284,34*74
+$GPGSV,3,3,10,11,06,337,28,03,14,055,24*73
+$GPRMC,222515.000,A,2734.66761,S,15305.62860,E,26.9,143.7,030308,11.2,W,A*05
+$GPVTG,143.7,T,154.9,M,26.9,N,49.8,K,A*23
+$GPGGA,222516.000,2734.67384,S,15305.63376,E,1,06,1.5,68.2,M,39.2,M,,*7E
+$GPGLL,2734.67384,S,15305.63376,E,222516.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222516.000,16.4,5.8,11.5,4.5,5.3,10.5,17.3*6A
+$GPGSV,3,1,10,16,48,115,44,25,39,268,32,23,58,175,38,20,71,336,30*71
+$GPGSV,3,2,10,19,02,028,18,04,06,241,23,13,30,223,24,27,19,284,33*73
+$GPGSV,3,3,10,11,06,337,28,03,14,055,28*7F
+$GPRMC,222516.000,A,2734.67384,S,15305.63376,E,27.7,143.8,030308,11.2,W,A*05
+$GPVTG,143.8,T,155.0,M,27.7,N,51.4,K,A*2E
+$GPGGA,222517.000,2734.68035,S,15305.63901,E,1,06,1.5,68.8,M,39.2,M,,*79
+$GPGLL,2734.68035,S,15305.63901,E,222517.000,A,A*40
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222517.000,19.1,6.2,12.1,7.2,5.8,11.0,15.3*66
+$GPGSV,3,1,10,16,48,115,44,25,39,268,34,23,58,175,38,20,71,336,32*75
+$GPGSV,3,2,10,19,02,028,20,04,06,241,23,13,30,223,24,27,19,284,34*7F
+$GPGSV,3,3,10,11,06,337,24,03,14,055,29*72
+$GPRMC,222517.000,A,2734.68035,S,15305.63901,E,28.6,144.1,030308,11.2,W,A*08
+$GPVTG,144.1,T,155.3,M,28.6,N,53.0,K,A*2B
+$GPGGA,222518.000,2734.68718,S,15305.64446,E,1,07,1.4,69.1,M,39.2,M,,*7F
+$GPGLL,2734.68718,S,15305.64446,E,222518.000,A,A*4E
+$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C
+$GPGST,222518.000,13.8,5.5,10.6,5.8,5.1,9.6,13.4*54
+$GPGSV,3,1,10,16,48,115,43,25,39,268,33,23,58,175,37,20,71,336,35*7D
+$GPGSV,3,2,10,19,02,028,20,04,06,241,18,13,30,223,24,27,19,284,33*70
+$GPGSV,3,3,10,11,06,337,22,03,14,055,33*7F
+$GPRMC,222518.000,A,2734.68718,S,15305.64446,E,29.9,144.4,030308,11.2,W,A*0D
+$GPVTG,144.4,T,155.6,M,29.9,N,55.3,K,A*20
+$GPGGA,222519.000,2734.69424,S,15305.65010,E,1,07,1.4,69.5,M,39.2,M,,*71
+$GPGLL,2734.69424,S,15305.65010,E,222519.000,A,A*44
+$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C
+$GPGST,222519.000,14.0,13.4,5.0,89.4,4.6,12.3,18.8*58
+$GPGSV,3,1,10,16,48,115,44,25,39,268,34,23,58,175,37,20,71,336,37*7F
+$GPGSV,3,2,10,19,02,028,20,04,06,241,18,13,30,223,23,27,19,284,31*75
+$GPGSV,3,3,10,11,06,337,26,03,14,055,35*7D
+$GPRMC,222519.000,A,2734.69424,S,15305.65010,E,31.0,144.4,030308,11.2,W,A*07
+$GPVTG,144.4,T,155.6,M,31.0,N,57.5,K,A*24
+$GPGGA,222520.000,2734.70163,S,15305.65604,E,1,07,1.4,69.6,M,39.2,M,,*75
+$GPGLL,2734.70163,S,15305.65604,E,222520.000,A,A*43
+$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C
+$GPGST,222520.000,9.8,11.6,4.7,89.0,4.3,10.6,15.9*6A
+$GPGSV,3,1,10,16,48,115,44,25,39,268,35,23,58,175,39,20,71,336,36*71
+$GPGSV,3,2,10,19,02,028,20,04,06,241,19,13,30,223,23,27,19,284,31*74
+$GPGSV,3,3,10,11,06,337,31,03,14,055,37*79
+$GPRMC,222520.000,A,2734.70163,S,15305.65604,E,32.5,144.1,030308,11.2,W,A*03
+$GPVTG,144.1,T,155.3,M,32.5,N,60.2,K,A*21
+$GPGGA,222521.000,2734.70923,S,15305.66218,E,1,07,1.4,69.5,M,39.2,M,,*71
+$GPGLL,2734.70923,S,15305.66218,E,222521.000,A,A*44
+$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C
+$GPGST,222521.000,11.1,6.2,10.8,9.6,5.8,9.8,16.8*53
+$GPGSV,3,1,10,16,48,115,44,25,39,268,36,23,58,175,40,20,71,336,38*72
+$GPGSV,3,2,10,19,02,028,20,04,06,241,19,13,30,223,23,27,19,284,26*72
+$GPGSV,3,3,10,11,06,338,31,03,14,055,37*76
+$GPRMC,222521.000,A,2734.70923,S,15305.66218,E,33.5,144.0,030308,11.2,W,A*04
+$GPVTG,144.0,T,155.3,M,33.5,N,62.0,K,A*21
+$GPGGA,222522.000,2734.71700,S,15305.66845,E,1,06,1.5,69.1,M,39.2,M,,*7A
+$GPGLL,2734.71700,S,15305.66845,E,222522.000,A,A*4B
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222522.000,15.0,5.7,9.9,5.5,5.2,9.0,15.4*68
+$GPGSV,3,1,10,16,48,115,43,25,39,268,36,23,58,175,40,20,71,336,37*7A
+$GPGSV,3,2,10,19,02,028,20,04,06,241,24,13,30,223,23,27,19,284,26*7C
+$GPGSV,3,3,10,11,06,338,25,03,14,055,37*73
+$GPRMC,222522.000,A,2734.71700,S,15305.66845,E,34.2,144.1,030308,11.2,W,A*0A
+$GPVTG,144.1,T,155.3,M,34.2,N,63.4,K,A*25
+$GPGGA,222523.000,2734.72487,S,15305.67483,E,1,07,1.4,68.6,M,39.2,M,,*75
+$GPGLL,2734.72487,S,15305.67483,E,222523.000,A,A*42
+$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C
+$GPGST,222523.000,13.8,5.2,10.1,3.9,4.8,9.2,13.8*5B
+$GPGSV,3,1,10,16,48,115,44,25,39,268,37,23,58,175,41,20,71,336,35*7F
+$GPGSV,3,2,10,19,02,028,20,04,06,241,24,13,30,223,23,27,19,284,26*7C
+$GPGSV,3,3,10,11,06,338,23,03,14,055,31*73
+$GPRMC,222523.000,A,2734.72487,S,15305.67483,E,34.7,144.2,030308,11.2,W,A*05
+$GPVTG,144.2,T,155.4,M,34.7,N,64.3,K,A*24
+$GPGGA,222524.000,2734.73280,S,15305.68126,E,1,07,1.4,68.1,M,39.2,M,,*70
+$GPGLL,2734.73280,S,15305.68126,E,222524.000,A,A*40
+$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C
+$GPGST,222524.000,10.5,4.9,9.4,3.5,4.5,8.6,12.8*60
+$GPGSV,3,1,10,16,48,115,44,25,39,268,37,23,58,175,41,20,71,336,35*7F
+$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,26*7A
+$GPGSV,3,3,10,11,06,338,25,03,14,055,29*7C
+$GPRMC,222524.000,A,2734.73280,S,15305.68126,E,35.0,144.2,030308,11.2,W,A*01
+$GPVTG,144.2,T,155.4,M,35.0,N,64.9,K,A*28
+$GPGGA,222525.000,2734.74083,S,15305.68778,E,1,07,1.4,67.7,M,39.2,M,,*73
+$GPGLL,2734.74083,S,15305.68778,E,222525.000,A,A*4A
+$GPGSA,A,3,16,25,23,20,27,11,03,,,,,,2.4,1.4,1.9*3C
+$GPGST,222525.000,10.3,5.2,13.4,3.6,4.8,12.3,20.4*6B
+$GPGSV,3,1,10,16,48,115,43,25,39,268,38,23,58,175,40,20,71,336,36*75
+$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,23*7F
+$GPGSV,3,3,10,11,06,338,27,03,14,055,36*70
+$GPRMC,222525.000,A,2734.74083,S,15305.68778,E,35.6,144.2,030308,11.2,W,A*0D
+$GPVTG,144.2,T,155.4,M,35.6,N,65.9,K,A*2F
+$GPGGA,222526.000,2734.74894,S,15305.69428,E,1,06,1.5,67.2,M,39.2,M,,*7C
+$GPGLL,2734.74894,S,15305.69428,E,222526.000,A,A*40
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222526.000,8.0,5.7,12.0,2.6,5.2,10.9,17.4*54
+$GPGSV,3,1,10,16,48,115,43,25,39,268,37,23,58,175,40,20,71,336,35*79
+$GPGSV,3,2,10,19,02,028,20,04,06,241,22,13,30,223,23,27,19,284,24*78
+$GPGSV,3,3,10,11,06,338,27,03,14,055,39*7F
+$GPRMC,222526.000,A,2734.74894,S,15305.69428,E,35.8,144.5,030308,11.2,W,A*0E
+$GPVTG,144.5,T,155.7,M,35.8,N,66.3,K,A*2C
+$GPGGA,222527.000,2734.75707,S,15305.70075,E,1,05,1.7,66.8,M,39.2,M,,*77
+$GPGLL,2734.75707,S,15305.70075,E,222527.000,A,A*41
+$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39
+$GPGST,222527.000,13.9,6.3,10.9,6.3,5.9,10.0,18.2*60
+$GPGSV,3,1,10,16,48,115,44,25,39,268,38,23,58,175,40,20,71,336,33*77
+$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F
+$GPGSV,3,3,10,11,06,338,,03,14,055,36*75
+$GPRMC,222527.000,A,2734.75707,S,15305.70075,E,35.8,144.6,030308,11.2,W,A*0C
+$GPVTG,144.6,T,155.8,M,35.8,N,66.2,K,A*21
+$GPGGA,222528.000,2734.76518,S,15305.70724,E,1,06,1.5,66.1,M,39.2,M,,*7C
+$GPGLL,2734.76518,S,15305.70724,E,222528.000,A,A*42
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222528.000,11.3,5.6,10.1,4.5,5.2,9.2,16.1*51
+$GPGSV,3,1,10,16,48,115,43,25,39,268,39,23,58,175,39,20,71,336,28*75
+$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F
+$GPGSV,3,3,10,11,06,338,,03,14,055,36*75
+$GPRMC,222528.000,A,2734.76518,S,15305.70724,E,35.7,144.4,030308,11.2,W,A*02
+$GPVTG,144.4,T,155.6,M,35.7,N,66.2,K,A*22
+$GPGGA,222529.000,2734.77313,S,15305.71385,E,1,06,1.5,66.1,M,39.2,M,,*7F
+$GPGLL,2734.77313,S,15305.71385,E,222529.000,A,A*41
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222529.000,10.9,5.6,12.5,5.4,5.2,11.4,20.9*6F
+$GPGSV,3,1,10,16,48,115,41,25,39,268,40,23,58,175,36,20,71,336,28*76
+$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,24*7D
+$GPGSV,3,3,10,11,06,338,27,03,14,055,30*76
+$GPRMC,222529.000,A,2734.77313,S,15305.71385,E,35.6,143.5,030308,11.2,W,A*06
+$GPVTG,143.5,T,154.7,M,35.6,N,65.8,K,A*2C
+$GPGGA,222530.000,2734.78106,S,15305.72042,E,1,06,1.5,66.0,M,39.2,M,,*74
+$GPGLL,2734.78106,S,15305.72042,E,222530.000,A,A*4B
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222530.000,9.4,5.4,18.9,2.4,4.9,17.3,30.6*54
+$GPGSV,3,1,10,16,48,115,40,25,39,268,40,23,58,175,36,20,71,336,28*77
+$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,30,223,23,27,19,284,26*7F
+$GPGSV,3,3,10,11,06,338,27,03,14,055,29*7E
+$GPRMC,222530.000,A,2734.78106,S,15305.72042,E,35.5,143.7,030308,11.2,W,A*0D
+$GPVTG,143.7,T,155.0,M,35.5,N,65.8,K,A*2B
+$GPGGA,222531.000,2734.78918,S,15305.72691,E,1,05,4.4,66.0,M,39.2,M,,*7D
+$GPGLL,2734.78918,S,15305.72691,E,222531.000,A,A*45
+$GPGSA,A,3,16,25,23,27,11,,,,,,,,9.3,4.4,8.2*36
+$GPGST,222531.000,9.1,8.5,53.9,3.2,8.2,49.2,81.3*56
+$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,37,20,71,336,28*78
+$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,23,27,19,284,25*7D
+$GPGSV,3,3,10,11,06,338,24,03,14,055,22*76
+$GPRMC,222531.000,A,2734.78918,S,15305.72691,E,35.9,144.5,030308,11.2,W,A*0A
+$GPVTG,144.5,T,155.7,M,35.9,N,66.4,K,A*2A
+$GPGGA,222532.000,2734.79737,S,15305.73347,E,1,06,1.5,66.0,M,39.2,M,,*74
+$GPGLL,2734.79737,S,15305.73347,E,222532.000,A,A*4B
+$GPGSA,A,3,16,25,23,20,27,03,,,,,,,2.5,1.5,2.0*36
+$GPGST,222532.000,11.0,6.8,38.7,1.2,6.3,35.3,58.4*69
+$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,36,20,71,336,28*79
+$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,24,27,19,284,23*7C
+$GPGSV,3,3,10,11,06,338,24,03,14,055,30*75
+$GPRMC,222532.000,A,2734.79737,S,15305.73347,E,36.1,144.5,030308,11.2,W,A*0F
+$GPVTG,144.5,T,155.7,M,36.1,N,66.9,K,A*2C
+$GPGGA,222533.000,2734.80571,S,15305.74004,E,1,06,4.1,66.1,M,39.2,M,,*70
+$GPGLL,2734.80571,S,15305.74004,E,222533.000,A,A*4F
+$GPGSA,A,3,16,25,23,27,11,03,,,,,,,8.3,4.1,7.3*3F
+$GPGST,222533.000,9.4,6.1,45.5,0.4,5.6,41.6,69.5*50
+$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,37,20,71,336,28*78
+$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,24,27,19,284,25*7C
+$GPGSV,3,3,10,11,06,338,22,03,14,055,25*77
+$GPRMC,222533.000,A,2734.80571,S,15305.74004,E,36.6,145.0,030308,11.2,W,A*08
+$GPVTG,145.0,T,156.2,M,36.6,N,67.7,K,A*26
+$GPGGA,222534.000,2734.81441,S,15305.74656,E,1,06,1.8,65.2,M,39.2,M,,*79
+$GPGLL,2734.81441,S,15305.74656,E,222534.000,A,A*4A
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A
+$GPGST,222534.000,20.2,5.8,45.7,1.7,5.4,41.7,71.3*6C
+$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,37,20,71,336,28*79
+$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,25,27,19,284,25*7D
+$GPGSV,3,3,10,11,06,338,22,03,14,055,31*72
+$GPRMC,222534.000,A,2734.81441,S,15305.74656,E,37.6,146.2,030308,11.2,W,A*0D
+$GPVTG,146.2,T,157.5,M,37.6,N,69.7,K,A*2E
+$GPGGA,222535.000,2734.82349,S,15305.75307,E,1,05,1.9,63.5,M,39.2,M,,*77
+$GPGLL,2734.82349,S,15305.75307,E,222535.000,A,A*47
+$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D
+$GPGST,222535.000,27.6,7.0,40.6,3.1,6.7,37.1,68.4*6C
+$GPGSV,3,1,10,16,48,115,40,25,39,268,36,23,58,175,37,20,71,336,28*77
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,31,223,25,27,19,284,23*78
+$GPGSV,3,3,10,11,06,338,22,03,14,055,26*74
+$GPRMC,222535.000,A,2734.82349,S,15305.75307,E,38.7,147.3,030308,11.2,W,A*0E
+$GPVTG,147.3,T,158.6,M,38.7,N,71.7,K,A*25
+$GPGGA,222536.000,2734.83215,S,15305.75969,E,1,05,1.7,63.5,M,39.2,M,,*71
+$GPGLL,2734.83215,S,15305.75969,E,222536.000,A,A*4F
+$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39
+$GPGST,222536.000,7.9,6.3,97.2,3.9,8.3,88.7,161.0*62
+$GPGSV,3,1,10,16,48,115,40,25,39,268,37,23,58,175,36,20,71,336,28*77
+$GPGSV,3,2,10,19,02,028,,04,06,241,20,13,31,223,25,27,19,284,23*78
+$GPGSV,3,3,10,11,06,338,22,03,14,055,26*74
+$GPRMC,222536.000,A,2734.83215,S,15305.75969,E,37.6,145.6,030308,11.2,W,A*0F
+$GPVTG,145.6,T,156.8,M,37.6,N,69.7,K,A*25
+$GPGGA,222537.000,2734.84076,S,15305.76655,E,1,05,1.7,63.5,M,39.2,M,,*73
+$GPGLL,2734.84076,S,15305.76655,E,222537.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,03,,,,,,,,2.9,1.7,2.4*39
+$GPGST,222537.000,16.0,7.8,110.8,2.1,8.0,101.2,209.1*57
+$GPGSV,3,1,10,16,48,115,39,25,39,268,36,23,58,175,34,20,71,336,28*7A
+$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A
+$GPGSV,3,3,10,11,06,338,22,03,14,055,25*77
+$GPRMC,222537.000,A,2734.84076,S,15305.76655,E,37.9,144.6,030308,11.2,W,A*03
+$GPVTG,144.6,T,155.8,M,37.9,N,70.3,K,A*24
+$GPGGA,222538.000,2734.84945,S,15305.77356,E,1,05,1.9,63.5,M,39.2,M,,*7C
+$GPGLL,2734.84945,S,15305.77356,E,222538.000,A,A*4C
+$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D
+$GPGST,222538.000,13.1,8.0,61.7,1.6,7.5,56.4,113.0*51
+$GPGSV,3,1,10,16,48,115,40,25,39,268,37,23,58,175,32,20,71,336,*79
+$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A
+$GPGSV,3,3,10,11,06,338,22,03,14,055,28*7A
+$GPRMC,222538.000,A,2734.84945,S,15305.77356,E,38.4,144.2,030308,11.2,W,A*04
+$GPVTG,144.2,T,155.4,M,38.4,N,71.1,K,A*2D
+$GPGGA,222539.000,2734.85792,S,15305.78022,E,1,05,1.9,63.5,M,39.2,M,,*77
+$GPGLL,2734.85792,S,15305.78022,E,222539.000,A,A*47
+$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D
+$GPGST,222539.000,6.4,7.5,72.7,1.5,7.1,66.5,137.2*68
+$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,32,20,71,336,*76
+$GPGSV,3,2,10,19,02,028,,04,06,241,22,13,31,223,25,27,19,284,23*7A
+$GPGSV,3,3,10,11,06,338,22,03,14,055,28*7A
+$GPRMC,222539.000,A,2734.85792,S,15305.78022,E,37.1,144.9,030308,11.2,W,A*0E
+$GPVTG,144.9,T,156.1,M,37.1,N,68.7,K,A*24
+$GPGGA,222540.000,2734.86604,S,15305.78646,E,1,05,4.4,63.5,M,39.2,M,,*78
+$GPGLL,2734.86604,S,15305.78646,E,222540.000,A,A*40
+$GPGSA,A,3,16,25,23,27,11,,,,,,,,9.3,4.4,8.2*36
+$GPGST,222540.000,13.6,8.3,67.7,1.8,7.8,61.9,111.1*55
+$GPGSV,3,1,10,16,48,115,40,25,39,268,38,23,58,175,32,20,71,336,*76
+$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,22,27,19,284,22*78
+$GPGSV,3,3,10,11,06,338,20,03,14,055,28*78
+$GPRMC,222540.000,A,2734.86604,S,15305.78646,E,35.3,145.6,030308,11.2,W,A*07
+$GPVTG,145.6,T,156.8,M,35.3,N,65.4,K,A*2D
+$GPGGA,222541.000,2734.87421,S,15305.79222,E,1,06,1.8,63.5,M,39.2,M,,*70
+$GPGLL,2734.87421,S,15305.79222,E,222541.000,A,A*42
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A
+$GPGST,222541.000,11.7,33.3,8.1,87.4,7.5,30.4,54.6*51
+$GPGSV,3,1,10,16,48,115,39,25,39,268,33,23,58,175,36,20,71,336,*77
+$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,22,27,19,284,22*78
+$GPGSV,3,3,10,11,06,338,20,03,14,055,26*76
+$GPRMC,222541.000,A,2734.87421,S,15305.79222,E,34.6,147.7,030308,11.2,W,A*02
+$GPVTG,147.7,T,158.9,M,34.6,N,64.1,K,A*21
+$GPGGA,222542.000,2734.88135,S,15305.79765,E,1,06,1.8,63.5,M,39.2,M,,*7A
+$GPGLL,2734.88135,S,15305.79765,E,222542.000,A,A*48
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A
+$GPGST,222542.000,23.5,7.9,53.0,0.2,7.2,48.5,78.4*6F
+$GPGSV,3,1,10,16,48,115,40,25,39,268,36,23,58,175,35,20,71,336,*7F
+$GPGSV,3,2,10,19,02,028,,04,06,241,27,13,31,223,23,27,19,284,25*7F
+$GPGSV,3,3,10,11,06,338,20,03,14,055,26*76
+$GPRMC,222542.000,A,2734.88135,S,15305.79765,E,31.0,145.8,030308,11.2,W,A*06
+$GPVTG,145.8,T,157.0,M,31.0,N,57.4,K,A*2C
+$GPGGA,222543.000,2734.88798,S,15305.80287,E,1,07,1.2,63.0,M,39.2,M,,*7B
+$GPGLL,2734.88798,S,15305.80287,E,222543.000,A,A*47
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222543.000,18.8,6.7,28.4,0.5,6.1,26.0,41.8*62
+$GPGSV,3,1,10,16,48,115,40,25,39,268,39,23,58,175,35,20,71,336,21*73
+$GPGSV,3,2,10,19,02,028,,04,06,241,37,13,31,223,22,27,19,284,24*7E
+$GPGSV,3,3,10,11,06,338,20,03,14,055,32*73
+$GPRMC,222543.000,A,2734.88798,S,15305.80287,E,29.0,144.8,030308,11.2,W,A*01
+$GPVTG,144.8,T,156.0,M,29.0,N,53.8,K,A*2D
+$GPGGA,222544.000,2734.89328,S,15305.80767,E,1,06,1.8,62.9,M,39.2,M,,*7A
+$GPGLL,2734.89328,S,15305.80767,E,222544.000,A,A*45
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A
+$GPGST,222544.000,14.9,35.2,5.8,89.5,5.4,32.2,52.6*52
+$GPGSV,3,1,10,16,48,115,43,25,39,268,40,23,58,175,25,20,71,336,21*7F
+$GPGSV,3,2,10,19,02,028,,04,06,241,28,13,31,223,30,27,19,284,29*7E
+$GPGSV,3,3,10,11,06,338,20,03,14,055,33*72
+$GPRMC,222544.000,A,2734.89328,S,15305.80767,E,24.5,140.9,030308,11.2,W,A*0E
+$GPVTG,140.9,T,152.1,M,24.5,N,45.3,K,A*29
+$GPGGA,222545.000,2734.89633,S,15305.81084,E,1,05,1.9,62.9,M,39.2,M,,*7D
+$GPGLL,2734.89633,S,15305.81084,E,222545.000,A,A*40
+$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.6,1.9,3.1*3D
+$GPGST,222545.000,19.5,6.0,33.0,1.0,5.5,30.2,52.4*69
+$GPGSV,3,1,10,16,48,115,41,25,39,268,34,23,58,175,29,20,71,336,30*72
+$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,29,27,19,284,30*73
+$GPGSV,3,3,10,11,06,338,20,03,14,055,30*71
+$GPRMC,222545.000,A,2734.89633,S,15305.81084,E,14.6,136.6,030308,11.2,W,A*05
+$GPVTG,136.6,T,147.8,M,14.6,N,27.0,K,A*2D
+$GPGGA,222546.000,2734.89236,S,15305.81130,E,1,06,1.3,62.6,M,39.2,M,,*77
+$GPGLL,2734.89236,S,15305.81130,E,222546.000,A,A*4C
+$GPGSA,A,3,16,25,23,20,13,03,,,,,,,2.3,1.3,1.9*3B
+$GPGST,222546.000,11.5,5.6,15.6,0.9,5.2,14.3,26.4*6E
+$GPGSV,3,1,10,16,48,115,35,25,39,268,40,23,58,175,41,20,71,336,38*74
+$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,33,27,19,284,26*7C
+$GPGSV,3,3,10,11,06,338,20,03,14,055,28*78
+$GPRMC,222546.000,A,2734.89236,S,15305.81130,E,16.9,2.1,030308,11.2,W,A*05
+$GPVTG,2.1,T,13.3,M,16.9,N,31.2,K,A*1F
+$GPGGA,222547.000,2734.89429,S,15305.81239,E,1,05,2.3,62.5,M,39.2,M,,*77
+$GPGLL,2734.89429,S,15305.81239,E,222547.000,A,A*4F
+$GPGSA,A,3,16,23,13,27,03,,,,,,,,4.6,2.3,3.9*39
+$GPGST,222547.000,11.4,38.3,9.7,69.8,14.7,33.0,49.2*6B
+$GPGSV,3,1,10,16,48,115,32,25,39,268,37,23,58,175,42,20,71,336,37*7F
+$GPGSV,3,2,10,19,02,028,,04,06,241,26,13,31,223,36,27,19,284,29*76
+$GPGSV,3,3,10,11,06,338,20,03,14,055,34*75
+$GPRMC,222547.000,A,2734.89429,S,15305.81239,E,8.4,154.5,030308,11.2,W,A*32
+$GPVTG,154.5,T,165.7,M,8.4,N,15.6,K,A*1D
+$GPGGA,222548.000,2734.89474,S,15305.81253,E,1,07,1.2,62.0,M,39.2,M,,*79
+$GPGLL,2734.89474,S,15305.81253,E,222548.000,A,A*44
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222548.000,11.0,12.3,7.9,86.0,7.3,11.3,20.6*5F
+$GPGSV,3,1,10,16,48,115,34,25,39,268,36,23,58,175,42,20,71,336,38*77
+$GPGSV,3,2,10,19,02,028,,04,06,241,25,13,31,223,36,27,19,284,29*75
+$GPGSV,3,3,10,11,06,338,20,03,14,055,33*72
+$GPRMC,222548.000,A,2734.89474,S,15305.81253,E,0.3,353.0,030308,11.2,W,A*36
+$GPVTG,353.0,T,4.3,M,0.3,N,0.5,K,A*27
+$GPGGA,222549.000,2734.89490,S,15305.81265,E,1,04,2.0,61.8,M,39.2,M,,*7E
+$GPGLL,2734.89490,S,15305.81265,E,222549.000,A,A*4A
+$GPGSA,A,3,25,23,13,03,,,,,,,,,3.9,2.0,3.3*3D
+$GPGST,222549.000,17.0,16.1,8.8,81.3,8.3,14.6,29.3*57
+$GPGSV,3,1,11,16,48,115,33,25,39,268,37,23,58,175,42,20,71,336,36*7E
+$GPGSV,3,2,11,19,02,028,,04,06,241,25,13,31,223,35,27,19,284,30*7F
+$GPGSV,3,3,11,11,06,338,20,01,,,21,03,14,055,33*71
+$GPRMC,222549.000,A,2734.89490,S,15305.81265,E,0.2,330.7,030308,11.2,W,A*3B
+$GPVTG,330.7,T,341.9,M,0.2,N,0.3,K,A*2A
+$GPGGA,222550.000,2734.89526,S,15305.81278,E,1,04,2.6,61.7,M,39.2,M,,*7F
+$GPGLL,2734.89526,S,15305.81278,E,222550.000,A,A*42
+$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31
+$GPGST,222550.000,13.4,12.4,27.3,43.1,18.9,19.8,52.9*5A
+$GPGSV,3,1,11,16,48,115,30,25,39,268,38,23,58,175,42,20,71,336,37*73
+$GPGSV,3,2,11,19,02,028,,04,06,241,25,13,31,223,36,27,19,284,31*7D
+$GPGSV,3,3,11,11,06,338,,01,,,21,03,14,055,32*72
+$GPRMC,222550.000,A,2734.89526,S,15305.81278,E,0.1,350.7,030308,11.2,W,A*36
+$GPVTG,350.7,T,1.9,M,0.1,N,0.2,K,A*29
+$GPGGA,222551.000,2734.89528,S,15305.81279,E,1,05,2.3,61.7,M,39.2,M,,*75
+$GPGLL,2734.89528,S,15305.81279,E,222551.000,A,A*4C
+$GPGSA,A,3,16,23,13,27,03,,,,,,,,4.6,2.3,3.9*39
+$GPGST,222551.000,13.7,31.0,11.1,60.5,16.5,25.2,39.3*5F
+$GPGSV,3,1,11,16,48,115,30,25,39,268,39,23,58,175,41,20,71,336,35*73
+$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,36,27,19,284,31*7B
+$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,30*71
+$GPRMC,222551.000,A,2734.89528,S,15305.81279,E,0.1,345.0,030308,11.2,W,A*3B
+$GPVTG,345.0,T,356.2,M,0.1,N,0.2,K,A*20
+$GPGGA,222552.000,2734.89550,S,15305.81288,E,1,05,2.1,61.7,M,39.2,M,,*75
+$GPGLL,2734.89550,S,15305.81288,E,222552.000,A,A*4E
+$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32
+$GPGST,222552.000,11.7,11.5,20.8,20.0,11.8,18.2,39.1*55
+$GPGSV,3,1,11,16,48,115,31,25,39,268,40,23,58,175,42,20,71,336,35*7F
+$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,38,27,19,284,31*75
+$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,30*71
+$GPRMC,222552.000,A,2734.89550,S,15305.81288,E,0.1,11.2,030308,11.2,W,A*09
+$GPVTG,11.2,T,22.5,M,0.1,N,0.2,K,A*27
+$GPGGA,222553.000,2734.89573,S,15305.81294,E,1,05,2.1,61.5,M,39.2,M,,*7A
+$GPGLL,2734.89573,S,15305.81294,E,222553.000,A,A*43
+$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32
+$GPGST,222553.000,9.8,10.3,17.6,19.1,10.4,15.6,33.7*6C
+$GPGSV,3,1,10,16,48,115,29,25,39,268,38,23,58,175,41,20,71,336,37*79
+$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,39,27,19,284,30*74
+$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B
+$GPRMC,222553.000,A,2734.89573,S,15305.81294,E,0.1,351.8,030308,11.2,W,A*39
+$GPVTG,351.8,T,3.0,M,0.1,N,0.2,K,A*2C
+$GPGGA,222554.000,2734.89591,S,15305.81298,E,1,04,2.6,61.4,M,39.2,M,,*7A
+$GPGLL,2734.89591,S,15305.81298,E,222554.000,A,A*44
+$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31
+$GPGST,222554.000,16.9,10.4,17.8,12.8,10.0,16.1,37.3*5F
+$GPGSV,3,1,10,16,48,115,32,25,39,268,38,23,58,175,41,20,71,336,36*72
+$GPGSV,3,2,10,19,02,028,,04,06,241,23,13,31,223,38,27,19,284,31*74
+$GPGSV,3,3,10,11,06,338,,03,14,055,26*74
+$GPRMC,222554.000,A,2734.89591,S,15305.81298,E,0.1,334.9,030308,11.2,W,A*3C
+$GPVTG,334.9,T,346.1,M,0.1,N,0.2,K,A*2D
+$GPGGA,222555.000,2734.89607,S,15305.81301,E,1,04,2.6,61.2,M,39.2,M,,*70
+$GPGLL,2734.89607,S,15305.81301,E,222555.000,A,A*48
+$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31
+$GPGST,222555.000,14.4,11.9,23.3,40.8,16.2,17.6,44.5*56
+$GPGSV,3,1,11,16,48,115,32,25,39,268,37,23,58,175,40,20,71,336,38*73
+$GPGSV,3,2,11,19,02,028,,04,06,241,23,13,31,223,37,27,19,284,30*7B
+$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,25*75
+$GPRMC,222555.000,A,2734.89607,S,15305.81301,E,0.1,6.2,030308,11.2,W,A*39
+$GPVTG,6.2,T,17.4,M,0.1,N,0.2,K,A*16
+$GPGGA,222556.000,2734.89612,S,15305.81301,E,1,04,2.6,61.1,M,39.2,M,,*74
+$GPGLL,2734.89612,S,15305.81301,E,222556.000,A,A*4F
+$GPGSA,A,3,16,25,23,13,,,,,,,,,6.1,2.6,5.6*31
+$GPGST,222556.000,12.4,15.8,24.1,4.1,14.5,22.0,39.9*69
+$GPGSV,3,1,11,16,48,115,33,25,39,268,38,23,58,174,41,20,71,336,38*7D
+$GPGSV,3,2,11,19,02,028,,04,06,242,23,13,31,223,38,27,19,284,32*75
+$GPGSV,3,3,11,11,06,338,,01,,,20,03,14,055,28*78
+$GPRMC,222556.000,A,2734.89612,S,15305.81301,E,0.1,21.8,030308,11.2,W,A*01
+$GPVTG,21.8,T,33.0,M,0.1,N,0.2,K,A*2B
+$GPGGA,222557.000,2734.89635,S,15305.81337,E,1,05,2.1,61.0,M,39.2,M,,*72
+$GPGLL,2734.89635,S,15305.81337,E,222557.000,A,A*4E
+$GPGSA,A,3,16,25,23,13,27,,,,,,,,4.7,2.1,4.2*32
+$GPGST,222557.000,10.3,13.0,15.0,5.2,11.9,13.7,32.7*6B
+$GPGSV,3,1,10,16,48,115,33,25,39,268,38,23,58,174,41,20,71,336,36*72
+$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,39,27,19,284,28*7E
+$GPGSV,3,3,10,11,06,338,,03,14,055,31*72
+$GPRMC,222557.000,A,2734.89635,S,15305.81337,E,1.2,96.1,030308,11.2,W,A*07
+$GPVTG,96.1,T,107.3,M,1.2,N,2.2,K,A*1B
+$GPGGA,222558.000,2734.89638,S,15305.81517,E,1,06,1.8,60.6,M,39.2,M,,*7A
+$GPGLL,2734.89638,S,15305.81517,E,222558.000,A,A*48
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A
+$GPGST,222558.000,18.6,12.9,7.5,72.4,7.5,11.4,21.9*57
+$GPGSV,3,1,10,16,48,115,39,25,39,268,38,23,58,174,37,20,71,336,26*78
+$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,34,27,19,284,29*72
+$GPGSV,3,3,10,11,06,338,,03,14,055,30*73
+$GPRMC,222558.000,A,2734.89638,S,15305.81517,E,5.6,82.0,030308,11.2,W,A*05
+$GPVTG,82.0,T,93.2,M,5.6,N,10.3,K,A*10
+$GPGGA,222559.000,2734.89631,S,15305.81911,E,1,05,2.2,60.5,M,39.2,M,,*71
+$GPGLL,2734.89631,S,15305.81911,E,222559.000,A,A*4A
+$GPGSA,A,3,16,25,23,20,27,,,,,,,,3.6,2.2,2.9*3A
+$GPGST,222559.000,17.0,15.1,33.1,15.1,15.5,29.4,59.0*59
+$GPGSV,3,1,10,16,48,115,34,25,39,268,35,23,58,174,30,20,71,336,29*70
+$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,35,27,19,284,28*72
+$GPGSV,3,3,10,11,06,338,,03,14,055,27*75
+$GPRMC,222559.000,A,2734.89631,S,15305.81911,E,12.5,87.6,030308,11.2,W,A*31
+$GPVTG,87.6,T,98.8,M,12.5,N,23.2,K,A*26
+$GPGGA,222600.000,2734.89436,S,15305.82359,E,1,06,1.8,61.2,M,39.2,M,,*72
+$GPGLL,2734.89436,S,15305.82359,E,222600.000,A,A*45
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.5,1.8,3.1*3A
+$GPGST,222600.000,14.4,14.9,6.9,79.1,6.7,13.4,28.4*57
+$GPGSV,3,1,10,16,48,115,37,25,39,268,36,23,58,174,29,20,71,336,33*73
+$GPGSV,3,2,10,19,02,028,,04,06,242,23,13,31,223,39,27,19,284,28*7E
+$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A
+$GPRMC,222600.000,A,2734.89436,S,15305.82359,E,15.9,62.5,030308,11.2,W,A*3D
+$GPVTG,62.5,T,73.7,M,15.9,N,29.5,K,A*22
+$GPGGA,222601.000,2734.89190,S,15305.82850,E,1,06,1.8,60.5,M,39.2,M,,*7E
+$GPGLL,2734.89190,S,15305.82850,E,222601.000,A,A*4F
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39
+$GPGST,222601.000,11.5,13.4,6.1,78.5,6.0,12.0,24.9*56
+$GPGSV,3,1,10,16,48,115,40,25,39,268,27,23,58,174,35,20,71,336,28*74
+$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,39,27,19,284,27*70
+$GPGSV,3,3,10,11,06,338,,03,14,055,23*71
+$GPRMC,222601.000,A,2734.89190,S,15305.82850,E,18.0,58.9,030308,11.2,W,A*36
+$GPVTG,58.9,T,70.1,M,18.0,N,33.4,K,A*2C
+$GPGGA,222602.000,2734.88904,S,15305.83361,E,1,05,1.6,60.0,M,39.2,M,,*79
+$GPGLL,2734.88904,S,15305.83361,E,222602.000,A,A*40
+$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F
+$GPGST,222602.000,11.3,17.1,6.5,54.9,10.2,13.2,18.6*62
+$GPGSV,3,1,10,16,48,115,27,25,39,268,29,23,58,174,33,20,71,336,33*77
+$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,35,27,19,284,32*78
+$GPGSV,3,3,10,11,06,338,,03,14,055,24*76
+$GPRMC,222602.000,A,2734.88904,S,15305.83361,E,19.8,55.1,030308,11.2,W,A*35
+$GPVTG,55.1,T,66.3,M,19.8,N,36.7,K,A*23
+$GPGGA,222603.000,2734.88556,S,15305.83944,E,1,04,3.8,58.8,M,39.2,M,,*70
+$GPGLL,2734.88556,S,15305.83944,E,222603.000,A,A*47
+$GPGSA,A,3,25,23,20,27,,,,,,,,,6.5,3.8,5.2*3C
+$GPGST,222603.000,12.6,48.6,15.6,66.9,41.3,21.9,62.5*59
+$GPGSV,3,1,10,16,48,115,23,25,39,268,29,23,58,174,31,20,71,337,37*74
+$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,34,27,19,284,26*7C
+$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A
+$GPRMC,222603.000,A,2734.88556,S,15305.83944,E,22.7,54.4,030308,11.2,W,A*31
+$GPVTG,54.4,T,65.6,M,22.7,N,42.1,K,A*23
+$GPGGA,222604.000,2734.88238,S,15305.84546,E,1,04,4.4,57.8,M,39.2,M,,*75
+$GPGLL,2734.88238,S,15305.84546,E,222604.000,A,A*46
+$GPGSA,A,3,25,20,13,27,,,,,,,,,7.2,4.4,5.7*37
+$GPGST,222604.000,10.4,46.8,10.9,81.3,42.4,11.8,57.5*57
+$GPGSV,3,1,10,16,48,115,27,25,39,268,32,23,58,174,32,20,71,337,37*79
+$GPGSV,3,2,10,19,02,028,,04,06,242,,13,31,223,34,27,19,284,34*7F
+$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B
+$GPRMC,222604.000,A,2734.88238,S,15305.84546,E,23.3,54.5,030308,11.2,W,A*34
+$GPVTG,54.5,T,65.7,M,23.3,N,43.2,K,A*24
+$GPGGA,222605.000,2734.87917,S,15305.85182,E,1,04,4.4,56.6,M,39.2,M,,*7F
+$GPGLL,2734.87917,S,15305.85182,E,222605.000,A,A*43
+$GPGSA,A,3,25,20,13,27,,,,,,,,,7.2,4.4,5.7*37
+$GPGST,222605.000,14.3,40.3,10.1,81.5,36.5,10.7,49.8*58
+$GPGSV,3,1,10,16,48,115,24,25,39,268,32,23,58,174,33,20,71,337,37*7B
+$GPGSV,3,2,10,19,02,028,,04,06,242,20,13,31,223,35,27,19,284,32*7A
+$GPGSV,3,3,10,11,06,338,,03,14,055,26*74
+$GPRMC,222605.000,A,2734.87917,S,15305.85182,E,24.5,55.0,030308,11.2,W,A*34
+$GPVTG,55.0,T,66.2,M,24.5,N,45.3,K,A*20
+$GPGGA,222606.000,2734.87588,S,15305.85846,E,1,05,3.6,55.8,M,39.2,M,,*7E
+$GPGLL,2734.87588,S,15305.85846,E,222606.000,A,A*4B
+$GPGSA,A,3,25,23,20,13,27,,,,,,,,6.3,3.6,5.2*36
+$GPGST,222606.000,11.7,30.4,8.7,77.7,27.2,9.8,40.6*59
+$GPGSV,3,1,10,16,48,115,24,25,39,268,31,23,58,174,32,20,71,337,34*7A
+$GPGSV,3,2,10,19,02,029,,04,06,242,20,13,31,223,35,27,19,284,34*7D
+$GPGSV,3,3,10,11,06,338,,03,14,055,24*76
+$GPRMC,222606.000,A,2734.87588,S,15305.85846,E,25.3,55.9,030308,11.2,W,A*32
+$GPVTG,55.9,T,67.1,M,25.3,N,46.9,K,A*25
+$GPGGA,222607.000,2734.87218,S,15305.86543,E,1,06,1.8,55.5,M,39.2,M,,*78
+$GPGLL,2734.87218,S,15305.86543,E,222607.000,A,A*4F
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39
+$GPGST,222607.000,11.2,13.8,8.5,86.1,7.8,12.6,27.3*52
+$GPGSV,3,1,10,16,48,115,29,25,39,268,26,23,58,174,34,20,71,337,32*71
+$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,36,27,19,284,30*7D
+$GPGSV,3,3,10,11,06,338,,03,14,055,24*76
+$GPRMC,222607.000,A,2734.87218,S,15305.86543,E,26.0,57.6,030308,11.2,W,A*3B
+$GPVTG,57.6,T,68.8,M,26.0,N,48.1,K,A*28
+$GPGGA,222608.000,2734.86867,S,15305.87251,E,1,06,1.8,55.1,M,39.2,M,,*75
+$GPGLL,2734.86867,S,15305.87251,E,222608.000,A,A*46
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39
+$GPGST,222608.000,15.1,15.8,7.1,68.8,8.0,13.6,36.7*5C
+$GPGSV,3,1,10,16,48,115,39,25,39,268,28,23,58,174,35,20,71,337,30*7D
+$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,40,27,19,284,28*75
+$GPGSV,3,3,10,11,06,338,,03,14,055,28*7A
+$GPRMC,222608.000,A,2734.86867,S,15305.87251,E,25.9,60.7,030308,11.2,W,A*3D
+$GPVTG,60.7,T,71.9,M,25.9,N,47.9,K,A*29
+$GPGGA,222609.000,2734.86555,S,15305.87973,E,1,06,1.8,54.7,M,39.2,M,,*74
+$GPGLL,2734.86555,S,15305.87973,E,222609.000,A,A*40
+$GPGSA,A,3,16,25,23,13,27,03,,,,,,,3.6,1.8,3.1*39
+$GPGST,222609.000,10.9,10.9,5.1,85.4,4.7,10.0,22.0*55
+$GPGSV,3,1,10,16,48,116,34,25,39,268,39,23,58,174,29,20,71,337,33*7D
+$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,42,27,19,284,23*7F
+$GPGSV,3,3,10,11,06,338,,03,14,055,26*74
+$GPRMC,222609.000,A,2734.86555,S,15305.87973,E,25.7,64.3,030308,11.2,W,A*35
+$GPVTG,64.3,T,75.6,M,25.7,N,47.5,K,A*20
+$GPGGA,222610.000,2734.86253,S,15305.88695,E,1,05,1.9,54.1,M,39.2,M,,*71
+$GPGLL,2734.86253,S,15305.88695,E,222610.000,A,A*41
+$GPGSA,A,3,16,25,23,13,03,,,,,,,,3.7,1.9,3.1*3C
+$GPGST,222610.000,11.1,14.6,7.4,64.7,8.3,12.4,28.7*57
+$GPGSV,3,1,10,16,48,116,29,25,39,268,42,23,58,174,28,20,71,337,32*7D
+$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,42,27,19,284,23*7F
+$GPGSV,3,3,10,11,06,338,,03,14,055,24*76
+$GPRMC,222610.000,A,2734.86253,S,15305.88695,E,25.3,65.0,030308,11.2,W,A*32
+$GPVTG,65.0,T,76.3,M,25.3,N,46.8,K,A*2C
+$GPGGA,222611.000,2734.85924,S,15305.89387,E,1,05,2.2,53.4,M,39.2,M,,*75
+$GPGLL,2734.85924,S,15305.89387,E,222611.000,A,A*4F
+$GPGSA,A,3,16,25,23,20,13,,,,,,,,5.3,2.2,4.8*39
+$GPGST,222611.000,17.7,8.4,21.7,17.4,9.4,19.0,57.8*57
+$GPGSV,3,1,10,16,48,116,39,25,39,268,32,23,58,174,35,20,71,337,26*72
+$GPGSV,3,2,10,19,02,029,,04,06,242,31,13,31,223,39,27,19,284,24*70
+$GPGSV,3,3,10,11,06,338,,03,14,055,26*74
+$GPRMC,222611.000,A,2734.85924,S,15305.89387,E,24.9,61.4,030308,11.2,W,A*37
+$GPVTG,61.4,T,72.6,M,24.9,N,46.1,K,A*2F
+$GPGGA,222612.000,2734.85516,S,15305.90007,E,1,07,1.2,53.3,M,39.2,M,,*7E
+$GPGLL,2734.85516,S,15305.90007,E,222612.000,A,A*42
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222612.000,15.5,16.3,8.2,77.8,8.0,14.7,27.8*50
+$GPGSV,3,1,10,16,48,116,29,25,39,268,29,23,58,174,30,20,71,337,34*7F
+$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,35,27,19,284,28*77
+$GPGSV,3,3,10,11,06,338,,03,14,055,25*77
+$GPRMC,222612.000,A,2734.85516,S,15305.90007,E,24.5,53.1,030308,11.2,W,A*32
+$GPVTG,53.1,T,64.3,M,24.5,N,45.4,K,A*23
+$GPGGA,222613.000,2734.85043,S,15305.90565,E,1,05,1.9,53.2,M,39.2,M,,*73
+$GPGLL,2734.85043,S,15305.90565,E,222613.000,A,A*47
+$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A
+$GPGST,222613.000,21.1,11.0,20.9,21.8,11.7,18.1,48.5*55
+$GPGSV,3,1,10,16,48,116,30,25,39,268,32,23,58,174,24,20,71,337,36*7A
+$GPGSV,3,2,10,19,02,029,,04,06,242,22,13,31,223,35,27,19,284,29*73
+$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B
+$GPRMC,222613.000,A,2734.85043,S,15305.90565,E,24.9,45.4,030308,11.2,W,A*39
+$GPVTG,45.4,T,56.6,M,24.9,N,46.1,K,A*2F
+$GPGGA,222614.000,2734.84523,S,15305.91064,E,1,05,1.9,53.2,M,39.2,M,,*73
+$GPGLL,2734.84523,S,15305.91064,E,222614.000,A,A*47
+$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A
+$GPGST,222614.000,18.8,16.8,28.3,28.1,18.2,24.0,43.4*54
+$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,32,20,71,337,35*7A
+$GPGSV,3,2,10,19,02,029,,04,06,242,28,13,31,223,26,27,19,284,32*71
+$GPGSV,3,3,10,11,06,338,,03,14,055,30*73
+$GPRMC,222614.000,A,2734.84523,S,15305.91064,E,24.7,40.2,030308,11.2,W,A*34
+$GPVTG,40.2,T,51.4,M,24.7,N,45.7,K,A*22
+$GPGGA,222615.000,2734.84002,S,15305.91547,E,1,07,1.2,53.0,M,39.2,M,,*7B
+$GPGLL,2734.84002,S,15305.91547,E,222615.000,A,A*44
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222615.000,19.7,18.9,7.9,71.0,8.8,16.5,18.9*52
+$GPGSV,3,1,10,16,48,116,25,25,39,268,26,23,58,174,35,20,71,337,34*79
+$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,25,27,19,284,30*7C
+$GPGSV,3,3,10,11,06,338,,03,14,055,29*7B
+$GPRMC,222615.000,A,2734.84002,S,15305.91547,E,24.1,38.7,030308,11.2,W,A*3B
+$GPVTG,38.7,T,49.9,M,24.1,N,44.7,K,A*2B
+$GPGGA,222616.000,2734.83488,S,15305.92024,E,1,07,1.2,53.1,M,39.2,M,,*7B
+$GPGLL,2734.83488,S,15305.92024,E,222616.000,A,A*45
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222616.000,18.1,15.8,11.2,70.8,10.8,14.1,19.9*51
+$GPGSV,3,1,10,16,48,116,27,25,39,268,29,23,58,174,34,20,71,337,30*71
+$GPGSV,3,2,10,19,02,029,,04,06,242,27,13,31,223,24,27,19,284,28*77
+$GPGSV,3,3,10,11,06,338,,03,14,055,32*71
+$GPRMC,222616.000,A,2734.83488,S,15305.92024,E,24.0,39.3,030308,11.2,W,A*3E
+$GPVTG,39.3,T,50.5,M,24.0,N,44.5,K,A*29
+$GPGGA,222617.000,2734.82955,S,15305.92505,E,1,07,1.2,53.2,M,39.2,M,,*73
+$GPGLL,2734.82955,S,15305.92505,E,222617.000,A,A*4E
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222617.000,14.7,13.3,9.2,70.7,8.9,11.8,16.8*5B
+$GPGSV,3,1,10,16,48,116,23,25,39,268,30,23,58,174,35,20,71,337,33*7F
+$GPGSV,3,2,10,19,02,029,,04,06,242,25,13,31,223,25,27,19,284,26*7A
+$GPGSV,3,3,10,11,06,338,,03,14,055,32*71
+$GPRMC,222617.000,A,2734.82955,S,15305.92505,E,24.7,38.8,030308,11.2,W,A*38
+$GPVTG,38.8,T,50.0,M,24.7,N,45.7,K,A*22
+$GPGGA,222618.000,2734.82405,S,15305.92991,E,1,07,1.2,53.5,M,39.2,M,,*72
+$GPGLL,2734.82405,S,15305.92991,E,222618.000,A,A*48
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222618.000,13.7,14.7,7.8,77.2,7.6,13.2,24.3*54
+$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,36,20,71,337,32*79
+$GPGSV,3,2,10,19,02,029,,04,06,242,31,13,31,223,25,27,19,283,23*7D
+$GPGSV,3,3,10,11,06,338,,03,14,056,32*72
+$GPRMC,222618.000,A,2734.82405,S,15305.92991,E,25.3,38.3,030308,11.2,W,A*30
+$GPVTG,38.3,T,49.5,M,25.3,N,46.8,K,A*2D
+$GPGGA,222619.000,2734.81867,S,15305.93485,E,1,07,1.2,53.8,M,39.2,M,,*7C
+$GPGLL,2734.81867,S,15305.93485,E,222619.000,A,A*4B
+$GPGSA,A,3,16,25,23,20,13,27,03,,,,,,2.1,1.2,1.7*33
+$GPGST,222619.000,20.5,18.3,9.9,85.5,9.1,16.7,27.9*5A
+$GPGSV,3,1,10,16,48,116,27,25,39,268,30,23,58,174,35,20,71,337,33*7B
+$GPGSV,3,2,10,19,02,029,,04,06,242,29,13,31,223,23,27,19,283,23*72
+$GPGSV,3,3,10,11,06,338,,03,14,056,32*72
+$GPRMC,222619.000,A,2734.81867,S,15305.93485,E,25.3,39.2,030308,11.2,W,A*33
+$GPVTG,39.2,T,50.4,M,25.3,N,46.8,K,A*24
+$GPGGA,222620.000,2734.81344,S,15305.93979,E,1,05,1.6,53.8,M,39.2,M,,*74
+$GPGLL,2734.81344,S,15305.93979,E,222620.000,A,A*45
+$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F
+$GPGST,222620.000,18.2,14.7,21.1,9.8,19.1,13.7,29.8*64
+$GPGSV,3,1,10,16,48,116,26,25,39,268,30,23,58,174,33,20,71,337,34*7B
+$GPGSV,3,2,10,19,02,029,,04,06,242,24,13,31,223,25,27,19,283,29*73
+$GPGSV,3,3,10,11,06,338,,03,14,056,33*73
+$GPRMC,222620.000,A,2734.81344,S,15305.93979,E,24.7,39.5,030308,11.2,W,A*3F
+$GPVTG,39.5,T,50.7,M,24.7,N,45.8,K,A*26
+$GPGGA,222621.000,2734.80838,S,15305.94469,E,1,06,1.3,53.5,M,39.2,M,,*74
+$GPGLL,2734.80838,S,15305.94469,E,222621.000,A,A*4E
+$GPGSA,A,3,16,25,23,20,13,03,,,,,,,2.3,1.3,1.9*3B
+$GPGST,222621.000,14.6,11.8,13.4,39.2,11.7,11.4,21.8*5D
+$GPGSV,3,1,10,16,48,116,25,25,39,268,31,23,58,174,33,20,71,337,37*7A
+$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,24,27,19,283,36*7D
+$GPGSV,3,3,10,11,06,338,,03,14,056,32*72
+$GPRMC,222621.000,A,2734.80838,S,15305.94469,E,24.1,40.1,030308,11.2,W,A*38
+$GPVTG,40.1,T,51.3,M,24.1,N,44.7,K,A*21
+$GPGGA,222622.000,2734.80354,S,15305.94956,E,1,06,1.7,53.3,M,39.2,M,,*75
+$GPGLL,2734.80354,S,15305.94956,E,222622.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,13,27,,,,,,,3.3,1.7,2.9*3B
+$GPGST,222622.000,13.2,10.2,17.1,41.6,12.5,13.2,30.8*59
+$GPGSV,3,1,10,16,48,116,26,25,39,268,31,23,58,174,26,20,71,337,39*73
+$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,28,27,19,283,36*71
+$GPGSV,3,3,10,11,06,338,,03,14,056,35*75
+$GPRMC,222622.000,A,2734.80354,S,15305.94956,E,23.6,41.3,030308,11.2,W,A*38
+$GPVTG,41.3,T,52.5,M,23.6,N,43.7,K,A*20
+$GPGGA,222623.000,2734.79878,S,15305.95470,E,1,05,1.9,52.8,M,39.2,M,,*78
+$GPGLL,2734.79878,S,15305.95470,E,222623.000,A,A*47
+$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A
+$GPGST,222623.000,14.7,24.8,16.6,50.3,19.9,18.6,39.3*5E
+$GPGSV,3,1,11,16,48,116,24,25,39,268,32,23,58,174,24,20,71,337,38*70
+$GPGSV,3,2,11,19,03,029,,04,06,242,24,13,31,223,32,27,19,283,34*79
+$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,34*7D
+$GPRMC,222623.000,A,2734.79878,S,15305.95470,E,24.0,43.4,030308,11.2,W,A*36
+$GPVTG,43.4,T,54.6,M,24.0,N,44.4,K,A*25
+$GPGGA,222624.000,2734.79400,S,15305.96019,E,1,05,1.9,52.3,M,39.2,M,,*7F
+$GPGLL,2734.79400,S,15305.96019,E,222624.000,A,A*4B
+$GPGSA,A,3,16,25,20,27,03,,,,,,,,2.7,1.9,2.0*39
+$GPGST,222624.000,12.3,24.0,7.9,80.2,8.0,21.7,15.3*5C
+$GPGSV,3,1,11,16,48,116,23,25,39,268,32,23,58,174,26,20,71,337,37*7A
+$GPGSV,3,2,11,19,03,029,,04,06,242,24,13,31,223,35,27,19,283,25*7E
+$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,31*78
+$GPRMC,222624.000,A,2734.79400,S,15305.96019,E,24.7,45.3,030308,11.2,W,A*3C
+$GPVTG,45.3,T,56.6,M,24.7,N,45.7,K,A*23
+$GPGGA,222625.000,2734.78953,S,15305.96595,E,1,05,1.9,51.8,M,39.2,M,,*7D
+$GPGLL,2734.78953,S,15305.96595,E,222625.000,A,A*41
+$GPGSA,A,3,16,25,20,13,27,,,,,,,,3.7,1.9,3.2*3A
+$GPGST,222625.000,24.0,12.2,19.9,37.5,14.2,16.0,36.1*57
+$GPGSV,3,1,11,16,48,116,30,25,39,268,32,23,58,174,23,20,71,337,37*7D
+$GPGSV,3,2,11,19,03,029,,04,06,242,25,13,31,223,36,27,19,283,25*7C
+$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C
+$GPRMC,222625.000,A,2734.78953,S,15305.96595,E,24.8,47.9,030308,11.2,W,A*31
+$GPVTG,47.9,T,59.1,M,24.8,N,46.0,K,A*28
+$GPGGA,222626.000,2734.78516,S,15305.97172,E,1,05,2.5,51.1,M,39.2,M,,*79
+$GPGLL,2734.78516,S,15305.97172,E,222626.000,A,A*43
+$GPGSA,A,3,16,25,20,04,13,,,,,,,,4.2,2.5,3.3*37
+$GPGST,222626.000,20.2,12.6,23.1,19.8,13.0,20.2,38.4*5F
+$GPGSV,3,1,11,16,48,116,31,25,39,268,32,23,58,174,25,20,71,337,38*75
+$GPGSV,3,2,11,19,03,029,,04,06,242,25,13,31,223,36,27,19,283,23*7A
+$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C
+$GPRMC,222626.000,A,2734.78516,S,15305.97172,E,24.7,48.3,030308,11.2,W,A*39
+$GPVTG,48.3,T,59.5,M,24.7,N,45.7,K,A*22
+$GPGGA,222627.000,2734.78079,S,15305.97737,E,1,04,2.5,50.5,M,39.2,M,,*77
+$GPGLL,2734.78079,S,15305.97737,E,222627.000,A,A*49
+$GPGSA,A,3,16,23,20,13,,,,,,,,,5.8,2.5,5.2*39
+$GPGST,222627.000,16.3,12.4,42.2,11.3,13.5,37.9,90.0*51
+$GPGSV,3,1,11,16,48,116,28,25,39,268,32,23,58,174,25,20,71,337,37*72
+$GPGSV,3,2,11,19,03,029,,04,06,242,29,13,31,223,37,27,19,283,30*75
+$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,24*7C
+$GPRMC,222627.000,A,2734.78079,S,15305.97737,E,24.3,48.1,030308,11.2,W,A*35
+$GPVTG,48.1,T,59.3,M,24.3,N,45.1,K,A*24
+$GPGGA,222628.000,2734.77637,S,15305.98293,E,1,07,1.3,50.2,M,39.2,M,,*7E
+$GPGLL,2734.77637,S,15305.98293,E,222628.000,A,A*41
+$GPGSA,A,3,16,25,23,04,13,27,03,,,,,,2.2,1.3,1.8*38
+$GPGST,222628.000,13.2,14.5,8.8,76.9,8.4,13.0,22.0*5F
+$GPGSV,3,1,11,16,48,116,30,25,39,268,32,23,58,174,27,20,71,337,37*79
+$GPGSV,3,2,11,19,03,029,,04,06,242,32,13,31,223,37,27,19,283,28*76
+$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,25*7D
+$GPRMC,222628.000,A,2734.77637,S,15305.98293,E,23.9,48.5,030308,11.2,W,A*34
+$GPVTG,48.5,T,59.7,M,23.9,N,44.3,K,A*2A
+$GPGGA,222629.000,2734.77226,S,15305.98850,E,1,08,1.1,49.5,M,39.2,M,,*7C
+$GPGLL,2734.77226,S,15305.98850,E,222629.000,A,A*41
+$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35
+$GPGST,222629.000,11.0,9.5,7.3,89.6,6.7,8.6,14.3*5E
+$GPGSV,3,1,11,16,48,116,31,25,39,268,32,23,58,174,25,20,71,337,36*7B
+$GPGSV,3,2,11,19,03,029,,04,06,242,30,13,31,223,37,27,19,283,28*74
+$GPGSV,3,3,11,11,06,338,,01,,,18,03,14,056,27*7F
+$GPRMC,222629.000,A,2734.77226,S,15305.98850,E,23.5,49.4,030308,11.2,W,A*38
+$GPVTG,49.4,T,60.6,M,23.5,N,43.5,K,A*2C
+$GPGGA,222630.000,2734.76859,S,15305.99361,E,1,04,3.5,49.4,M,39.2,M,,*74
+$GPGLL,2734.76859,S,15305.99361,E,222630.000,A,A*42
+$GPGSA,A,3,16,25,20,27,,,,,,,,,4.9,3.5,3.4*39
+$GPGST,222630.000,13.4,7.9,50.0,19.9,17.0,43.1,69.5*66
+$GPGSV,3,1,11,16,48,116,31,25,39,268,30,23,58,174,22,20,71,337,36*7E
+$GPGSV,3,2,11,19,03,029,,04,06,242,32,13,31,223,35,27,19,283,24*78
+$GPGSV,3,3,11,11,06,338,18,01,,,18,03,14,056,29*78
+$GPRMC,222630.000,A,2734.76859,S,15305.99361,E,21.1,50.3,030308,11.2,W,A*32
+$GPVTG,50.3,T,61.5,M,21.1,N,39.1,K,A*2E
+$GPGGA,222631.000,2734.76498,S,15305.99809,E,1,08,1.1,48.2,M,39.2,M,,*7C
+$GPGLL,2734.76498,S,15305.99809,E,222631.000,A,A*47
+$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35
+$GPGST,222631.000,18.4,10.8,5.8,77.6,5.6,9.7,13.2*63
+$GPGSV,3,1,11,16,48,116,32,25,39,268,31,23,58,174,22,20,71,337,35*7F
+$GPGSV,3,2,11,19,03,029,,04,06,242,30,13,31,223,36,27,19,283,25*78
+$GPGSV,3,3,11,11,06,338,18,01,,,18,03,14,056,33*73
+$GPRMC,222631.000,A,2734.76498,S,15305.99809,E,19.4,47.4,030308,11.2,W,A*38
+$GPVTG,47.4,T,58.6,M,19.4,N,35.9,K,A*2C
+$GPGGA,222632.000,2734.76359,S,15306.00162,E,1,08,1.1,49.6,M,39.2,M,,*77
+$GPGLL,2734.76359,S,15306.00162,E,222632.000,A,A*49
+$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35
+$GPGST,222632.000,18.1,14.9,6.7,53.4,9.5,11.5,16.1*5A
+$GPGSV,3,1,11,16,48,116,30,25,39,268,31,23,58,174,31,20,71,337,31*7B
+$GPGSV,3,2,11,19,03,029,,04,06,242,22,13,31,223,37,27,19,283,29*76
+$GPGSV,3,3,11,11,06,338,24,01,,,18,03,14,056,25*7B
+$GPRMC,222632.000,A,2734.76359,S,15306.00162,E,12.4,65.5,030308,11.2,W,A*3C
+$GPVTG,65.5,T,76.7,M,12.4,N,22.9,K,A*2D
+$GPGGA,222633.000,2734.76254,S,15306.00553,E,1,08,1.1,49.0,M,39.2,M,,*7A
+$GPGLL,2734.76254,S,15306.00553,E,222633.000,A,A*42
+$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35
+$GPGST,222633.000,13.9,12.3,5.8,55.3,7.8,9.7,13.7*62
+$GPGSV,3,1,10,16,48,116,35,25,39,268,35,23,58,174,30,20,71,337,35*7E
+$GPGSV,3,2,10,19,03,029,,04,06,242,26,13,31,223,39,27,19,283,26*72
+$GPGSV,3,3,10,11,06,338,24,03,14,056,30*76
+$GPRMC,222633.000,A,2734.76254,S,15306.00553,E,12.9,72.5,030308,11.2,W,A*3C
+$GPVTG,72.5,T,83.7,M,12.9,N,23.9,K,A*2D
+$GPGGA,222634.000,2734.76305,S,15306.00850,E,1,08,1.1,48.4,M,39.2,M,,*73
+$GPGLL,2734.76305,S,15306.00850,E,222634.000,A,A*4E
+$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35
+$GPGST,222634.000,11.3,10.3,5.3,58.0,6.5,8.4,12.0*62
+$GPGSV,3,1,10,16,48,116,33,25,39,268,38,23,58,174,30,20,71,337,30*70
+$GPGSV,3,2,10,19,03,029,,04,06,242,29,13,31,223,34,27,19,283,30*77
+$GPGSV,3,3,10,11,06,338,23,03,14,056,25*75
+$GPRMC,222634.000,A,2734.76305,S,15306.00850,E,9.4,99.3,030308,11.2,W,A*04
+$GPVTG,99.3,T,110.5,M,9.4,N,17.3,K,A*2D
+$GPGGA,222635.000,2734.76418,S,15306.01089,E,1,08,1.1,47.9,M,39.2,M,,*76
+$GPGLL,2734.76418,S,15306.01089,E,222635.000,A,A*49
+$GPGSA,A,3,16,25,23,20,04,13,27,03,,,,,1.7,1.1,1.3*35
+$GPGST,222635.000,13.4,9.3,7.7,66.3,7.3,8.3,14.0*50
+$GPGSV,3,1,10,16,48,116,36,25,39,268,31,23,58,174,37,20,71,337,36*7D
+$GPGSV,3,2,10,19,03,029,,04,06,242,31,13,31,223,34,27,19,283,31*7F
+$GPGSV,3,3,10,11,06,338,23,03,14,056,23*73
+$GPRMC,222635.000,A,2734.76418,S,15306.01089,E,8.3,116.7,030308,11.2,W,A*37
+$GPVTG,116.7,T,127.9,M,8.3,N,15.4,K,A*14
+$GPGGA,222636.000,2734.76577,S,15306.01258,E,1,07,1.7,47.9,M,39.2,M,,*7A
+$GPGLL,2734.76577,S,15306.01258,E,222636.000,A,A*4C
+$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F
+$GPGST,222636.000,10.6,11.9,8.1,45.4,9.3,9.3,18.8*65
+$GPGSV,3,1,10,16,48,116,41,25,39,268,35,23,58,174,40,20,71,337,33*7C
+$GPGSV,3,2,10,19,03,029,,04,06,242,32,13,31,223,28,27,19,283,34*74
+$GPGSV,3,3,10,11,06,338,25,03,14,056,23*75
+$GPRMC,222636.000,A,2734.76577,S,15306.01258,E,7.6,135.7,030308,11.2,W,A*39
+$GPVTG,135.7,T,146.9,M,7.6,N,14.1,K,A*1C
+$GPGGA,222637.000,2734.76759,S,15306.01422,E,1,07,1.7,47.8,M,39.2,M,,*7F
+$GPGLL,2734.76759,S,15306.01422,E,222637.000,A,A*48
+$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F
+$GPGST,222637.000,8.9,7.2,10.9,44.4,8.4,8.5,17.1*59
+$GPGSV,3,1,10,16,48,116,44,25,39,268,36,23,58,174,33,20,71,337,33*7E
+$GPGSV,3,2,10,19,03,029,,04,06,242,24,13,31,223,29,27,19,283,36*70
+$GPGSV,3,3,10,11,06,338,25,03,14,056,23*75
+$GPRMC,222637.000,A,2734.76759,S,15306.01422,E,8.0,140.6,030308,11.2,W,A*37
+$GPVTG,140.6,T,151.8,M,8.0,N,14.8,K,A*18
+$GPGGA,222638.000,2734.76957,S,15306.01592,E,1,06,2.0,47.6,M,39.2,M,,*71
+$GPGLL,2734.76957,S,15306.01592,E,222638.000,A,A*4D
+$GPGSA,A,3,16,25,23,20,04,13,,,,,,,3.2,2.0,2.6*30
+$GPGST,222638.000,10.4,8.9,16.3,14.1,8.7,14.6,19.9*51
+$GPGSV,3,1,10,16,48,116,38,25,39,268,30,23,58,174,29,20,71,337,29*73
+$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,29*7B
+$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71
+$GPRMC,222638.000,A,2734.76957,S,15306.01592,E,8.8,142.8,030308,11.2,W,A*36
+$GPVTG,142.8,T,154.0,M,8.8,N,16.2,K,A*19
+$GPGGA,222639.000,2734.77109,S,15306.01748,E,1,07,1.7,47.8,M,39.2,M,,*7C
+$GPGLL,2734.77109,S,15306.01748,E,222639.000,A,A*4B
+$GPGSA,A,3,16,25,23,20,04,13,27,,,,,,2.8,1.7,2.3*3F
+$GPGST,222639.000,9.5,9.6,14.7,43.8,11.3,11.5,19.8*51
+$GPGSV,3,1,10,16,48,116,37,25,39,268,32,23,58,174,37,20,71,337,29*71
+$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,27*75
+$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71
+$GPRMC,222639.000,A,2734.77109,S,15306.01748,E,7.1,137.2,030308,11.2,W,A*3E
+$GPVTG,137.2,T,148.4,M,7.1,N,13.1,K,A*18
+$GPGGA,222640.000,2734.77216,S,15306.02018,E,1,04,2.6,47.8,M,39.2,M,,*7F
+$GPGLL,2734.77216,S,15306.02018,E,222640.000,A,A*49
+$GPGSA,A,3,16,25,23,13,,,,,,,,,6.2,2.6,5.6*32
+$GPGST,222640.000,20.0,11.7,22.3,7.0,10.9,20.3,46.8*65
+$GPGSV,3,1,10,16,48,116,32,25,39,268,29,23,58,174,24,20,71,337,25*70
+$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,25*77
+$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71
+$GPRMC,222640.000,A,2734.77216,S,15306.02018,E,9.4,114.2,030308,11.2,W,A*36
+$GPVTG,114.2,T,125.4,M,9.4,N,17.4,K,A*18
+$GPGGA,222641.000,2734.77543,S,15306.02149,E,1,04,2.6,47.7,M,39.2,M,,*73
+$GPGLL,2734.77543,S,15306.02149,E,222641.000,A,A*4A
+$GPGSA,A,3,16,25,23,13,,,,,,,,,6.2,2.6,5.6*32
+$GPGST,222641.000,18.3,40.3,13.2,79.5,13.7,36.3,59.1*5E
+$GPGSV,3,1,10,16,48,116,34,25,39,268,23,23,58,174,26,20,71,337,27*7C
+$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71
+$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71
+$GPRMC,222641.000,A,2734.77543,S,15306.02149,E,12.5,160.9,030308,11.2,W,A*06
+$GPVTG,160.9,T,172.1,M,12.5,N,23.1,K,A*2E
+$GPGGA,222642.000,2734.77709,S,15306.02300,E,1,04,2.6,47.7,M,39.2,M,,*73
+$GPGLL,2734.77709,S,15306.02300,E,222642.000,A,A*4A
+$GPGSA,A,3,16,20,04,13,,,,,,,,,4.3,2.6,3.4*35
+$GPGST,222642.000,15.8,14.5,71.8,20.7,26.3,61.6,97.2*58
+$GPGSV,3,1,10,16,48,116,41,25,40,268,23,23,58,174,27,20,71,337,34*73
+$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71
+$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71
+$GPRMC,222642.000,A,2734.77709,S,15306.02300,E,7.5,140.7,030308,11.2,W,A*3E
+$GPVTG,140.7,T,151.9,M,7.5,N,13.9,K,A*14
+$GPGGA,222643.000,2734.77831,S,15306.02427,E,1,04,2.6,47.5,M,39.2,M,,*76
+$GPGLL,2734.77831,S,15306.02427,E,222643.000,A,A*4D
+$GPGSA,A,3,16,20,04,13,,,,,,,,,4.3,2.6,3.4*35
+$GPGST,222643.000,12.9,15.5,112.8,21.4,39.9,96.1,154.3*5C
+$GPGSV,3,1,10,16,48,116,41,25,40,268,23,23,58,174,26,20,71,337,35*73
+$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71
+$GPGSV,3,3,10,11,06,338,21,03,14,056,23*71
+$GPRMC,222643.000,A,2734.77831,S,15306.02427,E,5.6,136.2,030308,11.2,W,A*3C
+$GPVTG,136.2,T,147.4,M,5.6,N,10.4,K,A*15
+$GPGGA,222644.000,2734.77900,S,15306.02522,E,1,04,2.5,47.4,M,39.2,M,,*74
+$GPGLL,2734.77900,S,15306.02522,E,222644.000,A,A*4D
+$GPGSA,A,3,16,23,20,13,,,,,,,,,5.8,2.5,5.2*39
+$GPGST,222644.000,11.9,32.3,39.9,23.1,35.5,30.7,165.7*69
+$GPGSV,3,1,10,16,48,116,38,25,40,268,23,23,58,174,25,20,71,337,37*7C
+$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71
+$GPGSV,3,3,10,11,06,338,21,03,14,056,26*74
+$GPRMC,222644.000,A,2734.77900,S,15306.02522,E,3.7,127.8,030308,11.2,W,A*31
+$GPVTG,127.8,T,139.0,M,3.7,N,6.9,K,A*2F
+$GPGGA,222645.000,2734.77991,S,15306.02594,E,1,04,3.4,47.4,M,39.2,M,,*70
+$GPGLL,2734.77991,S,15306.02594,E,222645.000,A,A*49
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30
+$GPGST,222645.000,15.3,40.1,15.0,66.6,34.1,19.2,69.1*50
+$GPGSV,3,1,10,16,48,116,33,25,40,268,23,23,58,174,23,20,71,337,35*73
+$GPGSV,3,2,10,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*71
+$GPGSV,3,3,10,11,06,338,21,03,14,056,30*73
+$GPRMC,222645.000,A,2734.77991,S,15306.02594,E,3.9,145.4,030308,11.2,W,A*33
+$GPVTG,145.4,T,156.6,M,3.9,N,7.2,K,A*2C
+$GPGGA,222646.000,2734.78074,S,15306.02652,E,1,04,3.4,47.4,M,39.2,M,,*77
+$GPGLL,2734.78074,S,15306.02652,E,222646.000,A,A*4E
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30
+$GPGST,222646.000,14.8,53.5,15.6,78.9,48.1,16.9,76.9*50
+$GPGSV,3,1,11,16,48,116,32,25,40,268,23,23,58,174,26,20,71,337,32*71
+$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D
+$GPRMC,222646.000,A,2734.78074,S,15306.02652,E,3.5,149.5,030308,11.2,W,A*35
+$GPVTG,149.5,T,160.7,M,3.5,N,6.6,K,A*2C
+$GPGGA,222647.000,2734.78140,S,15306.02704,E,1,04,3.4,47.3,M,39.2,M,,*75
+$GPGLL,2734.78140,S,15306.02704,E,222647.000,A,A*4B
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.4,5.0*30
+$GPGST,222647.000,11.7,42.4,13.1,77.7,38.0,14.3,60.9*53
+$GPGSV,3,1,11,16,48,116,37,25,40,268,23,23,58,174,31,20,71,337,36*76
+$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D
+$GPRMC,222647.000,A,2734.78140,S,15306.02704,E,2.8,145.4,030308,11.2,W,A*31
+$GPVTG,145.4,T,156.6,M,2.8,N,5.1,K,A*2D
+$GPGGA,222648.000,2734.78183,S,15306.02753,E,1,04,3.5,47.2,M,39.2,M,,*77
+$GPGLL,2734.78183,S,15306.02753,E,222648.000,A,A*49
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222648.000,11.3,35.2,16.9,76.3,31.5,16.9,53.8*53
+$GPGSV,3,1,11,16,48,116,35,25,40,267,23,23,58,174,37,20,71,337,35*7E
+$GPGSV,3,2,11,19,03,029,,04,06,242,28,13,31,223,31,27,19,283,23*70
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,35*4C
+$GPRMC,222648.000,A,2734.78183,S,15306.02753,E,2.1,135.8,030308,11.2,W,A*31
+$GPVTG,135.8,T,147.1,M,2.1,N,3.9,K,A*26
+$GPGGA,222649.000,2734.78197,S,15306.02773,E,1,04,3.5,46.8,M,39.2,M,,*7A
+$GPGLL,2734.78197,S,15306.02773,E,222649.000,A,A*4F
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222649.000,13.9,60.8,14.8,84.0,55.3,14.7,79.7*52
+$GPGSV,3,1,11,16,48,116,31,25,40,267,23,23,58,174,36,20,71,337,31*7F
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,23*78
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,29*41
+$GPRMC,222649.000,A,2734.78197,S,15306.02773,E,0.6,148.6,030308,11.2,W,A*36
+$GPVTG,148.6,T,159.8,M,0.6,N,1.2,K,A*28
+$GPGGA,222650.000,2734.78195,S,15306.02785,E,1,04,3.5,46.4,M,39.2,M,,*75
+$GPGLL,2734.78195,S,15306.02785,E,222650.000,A,A*4C
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222650.000,11.4,48.0,12.9,83.3,43.6,12.8,63.8*5B
+$GPGSV,3,1,11,16,48,116,30,25,40,267,23,23,58,174,33,20,71,337,30*7A
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,23*78
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,26*4E
+$GPRMC,222650.000,A,2734.78195,S,15306.02785,E,0.2,6.4,030308,11.2,W,A*38
+$GPVTG,6.4,T,17.6,M,0.2,N,0.3,K,A*10
+$GPGGA,222651.000,2734.78191,S,15306.02798,E,1,04,3.5,45.9,M,39.2,M,,*72
+$GPGLL,2734.78191,S,15306.02798,E,222651.000,A,A*45
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222651.000,9.8,40.0,12.0,82.4,36.3,11.9,53.8*6E
+$GPGSV,3,1,11,16,48,116,28,25,40,267,,23,58,174,35,20,71,337,26*73
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,*79
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,28*40
+$GPRMC,222651.000,A,2734.78191,S,15306.02798,E,0.1,352.6,030308,11.2,W,A*32
+$GPVTG,352.6,T,3.8,M,0.1,N,0.3,K,A*28
+$GPGGA,222652.000,2734.78198,S,15306.02797,E,1,04,3.5,45.9,M,39.2,M,,*77
+$GPGLL,2734.78198,S,15306.02797,E,222652.000,A,A*40
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222652.000,21.7,41.2,15.0,83.8,37.5,14.2,91.6*58
+$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,23,20,71,337,26*78
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,19,283,*79
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,24*4C
+$GPRMC,222652.000,A,2734.78198,S,15306.02797,E,0.2,263.5,030308,11.2,W,A*34
+$GPVTG,263.5,T,274.7,M,0.2,N,0.3,K,A*26
+$GPGGA,222653.000,2734.78226,S,15306.02793,E,1,04,3.5,45.9,M,39.2,M,,*74
+$GPGLL,2734.78226,S,15306.02793,E,222653.000,A,A*43
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222653.000,18.8,36.4,20.7,81.4,33.0,19.3,78.6*5F
+$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,25,20,71,337,25*7D
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,24*4C
+$GPRMC,222653.000,A,2734.78226,S,15306.02793,E,0.8,188.1,030308,11.2,W,A*3F
+$GPVTG,188.1,T,199.3,M,0.8,N,1.5,K,A*2D
+$GPGGA,222654.000,2734.78231,S,15306.02789,E,1,04,3.5,45.9,M,39.2,M,,*7E
+$GPGLL,2734.78231,S,15306.02789,E,222654.000,A,A*49
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222654.000,14.4,23.3,16.5,69.8,20.7,16.0,57.9*5D
+$GPGSV,3,1,11,16,48,116,34,25,40,267,,23,58,174,34,20,71,337,31*79
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,31*48
+$GPRMC,222654.000,A,2734.78231,S,15306.02789,E,0.1,145.6,030308,11.2,W,A*3A
+$GPVTG,145.6,T,156.8,M,0.1,N,0.2,K,A*2C
+$GPGGA,222655.000,2734.78251,S,15306.02806,E,1,04,3.5,45.8,M,39.2,M,,*70
+$GPGLL,2734.78251,S,15306.02806,E,222655.000,A,A*46
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222655.000,12.0,28.1,14.0,78.7,25.3,13.6,52.5*54
+$GPGSV,3,1,11,16,48,116,40,25,40,267,,23,58,174,38,20,71,337,35*72
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,36*4F
+$GPRMC,222655.000,A,2734.78251,S,15306.02806,E,0.7,135.5,030308,11.2,W,A*37
+$GPVTG,135.5,T,146.8,M,0.7,N,1.2,K,A*2E
+$GPGGA,222656.000,2734.78273,S,15306.02823,E,1,04,3.5,45.7,M,39.2,M,,*7B
+$GPGLL,2734.78273,S,15306.02823,E,222656.000,A,A*42
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222656.000,9.9,24.8,12.2,76.6,22.2,12.0,44.0*69
+$GPGSV,3,1,11,16,48,116,38,25,40,267,,23,58,174,36,20,71,337,30*76
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,35*4C
+$GPRMC,222656.000,A,2734.78273,S,15306.02823,E,0.5,135.5,030308,11.2,W,A*31
+$GPVTG,135.5,T,146.7,M,0.5,N,1.0,K,A*21
+$GPGGA,222657.000,2734.78312,S,15306.02858,E,1,04,3.5,45.5,M,39.2,M,,*72
+$GPGLL,2734.78312,S,15306.02858,E,222657.000,A,A*49
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222657.000,8.4,22.4,10.9,74.9,19.9,11.0,38.1*60
+$GPGSV,3,1,11,16,48,116,37,25,40,267,,23,58,174,36,20,71,337,30*79
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,21,08,00,298,,03,14,056,34*4D
+$GPRMC,222657.000,A,2734.78312,S,15306.02858,E,1.3,137.6,030308,11.2,W,A*3C
+$GPVTG,137.6,T,148.8,M,1.3,N,2.4,K,A*21
+$GPGGA,222658.000,2734.78370,S,15306.02910,E,1,04,3.5,45.4,M,39.2,M,,*75
+$GPGLL,2734.78370,S,15306.02910,E,222658.000,A,A*4F
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222658.000,11.5,25.4,19.7,45.8,20.9,20.7,46.1*53
+$GPGSV,3,1,11,16,48,116,34,25,40,267,18,23,58,174,36,20,71,337,32*71
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,32*48
+$GPRMC,222658.000,A,2734.78370,S,15306.02910,E,2.7,141.8,030308,11.2,W,A*32
+$GPVTG,141.8,T,153.0,M,2.7,N,5.0,K,A*28
+$GPGGA,222659.000,2734.78463,S,15306.02956,E,1,04,3.5,45.4,M,39.2,M,,*73
+$GPGLL,2734.78463,S,15306.02956,E,222659.000,A,A*49
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222659.000,10.9,34.8,17.8,79.2,31.4,17.1,52.2*5E
+$GPGSV,3,1,11,16,48,116,32,25,40,267,18,23,58,174,37,20,71,337,32*76
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,26*4D
+$GPRMC,222659.000,A,2734.78463,S,15306.02956,E,3.6,157.2,030308,11.2,W,A*39
+$GPVTG,157.2,T,168.4,M,3.6,N,6.7,K,A*2D
+$GPGGA,222700.000,2734.78553,S,15306.02974,E,1,04,3.5,45.3,M,39.2,M,,*7B
+$GPGLL,2734.78553,S,15306.02974,E,222700.000,A,A*46
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222700.000,13.4,30.5,15.4,80.9,27.6,14.6,58.2*5C
+$GPGSV,3,1,11,16,48,116,38,25,40,267,18,23,58,174,42,20,71,337,34*78
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,30*4A
+$GPRMC,222700.000,A,2734.78553,S,15306.02974,E,3.1,171.1,030308,11.2,W,A*36
+$GPVTG,171.1,T,182.3,M,3.1,N,5.7,K,A*2D
+$GPGGA,222701.000,2734.78678,S,15306.02887,E,1,05,1.6,45.4,M,39.2,M,,*7A
+$GPGLL,2734.78678,S,15306.02887,E,222701.000,A,A*40
+$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F
+$GPGST,222701.000,18.6,22.3,33.4,25.2,29.0,22.6,46.2*53
+$GPGSV,3,1,11,16,48,116,30,25,40,267,18,23,58,174,33,20,71,337,27*74
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,20,27,20,283,*71
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,27*4C
+$GPRMC,222701.000,A,2734.78678,S,15306.02887,E,5.1,212.6,030308,11.2,W,A*37
+$GPVTG,212.6,T,223.8,M,5.1,N,9.5,K,A*27
+$GPGGA,222702.000,2734.78726,S,15306.02769,E,1,04,3.5,45.3,M,39.2,M,,*7B
+$GPGLL,2734.78726,S,15306.02769,E,222702.000,A,A*46
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.0*31
+$GPGST,222702.000,14.7,49.5,20.8,84.3,45.1,19.5,72.8*5F
+$GPGSV,3,1,11,16,48,116,36,25,40,267,18,23,58,174,40,20,71,337,31*71
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,20,27,20,283,*71
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,28*43
+$GPRMC,222702.000,A,2734.78726,S,15306.02769,E,4.2,246.4,030308,11.2,W,A*30
+$GPVTG,246.4,T,257.6,M,4.2,N,7.7,K,A*27
+$GPGGA,222703.000,2734.78745,S,15306.02617,E,1,05,1.6,45.3,M,39.2,M,,*77
+$GPGLL,2734.78745,S,15306.02617,E,222703.000,A,A*4A
+$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F
+$GPGST,222703.000,12.3,16.0,23.0,21.5,20.3,15.6,33.1*53
+$GPGSV,3,1,11,16,48,116,31,25,40,267,18,23,58,174,29,20,70,337,23*7B
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,27*4C
+$GPRMC,222703.000,A,2734.78745,S,15306.02617,E,4.9,265.5,030308,11.2,W,A*37
+$GPVTG,265.5,T,276.7,M,4.9,N,9.1,K,A*26
+$GPGGA,222704.000,2734.78730,S,15306.02555,E,1,04,3.5,45.3,M,39.2,M,,*77
+$GPGLL,2734.78730,S,15306.02555,E,222704.000,A,A*4A
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30
+$GPGST,222704.000,9.5,34.0,22.1,80.5,30.8,20.6,55.7*69
+$GPGSV,3,1,11,16,48,116,31,25,40,267,18,23,58,174,29,20,70,337,23*7B
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,31*4B
+$GPRMC,222704.000,A,2734.78730,S,15306.02555,E,2.1,286.5,030308,11.2,W,A*34
+$GPVTG,286.5,T,297.7,M,2.1,N,3.9,K,A*28
+$GPGGA,222705.000,2734.78698,S,15306.02452,E,1,04,3.5,45.3,M,39.2,M,,*73
+$GPGLL,2734.78698,S,15306.02452,E,222705.000,A,A*4E
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30
+$GPGST,222705.000,93.8,65.1,31.9,84.0,59.3,29.7,94.1*5F
+$GPGSV,3,1,11,16,48,116,29,25,40,267,18,23,58,174,29,20,70,337,23*72
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,30*4A
+$GPRMC,222705.000,A,2734.78698,S,15306.02452,E,3.6,290.3,030308,11.2,W,A*37
+$GPVTG,290.3,T,301.5,M,3.6,N,6.8,K,A*27
+$GPGGA,222706.000,2734.78686,S,15306.02339,E,1,04,3.5,45.3,M,39.2,M,,*75
+$GPGLL,2734.78686,S,15306.02339,E,222706.000,A,A*48
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30
+$GPGST,222706.000,114.3,62.0,48.3,70.3,55.4,45.7,116.3*5B
+$GPGSV,3,1,11,16,48,116,24,25,40,267,18,23,58,174,29,20,70,337,23*7F
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F
+$GPRMC,222706.000,A,2734.78686,S,15306.02339,E,3.4,277.7,030308,11.2,W,A*3E
+$GPVTG,277.7,T,288.9,M,3.4,N,6.3,K,A*2F
+$GPGGA,222707.000,2734.78679,S,15306.02251,E,1,04,3.5,45.3,M,39.2,M,,*7B
+$GPGLL,2734.78679,S,15306.02251,E,222707.000,A,A*46
+$GPGSA,A,3,16,23,20,03,,,,,,,,,6.1,3.5,5.1*30
+$GPGST,222707.000,128.0,90.0,67.0,53.0,75.4,69.6,158.6*55
+$GPGSV,3,1,11,16,48,116,24,25,40,267,18,23,58,174,29,20,70,337,23*7F
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,223,22,27,20,283,*73
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F
+$GPRMC,222707.000,A,2734.78679,S,15306.02251,E,,,030308,,,A*79
+$GPVTG,,T,,M,,N,,K,N*2C
+$GPGGA,222708.000,2734.78673,S,15306.02181,E,1,05,1.6,45.3,M,39.2,M,,*70
+$GPGLL,2734.78673,S,15306.02181,E,222708.000,A,A*4D
+$GPGSA,A,3,16,23,20,13,03,,,,,,,,2.5,1.6,1.9*3F
+$GPGST,222708.000,66.8,93.0,70.5,62.6,69.3,81.1,141.7*6F
+$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F
+$GPRMC,222708.000,A,2734.78673,S,15306.02181,E,,,030308,,,A*72
+$GPVTG,,T,,M,,N,,K,N*2C
+$GPGGA,222709.000,2734.78668,S,15306.02124,E,1,05,1.6,45.3,M,39.2,M,,*74
+$GPGLL,2734.78668,S,15306.02124,E,222709.000,A,A*49
+$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31
+$GPGST,222709.000,89.5,61.2,117.7,37.9,91.7,79.5,4.3*54
+$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F
+$GPRMC,222709.000,A,2734.78668,S,15306.02124,E,,,030308,,,A*76
+$GPVTG,,T,,M,,N,,K,N*2C
+$GPGGA,222710.000,2734.78664,S,15306.02080,E,1,05,1.6,45.3,M,39.2,M,,*7F
+$GPGLL,2734.78664,S,15306.02080,E,222710.000,A,A*42
+$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31
+$GPGST,222710.000,117.0,82.3,157.6,39.0,121.7,107.9,3.9*62
+$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F
+$GPRMC,222710.000,A,2734.78664,S,15306.02080,E,,,030308,,,A*7D
+$GPVTG,,T,,M,,N,,K,N*2C
+$GPGGA,222711.000,2734.78660,S,15306.02044,E,1,05,1.6,45.3,M,39.2,M,,*72
+$GPGLL,2734.78660,S,15306.02044,E,222711.000,A,A*4F
+$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31
+$GPGST,222711.000,128.0,107.6,205.2,40.2,156.7,142.6,3.5*58
+$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,174,29,20,70,337,23*76
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F
+$GPRMC,222711.000,A,2734.78660,S,15306.02044,E,,,030308,,,A*70
+$GPVTG,,T,,M,,N,,K,N*2C
+$GPGGA,222712.000,2734.78658,S,15306.02015,E,1,05,1.6,45.3,M,39.2,M,,*7E
+$GPGLL,2734.78658,S,15306.02015,E,222712.000,A,A*43
+$GPGSA,A,2,16,23,20,13,03,,,,,,,,1.8,1.6,0.9*31
+$GPGST,222712.000,128.0,137.2,261.1,41.4,197.4,183.9,3.2*51
+$GPGSV,3,1,11,16,48,116,24,25,40,267,,23,58,173,29,20,70,337,23*71
+$GPGSV,3,2,11,19,03,029,,04,06,242,,13,31,222,22,27,20,283,*72
+$GPGSV,3,3,11,11,06,338,,08,00,298,,03,14,056,24*4F
+$GPRMC,222712.000,A,2734.78658,S,15306.02015,E,,,030308,,,A*7C \ No newline at end of file
diff --git a/doc/src/snippets/declarative/testpolymapobjects.qml b/doc/src/snippets/declarative/testpolymapobjects.qml
new file mode 100644
index 00000000..09d347b2
--- /dev/null
+++ b/doc/src/snippets/declarative/testpolymapobjects.qml
@@ -0,0 +1,411 @@
+/****************************************************************************
+**
+** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the examples of the Qt Mobility Components.
+**
+** $QT_BEGIN_LICENSE:BSD$
+** You may use this file under the terms of the BSD license as follows:
+**
+** "Redistribution and use in source and binary forms, with or without
+** modification, are permitted provided that the following conditions are
+** met:
+** * Redistributions of source code must retain the above copyright
+** notice, this list of conditions and the following disclaimer.
+** * Redistributions in binary form must reproduce the above copyright
+** notice, this list of conditions and the following disclaimer in
+** the documentation and/or other materials provided with the
+** distribution.
+** * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor
+** the names of its contributors may be used to endorse or promote
+** products derived from this software without specific prior written
+** permission.
+**
+** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+import Qt 4.7
+import QtMobility.location 1.2
+import "landmarkmapcommon" as Common
+import "landmarkmapmobile" as Mobile
+
+import QtQuick 1.0
+
+Item {
+ id: page
+ width: 420
+ height: 580
+ focus: true
+
+
+ //![Wherever I may roam]
+ PositionSource {
+ id: myPositionSource
+ active: true
+ nmeaSource: "nmealog.txt"
+ updateInterval: 2000
+ onPositionChanged: {
+ console.log("Position changed in PositionSource")
+ myPathPolyline.addCoordinate(position.coordinate)
+ }
+ }
+ //![Wherever I may roam]
+
+ LandmarkModel {
+ id: landmarkModel
+ autoUpdate: true
+ onModelChanged: {
+ console.log("Landmark model changed, landmark count: " + count)
+ }
+ limit: 20
+ }
+
+ Mobile.TitleBar { id: titleBar; z: 5; width: parent.width - statusBar.width; height: 40; opacity: 0.8 }
+ Mobile.StatusBar { id: statusBar; z: 6; width: 80; height: titleBar.height; opacity: titleBar.opacity; anchors.right: parent.right}
+
+ Coordinate {
+ id: defaultMapCenter
+ latitude: -28.35
+ longitude: 153.4
+ }
+
+ Rectangle {
+ id: dataArea
+ anchors.top: titleBar.bottom
+ anchors.bottom: page.bottom
+ width: page.width
+ color: "#343434"
+ Image { source: "landmarkmapmobile/images/stripes.png"; fillMode: Image.Tile; anchors.fill: parent; opacity: 0.3 }
+
+ //![MapObjectView]
+ Map {
+ id: map
+ plugin : Plugin { name : "nokia" }
+ anchors.fill: parent; size.width: parent.width; size.height: parent.height; zoomLevel: 12
+ center: myPositionSource.position.coordinate
+
+ MapObjectView {
+ id: circle_basic_view
+ model: landmarkModel
+ delegate: Component {
+ id: circleMapDelegate
+ MapCircle {
+ color: "red"
+ radius: 500
+ center: landmark.coordinate
+ }
+ }
+ }
+ //![MapObjectView]
+
+ MapObjectView {
+ id: text_basic_view
+ model: landmarkModel
+ delegate: textMapDelegate
+ }
+
+ MapPolyline {
+ id: myPathPolyline
+ border {color: "red"; width: 4}
+ }
+
+ //![Basic MapPolygon]
+ MapPolygon {
+ id: polygon
+ color: "blue"
+ Coordinate {
+ id: topLeftCoordinate
+ latitude: -28.35
+ longitude: 153.4
+ }
+ Coordinate {
+ id: rightCoordinate
+ latitude: -28.34
+ longitude: 153.45
+ }
+ Coordinate {
+ id: bottomLeftCoordinate
+ latitude: -28.33
+ longitude: 153.4
+ }
+ }
+ //![Basic MapPolygon]
+ //![Basic MapPolyline]
+ MapPolyline {
+ id: polyline
+ border {color: "red"; width: 4}
+ Coordinate {
+ id: polylineTopLeftCoordinate
+ latitude: -28.35
+ longitude: 153.4
+ }
+ Coordinate {
+ id: polylineRightCoordinate
+ latitude: -28.34
+ longitude: 153.45
+ }
+ Coordinate {
+ id: polylineBottomLeftCoordinate
+ latitude: -28.33
+ longitude: 153.4
+ }
+ onPathChanged: {
+ console.log('Polyline pathChanged signal received')
+ }
+ }
+ //![Basic MapPolyline]
+
+ //![Basic map position marker definition]
+ MapCircle {
+ id: myPositionMarker
+ center: myPositionSource.position.coordinate
+ radius: 100
+ color: "yellow"
+ }
+ //![Basic map position marker definition]
+ }
+
+ MouseArea {
+ anchors.fill: parent
+
+ property bool mouseDown : false
+ property int lastX : -1
+ property int lastY : -1
+
+ onPressed : {
+ mouseDown = true
+ // While panning, its better not to actively udpate the model
+ // as it results in poor performance. Instead set opacity to make
+ // it more obvious that the landmark positions are not valid.
+ landmarkModel.autoUpdate = false
+ lastX = mouse.x
+ lastY = mouse.y
+ }
+ onReleased : {
+ mouseDown = false
+ landmarkModel.autoUpdate = true
+ landmarkModel.update()
+ lastX = -1
+ lastY = -1
+ }
+ onPositionChanged: {
+ if (mouseDown) {
+ var dx = mouse.x - lastX
+ var dy = mouse.y - lastY
+ map.pan(-dx, -dy)
+ page.state = "NoFollowing"
+ lastX = mouse.x
+ lastY = mouse.y
+ }
+ }
+ onDoubleClicked: {
+ page.state = "NoFollowing"
+ map.center = map.toCoordinate(Qt.point(mouse.x, mouse.y))
+ if (map.zoomLevel < map.maximumZoomLevel)
+ map.zoomLevel += 1
+ }
+ }
+
+ Component {
+ id: textMapDelegate
+ //![MapText]
+ MapText {
+ color: "blue"
+ coordinate: landmark.coordinate
+ text: landmark.name
+ font.pointSize: 8
+ }
+ //![MapText]
+ }
+
+ Component {
+ id: rectangleMapDelegate
+ //![MapRectangle]
+ MapRectangle {
+ color: "yellow"
+ topLeft: landmark.coordinate
+ bottomRight: Coordinate {
+ latitude: landmark.coordinate.latitude - 1
+ longitude: landmark.coordinate.longitude + 1
+ }
+ }
+ //![MapRectangle]
+ }
+
+ /* map mouse area testing
+ Component {
+ id: circleMapDelegate
+ MapCircle {
+ color: "red"
+ radius: 500
+ center: landmark.coordinate
+
+ MapMouseArea {
+ onPressed : {
+ console.log('pressed in model circle')
+ parent.color = "red"
+ }
+ onReleased : {
+ console.log('released in model circle')
+ parent.color = "yellow"
+ }
+ }
+ }
+ }
+ */
+
+ Mobile.Floater {
+ id : dataFloater
+ latitude: myPositionSource.position.coordinate.latitude
+ longitude: myPositionSource.position.coordinate.longitude
+ landmarks: landmarkModel.count
+ }
+
+ Item {
+ id: sliderContainer
+ anchors {bottom: toolbar0.top;}
+ height: 40
+ width: parent.width
+
+ Common.Slider {
+ id: zoomSlider;
+ minimum: 1; maximum: 18;
+ anchors {
+ fill: parent
+ bottomMargin: 5; rightMargin: 5; leftMargin: 5
+ }
+ onValueChanged: {
+ map.zoomLevel = value
+ }
+ }
+ }
+
+ Mobile.ToolBar {
+ id: toolbar0
+ opacity: titleBar.opacity
+ height: 40; width: parent.width
+ anchors.bottom: toolbar1.top
+ z: 6
+ button1Label: "-myposmark"; button2Label: "+myposmark"; button3Label: "-"
+ //![Basic remove MapObject]
+ onButton1Clicked: {
+ map.removeMapObject(myPositionMarker)
+ }
+ //![Basic remove MapObject]
+ //![Basic add MapObject]
+ onButton2Clicked: {
+ map.addMapObject(myPositionMarker)
+ }
+ //![Basic add MapObject]
+ onButton3Clicked: {
+ }
+ }
+
+ Mobile.ToolBar {
+ id: toolbar1
+ opacity: titleBar.opacity
+ height: 40; width: parent.width
+ anchors.bottom: toolbar2.top
+ z: 6
+ button1Label: "+polyg"; button2Label: "-polyg"; button3Label: "-initpolyg3"
+ //![Adding to polygon]
+ onButton1Clicked: {
+ polygon.addCoordinate(map.center)
+ }
+ //![Adding to polygon]
+ //![Removing from polygon]
+ onButton2Clicked: {
+ polygon.removeCoordinate(map.center)
+ }
+ //![Removing from polygon]
+ onButton3Clicked: {
+ polygon.removeCoordinate(bottomLeftCoordinate)
+ }
+ }
+
+ Mobile.ToolBar {
+ id: toolbar2
+ opacity: titleBar.opacity
+ height: 40; width: parent.width
+ anchors.bottom: toolbar3.top
+ z: 6
+ button1Label: "-iterpolyg2nd"; button2Label: "no follow"; button3Label: "+initpolyg3"
+ //![Iterating and removing polygon]
+ onButton1Clicked: {
+ for (var index = 0; index < polygon.path.length; index++) {
+ console.log("Latitude at index:" + index + " , " + polygon.path[index].latitude);
+ }
+ polygon.removeCoordinate(polygon.path[2])
+ }
+ //![Iterating and removing polygon]
+ onButton2Clicked: {
+ map.center = defaultMapCenter
+ myPositionSource.active = false
+ }
+ onButton3Clicked: {
+ polygon.addCoordinate(bottomLeftCoordinate)
+ }
+ }
+
+ Mobile.ToolBar {
+ id: toolbar3
+ opacity: toolbar1.opacity
+ height: 40; width: parent.width
+ anchors.bottom: toolbar4.top
+ z: 6
+ button1Label: "+polyl"; button2Label: "-polyl"; button3Label: "+initpolyl3"
+ onButton1Clicked: {
+ polyline.addCoordinate(map.center)
+ }
+ //![Removing from polyline]
+ onButton2Clicked: {
+ polyline.removeCoordinate(map.center)
+ }
+ //![Removing from polyline]
+ onButton3Clicked: {
+ polyline.addCoordinate(polylineBottomLeftCoordinate)
+ }
+ }
+
+ Mobile.ToolBar {
+ id: toolbar4
+ opacity: toolbar1.opacity
+ height: 40; width: parent.width
+ anchors.bottom: parent.bottom
+ z: 6
+ button1Label: "-iterpolyl2nd"; button2Label: "-"; button3Label: "-initpolyl3"
+ //![Iterating and removing polyline]
+ onButton1Clicked: {
+ for (var index = 0; index < polyline.path.length; index++) {
+ console.log("Index, latitude:" + index + " , " + polyline.path[index].latitude);
+ }
+ polyline.removeCoordinate(polyline.path[2])
+ }
+ //![Iterating and removing polyline]
+ onButton2Clicked: {
+ }
+ onButton3Clicked: {
+ polyline.removeCoordinate(polylineBottomLeftCoordinate)
+ }
+ }
+
+ } // dataArea
+
+} // page
+
+
+
diff --git a/doc/src/snippets/snippets.pro b/doc/src/snippets/snippets.pro
new file mode 100644
index 00000000..fc277da2
--- /dev/null
+++ b/doc/src/snippets/snippets.pro
@@ -0,0 +1,13 @@
+include(../../../staticconfig.pri)
+
+TEMPLATE = subdirs
+
+contains(mobility_modules,contacts): SUBDIRS += qtcontactsdocsample
+contains(mobility_modules,versit): SUBDIRS += qtversitdocsample
+contains(mobility_modules,organizer): SUBDIRS += qtorganizerdocsample
+
+contains(mobility_modules,location): SUBDIRS += qtlandmarksdocsample
+contains(mobility_modules,sensors): SUBDIRS += sensors
+contains(mobility_modules,feedback): SUBDIRS += qtfeedbackdocsample
+!win32:contains(mobility_modules,connectivity): SUBDIRS += connectivity
+!symbian:contains(mobility_modules,multimedia): SUBDIRS += multimedia-snippets
diff --git a/doc/src/tutorials/maps.qdoc b/doc/src/tutorials/maps.qdoc
new file mode 100644
index 00000000..470288bf
--- /dev/null
+++ b/doc/src/tutorials/maps.qdoc
@@ -0,0 +1,2147 @@
+/****************************************************************************
+**
+** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
+** All rights reserved.
+** Contact: Nokia Corporation (qt-info@nokia.com)
+**
+** This file is part of the documentation of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:FDL$
+** 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 Free Documentation License
+** Alternatively, this file may be used under the terms of the GNU Free
+** Documentation License version 1.3 as published by the Free Software
+** Foundation and appearing in the file included in the packaging of this
+** file.
+**
+** If you have questions regarding the use of this file, please contact
+** Nokia at qt-info@nokia.com.
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+/*!
+ \page tutorials-mapsdemo.html
+
+
+ \contentspage Maps Demo Tutorial
+ \startpage Maps Demo Tutorial
+
+ \title Maps Demo Tutorial
+
+ \brief An introduction to the Location API, showing how to develop a simple
+ map search and navigation application.
+
+ In this tutorial, you will learn about the basic components of the Location
+ API, including
+
+ \list
+ \o Drawing and interacting with maps;
+ \o Managing map objects;
+ \o Search and routing services; and
+ \o Receiving position updates.
+ \endlist
+
+ We will be developing the map search and navigation application shown below:
+
+ \image mapsdemo-finished.png
+
+ Tutorial contents:
+
+ \list 1
+ \o \l{Part 1 - The Map Widget}
+ \o \l{Part 2 - Searching for locations}
+ \o \l{Part 3 - Listening to satellites}
+ \o \l{Part 4 - Stopping for directions}
+ \o \l{Part 5 - Tuning for mobile devices}
+ \endlist
+*/
+
+/*!
+ \page tutorials-mapsdemo-part1.html
+
+ \previouspage {Maps Demo Tutorial}
+ \contentspage {Maps Demo Tutorial} {Contents}
+ \nextpage Part 2 - Searching for locations
+ \startpage Maps Demo Tutorial
+
+ \title Part 1 - The Map Widget
+
+ To begin with, we will start defining the map widget, which is the central part of
+ the application's user interface. Enough of the map widget will be defined here to
+ work satisfactorily on most desktop platforms -- full consideration for mobile use
+ will be made later along with other parts of the application.
+
+ \section2 The very basics
+
+ The Location module provides the QGraphicsGeoMap which is a simple, easy way to insert
+ maps into a QGraphicsScene. Since we're going to be extending the map later, we'll
+ create a subclass of QGraphicsGeoMap called \c GeoMap, as below:
+
+ \code
+class GeoMap : public QGraphicsGeoMap
+{
+ Q_OBJECT
+
+public:
+ GeoMap(QGeoMappingManager *manager, MapsWidget *mapsWidget);
+ ~GeoMap();
+
+private:
+ MapsWidget *mapsWidget;
+};
+
+GeoMap::GeoMap(QGeoMappingManager *manager, MapsWidget *mapsWidget) :
+ QGraphicsGeoMap(manager), mapsWidget(mapsWidget)
+{
+}
+ \endcode
+
+ And next we define a QWidget subclass, MapsWidget, which handles the creation of
+ QGraphicsView and QGraphicsScene to put the GeoMap into. We make use of the Pimpl
+ idiom on this class, since (as we will see) it will grow later to have a large
+ complement of private data members, and some of these have naming conflicts with
+ public methods.
+
+ \code
+class MapsWidgetPrivate;
+class MapsWidget : public QWidget
+{
+ Q_OBJECT
+
+public:
+ MapsWidget(QWidget *parent = 0);
+ ~MapsWidget();
+
+public slots:
+ void initialize(QGeoMappingManager *manager);
+
+private:
+ MapsWidgetPrivate *d;
+};
+ \endcode
+
+ We perform the creation of the QGraphicsScene and GeoMap in the initialize() method:
+
+ \code
+class MapsWidgetPrivate
+{
+public:
+ GeoMap *map;
+ QGraphicsView *view;
+};
+
+void MapsWidget::initialize(QGeoMappingManager *manager)
+{
+ d->map = new GeoMap(manager, this);
+
+ QGraphicsScene *sc = new QGraphicsScene;
+ sc->addItem(d->map);
+
+ d->map->resize(300, 480);
+
+ d->view = new QGraphicsView(sc, this);
+ d->view->setVisible(true);
+ d->view->setInteractive(true);
+
+ d->map->setCenter(QGeoCoordinate(-27.5796, 153.1));
+ d->map->setZoomLevel(15);
+}
+ \endcode
+
+ Doing this in the constructor, while possible, is not the preferred approach, as
+ the QGeoMappingManager may not be available until the user has chosen it, or until a
+ network connection is available. This is especially important in mobile
+ environments, as we'll see later.
+
+ To get an instance of QGeoMappingManager we use the list of service providers
+ available in QGeoServiceProvider::availableServiceProviders(). Service providers
+ provide the ability to fetch and draw maps, search for locations, get directions,
+ and a variety of other tasks.
+
+ To test out the MapsWidget we just wrote, we can simply get the first available
+ service provider in the main() function, as follows:
+
+ \code
+int main(int argc, char *argv[])
+{
+ QApplication a(argc, argv);
+
+ MapsWidget w;
+ w.show();
+
+ QList<QString> providers = QGeoServiceProvider::availableServiceProviders();
+ QGeoServiceProvider *serviceProvider = new QGeoServiceProvider(providers[0]);
+
+ w.initialize(serviceProvider->mappingManager());
+
+ return a.exec();
+}
+ \endcode
+
+ If you compile and run the code so far, you should see a window appear containing
+ a street map of Eight Mile Plains, in Queensland, Australia, rendered by your
+ platform's default geo service provider.
+
+ \image mapsdemo-verybasic.png
+
+ \section2 Pan & zoom
+
+ Next we'll add some basic pan and zoom capability to the map widget. Like most other
+ classes in Qt, QGraphicsGeoMap allows mouse and keyboard events to be handled by
+ private methods.
+
+ Into the private section of the GeoMap declaration we add:
+ \code
+bool panActive;
+
+void mousePressEvent(QGraphicsSceneMouseEvent *event);
+void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
+ \endcode
+
+ And their definitions:
+
+ \code
+void GeoMap::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ panActive = true;
+ event->accept();
+}
+
+void GeoMap::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ panActive = false;
+ event->accept();
+}
+
+void GeoMap::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (panActive) {
+ QPointF delta = event->lastPos() - event->pos();
+ pan(delta.x(), delta.y());
+ }
+ event->accept();
+}
+ \endcode
+
+ These three short methods are enough to add basic panning support to the map.
+ The panning method is a simple mouse-locked one, and moving long distances on
+ a touch screen with it can get quite tedious. Many map applications now make
+ use of "kinetic" panning for a better user experience, especially on touch
+ devices, but in the interests of simplicity, we'll save that for other examples.
+
+ Next, to add zoom support on the mouse scrollwheel:
+
+ \code
+void GeoMap::wheelEvent(QGraphicsSceneWheelEvent *event)
+{
+ qreal panx = event->pos().x() - size().width() / 2.0;
+ qreal pany = event->pos().y() - size().height() / 2.0;
+ pan(panx, pany);
+ if (event->delta() > 0) { // zoom in
+ if (zoomLevel() < maximumZoomLevel()) {
+ setZoomLevel(zoomLevel() + 1);
+ }
+ } else { // zoom out
+ if (zoomLevel() > minimumZoomLevel()) {
+ setZoomLevel(zoomLevel() - 1);
+ }
+ }
+ pan(-panx, -pany);
+ event->accept();
+}
+ \endcode
+
+ This method is a little more complicated. To provide a suitable zoom feel, we
+ have to actually combine panning with zooming, so that the user's point of
+ interest (the mouse cursor) remains in the same part of the view. So, we
+ actually pan the mouse cursor's location into the center, then adjust
+ the zoom level, then pan back at the end.
+
+ \section2 Map icons
+
+ Another important basic feature is the ability to render icons on the map to
+ represent points of interest. The QGeoMapPixmapObject class provides most of
+ the functionality necessary to achieve this, and we'll use a subclass of it
+ in similar vein to our GeoMap, above.
+
+ For our application, we want to deal with 6 different kinds of icons:
+ \list
+ \o A "my location" icon
+ \o "Search" icons for search results
+ \o User waypoints for direction routes
+ \o Start points for directions
+ \o End points for directions
+ \o "Path" markers for individual steps in the direction route
+ \endlist
+
+ Once again we make use of the Pimpl idiom to separate the private data
+ members from the interface:
+
+ \code
+class MarkerPrivate;
+class Marker : public QGeoMapPixmapObject
+{
+ Q_OBJECT
+public:
+ enum MarkerType {
+ MyLocationMarker,
+ SearchMarker,
+ WaypointMarker,
+ StartMarker,
+ EndMarker,
+ PathMarker
+ };
+
+ explicit Marker(MarkerType type);
+
+ inline MarkerType markerType() const { return m_type; }
+ void setMarkerType(MarkerType type);
+
+private:
+ MarkerPrivate *d;
+
+};
+ \endcode
+
+ So we can construct Marker instances of different types, but we need QPixmaps
+ to represent each one. In our implementation we will simply use a \c switch
+ statement to map MarkerTypes to QPixmaps.
+
+ \code
+class MarkerPrivate
+{
+public:
+ Marker::MarkerType type;
+};
+
+Marker::Marker(MarkerType type) :
+ QGeoMapPixmapObject()
+{
+ setMarkerType(type);
+}
+
+void Marker::setMarkerType(MarkerType type)
+{
+ QString filename;
+ QPoint offset;
+ int scale;
+
+ d->type = type;
+
+ switch (d->type) {
+ case MyLocationMarker:
+ filename = ":/icons/mylocation.png";
+ break;
+ case SearchMarker:
+ filename = ":/icons/searchmarker.png";
+ break;
+ case WaypointMarker:
+ filename = ":/icons/waypointmarker.png";
+ break;
+ case StartMarker:
+ filename = ":/icons/startmarker.png";
+ break;
+ case EndMarker:
+ filename = ":/icons/endmarker.png";
+ break;
+ case PathMarker:
+ filename = ":/icons/pathmarker.png";
+ break;
+ }
+
+ if (d->type == MyLocationMarker) {
+ offset = QPoint(-13,-13);
+ scale = 25;
+ } else {
+ offset = QPoint(-15, -36);
+ scale = 30;
+ }
+
+ setOffset(offset);
+ setPixmap(QPixmap(filename).scaledToWidth(scale, Qt::SmoothTransformation));
+}
+ \endcode
+
+ The icon PNG images can be found in the \c examples/mapsdemo/icons
+ directory in the QtLocation source tree. All we have to do to have this
+ working is simply add the PNG icons to a \c .qrc file and add it to the
+ project.
+
+ The QGraphicsGeoMap::addMapObject method is used to add markers to a map.
+ We can add a call to create a marker at our starting point into
+ MapsWidget::initialize() as a demonstration:
+
+ \code
+// in MapsWidget::initialize()
+Marker *me = new Marker(Marker::MyLocationMarker);
+me->setCoordinate(QGeoCoordinate(-27.5796, 153.1));
+geoMap->addMapObject(me);
+ \endcode
+
+ Build and start the application, and we now have a "My Location" icon in
+ the centre of the initial view.
+
+ This now concludes the basic functionality of the map widget. We'll be
+ making a few modifications and improvements to it as we go along, but
+ the basic skeleton will remain the same.
+
+ Next, we'll add a basic GUI around the map widget, and the ability
+ to search for locations like addresses.
+*/
+
+/*!
+ \page tutorials-mapsdemo-part2.html
+
+ \previouspage Part 1 - The Map Widget
+ \contentspage {Maps Demo Tutorial} {Contents}
+ \nextpage Part 3 - Listening to satellites
+ \startpage Maps Demo Tutorial
+
+ \title Part 2 - Searching for locations
+
+ Now that we have a basic map widget, we want to add the capability
+ to search for addresses and locations and create markers for them
+ on the map.
+
+ \section2 Search classes
+
+ Searching in the Location API is handled by use of the QGeoSearchManager,
+ which we obtain in similar fashion to the MappingManager (in main() in
+ part 1). As we want to create markers for search results and then
+ be able to remove them for the next search (or perhaps other operations),
+ we need some way to organise collections of markers.
+
+ To do this, we introduce a new class, MarkerManager:
+
+ \code
+class MarkerManagerPrivate;
+class MarkerManager : public QObject
+{
+ Q_OBJECT
+public:
+ explicit MarkerManager(QGeoSearchManager *sm, QObject *parent=0);
+ ~MarkerManager();
+
+public slots:
+ void setMap(QGraphicsGeoMap *map);
+ void setMyLocation(QGeoCoordinate coord);
+ void search(QString query);
+ void removeSearchMarkers();
+
+signals:
+ void searchError(QGeoSearchReply::Error error, QString errorString);
+ void searchFinished();
+
+private:
+ MarkerManagerPrivate *d;
+
+private slots:
+ void replyFinished(QGeoSearchReply *reply);
+};
+ \endcode
+
+ The MarkerManager tracks both the "My Location" marker and a list of search
+ result markers. Implementing the My Location portion is nothing new:
+
+ \code
+class MarkerManagerPrivate
+{
+public:
+ Marker *myLocation;
+ QList<Marker*> searchMarkers;
+
+ QGraphicsGeoMap *map;
+ QGeoSearchManager *searchManager;
+
+ QSet<QGeoSearchReply*> forwardReplies;
+};
+
+MarkerManager::MarkerManager(QGeoSearchManager *searchManager, QObject *parent) :
+ QObject(parent),
+ d(new MarkerManagerPrivate)
+{
+ d->myLocation = new Marker(Marker::MyLocationMarker);
+ d->searchManager = searchManager;
+}
+
+MarkerManager::~MarkerManager()
+{
+ if (d->map)
+ d->map->removeMapObject(m_myLocation);
+ delete d->myLocation;
+ ...
+}
+
+void MarkerManager::setMap(QGraphicsGeoMap *map)
+{
+ ...
+ d->map = map;
+ d->map->addMapObject(d->myLocation);
+ ...
+}
+
+void MarkerManager::setMyLocation(QGeoCoordinate coord)
+{
+ d->myLocation->setCoordinate(coord);
+}
+ \endcode
+
+ To implement searching, we call the QGeoSearchManager::search method, which
+ returns a QGeoSearchReply. This reply object emits a signal finished() when
+ the search results are available. It can also be constructed already
+ finished, and we need to check for this first before connecting the signals.
+
+ We make use of the searchManager's version of the \a finished() signal, as
+ it gives out the necessary QGeoSearchReply* parameter so that we can have
+ one slot to handle both the case where the reply is constructed already
+ finished, and the case where the signal fires later.
+
+ \code
+MarkerManager::MarkerManager(QGeoSearchManager *searchManager, QObject *parent) :
+ ...
+{
+ ...
+ connect(d->searchManager, SIGNAL(finished(QGeoSearchReply*)),
+ this, SLOT(replyFinished(QGeoSearchReply*)));
+}
+
+void MarkerManager::search(QString query)
+{
+ QGeoSearchReply *reply = d->searchManager->search(query);
+
+ d->forwardReplies.insert(reply);
+ if (reply->isFinished()) {
+ replyFinished(reply);
+ } else {
+ connect(reply, SIGNAL(error(QGeoSearchReply::Error,QString)),
+ this, SIGNAL(searchError(QGeoSearchReply::Error,QString)));
+ }
+}
+ \endcode
+
+ The QGeoSearchReply yields its results as a list of QGeoPlace instances.
+ While these hold quite a bit of information, for now we'll just be using
+ them for their coordinates.
+
+ \code
+void MarkerManager::replyFinished(QGeoSearchReply *reply)
+{
+ if (!d->forwardReplies.contains(reply))
+ return;
+
+ // generate the markers and add them to the map
+ foreach (QGeoPlace place, reply->places()) {
+ Marker *m = new Marker(Marker::SearchMarker);
+ m->setCoordinate(place.coordinate());
+ d->searchMarkers.append(m);
+
+ if (d->map) {
+ d->map->addMapObject(m);
+ // also zoom out until marker is visible
+ while (!d->map->viewport().contains(place.coordinate()))
+ d->map->setZoomLevel(d->map->zoomLevel()-1);
+ }
+ }
+
+ d->forwardReplies.remove(reply);
+ reply->deleteLater();
+
+ emit searchFinished();
+}
+ \endcode
+
+ Next, we add two methods to MapsWidget to keep track of a MarkerManager
+ instance associated with its map:
+
+ \code
+class MapsWidget : public QWidget
+{
+ ...
+public:
+ void setMarkerManager(MarkerManager *markerManager);
+ MarkerManager *markerManager() const;
+
+ ...
+};
+
+class MapsWidgetPrivate
+{
+public:
+ MarkerManager *markerManager;
+ ...
+};
+ \endcode
+
+ And then add two small sections of code to connect them together:
+
+ \code
+void MapsWidget::initialize(QGeoMappingManager *manager)
+{
+ d->map = new GeoMap(manager, this);
+ if (d->markerManager)
+ d->markerManager->setMap(d->map);
+ ...
+}
+
+void MapsWidget::setMarkerManager(MarkerManager *markerManager)
+{
+ d->markerManager = markerManager;
+ if (d->map)
+ d->markerManager->setMap(d->map);
+}
+ \endcode
+
+ Now we have basic search capability added to our code. But we still
+ have no GUI to drive it, and so we'll focus on that in the next section.
+
+ \section2 GUI with search dialog
+
+ Next we'll build a GUI around our map widget and add a search dialog to
+ make use of the code we just wrote. Our finished GUI looks like this:
+
+ \image mapsdemo-searchgui.png
+
+ We won't cover building the GUI in too much detail (that being the
+ subject of other tutorials), but the complete code is in the finished
+ MapsDemo example in the QtLocation part of the Qt distribution.
+
+ Our GUI consists of a QMainWindow containing our MapsWidget and a QMenuBar.
+ On the QMenuBar is an option for zooming to the current "My Location", and
+ a menu for performing search operations.
+
+ Also part of the GUI is the dialog box displayed when selecting "Search
+ for address or name" -- this is a simple QDialog subclass with a QFormLayout
+ and a QDialogButtonBox.
+
+ In the MainWindow constructor, we simply set up the menubar and MapsWidget
+ and other UI details. All initialization of Location-based details are in
+ the MainWindow::initialize() slot. For the moment, we will simply assume
+ that initialize() is called directly from the constructor (the purpose of
+ this decoupling will be explained later).
+
+ \code
+void MainWindow::initialize()
+{
+ if (serviceProvider)
+ delete serviceProvider;
+
+ QList<QString> providers = QGeoServiceProvider::availableServiceProviders();
+ if (providers.size() < 1) {
+ QMessageBox::information(this, tr("Maps Demo"),
+ tr("No service providers are available"));
+ QCoreApplication::quit();
+ return;
+ }
+
+ serviceProvider = new QGeoServiceProvider(providers[0]);
+ if (serviceProvider->error() != QGeoServiceProvider::NoError) {
+ QMessageBox::information(this, tr("Maps Demo"),
+ tr("Error loading geoservice plugin: %1").arg(providers[0]));
+ QCoreApplication::quit();
+ return;
+ }
+
+ mapsWidget->initialize(serviceProvider->mappingManager());
+ markerManager = new MarkerManager(serviceProvider->searchManager());
+ mapsWidget->setMarkerManager(markerManager);
+
+ connect(markerManager, SIGNAL(searchError(QGeoSearchReply::Error,QString)),
+ this, SLOT(showErrorMessage(QGeoSearchReply::Error,QString)));
+
+ mapsWidget->setMyLocation(QGeoCoordinate(-27.5796, 153.1));
+}
+ \endcode
+
+ As you can see, this performs more or less the same actions as our old
+ code in main() from part 1 of the tutorial did. It fetches the first
+ available service provider, then initializes the MapsWidget and
+ MarkerManager using the appropriate Manager instances.
+
+ Additionally, we've added a setMyLocation() method to MapsWidget which
+ simply calls the current MarkerManager's method of the same name, plus
+ centreing the view on the marker.
+
+ The "Search for address or name" menu item sets off the showSearchDialog()
+ slot:
+
+ \code
+void MainWindow::showSearchDialog()
+{
+ SearchDialog sd;
+ if (sd.exec() == QDialog::Accepted) {
+ if (markerManager) {
+ markerManager->removeSearchMarkers();
+ markerManager->search(sd.searchTerms());
+ }
+ }
+}
+ \endcode
+
+ Which uses the methods on MarkerManager that we defined previously. So now
+ we have a basic searchable mapping application. However, there is one big
+ piece of functionality missing for a searchable map: consider if we had
+ a provider that allowed us to search for local businesses. We might type
+ in a business name in the Search dialog and press OK, and then be presented
+ with tens or hundreds of businesses that match the name we typed from all
+ around the world. Some of these results might not even be the kind of
+ business we were looking for (partial text matches etc).
+
+ This can be solved with the addition of two key features: viewing the extra
+ details about search results that we're currently throwing away; and adding
+ the ability to limit the search area.
+
+ \section2 Adding details to search markers
+
+ First up, we'll add some additional properties to the Marker class:
+
+ \code
+class Marker : public QGeoMapPixmapObject
+{
+ ....
+public:
+ QString name() const;
+ void setName(QString name);
+
+ QGeoAddress address() const;
+ void setAddress(QGeoAddress addr);
+
+ bool moveable() const;
+ void setMoveable(bool moveable);
+ ...
+};
+
+class MarkerPrivate
+{
+public:
+ ...
+ QString name;
+ bool moveable;
+ QGeoAddress address;
+};
+ \endcode
+
+ And add code to MarkerManager to set them from search results:
+
+ \code
+void MarkerManager::replyFinished(QGeoSearchReply *reply)
+{
+ ...
+ foreach (QGeoPlace place, reply->places()) {
+ Marker *m = new Marker(Marker::SearchMarker);
+
+ m->setCoordinate(place.coordinate());
+ if (place.isLandmark()) {
+ QLandmark lm(place);
+ m->setName(lm.name());
+ } else {
+ m->setName(QString("%1, %2").arg(place.address().street())
+ .arg(place.address().city()));
+ }
+ m->setAddress(place.address());
+ m->setMoveable(false);
+ ...
+ \endcode
+
+ So now the data is available from the Marker objects. We want to show
+ this to the user somehow, though, and the best means of doing this is
+ probably a dialog box. We're going to do a dialog box that appears when
+ the user clicks a marker, so we'll have to add click detection to
+ MapsWidget and GeoMap, first.
+
+ We already have methods for handling mouse presses and releases over
+ the map widget, so we will modify these. Add two private fields and a
+ signal to GeoMap:
+
+ \code
+class GeoMap : public QGraphicsGeoMap
+{
+ ...
+signals:
+ void clicked(Marker *marker);
+
+private:
+ ...
+ bool markerPressed;
+ QGeoMapObject *pressed;
+ ...
+};
+ \endcode
+
+ We set the \c markerPressed flag when the mouse has been pressed over a
+ map object, and set \c pressed to the map object in question.
+
+ \code
+void GeoMap::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ panActive = true;
+
+ markerPressed = false;
+ QList<QGeoMapObject*> objects = mapObjectsAtScreenPosition(event->pos());
+ if (objects.size() > 0) {
+ pressed = objects.first();
+ markerPressed = true;
+ }
+
+ event->accept();
+}
+
+void GeoMap::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ panActive = false;
+
+ if (markerPressed) {
+ // check if we're still over the object
+ QList<QGeoMapObject*> objects = mapObjectsAtScreenPosition(event->pos());
+ if (objects.contains(pressed)) {
+ Marker *m = dynamic_cast<Marker*>(pressed);
+ if (m)
+ emit clicked(m);
+ }
+
+ markerPressed = false;
+ }
+
+ event->accept();
+}
+ \endcode
+
+ Finally, we need to pass this clicked() signal up through MapsWidget so
+ that we can use it from outside. We do this by adding a signal and
+ connecting GeoMap's signal to the signal on MapsWidget with the same
+ name.
+
+ \code
+class MapsWidget : public QWidget
+{
+ ...
+signals:
+ void markerClicked(Marker *m);
+ ...
+};
+
+void MapsWidget::initialize(QGeoMappingManager *manager)
+{
+ ...
+ connect(d->map, SIGNAL(clicked(Marker*)),
+ this, SIGNAL(markerClicked(Marker*)));
+}
+ \endcode
+
+ Now that's done, creating a dialog box to display the address information
+ is relatively trivial. The MarkerDialog class contains a QLineEdit for the
+ name field, a readonly QLabel for the address, and two QDoubleSpinBoxes
+ for latitude and longitude.
+
+ We connect up the MapsWidget's markerClicked() signal to a slot in
+ MainWindow:
+
+ \code
+void MainWindow::showMarkerDialog(Marker *marker)
+{
+ MarkerDialog md(marker);
+ if (md.exec() == QDialog::Accepted) {
+ marker->setName(md.markerName());
+ QGeoCoordinate c(md.latitude(), md.longitude());
+ marker->setCoordinate(c);
+ }
+}
+ \endcode
+
+ And now clicking on markers on the map yields a simple editing dialog box, so
+ our first task is complete.
+
+ \section2 Limiting search area
+
+ The QGeoSearchManager's search() method already comes with support for
+ limited search areas -- by setting up a QGeoBoundingArea we can take
+ advantage of this functionality.
+
+ Firstly, we'll modify the MarkerManager's search() method:
+
+ \code
+// declaration
+void search(QString query, qreal radius=-1);
+
+// implementation
+void MarkerManager::search(QString query, qreal radius)
+{
+ QGeoSearchReply *reply;
+ if (radius > 0) {
+ QGeoBoundingCircle boundingCircle(m_myLocation->coordinate(), radius);
+ reply = d->searchManager->search(query,
+ QGeoSearchManager::SearchAll,
+ -1, 0,
+ boundingCircle);
+ } else {
+ reply = d->searchManager->search(query);
+ }
+
+ if (reply->isFinished()) {
+ ...
+ \endcode
+
+ And now we need to modify the UI to expose this to the user. There are
+ a few ways of doing this, but the option we'll take is to expose a
+ QComboBox with some preset distances. This is easier to use on
+ touch screen devices, especially, where entering numbers often takes
+ much more effort from the user than selecting an option.
+
+ \code
+// in SearchDialog constructor
+whereCombo = new QComboBox();
+whereCombo->addItem(tr("Nearby (<10km)"), 10000);
+whereCombo->addItem(tr("Within 30 mins drive of me (<25km)"), 25000);
+whereCombo->addItem(tr("Within 100km of me"), 100000);
+whereCombo->addItem(tr("Anywhere in the world"), -1);
+whereCombo->setCurrentIndex(1);
+formLayout->addRow(tr("Where"), whereCombo);
+ \endcode
+
+ Then to get the radius value to put into search, we simply take the user
+ data from the QComboBox, convert it to a qreal and pass it through.
+
+ So we now have a searchable map, with clickable markers and the ability
+ to limit the search radius. The last feature we'll cover that relates to
+ searching is the so-called "reverse geocode" technique.
+
+ \section2 Reverse geocode
+
+ Currently, if you click the My Location icon on our map application, a
+ blank address is displayed. We can add the capability here to turn the
+ current coordinates of the marker into an approximate address, and the
+ technique is known as "reverse geocode" searching.
+
+ To implement this, we'll hook into the coordinateChanged() signal of
+ the Marker object:
+
+ \code
+MarkerManager::MarkerManager(QGeoSearchManager *searchManager, QObject *parent) :
+ QObject(parent),
+ d(new MarkerManagerPrivate)
+{
+ d->searchManager = searchManager;
+ d->myLocation = new Marker(Marker::MyLocationMarker);
+ d->myLocation->setName("Me");
+
+ ...
+
+ // hook the coordinateChanged() signal for reverse geocoding
+ connect(d->myLocation, SIGNAL(coordinateChanged(QGeoCoordinate)),
+ this, SLOT(myLocationChanged(QGeoCoordinate)));
+}
+ \endcode
+
+ Then we perform the reverse lookup in the myLocationChanged() slot. This
+ looks quite similar to the original search() method, with good reason, as
+ the reverse geocode lookup is simply a special kind of search call.
+
+ \code
+void MarkerManager::myLocationChanged(QGeoCoordinate location)
+{
+ QGeoSearchReply *reply = d->searchManager->reverseGeocode(location);
+
+ d->reverseReplies.insert(reply);
+ if (reply->isFinished())
+ reverseReplyFinished(reply);
+}
+
+void MarkerManager::reverseReplyFinished(QGeoSearchReply *reply)
+{
+ if (!d->reverseReplies.contains(reply))
+ return;
+
+ if (reply->places().size() > 0) {
+ QGeoPlace place = reply->places().first();
+ d->myLocation->setAddress(place.address());
+ }
+
+ reply->deleteLater();
+}
+ \endcode
+
+ However, this isn't going to work very well with a GPS updating myLocation
+ on a regular basis and a slow network connection, as the requests
+ will pile up and the geocoded coordinates will lag behind the reported
+ ones by quite a margin. A simple scheme to solve this relies only
+ on two boolean flags:
+
+ \code
+class MarkerManagerPrivate
+{
+public:
+ ...
+ // a reverse geocode request is currently running
+ bool revGeocodeRunning;
+ // a request is currently running, and my location has changed
+ // since it started (ie, the request is stale)
+ bool myLocHasMoved;
+};
+
+void MarkerManager::myLocationChanged(QGeoCoordinate location)
+{
+ if (d->revGeocodeRunning) {
+ d->myLocHasMoved = true;
+ } else {
+ QGeoSearchReply *reply = d->searchManager->reverseGeocode(location);
+ d->reverseReplies.insert(reply);
+
+ d->myLocHasMoved = false;
+
+ if (reply->isFinished()) {
+ d->revGeocodeRunning = false;
+ reverseReplyFinished(reply);
+ } else {
+ d->revGeocodeRunning = true;
+ }
+ }
+}
+
+void MarkerManager::reverseReplyFinished(QGeoSearchReply *reply)
+{
+ if (!d->reverseReplies.contains(reply))
+ return;
+
+ // set address, as before
+
+ d->revGeocodeRunning = false;
+ if (d->myLocHasMoved)
+ myLocationChanged(d->myLocation->coordinate());
+
+ d->reverseReplies.remove(reply);
+ reply->deleteLater();
+}
+ \endcode
+
+ A reverse geocode request is only sent if the previous one has
+ finished -- if it hasn't finished, a flag is set so that the location
+ will be refreshed at the conclusion of the previous request. This is
+ far from a perfect scheme, but in practise it works quite well.
+
+ At the end of part 2 now, we have a searchable map with a simple GUI,
+ clickable markers, the ability to limit search radius about our location,
+ and reverse geocoding to work out the address of where we are. This is
+ already quite a bit of useful functionality, but we will continue to
+ extend it further.
+
+ In part 3, we will add support for using platform positioning methods such
+ as GPS, and in part 4 we will add the ability to fetch directions to a given
+ destination. Finally, in part 5 we will cover a number of points about
+ means for achieving a better user experience on mobile platforms.
+*/
+
+/*!
+ \page tutorials-mapsdemo-part3.html
+
+ \previouspage Part 2 - Searching for locations
+ \contentspage {Maps Demo Tutorial} {Contents}
+ \nextpage Part 4 - Stopping for directions
+ \startpage Maps Demo Tutorial
+
+ \title Part 3 - Listening to satellites
+
+ Another useful part of the Location API is the ability to receive updates
+ of the user's present geographic location from methods such as GPS or
+ network positioning. We're going to add support to our MapsDemo for
+ using these methods to update the "my location" marker we've already
+ added in parts 1 and 2 of this tutorial.
+
+ But first we need an attractive way to present status messages to the user
+ while they are busy looking at the map. We're going to do this using an
+ animated translucent rectangle at the bottom of the display.
+
+ \section2 Animated status bar
+
+ First, set up the map to resize automatically:
+
+ \code
+class MapsWidget : public QWidget
+{
+ ...
+private:
+ void resizeEvent(QResizeEvent *event);
+ void showEvent(QShowEvent *event);
+};
+
+void MapsWidget::resizeEvent(QResizeEvent *event)
+{
+ if (d->view && d->map) {
+ d->view->resize(size());
+ d->map->resize(size());
+ d->view->centerOn(d->map);
+ }
+}
+
+void MapsWidget::showEvent(QShowEvent *event)
+{
+ if (d->view && d->map) {
+ d->view->resize(size());
+ d->map->resize(size());
+ d->view->centerOn(d->map);
+ }
+}
+ \endcode
+
+ And now we add our new StatusBarItem class:
+
+ \code
+class StatusBarItemPrivate;
+class StatusBarItem : public QObject, public QGraphicsRectItem
+{
+ Q_OBJECT
+ Q_PROPERTY(int offset READ offset WRITE setOffset)
+
+public:
+ StatusBarItem();
+ ~StatusBarItem();
+
+ int offset() const;
+ void setRect(qreal x, qreal y, qreal w, qreal h);
+
+public slots:
+ void setText(QString text);
+
+ void showText(QString text, quint32 timeout=3000);
+ void show();
+ void hide();
+
+ void setOffset(int offset);
+
+private:
+ StatusBarItemPrivate *d;
+};
+ \endcode
+
+ Note that the order of base classes here is very important: QObject
+ and then QGraphicsRectItem. Re-ordering the base classes will cause
+ the code not to compile, as QGraphicsRectItem does not have a
+ meta-object (for more details consult the documentation in Qt).
+
+ The \a offset property here is added so that when we come to animating
+ our status bar, we can handle the case where the bar is sliding in
+ and the window is being resized simultaneously. If we simply animated
+ the \a y property of the GraphicsItem instead we would have difficulty
+ handling this case.
+
+ Now add a pointer to one of these in MapsWidgetPrivate (and matching
+ accessor methods):
+
+ \code
+class MapsWidgetPrivate
+{
+public:
+ ...
+ StatusBarItem *statusBarItem;
+};
+ \endcode
+
+ And we're ready for the implementation. The constructor is not terribly
+ exciting, but sets the defaults for everything:
+
+ \code
+class StatusBarItemPrivate
+{
+public:
+ int offset;
+ QGraphicsSimpleTextItem *textItem;
+};
+
+StatusBarItem::StatusBarItem() :
+ d(new StatusBarItemPrivate)
+{
+ d->offset = 0;
+
+ setPen(QPen(QBrush(), 0));
+ setBrush(QBrush(QColor(0,0,0,120)));
+
+ d->textItem = new QGraphicsSimpleTextItem(this);
+ d->textItem->setBrush(QBrush(Qt::white));
+
+ setText("");
+}
+ \endcode
+
+ The \a setText function, however, is more interesting;
+
+ \code
+void StatusBarItem::setText(QString text)
+{
+ d->textItem->setText(text);
+ QRectF rect = d->textItem->boundingRect();
+ QPointF delta = this->rect().center() - rect.center();
+ d->textItem->setPos(delta.x(), delta.y());
+}
+ \endcode
+
+ This re-centers the \a textItem inside its parent (the StatusBarItem)
+ every time the text changes.
+
+ Also, the \a setRect method is used to update the size and position of
+ the status bar:
+
+ \code
+void StatusBarItem::setRect(qreal x, qreal y, qreal w, qreal h)
+{
+ QGraphicsRectItem::setRect(x, y + d->offset, w, h);
+ setText(d->textItem->text());
+}
+ \endcode
+
+ Here we see the use of the \a offset property for the first time. The
+ idea is to call \a setRect to specify a rectangle that is below
+ the bottom of the visible area in the QGraphicsView. Then \a offset
+ is used to bump the status bar up into the visible area when needed.
+
+ Whenever we change the offset we should re-calculate our own \a y
+ value using the rect and the offset together:
+
+ \code
+void StatusBarItem::setOffset(int offset)
+{
+ this->setY(this->y() - d->offset + offset);
+ d->offset = offset;
+}
+ \endcode
+
+ And now finally, the animations:
+
+ \code
+void StatusBarItem::show()
+{
+ QPropertyAnimation *anim = new QPropertyAnimation(this, "offset");
+ anim->setStartValue(0);
+ anim->setEndValue(-1 * rect().height());
+ anim->setDuration(500);
+ anim->start(QAbstractAnimation::DeleteWhenStopped);
+}
+
+void StatusBarItem::hide()
+{
+ QPropertyAnimation *anim = new QPropertyAnimation(this, "offset");
+ anim->setStartValue(d->offset);
+ anim->setEndValue(0);
+ anim->setDuration(500);
+ anim->start(QAbstractAnimation::DeleteWhenStopped);
+}
+ \endcode
+
+ You can see here that we simply use QPropertyAnimations on the \a offset
+ property we just defined. This produces a nice linear slide in and out
+ whenever \a show() or \a hide() are called.
+
+ Lastly, one convenience method:
+
+ \code
+void StatusBarItem::showText(QString text, quint32 timeout)
+{
+ setText(text);
+ show();
+ QTimer::singleShot(timeout, this, SLOT(hide()));
+}
+ \endcode
+
+ This lets us more easily display a status message when we only want it
+ to appear and disappear soon afterwards.
+
+ Then we have only to add this into our MapsWidget:
+
+ \code
+void MapsWidget::initialize(QGeoMappingManager *manager)
+{
+ QGraphicsScene *sc;
+ ...
+ d->statusBarItem = new StatusBarItem;
+ sc->addItem(d->statusBarItem);
+}
+
+void MapsWidget::resizeEvent(QResizeEvent *event)
+{
+ if (d->view && d->map) {
+ ...
+ d->statusBarItem->setRect(0, height(), width(), 20);
+ }
+}
+
+// and similarly in MapsWidget::showEvent()
+ \endcode
+
+ \section2 Getting GPS data
+
+ Now we move on to the focus of this section: GPS data and how to get it.
+ The QGeoPositionInfoSource class gives a convenient interface to
+ receive position updates. We're going to add one to our MainWindow:
+
+ \code
+class MainWindow : public QMainWindow
+{
+private:
+ QGeoPositionInfoSource *positionSource;
+
+private slots:
+ // slot to receive updates
+ void updateMyPosition(QGeoPositionInfo info);
+};
+ \endcode
+
+ And in \a initialize() we'll set it up. We're just using whatever the
+ default position source for the platform happens to be, at an update
+ interval of 1000ms, which is plenty for a basic maps application. Once
+ set up, we call the source's \a startUpdates() method to begin receiving
+ position updates.
+
+ \code
+void MainWindow::initialize()
+{
+ ...
+ if (positionSource)
+ delete positionSource;
+
+ positionSource = QGeoPositionInfoSource::createDefaultSource(this);
+
+ if (!positionSource) {
+ mapsWidget->statusBar()->showText("Could not open GPS", 5000);
+ mapsWidget->setMyLocation(QGeoCoordinate(-27.5796, 153.1));
+ } else {
+ positionSource->setUpdateInterval(1000);
+ connect(positionSource, SIGNAL(positionUpdated(QGeoPositionInfo)),
+ this, SLOT(updateMyPosition(QGeoPositionInfo)));
+ positionSource->startUpdates();
+ mapsWidget->statusBar()->showText("Opening GPS...");
+ }
+}
+ \endcode
+
+ Here we also make use of the StatusBarItem to display a message when
+ we are able or unable to open the QGeoPositionInfoSource.
+
+ And then in the slot \a updateMyPosition, we use this to set the
+ myLocation marker.
+
+ \code
+void MainWindow::updateMyPosition(QGeoPositionInfo info)
+{
+ if (mapsWidget) {
+ mapsWidget->setMyLocation(info.coordinate());
+ }
+}
+ \endcode
+
+ So, running the code as is, we have a moving marker for "My Location"
+ that follows our actual GPS or network-sourced location. If you start
+ driving your car with this app running however, you'll quickly notice
+ the fact that the viewport does not pan to follow you as you leave
+ the map area.
+
+ We could simply add a call to \a setCenter() on the map object in the
+ \a updateMyPosition slot, but in the interests of prettiness, we are
+ going to make a nice smoothly animated transition instead.
+
+ \section2 Following and animated panning
+
+ First, add a new boolean member variable to MainWindow, called
+ \a tracking, to keep track of whether the viewport is currently
+ following the My Location marker:
+
+ \code
+class MainWindow : public QMainWindow
+{
+private:
+ bool tracking;
+ ...
+};
+ \endcode
+
+ Our intended design is that initially, the viewport will be in tracking
+ mode. It will continue this way until the view is manually panned by
+ the user, at which point tracking will stop. Then, if the user clicks
+ the "My Location" menu option to re-center the map, we resume tracking
+ once again.
+
+ So we will need a way to notify the MainWindow that the user has panned
+ the view. Add a new signal \a mapPanned() to MapsWidget, and a
+ corresponding signal \a panned() to GeoMap, as we did for \a clicked().
+
+ \code
+class MapsWidget : public QWidget
+{
+signals:
+ void mapPanned();
+ ...
+};
+
+class GeoMap : public QGraphicsGeoMap
+{
+signals:
+ void panned();
+ ...
+};
+
+void MapsWidget::initialize(QGeoMappingManager *manager)
+{
+ ...
+ connect(geoMap, SIGNAL(panned()),
+ this, SIGNAL(mapPanned()));
+ ...
+}
+ \endcode
+
+ And now we simply emit it when a user pan takes place:
+
+ \code
+void GeoMap::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
+{
+ if (panActive) {
+ ...
+ emit panned();
+ }
+ ...
+}
+ \endcode
+
+ Back up in MainWindow, we create a slot \a disableTracking and hook up the
+ new signal to it:
+
+ \code
+class MainWindow : public QMainWindow
+{
+ ...
+private slots:
+ ...
+ void disableTracking();
+ ...
+};
+
+void MainWindow::initialize()
+{
+ ...
+ connect(mapsWidget, SIGNAL(mapPanned()),
+ this, SLOT(disableTracking()));
+ ...
+}
+ \endcode
+
+ And finally in the slot itself we simply set the flag we created earlier:
+
+ \code
+void MainWindow::disableTracking()
+{
+ tracking = false;
+}
+ \endcode
+
+ Next we want animated panning to be available. Add a new method on
+ MapsWidget:
+
+ \code
+class MapsWidget : public QWidget
+{
+public:
+ ...
+ void animatedPanTo(QGeoCoordinate center);
+ ...
+};
+ \endcode
+
+ To do animations in Qt, it's always easiest if we can make use of a
+ QPropertyAnimation, and to do this you need a Q_PROPERTY to act upon.
+ We'll use two animations in parallel, one moving latitude and one moving
+ longitude, so we need two Q_PROPERTIES:
+
+ \code
+class GeoMap : public QGraphicsGeoMap
+{
+ Q_OBJECT
+
+ Q_PROPERTY(double centerLatitude READ centerLatitude WRITE setCenterLatitude)
+ Q_PROPERTY(double centerLongitude READ centerLongitude WRITE setCenterLongitude)
+
+public:
+ ...
+ double centerLatitude() const;
+ void setCenterLatitude(double lat);
+ double centerLongitude() const;
+ void setCenterLongitude(double lon);
+ ...
+};
+ \endcode
+
+ These functions simply adjust the corresponding value on \a center() and
+ then call \a setCenter() with the new \a QGeoCoordinate.
+
+ Now we can implement our \a animatedPanTo() method:
+
+ \code
+void MapsWidget::animatedPanTo(QGeoCoordinate center)
+{
+ if (!d->map)
+ return;
+
+ QPropertyAnimation *latAnim = new QPropertyAnimation(d->map, "centerLatitude");
+ latAnim->setEndValue(center.latitude());
+ latAnim->setDuration(200);
+ QPropertyAnimation *lonAnim = new QPropertyAnimation(d->map, "centerLongitude");
+ lonAnim->setEndValue(center.longitude());
+ lonAnim->setDuration(200);
+
+ QParallelAnimationGroup *group = new QParallelAnimationGroup;
+ group->addAnimation(latAnim);
+ group->addAnimation(lonAnim);
+ group->start(QAbstractAnimation::DeleteWhenStopped);
+}
+ \endcode
+
+ To bring it all together, we make the last few changes in MainWindow:
+
+ \code
+void MainWindow::goToMyLocation()
+{
+ mapsWidget->animatedPanTo(markerManager->myLocation());
+ tracking = true;
+}
+
+void MainWindow::updateMyPosition(QGeoPositionInfo info)
+{
+ if (mapsWidget) {
+ mapsWidget->setMyLocation(info.coordinate());
+ if (tracking)
+ mapsWidget->animatedPanTo(info.coordinate());
+ }
+}
+ \endcode
+
+ And now we have the simple location tracking functionality we set out to
+ implement.
+*/
+
+/*!
+ \page tutorials-mapsdemo-part4.html
+
+ \previouspage Part 3 - Listening to satellites
+ \contentspage {Maps Demo Tutorial} {Contents}
+ \nextpage Part 5 - Tuning for mobile devices
+ \startpage Maps Demo Tutorial
+
+ \title Part 4 - Stopping for directions
+
+ To complete our tour of the Maps API, we're going to add some very basic
+ support for finding transport routes across a map. There is much more
+ functionality available in the routing and navigation API than we are
+ going to use, though some backend plugins may place restrictions on its
+ use to develop, for example, voice-aided navigation applications (such
+ as the Nokia Ovi maps plugin).
+
+ \image mapsdemo-routing.png
+
+ We are going to add support for a simple dialog that can be used to search
+ for a destination point and display a line on the map giving the route from
+ the current GPS "My Location" (which we implemented in part 3) to that
+ destination.
+
+ First, we implement the dialog along similar lines to the SearchDialog we
+ created earlier:
+
+ \code
+class NavigateDialog : public QDialog
+{
+ Q_OBJECT
+public:
+ NavigateDialog(QWidget *parent=0);
+ ~NavigateDialog();
+
+ QString destinationAddress() const;
+ QGeoRouteRequest::TravelModes travelMode() const;
+
+private:
+ QLineEdit *addressEdit;
+ QComboBox *modeCombo;
+};
+ \endcode
+
+ Once again we make use of a QFormLayout inside the dialog to align the
+ widgets together. We have a QLineEdit for the address of the destination,
+ and a QComboBox listing possible travel modes.
+
+ In MainWindow, we create a new slot for showing the navigate dialog:
+
+ \code
+void MainWindow::showNavigateDialog()
+{
+ NavigateDialog nd;
+ if (nd.exec() == QDialog::Accepted) {
+ if (markerManager) {
+ // will fill this out later
+ }
+ }
+}
+ \endcode
+
+ And we hook it up to a Menu action:
+
+ \code
+MainWindow::MainWindow() :
+ ...
+{
+ ...
+ QMenu *navigateMenu = new QMenu("Directions");
+ mbar->addMenu(navigateMenu);
+
+ navigateMenu->addAction("From here to address", this, SLOT(showNavigateDialog()));
+ ....
+}
+ \endcode
+
+ Now we need a new class to manage routing. Finding a route to an address
+ is a two-stage process: first, a geocode search is performed on the
+ address to get a lat/lon coordinate. Then this coordinate is used in
+ a route request which finally returns the desired route.
+
+ Our new class is called Navigator, and includes private slots to handle
+ each of these events:
+
+ \code
+class Navigator : public QObject
+{
+ Q_OBJECT
+public:
+ Navigator(QGeoRoutingManager *routingManager, QGeoSearchManager *searchManager,
+ MapsWidget *mapsWidget, const QString &address,
+ const QGeoRouteRequest &requestTemplate);
+ ~Navigator();
+
+ void start();
+ QGeoRoute route() const;
+
+signals:
+ void finished();
+ void searchError(QGeoSearchReply::Error error, QString errorString);
+ void routingError(QGeoRouteReply::Error error, QString errorString);
+
+private slots:
+ void on_addressSearchFinished();
+ void on_routingFinished();
+
+private:
+ QString address;
+ QGeoRouteRequest request;
+
+ QGeoRoutingManager *routingManager;
+ QGeoSearchManager *searchManager;
+ MapsWidget *mapsWidget;
+
+ QGeoSearchReply *addressReply;
+ QGeoRouteReply *routeReply;
+
+ QGeoMapRouteObject *routeObject;
+ Marker *endMarker;
+ Marker *startMarker;
+
+ QGeoRoute firstRoute;
+};
+ \endcode
+
+ The intended lifecycle of a Navigator is to be created when the dialog
+ is accepted, then \a start() is called to begin the requests. The
+ requests will either error out or complete, emitting one of \a finished(),
+ \a searchError(), or \a routingError() signals. If the request is
+ successful, the Navigator creates the appropriate markers and draws
+ the route on the map (using a QGeoMapRouteObject). It then owns these
+ map objects and will remove them when deleted.
+
+ Now for the Navigator's implementation: first, the \a start() method,
+ which begins the process by launching the search request.
+
+ A QGeoRouteRequest is specified first and foremost by the points the
+ route must pass through (the \a waypoints). In our case we only
+ wish two have two waypoints, the user's starting location, and the
+ destination. We add the first of these in \a start() and the second
+ after the search request returns.
+
+ \code
+void Navigator::start()
+{
+ QList<QGeoCoordinate> waypoints = request.waypoints();
+ waypoints.append(mapsWidget->markerManager()->myLocation());
+ request.setWaypoints(waypoints);
+
+ startMarker = new Marker(Marker::StartMarker);
+ startMarker->setCoordinate(mapsWidget->markerManager()->myLocation());
+ startMarker->setName("Start point");
+ mapsWidget->map()->addMapObject(startMarker);
+
+ addressReply = searchManager->search(address);
+ if (addressReply->isFinished()) {
+ on_addressSearchFinished();
+ } else {
+ connect(addressReply, SIGNAL(error(QGeoSearchReply::Error,QString)),
+ this, SIGNAL(searchError(QGeoSearchReply::Error,QString)));
+ connect(addressReply, SIGNAL(finished()),
+ this, SLOT(on_addressSearchFinished()));
+ }
+}
+ \endcode
+
+ After the request finishes, the \a on_addressSearchFinished() slot will
+ be invoked, which finishes off the routing request and sends it in a
+ similar fashion:
+
+ \code
+void Navigator::on_addressSearchFinished()
+{
+ if (addressReply->places().size() <= 0) {
+ addressReply->deleteLater();
+ return;
+ }
+
+ QGeoPlace place = addressReply->places().at(0);
+
+ QList<QGeoCoordinate> waypoints = request.waypoints();
+ waypoints.append(place.coordinate());
+ request.setWaypoints(waypoints);
+
+ routeReply = routingManager->calculateRoute(request);
+ if (routeReply->isFinished()) {
+ on_routingFinished();
+ } else {
+ connect(routeReply, SIGNAL(error(QGeoRouteReply::Error,QString)),
+ this, SIGNAL(routingError(QGeoRouteReply::Error,QString)));
+ connect(routeReply, SIGNAL(finished()),
+ this, SLOT(on_routingFinished()));
+ }
+
+ endMarker = new Marker(Marker::EndMarker);
+ endMarker->setCoordinate(place.coordinate());
+ endMarker->setAddress(place.address());
+ endMarker->setName("Destination");
+ mapsWidget->map()->addMapObject(endMarker);
+
+ addressReply->deleteLater();
+}
+ \endcode
+
+ And then finally, when the routing request returns we can create
+ the route object on the map and emit \a finished():
+
+ \code
+void Navigator::on_routingFinished()
+{
+ if (routeReply->routes().size() <= 0) {
+ emit routingError(QGeoRouteReply::NoError, "No valid routes returned");
+ routeReply->deleteLater();
+ return;
+ }
+
+ QGeoRoute route = routeReply->routes().at(0);
+ firstRoute = route;
+
+ routeObject = new QGeoMapRouteObject;
+ routeObject->setRoute(route);
+ routeObject->setPen(QPen(Qt::blue, 2.0));
+
+ mapsWidget->map()->addMapObject(routeObject);
+
+ emit finished();
+ routeReply->deleteLater();
+}
+ \endcode
+
+ Now in MainWindow we have to create a new Navigator instance after
+ the dialog returns. We store the Navigator instance in a member
+ variable so that we can delete the last one in order to remove
+ its map objects before the new one is constructed:
+
+ \code
+class MainWindow : public QMainWindow
+{
+private:
+ Navigator *lastNavigator;
+ ...
+};
+
+void MainWindow::showNavigateDialog()
+{
+ NavigateDialog nd;
+ if (nd.exec() == QDialog::Accepted) {
+ if (markerManager) {
+ QGeoRouteRequest req;
+
+ req.setTravelModes(nd.travelMode());
+
+ if (lastNavigator)
+ lastNavigator->deleteLater();
+
+ Navigator *nvg = new Navigator(serviceProvider->routingManager(),
+ serviceProvider->searchManager(),
+ mapsWidget, nd.destinationAddress(),
+ req);
+
+ lastNavigator = nvg;
+
+ connect(nvg, SIGNAL(searchError(QGeoSearchReply::Error,QString)),
+ this, SLOT(showErrorMessage(QGeoSearchReply::Error,QString)));
+ connect(nvg, SIGNAL(routingError(QGeoRouteReply::Error,QString)),
+ this, SLOT(showErrorMessage(QGeoRouteReply::Error,QString)));
+
+ mapsWidget->statusBar()->setText("Routing...");
+ mapsWidget->statusBar()->show();
+
+ nvg->start();
+
+ connect(nvg, SIGNAL(finished()),
+ mapsWidget->statusBar(), SLOT(hide()));
+ }
+ }
+}
+ \endcode
+
+ And now we have basic support for calculating and displaying
+ routes on the map. In addition to this, we could quite easily
+ use the QGeoRoute object to show a list of directions and
+ overall statistics about the journey. For more information see
+ the documentation about QGeoRoute.
+
+ In the final part of this tutorial, we will optimise the maps
+ demo so far for mobile platforms in order to deploy it to a
+ phone.
+*/
+
+/*!
+ \page tutorials-mapsdemo-part5.html
+
+ \previouspage Part 4 - Stopping for directions
+ \contentspage {Maps Demo Tutorial} {Contents}
+ \startpage Maps Demo Tutorial
+
+ \title Part 5 - Tuning for mobile devices
+
+ So far in this tutorial we've been mainly aiming at desktop use
+ of the application. If you attempted to build it as is for
+ a mobile platform you would quite quickly notice a number of
+ issues that prevent it from being really usable, and we will
+ now address these one by one.
+
+ \section2 Network connection management
+
+ Most mobile platforms have multiple network connections, which
+ are not connected all the time, and change regularly in
+ operation. Qt provides the Bearer API for managing these
+ and the events that occur with them.
+
+ At present when our application starts it simply assumes that
+ a network link is available and that a mapping plugin will
+ load. This could quite easily not be the case, so we will use
+ the Bearer API to verify the state of the network and ensure
+ that it is running before we call \a initialize().
+
+ First up, we need a QNetworkConfigurationManager in order to
+ get at the default configuration of our environment:
+
+ \code
+class MainWindow : public QMainWindow
+{
+ ...
+private:
+ QNetworkConfigurationManager *netConfigManager;
+};
+ \endcode
+
+ We create it in the constructor of \a MainWindow. As mentioned
+ in the documentation for QNetworkConfigurationManager, we should
+ make a call to \a updateConfigurations() before actually making
+ use of the instance. So we'll also need a slot to be called
+ when this completes (we name this \a openNetworkSession()).
+
+ \code
+MainWindow::MainWindow() :
+ ...
+{
+ ...
+ netConfigManager = new QNetworkConfigurationManager;
+ connect(netConfigManager, SIGNAL(updateCompleted()),
+ this, SLOT(openNetworkSession()));
+ netConfigManager->updateConfigurations();
+}
+ \endcode
+
+ And in the slot itself we use the \a defaultConfiguration() method
+ as the parameter to construct a new QNetworkSession to represent
+ our default connection to the network.
+
+ We first check to see if this session is open, and if so, call
+ initialize() right away. Otherwise, we hook up an appropriate
+ signal and wait for the network to be available.
+
+ \code
+void MainWindow::openNetworkSession()
+{
+ session = new QNetworkSession(netConfigManager->defaultConfiguration());
+ if (session->isOpen()) {
+ initialize();
+ } else {
+ connect(session, SIGNAL(opened()),
+ this, SLOT(initialize()));
+ session->open();
+ }
+}
+ \endcode
+
+ So now our \a initialize() method will be called once a network
+ connection is available.
+
+ \section2 Zoom buttons and panning keys
+
+ In our current implementation we depend upon the presence of a mouse
+ wheel in order to zoom in and out on the map. This is not terribly
+ useful in environments that lack a mouse (ie, anything except a desktop
+ or laptop computer). To address this, we will implement a simple pair
+ of zoom buttons on the right-hand side of the map display.
+
+ We also currently assume that panning the map using a mouse or touch
+ screen is possible, which is not the case on, for example, many
+ Symbian devices, which lack touch input. To rectify this, we will
+ add support for handling arrow key events in \a GeoMap.
+
+ First up, our zoom buttons. We're going to use a very similar setup
+ to that which we used for the sliding status bar previously, and
+ create a new subclass of QGraphicsRectItem:
+
+ \code
+class ZoomButtonItemPrivate;
+class ZoomButtonItem : public QGraphicsRectItem
+{
+public:
+ explicit ZoomButtonItem(GeoMap *map);
+
+ void setRect(qreal x, qreal y, qreal w, qreal h);
+
+private:
+ ZoomButtonItemPrivate *d;
+
+ bool isTopHalf(const QPointF &point);
+ bool isBottomHalf(const QPointF &point);
+
+protected:
+ void mousePressEvent(QGraphicsSceneMouseEvent *event);
+ void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
+};
+ \endcode
+
+ Our button is going to simply be a translucent rectangle, with the top
+ half containing a "+" symbol, which zooms in when clicked, and the
+ bottom half containing a "-" symbol, which zooms out. In the constructor
+ we create the two text items:
+
+ \code
+class ZoomButtonItemPrivate
+{
+public:
+ GeoMap *map;
+
+ QGraphicsSimpleTextItem *plusText;
+ QGraphicsSimpleTextItem *minusText;
+
+ bool pressedOverTopHalf;
+ bool pressedOverBottomHalf;
+};
+
+ZoomButtonItem::ZoomButtonItem(GeoMap *map) :
+ d(new ZoomButtonItemPrivate)
+{
+ d->map = map;
+ d->pressedOverBottomHalf = false;
+ d->pressedOverTopHalf = false;
+
+ setPen(QPen(QBrush(), 0));
+ setBrush(QBrush(QColor(0,0,0,150)));
+
+ d->plusText = new QGraphicsSimpleTextItem(this);
+ d->plusText->setText("+");
+ d->plusText->setBrush(QBrush(Qt::white));
+
+ d->minusText = new QGraphicsSimpleTextItem(this);
+ d->minusText->setText("-");
+ d->minusText->setBrush(QBrush(Qt::white));
+}
+ \endcode
+
+ And in \a setRect() we manage sizing and aligning the text items so
+ that they each occupy roughly half the space.
+
+ \code
+void ZoomButtonItem::setRect(qreal x, qreal y, qreal w, qreal h)
+{
+ QGraphicsRectItem::setRect(x, y, w, h);
+
+ QFont f;
+ f.setFixedPitch(true);
+ f.setPixelSize(h/3.0);
+ d->plusText->setFont(f);
+ d->minusText->setFont(f);
+
+ QRectF plusBound = d->plusText->boundingRect();
+ QPointF plusCenter(x+w/2.0, y+h/4.0);
+ QPointF plusDelta = plusCenter - plusBound.center();
+ d->plusText->setPos(plusDelta);
+
+ QRectF minusBound = d->minusText->boundingRect();
+ QPointF minusCenter(x+w/2.0, y+3.0*h/4.0);
+ QPointF minusDelta = minusCenter - minusBound.center();
+ d->minusText->setPos(minusDelta);
+}
+ \endcode
+
+ Finally, we use the boolean flags in ZoomButtonItemPrivate, above, to
+ manage click detection in the \a mousePressEvent and \a mouseReleaseEvent
+ functions:
+
+ \code
+void ZoomButtonItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
+{
+ const QPointF pos = event->pos();
+ if (!d->pressedOverTopHalf && !d->pressedOverBottomHalf) {
+ if (isTopHalf(pos)) {
+ d->pressedOverTopHalf = true;
+ } else if (isBottomHalf(pos)) {
+ d->pressedOverBottomHalf = true;
+ }
+ }
+ event->accept();
+}
+
+void ZoomButtonItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
+{
+ const QPointF pos = event->pos();
+ if (isTopHalf(pos) && d->pressedOverTopHalf) {
+ d->map->setZoomLevel(d->map->zoomLevel() + 1.0);
+ } else if (isBottomHalf(pos) && d->pressedOverBottomHalf) {
+ d->map->setZoomLevel(d->map->zoomLevel() - 1.0);
+ }
+ d->pressedOverBottomHalf = false;
+ d->pressedOverTopHalf = false;
+ event->accept();
+}
+ \endcode
+
+ In this way, if the mouse (or finger for touch screens) is pressed
+ and then released over the same half of the ZoomButtonItem, we
+ perform the zoom action appropriately. We could have simply hooked
+ the corresponding events on the children items, \a plusText and
+ \a minusText, but as they occupy less space and their size/shape vary
+ depending on the default font, users may find it difficult to target
+ the active portion of the button (especially in a touch environment).
+
+ Adding the new button item to the MapsWidget also happens similarly
+ to before:
+
+ \code
+void MapsWidget::initialize(QGeoMappingManager *manager)
+{
+ ...
+ d->zoomButtonItem = new ZoomButtonItem(d->map);
+ sc->addItem(d->zoomButtonItem);
+
+ resizeEvent(0);
+ ...
+}
+
+void MapsWidget::resizeEvent(QResizeEvent *event)
+{
+ if (d->view && d->map) {
+ ...
+ d->zoomButtonItem->setRect(width()-30, height()/2.0 - 35, 25, 70);
+ }
+}
+ \endcode
+
+ And now we can zoom in and out properly on touch devices. Next we'll
+ address the need to pan and zoom on devices with neither touch
+ nor mouse, which we can do through handling key events.
+
+ To do this we override the \a keyPressEvent() method on \a GeoMap:
+
+ \code
+void GeoMap::keyPressEvent(QKeyEvent *event)
+{
+ QGeoCoordinate center;
+ QPropertyAnimation *anim;
+ const qreal width = size().width();
+ const qreal height = size().height();
+
+ switch (event->key()) {
+ case Qt::Key_4:
+ case Qt::Key_Left:
+ center = screenPositionToCoordinate(
+ QPointF(width/2 - width/5, height/2));
+ anim = new QPropertyAnimation(this, "centerLongitude");
+ anim->setEndValue(center.longitude());
+ anim->setDuration(200);
+ anim->start(QAbstractAnimation::DeleteWhenStopped);
+ break;
+ case Qt::Key_6:
+ case Qt::Key_Right:
+ center = screenPositionToCoordinate(
+ QPointF(width/2 + width/5, height/2));
+ anim = new QPropertyAnimation(this, "centerLongitude");
+ anim->setEndValue(center.longitude());
+ anim->setDuration(200);
+ anim->start(QAbstractAnimation::DeleteWhenStopped);
+ break;
+ case Qt::Key_2:
+ case Qt::Key_Up:
+ center = screenPositionToCoordinate(
+ QPointF(width/2, height/2 - height/5));
+ anim = new QPropertyAnimation(this, "centerLatitude");
+ anim->setEndValue(center.latitude());
+ anim->setDuration(200);
+ anim->start(QAbstractAnimation::DeleteWhenStopped);
+ break;
+ case Qt::Key_8:
+ case Qt::Key_Down:
+ center = screenPositionToCoordinate(
+ QPointF(width/2, height/2 + height/5));
+ anim = new QPropertyAnimation(this, "centerLatitude");
+ anim->setEndValue(center.latitude());
+ anim->setDuration(200);
+ anim->start(QAbstractAnimation::DeleteWhenStopped);
+ break;
+ case Qt::Key_1:
+ if (zoomLevel() > minimumZoomLevel()) {
+ setZoomLevel(zoomLevel() - 1);
+ }
+ break;
+ case Qt::Key_3:
+ if (zoomLevel() < maximumZoomLevel()) {
+ setZoomLevel(zoomLevel() + 1);
+ }
+ break;
+ }
+ this->setFocus();
+ event->accept();
+}
+ \endcode
+
+ We allow both the arrow keys (which map to the sides of the D-pad
+ on some devices), and the numbers 2, 8, 6 and 4 to pan the map,
+ which some users may find more comfortable.
+
+ In addition, the 1 and 3 keys allow zooming in and out. This key
+ mapping is very similar to that used by the majority of maps
+ applications on Symbian, and should be familiar to most users.
+
+ \section2 Conclusion
+
+ In summary, in this tutorial we have built a simple maps and
+ navigation application from scratch using the Qt Location API.
+
+ We first built the basic maps widget, then added a UI and search
+ capability, followed by basic routing and some tuning for use
+ on mobile platforms.
+
+ The full code as at the end of the tutorial is available in the
+ QtLocation examples, named "mapsdemo".
+*/