diff options
author | Aaron McCarthy <mccarthy.aaron@gmail.com> | 2012-06-23 22:12:07 +1000 |
---|---|---|
committer | Aaron McCarthy <mccarthy.aaron@gmail.com> | 2013-02-22 10:36:51 +0100 |
commit | ed7d22bc48193fb901b610518dba26e83f7ee78e (patch) | |
tree | a85121e5c442b4ce5e6eae215e0fe5c50b20dabe | |
parent | 9bc6ac130031e4ca72fc746b020e68e951d1490d (diff) | |
download | qtlocation-ed7d22bc48193fb901b610518dba26e83f7ee78e.tar.gz |
Add geocoding support to OSM plugin.
Supports:
* geocoding
* reverse geocoding
* locale results
Change-Id: I1e7f5b5013e3ca56b7abe92d97c8cebc34c21cdd
Reviewed-by: Alex <ablasche@gmail.com>
-rw-r--r-- | src/plugins/geoservices/osm/osm.pro | 8 | ||||
-rw-r--r-- | src/plugins/geoservices/osm/osm_plugin.json | 4 | ||||
-rw-r--r-- | src/plugins/geoservices/osm/qgeocodereplyosm.cpp | 189 | ||||
-rw-r--r-- | src/plugins/geoservices/osm/qgeocodereplyosm.h | 70 | ||||
-rw-r--r-- | src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp | 179 | ||||
-rw-r--r-- | src/plugins/geoservices/osm/qgeocodingmanagerengineosm.h | 78 | ||||
-rw-r--r-- | src/plugins/geoservices/osm/qgeoserviceproviderpluginosm.cpp | 7 |
7 files changed, 527 insertions, 8 deletions
diff --git a/src/plugins/geoservices/osm/osm.pro b/src/plugins/geoservices/osm/osm.pro index ea26a964..96b51068 100644 --- a/src/plugins/geoservices/osm/osm.pro +++ b/src/plugins/geoservices/osm/osm.pro @@ -8,13 +8,17 @@ HEADERS += \ qgeoserviceproviderpluginosm.h \ qgeotiledmappingmanagerengineosm.h \ qgeotilefetcherosm.h \ - qgeomapreplyosm.h + qgeomapreplyosm.h \ + qgeocodingmanagerengineosm.h \ + qgeocodereplyosm.h SOURCES += \ qgeoserviceproviderpluginosm.cpp \ qgeotiledmappingmanagerengineosm.cpp \ qgeotilefetcherosm.cpp \ - qgeomapreplyosm.cpp + qgeomapreplyosm.cpp \ + qgeocodingmanagerengineosm.cpp \ + qgeocodereplyosm.cpp OTHER_FILES += \ osm_plugin.json diff --git a/src/plugins/geoservices/osm/osm_plugin.json b/src/plugins/geoservices/osm/osm_plugin.json index 690140a4..f004d8b7 100644 --- a/src/plugins/geoservices/osm/osm_plugin.json +++ b/src/plugins/geoservices/osm/osm_plugin.json @@ -4,6 +4,8 @@ "Version": 100, "Experimental": false, "Features": [ - "OnlineMappingFeature" + "OnlineMappingFeature", + "OnlineGeocodingFeature", + "ReverseGeocodingFeature" ] } diff --git a/src/plugins/geoservices/osm/qgeocodereplyosm.cpp b/src/plugins/geoservices/osm/qgeocodereplyosm.cpp new file mode 100644 index 00000000..dfb656dd --- /dev/null +++ b/src/plugins/geoservices/osm/qgeocodereplyosm.cpp @@ -0,0 +1,189 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Aaron McCarthy <mccarthy.aaron@gmail.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qgeocodereplyosm.h" + +#include <QtCore/QJsonDocument> +#include <QtCore/QJsonObject> +#include <QtCore/QJsonArray> +#include <QtLocation/QGeoCoordinate> +#include <QtLocation/QGeoAddress> +#include <QtLocation/QGeoLocation> +#include <QtLocation/QGeoRectangle> + +QT_BEGIN_NAMESPACE + +QGeocodeReplyOsm::QGeocodeReplyOsm(QNetworkReply *reply, QObject *parent) +: QGeocodeReply(parent), m_reply(reply) +{ + connect(m_reply, SIGNAL(finished()), this, SLOT(networkReplyFinished())); + connect(m_reply, SIGNAL(error(QNetworkReply::NetworkError)), + this, SLOT(networkReplyError(QNetworkReply::NetworkError))); + + setLimit(1); + setOffset(0); +} + +QGeocodeReplyOsm::~QGeocodeReplyOsm() +{ + if (m_reply) + m_reply->deleteLater(); +} + +void QGeocodeReplyOsm::abort() +{ + if (!m_reply) + return; + + m_reply->abort(); + + m_reply->deleteLater(); + m_reply = 0; +} + +void QGeocodeReplyOsm::networkReplyFinished() +{ + if (!m_reply) + return; + + if (m_reply->error() != QNetworkReply::NoError) + return; + + QJsonDocument document = QJsonDocument::fromJson(m_reply->readAll()); + + if (document.isObject()) { + QJsonObject object = document.object(); + + QGeoCoordinate coordinate; + + coordinate.setLatitude(object.value(QStringLiteral("lat")).toString().toDouble()); + coordinate.setLongitude(object.value(QStringLiteral("lon")).toString().toDouble()); + + QJsonObject ao = object.value(QStringLiteral("address")).toObject(); + + QGeoAddress address; + address.setText(object.value(QStringLiteral("display_name")).toString()); + address.setCountry(ao.value(QStringLiteral("country")).toString()); + address.setCountryCode(ao.value(QStringLiteral("country_code")).toString()); + address.setState(ao.value(QStringLiteral("state")).toString()); + address.setCity(ao.value(QStringLiteral("city")).toString()); + address.setDistrict(ao.value(QStringLiteral("suburb")).toString()); + address.setPostalCode(ao.value(QStringLiteral("postcode")).toString()); + address.setStreet(ao.value(QStringLiteral("road")).toString()); + + QGeoLocation location; + location.setCoordinate(coordinate); + location.setAddress(address); + + QList<QGeoLocation> locations; + locations.append(location); + + setLocations(locations); + setFinished(true); + } else if (document.isArray()) { + QJsonArray results = document.array(); + + QList<QGeoLocation> locations; + + for (int i = 0; i < results.count(); ++i) { + if (!results.at(i).isObject()) + continue; + + QJsonObject object = results.at(i).toObject(); + + QGeoCoordinate coordinate; + + coordinate.setLatitude(object.value(QStringLiteral("lat")).toString().toDouble()); + coordinate.setLongitude(object.value(QStringLiteral("lon")).toString().toDouble()); + + QGeoRectangle rectangle; + + if (object.contains(QStringLiteral("boundingbox"))) { + QJsonArray a = object.value(QStringLiteral("boundingbox")).toArray(); + if (a.count() == 4) { + rectangle.setTopLeft(QGeoCoordinate(a.at(1).toString().toDouble(), + a.at(2).toString().toDouble())); + rectangle.setBottomRight(QGeoCoordinate(a.at(0).toString().toDouble(), + a.at(3).toString().toDouble())); + } + } + + QJsonObject ao = object.value(QStringLiteral("address")).toObject(); + + QGeoAddress address; + address.setText(object.value(QStringLiteral("display_name")).toString()); + address.setCountry(ao.value(QStringLiteral("country")).toString()); + address.setCountryCode(ao.value(QStringLiteral("country_code")).toString()); + address.setState(ao.value(QStringLiteral("state")).toString()); + address.setCity(ao.value(QStringLiteral("city")).toString()); + address.setDistrict(ao.value(QStringLiteral("suburb")).toString()); + address.setPostalCode(ao.value(QStringLiteral("postcode")).toString()); + address.setStreet(ao.value(QStringLiteral("road")).toString()); + + QGeoLocation location; + location.setCoordinate(coordinate); + location.setBoundingBox(rectangle); + location.setAddress(address); + locations.append(location); + } + + setLocations(locations); + setFinished(true); + } + + m_reply->deleteLater(); + m_reply = 0; +} + +void QGeocodeReplyOsm::networkReplyError(QNetworkReply::NetworkError error) +{ + Q_UNUSED(error) + + if (!m_reply) + return; + + setError(QGeocodeReply::CommunicationError, m_reply->errorString()); + + m_reply->deleteLater(); + m_reply = 0; +} + +QT_END_NAMESPACE diff --git a/src/plugins/geoservices/osm/qgeocodereplyosm.h b/src/plugins/geoservices/osm/qgeocodereplyosm.h new file mode 100644 index 00000000..669ee40d --- /dev/null +++ b/src/plugins/geoservices/osm/qgeocodereplyosm.h @@ -0,0 +1,70 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Aaron McCarthy <mccarthy.aaron@gmail.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCODEREPLYOSM_H +#define QGEOCODEREPLYOSM_H + +#include <QtNetwork/QNetworkReply> +#include <QtLocation/QGeocodeReply> + +QT_BEGIN_NAMESPACE + +class QGeocodeReplyOsm : public QGeocodeReply +{ + Q_OBJECT + +public: + explicit QGeocodeReplyOsm(QNetworkReply *reply, QObject *parent = 0); + ~QGeocodeReplyOsm(); + + void abort(); + +private Q_SLOTS: + void networkReplyFinished(); + void networkReplyError(QNetworkReply::NetworkError error); + +private: + QNetworkReply *m_reply; +}; + +QT_END_NAMESPACE + +#endif // QGEOCODEREPLYOSM_H diff --git a/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp b/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp new file mode 100644 index 00000000..4119329c --- /dev/null +++ b/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp @@ -0,0 +1,179 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Aaron McCarthy <mccarthy.aaron@gmail.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include "qgeocodingmanagerengineosm.h" +#include "qgeocodereplyosm.h" + +#include <QtCore/QVariantMap> +#include <QtCore/QUrl> +#include <QtCore/QUrlQuery> +#include <QtCore/QLocale> +#include <QtNetwork/QNetworkAccessManager> +#include <QtNetwork/QNetworkRequest> +#include <QtLocation/QGeoCoordinate> +#include <QtLocation/QGeoAddress> +#include <QtLocation/QGeoShape> +#include <QtLocation/QGeoRectangle> + +QT_BEGIN_NAMESPACE + +static QString addressToQuery(const QGeoAddress &address) +{ + return address.street() + QStringLiteral(", ") + + address.district() + QStringLiteral(", ") + + address.city() + QStringLiteral(", ") + + address.state() + QStringLiteral(", ") + + address.country(); +} + +static QString boundingBoxToLtrb(const QGeoRectangle &rect) +{ + return QString::number(rect.topLeft().longitude()) + QLatin1Char(',') + + QString::number(rect.topLeft().latitude()) + QLatin1Char(',') + + QString::number(rect.bottomRight().longitude()) + QLatin1Char(',') + + QString::number(rect.bottomRight().latitude()); +} + +QGeocodingManagerEngineOsm::QGeocodingManagerEngineOsm(const QVariantMap ¶meters, + QGeoServiceProvider::Error *error, + QString *errorString) +: QGeocodingManagerEngine(parameters), m_networkManager(new QNetworkAccessManager(this)) +{ + if (parameters.contains(QStringLiteral("useragent"))) + m_userAgent = parameters.value(QStringLiteral("useragent")).toString().toLatin1(); + else + m_userAgent = "Qt Location based application"; + + *error = QGeoServiceProvider::NoError; + errorString->clear(); +} + +QGeocodingManagerEngineOsm::~QGeocodingManagerEngineOsm() +{ +} + +QGeocodeReply *QGeocodingManagerEngineOsm::geocode(const QGeoAddress &address, const QGeoShape &bounds) +{ + return geocode(address, -1, -1, bounds); +} + +QGeocodeReply *QGeocodingManagerEngineOsm::geocode(const QGeoAddress &address, int limit, int offset, const QGeoShape &bounds) +{ + Q_UNUSED(offset) + + QNetworkRequest request; + request.setRawHeader("User-Agent", m_userAgent); + + QUrl url(QStringLiteral("http://nominatim.openstreetmap.org/search")); + QUrlQuery query; + query.addQueryItem(QStringLiteral("q"), addressToQuery(address)); + query.addQueryItem(QStringLiteral("format"), QStringLiteral("json")); + query.addQueryItem(QStringLiteral("accept-language"), locale().name().left(2)); + //query.addQueryItem(QStringLiteral("countrycodes"), QStringLiteral("au,jp")); + if (bounds.type() == QGeoShape::RectangleType) { + query.addQueryItem(QStringLiteral("viewbox"), boundingBoxToLtrb(bounds)); + query.addQueryItem(QStringLiteral("bounded"), QStringLiteral("1")); + } + query.addQueryItem(QStringLiteral("polygon"), QStringLiteral("1")); + query.addQueryItem(QStringLiteral("addressdetails"), QStringLiteral("1")); + if (limit != -1) + query.addQueryItem(QStringLiteral("limit"), QString::number(limit)); + + url.setQuery(query); + request.setUrl(url); + + QNetworkReply *reply = m_networkManager->get(request); + + QGeocodeReplyOsm *geocodeReply = new QGeocodeReplyOsm(reply, this); + + connect(geocodeReply, SIGNAL(finished()), this, SLOT(replyFinished())); + connect(geocodeReply, SIGNAL(error(QGeocodeReply::Error,QString)), + this, SLOT(replyError(QGeocodeReply::Error,QString))); + + return geocodeReply; +} + +QGeocodeReply *QGeocodingManagerEngineOsm::reverseGeocode(const QGeoCoordinate &coordinate, + const QGeoShape &bounds) +{ + Q_UNUSED(bounds) + + QNetworkRequest request; + request.setRawHeader("User-Agent", m_userAgent); + + QUrl url(QStringLiteral("http://nominatim.openstreetmap.org/reverse")); + QUrlQuery query; + query.addQueryItem(QStringLiteral("format"), QStringLiteral("json")); + query.addQueryItem(QStringLiteral("accept-language"), locale().name().left(2)); + query.addQueryItem(QStringLiteral("lat"), QString::number(coordinate.latitude())); + query.addQueryItem(QStringLiteral("lon"), QString::number(coordinate.longitude())); + query.addQueryItem(QStringLiteral("zoom"), QStringLiteral("18")); + query.addQueryItem(QStringLiteral("addressdetails"), QStringLiteral("1")); + + url.setQuery(query); + request.setUrl(url); + + QNetworkReply *reply = m_networkManager->get(request); + + QGeocodeReplyOsm *geocodeReply = new QGeocodeReplyOsm(reply, this); + + connect(geocodeReply, SIGNAL(finished()), this, SLOT(replyFinished())); + connect(geocodeReply, SIGNAL(error(QGeocodeReply::Error,QString)), + this, SLOT(replyError(QGeocodeReply::Error,QString))); + + return geocodeReply; +} + +void QGeocodingManagerEngineOsm::replyFinished() +{ + QGeocodeReply *reply = qobject_cast<QGeocodeReply *>(sender()); + if (reply) + emit finished(reply); +} + +void QGeocodingManagerEngineOsm::replyError(QGeocodeReply::Error errorCode, const QString &errorString) +{ + QGeocodeReply *reply = qobject_cast<QGeocodeReply *>(sender()); + if (reply) + emit error(reply, errorCode, errorString); +} + +QT_END_NAMESPACE diff --git a/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.h b/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.h new file mode 100644 index 00000000..0794cced --- /dev/null +++ b/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Aaron McCarthy <mccarthy.aaron@gmail.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the QtLocation module of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#ifndef QGEOCODINGMANAGERENGINEOSM_H +#define QGEOCODINGMANAGERENGINEOSM_H + +#include <QtLocation/QGeoServiceProvider> +#include <QtLocation/QGeocodingManagerEngine> +#include <QtLocation/QGeocodeReply> + +QT_BEGIN_NAMESPACE + +class QNetworkAccessManager; + +class QGeocodingManagerEngineOsm : public QGeocodingManagerEngine +{ + Q_OBJECT + +public: + QGeocodingManagerEngineOsm(const QVariantMap ¶meters, QGeoServiceProvider::Error *error, + QString *errorString); + ~QGeocodingManagerEngineOsm(); + + QGeocodeReply *geocode(const QGeoAddress &address, const QGeoShape &bounds); + QGeocodeReply *geocode(const QGeoAddress &address, int limit, int offset, + const QGeoShape &bounds); + QGeocodeReply *reverseGeocode(const QGeoCoordinate &coordinate, const QGeoShape &bounds); + +private Q_SLOTS: + void replyFinished(); + void replyError(QGeocodeReply::Error errorCode, const QString &errorString); + +private: + QNetworkAccessManager *m_networkManager; + QByteArray m_userAgent; +}; + +QT_END_NAMESPACE + +#endif // QGEOCODINGMANAGERENGINEOSM_H diff --git a/src/plugins/geoservices/osm/qgeoserviceproviderpluginosm.cpp b/src/plugins/geoservices/osm/qgeoserviceproviderpluginosm.cpp index 3ee87bb8..e3087c40 100644 --- a/src/plugins/geoservices/osm/qgeoserviceproviderpluginosm.cpp +++ b/src/plugins/geoservices/osm/qgeoserviceproviderpluginosm.cpp @@ -41,6 +41,7 @@ #include "qgeoserviceproviderpluginosm.h" #include "qgeotiledmappingmanagerengineosm.h" +#include "qgeocodingmanagerengineosm.h" #include <QtLocation/private/qgeotiledmappingmanagerengine_p.h> @@ -49,11 +50,7 @@ QT_BEGIN_NAMESPACE QGeocodingManagerEngine *QGeoServiceProviderFactoryOsm::createGeocodingManagerEngine( const QVariantMap ¶meters, QGeoServiceProvider::Error *error, QString *errorString) const { - Q_UNUSED(parameters) - Q_UNUSED(error) - Q_UNUSED(errorString) - - return 0; + return new QGeocodingManagerEngineOsm(parameters, error, errorString); } QGeoMappingManagerEngine *QGeoServiceProviderFactoryOsm::createMappingManagerEngine( |