Skip to content

Commit 19321cb

Browse files
author
Vladyslav Stelmakhovskyi
committed
Implemented map tiles support
1 parent d566830 commit 19321cb

12 files changed

+548
-5
lines changed

googlemaps.pro

+10-2
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,11 @@ HEADERS += \
1313
qgeoroutereplygooglemaps.h \
1414
qplacemanagerenginegooglemaps.h \
1515
qplacesearchreplygooglemaps.h \
16-
qplacecategoriesreplygooglemaps.h
16+
qplacecategoriesreplygooglemaps.h \
17+
qgeomapreplygooglemaps.h \
18+
qgeotiledmapgooglemaps.h \
19+
qgeotiledmappingmanagerenginegooglemaps.h \
20+
qgeotilefetchergooglemaps.h
1721

1822
SOURCES += \
1923
qgeoserviceproviderplugingooglemaps.cpp \
@@ -23,7 +27,11 @@ SOURCES += \
2327
qgeoroutereplygooglemaps.cpp \
2428
qplacemanagerenginegooglemaps.cpp \
2529
qplacesearchreplygooglemaps.cpp \
26-
qplacecategoriesreplygooglemaps.cpp
30+
qplacecategoriesreplygooglemaps.cpp \
31+
qgeomapreplygooglemaps.cpp \
32+
qgeotiledmapgooglemaps.cpp \
33+
qgeotiledmappingmanagerenginegooglemaps.cpp \
34+
qgeotilefetchergooglemaps.cpp
2735

2836

2937
OTHER_FILES += \

googlemaps_plugin.json

+3-1
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
"OnlineGeocodingFeature",
88
"ReverseGeocodingFeature",
99
"OnlineRoutingFeature",
10-
"OnlinePlacesFeature"
10+
"AlternativeRoutesFeature",
11+
"OnlinePlacesFeature",
12+
"OnlineMappingFeature"
1113
]
1214
}

qgeomapreplygooglemaps.cpp

+68
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#include "qgeomapreplygooglemaps.h"
2+
#include <QNetworkAccessManager>
3+
#include <QNetworkCacheMetaData>
4+
#include <QDateTime>
5+
6+
QT_BEGIN_NAMESPACE
7+
8+
QGeoMapReplyGooglemaps::QGeoMapReplyGooglemaps(QNetworkReply *reply, const QGeoTileSpec &spec, QObject *parent)
9+
: QGeoTiledMapReply(spec, parent),
10+
m_reply(reply)
11+
{
12+
connect(m_reply,
13+
SIGNAL(finished()),
14+
this,
15+
SLOT(networkFinished()));
16+
17+
connect(m_reply,
18+
SIGNAL(error(QNetworkReply::NetworkError)),
19+
this,
20+
SLOT(networkError(QNetworkReply::NetworkError)));
21+
}
22+
23+
QGeoMapReplyGooglemaps::~QGeoMapReplyGooglemaps()
24+
{
25+
}
26+
27+
QNetworkReply *QGeoMapReplyGooglemaps::networkReply() const
28+
{
29+
return m_reply;
30+
}
31+
32+
void QGeoMapReplyGooglemaps::abort()
33+
{
34+
if (!m_reply)
35+
return;
36+
37+
m_reply->abort();
38+
}
39+
40+
void QGeoMapReplyGooglemaps::networkFinished()
41+
{
42+
if (!m_reply)
43+
return;
44+
45+
if (m_reply->error() != QNetworkReply::NoError)
46+
return;
47+
48+
setMapImageData(m_reply->readAll());
49+
setMapImageFormat("png");
50+
setFinished(true);
51+
52+
m_reply->deleteLater();
53+
m_reply = 0;
54+
}
55+
56+
void QGeoMapReplyGooglemaps::networkError(QNetworkReply::NetworkError error)
57+
{
58+
if (!m_reply)
59+
return;
60+
61+
if (error != QNetworkReply::OperationCanceledError)
62+
setError(QGeoTiledMapReply::CommunicationError, m_reply->errorString());
63+
setFinished(true);
64+
m_reply->deleteLater();
65+
m_reply = 0;
66+
}
67+
68+
QT_END_NAMESPACE

