diff options
author | Alex Blasche <alexander.blasche@theqtcompany.com> | 2016-07-29 15:37:19 +0200 |
---|---|---|
committer | Alex Blasche <alexander.blasche@theqtcompany.com> | 2016-07-29 15:37:19 +0200 |
commit | 76e3fea9e77713860211c599b2a0aff3a72902c6 (patch) | |
tree | 0a24d1c3b987a6f4ebc2fbde6cb0d0a2daae7142 /src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp | |
parent | 1753409f92a6b865b71612465b887f808568ada2 (diff) | |
parent | 1a1d2e3fff5856dc9d1283b510a9f325c6fb8a93 (diff) |
Merge remote-tracking branch 'gerrit/5.7' into dev
Change-Id: I6a1a72547077c628429ee9a0781070ad3ae787f1
Diffstat (limited to 'src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp')
-rw-r--r-- | src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp | 153 |
1 files changed, 134 insertions, 19 deletions
diff --git a/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp b/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp index 043f3f29..dbc174d3 100644 --- a/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp +++ b/src/plugins/geoservices/osm/qgeotiledmappingmanagerengineosm.cpp @@ -45,6 +45,9 @@ #include <QtLocation/private/qgeocameracapabilities_p.h> #include <QtLocation/private/qgeomaptype_p.h> #include <QtLocation/private/qgeotiledmap_p.h> +#include <QtLocation/private/qgeofiletilecache_p.h> + +#include <QtNetwork/QNetworkAccessManager> QT_BEGIN_NAMESPACE @@ -58,33 +61,136 @@ QGeoTiledMappingManagerEngineOsm::QGeoTiledMappingManagerEngineOsm(const QVarian setTileSize(QSize(256, 256)); + QNetworkAccessManager *nm = new QNetworkAccessManager(); + QString domain = QStringLiteral("http://maps-redirect.qt.io/osm/5.6/"); + if (parameters.contains(QStringLiteral("osm.mapping.providersrepository.address"))) { + QString customAddress = parameters.value(QStringLiteral("osm.mapping.providersrepository.address")).toString(); + // Allowing some malformed addresses ( containing the suffix "/osm/5.6/" + if (customAddress.indexOf(QStringLiteral(":")) < 0) // defaulting to http:// if no prefix is found + customAddress = QStringLiteral("http://") + customAddress; + if (customAddress[customAddress.length()-1] != QLatin1Char('/')) + customAddress += QLatin1Char('/'); + domain = customAddress; + } + + m_providers.push_back( + new QGeoTileProviderOsm(domain + "street", + nm, + QGeoMapType(QGeoMapType::StreetMap, tr("Street Map"), tr("Street map view in daylight mode"), false, false, 1), + QGeoTileProviderOsm::TileProvider(QStringLiteral("http://c.tile.openstreetmap.org/%z/%x/%y.png"), + QStringLiteral("png"), + QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap.org</a>"), + QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors") + ))); + m_providers.push_back( + new QGeoTileProviderOsm(domain + "satellite", + nm, + QGeoMapType(QGeoMapType::SatelliteMapDay, tr("Satellite Map"), tr("Satellite map view in daylight mode"), false, false, 2), + QGeoTileProviderOsm::TileProvider(QStringLiteral("http://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer/tile/%z/%y/%x"), + QStringLiteral("jpg"), + QStringLiteral("<a href='http://basemap.nationalmap.gov/arcgis/rest/services/USGSImageryOnly/MapServer'>USGS The National Map: Orthoimagery</a>"), + QStringLiteral("<a href='http://landsat.gsfc.nasa.gov/?page_id=2339'>USGS/NASA Landsat</a>") + ))); + m_providers.push_back( + new QGeoTileProviderOsm(domain + "cycle", + nm, + QGeoMapType(QGeoMapType::CycleMap, tr("Cycle Map"), tr("Cycle map view in daylight mode"), false, false, 3), + QGeoTileProviderOsm::TileProvider(QStringLiteral("http://c.tile.opencyclemap.org/cycle/%z/%x/%y.png"), + QStringLiteral("png"), + QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"), + QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors") + ))); + m_providers.push_back( + new QGeoTileProviderOsm(domain + "transit", + nm, + QGeoMapType(QGeoMapType::TransitMap, tr("Transit Map"), tr("Public transit map view in daylight mode"), false, false, 4), + QGeoTileProviderOsm::TileProvider(QStringLiteral("http://c.tile2.opencyclemap.org/transport/%z/%x/%y.png"), + QStringLiteral("png"), + QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"), + QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors") + ))); + m_providers.push_back( + new QGeoTileProviderOsm(domain + "night-transit", + nm, + QGeoMapType(QGeoMapType::TransitMap, tr("Night Transit Map"), tr("Public transit map view in night mode"), false, true, 5), + QGeoTileProviderOsm::TileProvider(QStringLiteral("http://a.tile.thunderforest.com/transport-dark/%z/%x/%y.png"), + QStringLiteral("png"), + QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"), + QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors") + ))); + m_providers.push_back( + new QGeoTileProviderOsm(domain + "terrain", + nm, + QGeoMapType(QGeoMapType::TerrainMap, tr("Terrain Map"), tr("Terrain map view"), false, false, 6), + QGeoTileProviderOsm::TileProvider(QStringLiteral("http://a.tile.thunderforest.com/landscape/%z/%x/%y.png"), + QStringLiteral("png"), + QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"), + QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors") + ))); + m_providers.push_back( + new QGeoTileProviderOsm(domain + "hiking", + nm, + QGeoMapType(QGeoMapType::PedestrianMap, tr("Hiking Map"), tr("Hiking map view"), false, false, 7), + QGeoTileProviderOsm::TileProvider(QStringLiteral("http://a.tile.thunderforest.com/outdoors/%z/%x/%y.png"), + QStringLiteral("png"), + QStringLiteral("<a href='http://www.thunderforest.com/'>Thunderforest</a>"), + QStringLiteral("<a href='http://www.openstreetmap.org/copyright'>OpenStreetMap</a> contributors") + ))); + + if (parameters.contains(QStringLiteral("osm.mapping.custom.host")) + || parameters.contains(QStringLiteral("osm.mapping.host"))) { + // Adding a custom provider + QString tmsServer; + if (parameters.contains(QStringLiteral("osm.mapping.host"))) + tmsServer = parameters.value(QStringLiteral("osm.mapping.host")).toString(); + if (parameters.contains(QStringLiteral("osm.mapping.custom.host"))) // priority to the new one + tmsServer = parameters.value(QStringLiteral("osm.mapping.custom.host")).toString(); + + QString mapCopyright; + QString dataCopyright; + if (parameters.contains(QStringLiteral("osm.mapping.custom.mapcopyright"))) + mapCopyright = parameters.value(QStringLiteral("osm.mapping.custom.mapcopyright")).toString(); + if (parameters.contains(QStringLiteral("osm.mapping.custom.datacopyright"))) + dataCopyright = parameters.value(QStringLiteral("osm.mapping.custom.datacopyright")).toString(); + + if (parameters.contains(QStringLiteral("osm.mapping.copyright"))) + m_customCopyright = parameters.value(QStringLiteral("osm.mapping.copyright")).toString(); + + m_providers.push_back( + new QGeoTileProviderOsm("", + nm, + QGeoMapType(QGeoMapType::CustomMap, tr("Custom URL Map"), tr("Custom url map view set via urlprefix parameter"), false, false, 8), + QGeoTileProviderOsm::TileProvider(tmsServer + QStringLiteral("%z/%x/%y.png"), + QStringLiteral("png"), + mapCopyright, + dataCopyright + ))); + + m_providers.last()->disableRedirection(); + } + + bool disableRedirection = false; + if (parameters.contains(QStringLiteral("osm.mapping.providersrepository.disabled"))) + disableRedirection = parameters.value(QStringLiteral("osm.mapping.providersrepository.disabled")).toBool(); + QList<QGeoMapType> mapTypes; + foreach (QGeoTileProviderOsm * provider, m_providers) { + provider->setParent(this); + if (disableRedirection) + provider->disableRedirection(); + mapTypes << provider->mapType(); + } // See map type implementations in QGeoTiledMapOsm and QGeoTileFetcherOsm. - mapTypes << QGeoMapType(QGeoMapType::StreetMap, tr("Street Map"), tr("Street map view in daylight mode"), false, false, 1); - mapTypes << QGeoMapType(QGeoMapType::SatelliteMapDay, tr("Satellite Map"), tr("Satellite map view in daylight mode"), false, false, 2); - mapTypes << QGeoMapType(QGeoMapType::CycleMap, tr("Cycle Map"), tr("Cycle map view in daylight mode"), false, false, 3); - mapTypes << QGeoMapType(QGeoMapType::TransitMap, tr("Transit Map"), tr("Public transit map view in daylight mode"), false, false, 4); - mapTypes << QGeoMapType(QGeoMapType::TransitMap, tr("Night Transit Map"), tr("Public transit map view in night mode"), false, true, 5); - mapTypes << QGeoMapType(QGeoMapType::TerrainMap, tr("Terrain Map"), tr("Terrain map view"), false, false, 6); - mapTypes << QGeoMapType(QGeoMapType::PedestrianMap, tr("Hiking Map"), tr("Hiking map view"), false, false, 7); - if (parameters.contains(QStringLiteral("osm.mapping.host"))) - mapTypes << QGeoMapType(QGeoMapType::CustomMap, tr("Custom URL Map"), tr("Custom url map view set via urlprefix parameter"), false, false, 8); setSupportedMapTypes(mapTypes); - QGeoTileFetcherOsm *tileFetcher = new QGeoTileFetcherOsm(this); + QGeoTileFetcherOsm *tileFetcher = new QGeoTileFetcherOsm(m_providers, nm, this); if (parameters.contains(QStringLiteral("osm.useragent"))) { const QByteArray ua = parameters.value(QStringLiteral("osm.useragent")).toString().toLatin1(); tileFetcher->setUserAgent(ua); } - if (parameters.contains(QStringLiteral("osm.mapping.host"))) { - const QString up = parameters.value(QStringLiteral("osm.mapping.host")).toString().toLatin1(); - tileFetcher->setUrlPrefix(up); - } - if (parameters.contains(QStringLiteral("osm.mapping.copyright"))) - m_customCopyright = parameters.value(QStringLiteral("osm.mapping.copyright")).toString().toLatin1(); - setTileFetcher(tileFetcher); + setTileFetcher(tileFetcher); if (parameters.contains(QStringLiteral("osm.mapping.cache.directory"))) { m_cacheDirectory = parameters.value(QStringLiteral("osm.mapping.cache.directory")).toString(); @@ -92,10 +198,14 @@ QGeoTiledMappingManagerEngineOsm::QGeoTiledMappingManagerEngineOsm(const QVarian // managerName() is not yet set, we have to hardcode the plugin name below m_cacheDirectory = QAbstractGeoTileCache::baseCacheDirectory() + QLatin1String("osm"); } - if (parameters.contains(QStringLiteral("osm.mapping.offline.directory"))) { + if (parameters.contains(QStringLiteral("osm.mapping.offline.directory"))) m_offlineDirectory = parameters.value(QStringLiteral("osm.mapping.offline.directory")).toString(); - } + QAbstractGeoTileCache *tileCache = new QGeoFileTileCacheOsm(m_offlineDirectory, m_cacheDirectory); + + // 50mb of disk cache by default to minimize n. of accesses to public OSM servers + tileCache->setMaxDiskUsage(50 * 1024 * 1024); + if (parameters.contains(QStringLiteral("osm.mapping.cache.disk.size"))) { bool ok = false; int cacheSize = parameters.value(QStringLiteral("osm.mapping.cache.disk.size")).toString().toInt(&ok); @@ -131,6 +241,11 @@ QGeoMap *QGeoTiledMappingManagerEngineOsm::createMap() return new QGeoTiledMapOsm(this); } +const QVector<QGeoTileProviderOsm *> &QGeoTiledMappingManagerEngineOsm::providers() +{ + return m_providers; +} + QString QGeoTiledMappingManagerEngineOsm::customCopyright() const { return m_customCopyright; |