diff options
author | Vladimir Bezkorovainyi <vladimir.bezkorovainyi@nokia.com> | 2011-07-12 13:08:41 +0200 |
---|---|---|
committer | Vladimir Bezkorovainyi <vladimir.bezkorovainyi@nokia.com> | 2011-07-14 17:02:20 +0200 |
commit | a35c88c9e8421ae8f37009bba4447cd1fe5ae61a (patch) | |
tree | 131dc17ca61cdfbbc6d956d328e0dee5a46aeaa4 /plugins/geoservices | |
parent | cea96cfa25404ada12bffb3a13a3658370dd973d (diff) |
read the meta service at startup to retrieve available tile zoom levels, resolutions, map types.
Diffstat (limited to 'plugins/geoservices')
-rw-r--r-- | plugins/geoservices/nokia/nokia.pro | 1 | ||||
-rwxr-xr-x | plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.cpp | 122 | ||||
-rw-r--r-- | plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.h | 3 |
3 files changed, 116 insertions, 10 deletions
diff --git a/plugins/geoservices/nokia/nokia.pro b/plugins/geoservices/nokia/nokia.pro index 7ad8f17b96..160150b256 100644 --- a/plugins/geoservices/nokia/nokia.pro +++ b/plugins/geoservices/nokia/nokia.pro @@ -6,6 +6,7 @@ PLUGIN_TYPE=geoservices include(../../../common.pri) QT += network +QT += xml CONFIG += mobility MOBILITY = location diff --git a/plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.cpp b/plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.cpp index 8c03e6c589..5c45abeb66 100755 --- a/plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.cpp +++ b/plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.cpp @@ -58,6 +58,9 @@ #include <QSize> #include <QDir> #include <QUrl> +#include <QEventLoop> +#include <QDomDocument> +#include <algorithm> #define LARGE_TILE_DIMENSION 256 @@ -100,6 +103,69 @@ QChar QGeoMappingManagerEngineNokia::findFirstInternalFlashDrive() } #endif //Q_OS_SYMBIAN +namespace +{ + void getMapTypes(const QDomDocument &doc, QList<QGraphicsGeoMap::MapType> &mapTypes) + { + typedef std::map<QString, QGraphicsGeoMap::MapType> MapTypeRegistry; + static MapTypeRegistry registeredTypes; + if (registeredTypes.empty()) + { + + registeredTypes.insert(std::make_pair("terrain.day", QGraphicsGeoMap::TerrainMap)); + registeredTypes.insert(std::make_pair("normal.day", QGraphicsGeoMap::StreetMap)); + registeredTypes.insert(std::make_pair("satellite.day", QGraphicsGeoMap::SatelliteMapDay)); + + //registeredTypes.insert(std::make_pair("hybrid.day", QGraphicsGeoMap::)); + //registeredTypes.insert(std::make_pair("normal.day.transit", QGraphicsGeoMap::)); + //registeredTypes.insert(std::make_pair("normal.day.grey", QGraphicsGeoMap::)); + } + + QDomElement response = doc.firstChildElement("response"); + QDomNodeList schemes = response.firstChildElement("schemes").childNodes(); + for (int i = 0; i < schemes.count(); ++i) + { + QString id = schemes.at(i).toElement().attribute("id"); + MapTypeRegistry::const_iterator found = registeredTypes.find(id); + if (found != registeredTypes.end()) + { + mapTypes << found->second; + } + } + + if (mapTypes.empty()) + { + mapTypes << QGraphicsGeoMap::NoMap; + } + } + + void getResolutions(const QDomDocument &doc, QList<QSize> &sizes) + { + QDomElement response = doc.firstChildElement("response"); + QDomNodeList resolutions = response.firstChildElement("resolutions").childNodes(); + + for (int i = 0; i < resolutions.count(); ++i) + { + QDomElement size = resolutions.at(i).toElement(); + sizes << QSize(size.attribute("width").toInt(), size.attribute("height").toInt()); + } + } + + void getZoomLevels(const QDomDocument &doc, double &minZoomLevel, double &maxZoomLevel) + { + QDomElement response = doc.firstChildElement("response"); + + QDomElement zoomLevels = response.firstChildElement("zoomLevels"); + minZoomLevel = zoomLevels.attribute("min").toDouble(); + maxZoomLevel = zoomLevels.attribute("max").toDouble(); + } + + bool less(const QSize &first, const QSize &second) + { + return first.width() * first.height() < second.width() * second.height(); + } +} + QGeoMappingManagerEngineNokia::QGeoMappingManagerEngineNokia(const QMap<QString, QVariant> ¶meters, QGeoServiceProvider::Error *error, QString *errorString) : QGeoTiledMappingManagerEngine(parameters), m_cache(0), @@ -110,16 +176,6 @@ QGeoMappingManagerEngineNokia::QGeoMappingManagerEngineNokia(const QMap<QString, Q_UNUSED(error) Q_UNUSED(errorString) - setTileSize(QSize(256, 256)); - setMinimumZoomLevel(0.0); - setMaximumZoomLevel(18.0); - - QList<QGraphicsGeoMap::MapType> types; - types << QGraphicsGeoMap::StreetMap; - types << QGraphicsGeoMap::SatelliteMapDay; - types << QGraphicsGeoMap::TerrainMap; - setSupportedMapTypes(types); - QList<QGraphicsGeoMap::ConnectivityMode> modes; modes << QGraphicsGeoMap::OnlineMode; setSupportedConnectivityModes(modes); @@ -139,6 +195,7 @@ QGeoMappingManagerEngineNokia::QGeoMappingManagerEngineNokia(const QMap<QString, } } } + setupServiceInfo(); if (parameters.contains("mapping.host")) { QString host = parameters.value("mapping.host").toString(); @@ -300,3 +357,48 @@ QString QGeoMappingManagerEngineNokia::mapTypeToStr(QGraphicsGeoMap::MapType typ return "normal.day"; } +void QGeoMappingManagerEngineNokia::setupServiceInfo() +{ + QSize maxResolution(256, 256); + double minZoomLevel(0.0), maxZoomLevel(18.0); + QList<QGraphicsGeoMap::MapType> types; + types << QGraphicsGeoMap::StreetMap; + types << QGraphicsGeoMap::SatelliteMapDay; + types << QGraphicsGeoMap::TerrainMap; + + QString path = "http://"; + path += m_host; + path += "/maptiler/info"; + + std::auto_ptr<QNetworkReply> reply(m_networkManager->get(QNetworkRequest((QUrl(path))))); + + QEventLoop loop; + connect(reply.get(), SIGNAL(finished()), &loop, SLOT(quit())); + connect(reply.get(), SIGNAL(error(QNetworkReply::NetworkError)), &loop, SLOT(quit())); + loop.exec(); + + if (QNetworkReply::NoError == reply->error()) + { + QDomDocument doc; + if (doc.setContent(reply->readAll())) + { + getZoomLevels(doc, minZoomLevel, maxZoomLevel); + + types.clear(); + getMapTypes(doc, types); + + QList<QSize> resolutions; + getResolutions(doc, resolutions); + QList<QSize>::const_iterator found = std::max_element(resolutions.begin(), resolutions.end(), &less); + if (found != resolutions.end()) + { + maxResolution = *found; + } + } + } + + setTileSize(maxResolution); + setMinimumZoomLevel(minZoomLevel); + setMaximumZoomLevel(maxZoomLevel); + setSupportedMapTypes(types); +} diff --git a/plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.h b/plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.h index 6854685cb3..5335804ce5 100644 --- a/plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.h +++ b/plugins/geoservices/nokia/qgeomappingmanagerengine_nokia.h @@ -78,6 +78,9 @@ private: static QString sizeToStr(const QSize &size); static QString mapTypeToStr(QGraphicsGeoMap::MapType type); + + void setupServiceInfo(); + #if defined(Q_OS_SYMBIAN) QChar findFirstInternalFlashDrive(); #endif //Q_OS_SYMBIAN |