qgeomapreplygooglemaps.h

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#ifndef QGEOMAPREPLYGOOGLEMAPS_H
2+
#define QGEOMAPREPLYGOOGLEMAPS_H
3+
4+
#include <QtNetwork/QNetworkReply>
5+
#include <QtLocation/private/qgeotilespec_p.h>
6+
#include <QtLocation/private/qgeotiledmapreply_p.h>
7+
#include <QtCore/QPointer>
8+
9+
QT_BEGIN_NAMESPACE
10+
11+
class QGeoMapReplyGooglemaps : public QGeoTiledMapReply
12+
{
13+
Q_OBJECT
14+
15+
public:
16+
QGeoMapReplyGooglemaps(QNetworkReply *reply, const QGeoTileSpec &spec, QObject *parent = 0);
17+
~QGeoMapReplyGooglemaps();
18+
19+
void abort();
20+
21+
QNetworkReply *networkReply() const;
22+
23+
private Q_SLOTS:
24+
void networkFinished();
25+
void networkError(QNetworkReply::NetworkError error);
26+
27+
private:
28+
QPointer<QNetworkReply> m_reply;
29+
};
30+
31+
QT_END_NAMESPACE
32+
33+
#endif

qgeoserviceproviderplugingooglemaps.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
#include "qgeocodingmanagerenginegooglemaps.h"
33
#include "qgeoroutingmanagerenginegooglemaps.h"
44
#include "qplacemanagerenginegooglemaps.h"
5+
#include "qgeotiledmappingmanagerenginegooglemaps.h"
6+
57

68
QGeoCodingManagerEngine *QGeoServiceProviderFactoryGooglemaps::createGeocodingManagerEngine(
79
const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString) const
@@ -20,3 +22,11 @@ QPlaceManagerEngine *QGeoServiceProviderFactoryGooglemaps::createPlaceManagerEng
2022
{
2123
return new QPlaceManagerEngineGooglemaps(parameters, error, errorString);
2224
}
25+
26+
QGeoMappingManagerEngine *QGeoServiceProviderFactoryGooglemaps::createMappingManagerEngine(
27+
const QVariantMap &parameters,
28+
QGeoServiceProvider::Error *error,
29+
QString *errorString) const
30+
{
31+
return new QGeoTiledMappingManagerEngineGooglemaps(parameters, error, errorString);
32+
}

qgeoserviceproviderplugingooglemaps.h

+6-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
#ifndef QGEOSERVICEPROVIDER_GOOGLEMAPS_H
2-
#define QGEOSERVICEPROVIDER_GOOGLEMAPS_H
1+
#ifndef QGEOSERVICEPROVIDERGOOGLEMAPS_H
2+
#define QGEOSERVICEPROVIDERGOOGLEMAPS_H
33

44
#include <QtCore/QObject>
55
#include <QtLocation/QGeoServiceProviderFactory>
@@ -21,6 +21,10 @@ class QGeoServiceProviderFactoryGooglemaps: public QObject, public QGeoServicePr
2121
QPlaceManagerEngine *createPlaceManagerEngine(const QVariantMap &parameters,
2222
QGeoServiceProvider::Error *error,
2323
QString *errorString) const;
24+
QGeoMappingManagerEngine *createMappingManagerEngine(const QVariantMap &parameters,
25+
QGeoServiceProvider::Error *error,
26+
QString *errorString) const;
27+
2428
};
2529

2630
#endif

