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 /src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp | |
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>
Diffstat (limited to 'src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp')
-rw-r--r-- | src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp | 179 |
1 files changed, 179 insertions, 0 deletions
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 |