summaryrefslogtreecommitdiff
path: root/src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp
diff options
context:
space:
mode:
authorAaron McCarthy <mccarthy.aaron@gmail.com>2012-06-23 22:12:07 +1000
committerAaron McCarthy <mccarthy.aaron@gmail.com>2013-02-22 10:36:51 +0100
commited7d22bc48193fb901b610518dba26e83f7ee78e (patch)
treea85121e5c442b4ce5e6eae215e0fe5c50b20dabe /src/plugins/geoservices/osm/qgeocodingmanagerengineosm.cpp
parent9bc6ac130031e4ca72fc746b020e68e951d1490d (diff)
downloadqtlocation-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.cpp179
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 &parameters,
+ 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