qgeotiledmapgooglemaps.cpp

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#include "qgeotiledmapgooglemaps.h"
2+
#include "qgeotiledmappingmanagerenginegooglemaps.h"
3+
#include "QtLocation/private/qgeomapcontroller_p.h"
4+
5+
#include <QDebug>
6+
#include <QObject>
7+
#include <QColor>
8+
#include <QFont>
9+
#include <QPainter>
10+
#include <QImage>
11+
#include <QRect>
12+
13+
#include <QStaticText>
14+
15+
QT_BEGIN_NAMESPACE
16+
17+
/*!
18+
Constructs a new tiled map data object, which stores the map data required by
19+
\a geoMap and makes use of the functionality provided by \a engine.
20+
*/
21+
QGeoTiledMapGooglemaps::QGeoTiledMapGooglemaps(QGeoTiledMappingManagerEngineGooglemaps *engine, QObject *parent /*= 0*/) :
22+
QGeoTiledMap(engine, parent),
23+
m_engine(engine)
24+
{}
25+
26+
QGeoTiledMapGooglemaps::~QGeoTiledMapGooglemaps() {}
27+
28+
void QGeoTiledMapGooglemaps::evaluateCopyrights(const QSet<QGeoTileSpec> &visibleTiles)
29+
{
30+
Q_UNUSED(visibleTiles);
31+
}
32+
33+
QT_END_NAMESPACE

