26 QGeoNetworkAccessManager *networkManager,
27 const QVariantMap ¶meters,
28 QGeoServiceProvider::Error *error,
30 : QGeoTiledMappingManagerEngine()
33 Q_UNUSED(errorString);
36 if (parameters.contains(QStringLiteral(
"here.mapping.highdpi_tiles"))) {
37 const QString param = parameters.value(QStringLiteral(
"here.mapping.highdpi_tiles")).toString().toLower();
42 QGeoCameraCapabilities capabilities;
44 capabilities.setMinimumZoomLevel(0.0);
45 capabilities.setMaximumZoomLevel(20.0);
48 capabilities.setMinimumZoomLevel(1.0);
49 capabilities.setMaximumZoomLevel(19.0);
51 capabilities.setSupportsBearing(
true);
52 capabilities.setSupportsTilting(
true);
53 capabilities.setMinimumTilt(0);
54 capabilities.setMaximumTilt(80);
55 capabilities.setMinimumFieldOfView(20.0);
56 capabilities.setMaximumFieldOfView(120.0);
57 capabilities.setOverzoomEnabled(
true);
58 setCameraCapabilities(capabilities);
60 setTileSize(QSize(256, 256));
63 const QByteArray pluginName =
"here";
64 QList<QGeoMapType> types;
65 types << QGeoMapType(QGeoMapType::StreetMap, tr(
"Street Map"), tr(
"Normal map view in daylight mode"),
false,
false, ++mapId, pluginName, capabilities);
66 types << QGeoMapType(QGeoMapType::SatelliteMapDay, tr(
"Satellite Map"), tr(
"Satellite map view in daylight mode"),
false,
false, ++mapId, pluginName, capabilities);
67 types << QGeoMapType(QGeoMapType::TerrainMap, tr(
"Terrain Map"), tr(
"Terrain map view in daylight mode"),
false,
false, ++mapId, pluginName, capabilities);
68 types << QGeoMapType(QGeoMapType::HybridMap, tr(
"Hybrid Map"), tr(
"Satellite map view with streets in daylight mode"),
false,
false, ++mapId, pluginName, capabilities);
69 types << QGeoMapType(QGeoMapType::TransitMap, tr(
"Transit Map"), tr(
"Color-reduced map view with public transport scheme in daylight mode"),
false,
false, ++mapId, pluginName, capabilities);
70 types << QGeoMapType(QGeoMapType::GrayStreetMap, tr(
"Gray Street Map"), tr(
"Color-reduced map view in daylight mode"),
false,
false, ++mapId, pluginName, capabilities);
71 types << QGeoMapType(QGeoMapType::StreetMap, tr(
"Mobile Street Map"), tr(
"Mobile normal map view in daylight mode"),
true,
false, ++mapId, pluginName, capabilities);
72 types << QGeoMapType(QGeoMapType::TerrainMap, tr(
"Mobile Terrain Map"), tr(
"Mobile terrain map view in daylight mode"),
true,
false, ++mapId, pluginName, capabilities);
73 types << QGeoMapType(QGeoMapType::HybridMap, tr(
"Mobile Hybrid Map"), tr(
"Mobile satellite map view with streets in daylight mode"),
true,
false, ++mapId, pluginName, capabilities);
74 types << QGeoMapType(QGeoMapType::TransitMap, tr(
"Mobile Transit Map"), tr(
"Mobile color-reduced map view with public transport scheme in daylight mode"),
true,
false, ++mapId, pluginName, capabilities);
75 types << QGeoMapType(QGeoMapType::GrayStreetMap, tr(
"Mobile Gray Street Map"), tr(
"Mobile color-reduced map view in daylight mode"),
true,
false, ++mapId, pluginName, capabilities);
76 types << QGeoMapType(QGeoMapType::StreetMap, tr(
"Custom Street Map"), tr(
"Normal map view in daylight mode"),
false,
false, ++mapId, pluginName, capabilities);
77 types << QGeoMapType(QGeoMapType::StreetMap, tr(
"Night Street Map"), tr(
"Normal map view in night mode"),
false,
true, ++mapId, pluginName, capabilities);
78 types << QGeoMapType(QGeoMapType::StreetMap, tr(
"Mobile Night Street Map"), tr(
"Mobile normal map view in night mode"),
true,
true, ++mapId, pluginName, capabilities);
79 types << QGeoMapType(QGeoMapType::GrayStreetMap, tr(
"Gray Night Street Map"), tr(
"Color-reduced map view in night mode (especially used for background maps)"),
false,
true, ++mapId, pluginName, capabilities);
80 types << QGeoMapType(QGeoMapType::GrayStreetMap, tr(
"Mobile Gray Night Street Map"), tr(
"Mobile color-reduced map view in night mode (especially used for background maps)"),
true,
true, ++mapId, pluginName, capabilities);
81 types << QGeoMapType(QGeoMapType::PedestrianMap, tr(
"Pedestrian Street Map"), tr(
"Pedestrian map view in daylight mode"),
false,
false, ++mapId, pluginName, capabilities);
82 types << QGeoMapType(QGeoMapType::PedestrianMap, tr(
"Mobile Pedestrian Street Map"), tr(
"Mobile pedestrian map view in daylight mode for mobile usage"),
true,
false, ++mapId, pluginName, capabilities);
83 types << QGeoMapType(QGeoMapType::PedestrianMap, tr(
"Pedestrian Night Street Map"), tr(
"Pedestrian map view in night mode"),
false,
true, ++mapId, pluginName, capabilities);
84 types << QGeoMapType(QGeoMapType::PedestrianMap, tr(
"Mobile Pedestrian Night Street Map"), tr(
"Mobile pedestrian map view in night mode for mobile usage"),
true,
true, ++mapId, pluginName, capabilities);
85 types << QGeoMapType(QGeoMapType::CarNavigationMap, tr(
"Car Navigation Map"), tr(
"Normal map view in daylight mode for car navigation"),
false,
false, ++mapId, pluginName, capabilities);
86 setSupportedMapTypes(types);
88 QGeoTileFetcherNokia *fetcher =
new QGeoTileFetcherNokia(parameters, networkManager,
this, tileSize(), ppi);
89 setTileFetcher(fetcher);
94 if (parameters.contains(QStringLiteral(
"here.mapping.cache.directory"))) {
95 m_cacheDirectory = parameters.value(QStringLiteral(
"here.mapping.cache.directory")).toString();
98 m_cacheDirectory = QAbstractGeoTileCache::baseLocationCacheDirectory() + QLatin1String(pluginName);
101 QGeoFileTileCache *tileCache =
new QGeoFileTileCacheNokia(ppi, m_cacheDirectory);
104
105
106 if (parameters.contains(QStringLiteral(
"here.mapping.cache.disk.cost_strategy"))) {
107 QString cacheStrategy = parameters.value(QStringLiteral(
"here.mapping.cache.disk.cost_strategy")).toString().toLower();
108 if (cacheStrategy == QLatin1String(
"bytesize"))
109 tileCache->setCostStrategyDisk(QGeoFileTileCache::ByteSize);
111 tileCache->setCostStrategyDisk(QGeoFileTileCache::Unitary);
113 tileCache->setCostStrategyDisk(QGeoFileTileCache::ByteSize);
115 if (parameters.contains(QStringLiteral(
"here.mapping.cache.disk.size"))) {
117 int cacheSize = parameters.value(QStringLiteral(
"here.mapping.cache.disk.size")).toString().toInt(&ok);
119 tileCache->setMaxDiskUsage(cacheSize);
123
124
125 if (parameters.contains(QStringLiteral(
"here.mapping.cache.memory.cost_strategy"))) {
126 QString cacheStrategy = parameters.value(QStringLiteral(
"here.mapping.cache.memory.cost_strategy")).toString().toLower();
127 if (cacheStrategy == QLatin1String(
"bytesize"))
128 tileCache->setCostStrategyMemory(QGeoFileTileCache::ByteSize);
130 tileCache->setCostStrategyMemory(QGeoFileTileCache::Unitary);
132 tileCache->setCostStrategyMemory(QGeoFileTileCache::ByteSize);
134 if (parameters.contains(QStringLiteral(
"here.mapping.cache.memory.size"))) {
136 int cacheSize = parameters.value(QStringLiteral(
"here.mapping.cache.memory.size")).toString().toInt(&ok);
138 tileCache->setMaxMemoryUsage(cacheSize);
142
143
144 if (parameters.contains(QStringLiteral(
"here.mapping.cache.texture.cost_strategy"))) {
145 QString cacheStrategy = parameters.value(QStringLiteral(
"here.mapping.cache.texture.cost_strategy")).toString().toLower();
146 if (cacheStrategy == QLatin1String(
"bytesize"))
147 tileCache->setCostStrategyTexture(QGeoFileTileCache::ByteSize);
149 tileCache->setCostStrategyTexture(QGeoFileTileCache::Unitary);
151 tileCache->setCostStrategyTexture(QGeoFileTileCache::ByteSize);
153 if (parameters.contains(QStringLiteral(
"here.mapping.cache.texture.size"))) {
155 int cacheSize = parameters.value(QStringLiteral(
"here.mapping.cache.texture.size")).toString().toInt(&ok);
157 tileCache->setExtraTextureUsage(cacheSize);
161 if (parameters.contains(QStringLiteral(
"here.mapping.prefetching_style"))) {
162 const QString prefetchingMode = parameters.value(QStringLiteral(
"here.mapping.prefetching_style")).toString();
163 if (prefetchingMode == QStringLiteral(
"TwoNeighbourLayers"))
164 m_prefetchStyle = QGeoTiledMap::PrefetchTwoNeighbourLayers;
165 else if (prefetchingMode == QStringLiteral(
"OneNeighbourLayer"))
166 m_prefetchStyle = QGeoTiledMap::PrefetchNeighbourLayer;
167 else if (prefetchingMode == QStringLiteral(
"NoPrefetching"))
168 m_prefetchStyle = QGeoTiledMap::NoPrefetching;
171 setTileCache(tileCache);
172 populateMapSchemes();
174 QMetaObject::invokeMethod(fetcher,
"fetchCopyrightsData", Qt::QueuedConnection);
175 QMetaObject::invokeMethod(fetcher,
"fetchVersionData", Qt::QueuedConnection);
338 const QSet<QGeoTileSpec> &tiles)
340 static const QChar copyrightSymbol(0x00a9);
341 typedef QSet<QGeoTileSpec>::const_iterator tile_iter;
342 QGeoRectangle viewport;
343 double viewX0, viewY0, viewX1, viewY1;
345 tile_iter tile = tiles.constBegin();
346 tile_iter lastTile = tiles.constEnd();
349 double divFactor = qPow(2.0, tile->zoom());
350 viewX0 = viewX1 = tile->x();
351 viewY0 = viewY1 = tile->y();
356 for (; tile != lastTile; ++tile) {
357 if (tile->x() < viewX0)
359 if (tile->x() > viewX1)
361 if (tile->y() < viewY0)
363 if (tile->y() > viewY1)
373 pt.setX(viewX0 / divFactor);
374 pt.setY(viewY0 / divFactor);
375 viewport.setTopLeft(QWebMercator::mercatorToCoord(pt));
376 pt.setX(viewX1 / divFactor);
377 pt.setY(viewY1 / divFactor);
378 viewport.setBottomRight(QWebMercator::mercatorToCoord(pt));
382 QList<CopyrightDesc> descriptorList = m_copyrights[ getBaseScheme(mapType.mapId()) ];
383 CopyrightDesc *descriptor;
384 int descIndex, boxIndex;
385 QString copyrightsText;
386 QSet<QString> copyrightStrings;
388 for (descIndex = 0; descIndex < descriptorList.count(); descIndex++) {
389 if (descriptorList[descIndex].minLevel <= zoomLevel && zoomLevel <= descriptorList[descIndex].maxLevel) {
390 descriptor = &descriptorList[descIndex];
392 for (boxIndex = 0; boxIndex < descriptor->boxes.count(); boxIndex++) {
393 QGeoRectangle box = descriptor->boxes[boxIndex];
395 if (box.intersects(viewport)) {
396 copyrightStrings.insert(descriptor->label);
400 if (!descriptor->boxes.count())
401 copyrightStrings.insert(descriptor->label);
405 for (
const QString ©rightString : copyrightStrings) {
406 if (copyrightsText.length())
407 copyrightsText += QLatin1Char(
'\n');
408 copyrightsText += copyrightSymbol;
409 copyrightsText += copyrightString;
412 return copyrightsText;