qgeotiledmapgooglemaps.h

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
#ifndef QGEOMAPGOOGLEMAPS_H
2+
#define QGEOMAPGOOGLEMAPS_H
3+
4+
#include "QtLocation/private/qgeotiledmap_p.h"
5+
#include <QtGui/QImage>
6+
#include <QtCore/QPointer>
7+
8+
QT_BEGIN_NAMESPACE
9+
10+
class QGeoTiledMappingManagerEngineGooglemaps;
11+
12+
class QGeoTiledMapGooglemaps: public QGeoTiledMap
13+
{
14+
Q_OBJECT
15+
public:
16+
QGeoTiledMapGooglemaps(QGeoTiledMappingManagerEngineGooglemaps *engine, QObject *parent = 0);
17+
~QGeoTiledMapGooglemaps();
18+
19+
QString getViewCopyright();
20+
void evaluateCopyrights(const QSet<QGeoTileSpec> &visibleTiles);
21+
22+
private:
23+
//QImage m_logo;
24+
QImage m_copyrightsSlab;
25+
QString m_lastCopyrightsString;
26+
QPointer<QGeoTiledMappingManagerEngineGooglemaps> m_engine;
27+
28+
Q_DISABLE_COPY(QGeoTiledMapGooglemaps)
29+
};
30+
31+
QT_END_NAMESPACE
32+
33+
#endif // QGEOMAPGOOGLEMAPS_H
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#include "QtLocation/private/qgeocameracapabilities_p.h"
2+
#include "qgeotiledmappingmanagerenginegooglemaps.h"
3+
#include "qgeotiledmapgooglemaps.h"
4+
#include "qgeotilefetchergooglemaps.h"
5+
#include "QtLocation/private/qgeotilespec_p.h"
6+
#include "QtLocation/private/qgeofiletilecache_p.h"
7+
8+
#include <QDebug>
9+
#include <QDir>
10+
#include <QVariant>
11+
#include <QtCore/QJsonArray>
12+
#include <QtCore/QJsonObject>
13+
#include <QtCore/QJsonDocument>
14+
#include <QtCore/qmath.h>
15+
#include <QtCore/qstandardpaths.h>
16+
17+
QT_BEGIN_NAMESPACE
18+
19+
QGeoTiledMappingManagerEngineGooglemaps::QGeoTiledMappingManagerEngineGooglemaps(const QVariantMap &parameters,
20+
QGeoServiceProvider::Error *error,
21+
QString *errorString)
22+
: QGeoTiledMappingManagerEngine()
23+
{
24+
Q_UNUSED(error);
25+
Q_UNUSED(errorString);
26+
27+
QGeoCameraCapabilities capabilities;
28+
29+
capabilities.setMinimumZoomLevel(0.0);
30+
capabilities.setMaximumZoomLevel(21.0);
31+
32+
setCameraCapabilities(capabilities);
33+
34+
setTileSize(QSize(256, 256));
35+
36+
QList<QGeoMapType> types;
37+
types << QGeoMapType(QGeoMapType::StreetMap, tr("Street Map"), tr("Normal map view in daylight mode"), false, false, 1);
38+
types << QGeoMapType(QGeoMapType::SatelliteMapDay, tr("Satellite Map"), tr("Satellite map view in daylight mode"), false, false, 2);
39+
types << QGeoMapType(QGeoMapType::TerrainMap, tr("Terrain Map"), tr("Terrain map view in daylight mode"), false, false, 3);
40+
types << QGeoMapType(QGeoMapType::HybridMap, tr("Hybrid Map"), tr("Satellite map view with streets in daylight mode"), false, false, 4);
41+
setSupportedMapTypes(types);
42+
43+
QGeoTileFetcherGooglemaps *fetcher = new QGeoTileFetcherGooglemaps(parameters, this, tileSize());
44+
setTileFetcher(fetcher);
45+
46+
m_cacheDirectory = QAbstractGeoTileCache::baseCacheDirectory() + QLatin1String("googlemaps");
47+
48+
QAbstractGeoTileCache *tileCache = new QGeoFileTileCache(m_cacheDirectory);
49+
setTileCache(tileCache);
50+
51+
populateMapSchemes();
52+
}
53+
54+
QGeoTiledMappingManagerEngineGooglemaps::~QGeoTiledMappingManagerEngineGooglemaps()
55+
{
56+
}
57+
58+
void QGeoTiledMappingManagerEngineGooglemaps::populateMapSchemes()
59+
{
60+
m_mapSchemes[0] = QStringLiteral("roadmap");
61+
m_mapSchemes[1] = QStringLiteral("roadmap");
62+
m_mapSchemes[2] = QStringLiteral("satellite");
63+
m_mapSchemes[3] = QStringLiteral("terrain");
64+
m_mapSchemes[4] = QStringLiteral("hybrid");
65+
}
66+
67+
QString QGeoTiledMappingManagerEngineGooglemaps::getScheme(int mapId)
68+
{
69+
return m_mapSchemes[mapId];
70+
}
71+
72+
QGeoMap *QGeoTiledMappingManagerEngineGooglemaps::createMap()
73+
{
74+
return new QGeoTiledMapGooglemaps(this);
75+
}
76+
77+
QT_END_NAMESPACE
78+
+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
#ifndef QGEOTILEDMAPPINGMANAGERENGINEGOOGLEMAPS_H
2+
#define QGEOTILEDMAPPINGMANAGERENGINEGOOGLEMAPS_H
3+
4+
#include "QtLocation/private/qgeotiledmappingmanagerengine_p.h"
5+
#include <QtPositioning/QGeoRectangle>
6+
#include "QtLocation/private/qgeomaptype_p.h"
7+
8+
#include <QGeoServiceProvider>
9+
10+
#include <QList>
11+
#include <QHash>
12+
#include <QSet>
13+
14+
QT_BEGIN_NAMESPACE
15+
16+
class QByteArray;
17+
class QGeoTileSpec;
18+
class QGeoNetworkAccessManager;
19+
20+
class QGeoTiledMappingManagerEngineGooglemaps : public QGeoTiledMappingManagerEngine
21+
{
22+
Q_OBJECT
23+
24+
public:
25+
QGeoTiledMappingManagerEngineGooglemaps(const QVariantMap &parameters,
26+
QGeoServiceProvider::Error *error,
27+
QString *errorString);
28+
~QGeoTiledMappingManagerEngineGooglemaps();
29+
30+
virtual QGeoMap *createMap();
31+
QString getScheme(int mapId);
32+
33+
private:
34+
void initialize();
35+
void populateMapSchemes();
36+
37+
QHash<int, QString> m_mapSchemes;
38+
QString m_cacheDirectory;
39+
};
40+
41+
QT_END_NAMESPACE
42+
43+
#endif // QGEOTILEDMAPPINGMANAGERENGINEGOOGLEMAPS_H

0 commit comments

Comments
 (0)