6#include <QtCore/QJsonDocument>
7#include <QtCore/QJsonObject>
8#include <QtCore/QJsonArray>
9#include <QtPositioning/QGeoCoordinate>
10#include <QtPositioning/QGeoAddress>
11#include <QtPositioning/QGeoLocation>
12#include <QtPositioning/QGeoRectangle>
13#include <QtLocation/private/qgeojson_p.h>
21 setError(UnknownError, QStringLiteral(
"Null reply"));
24 connect(reply, &QNetworkReply::finished,
25 this, &QGeoCodeReplyOsm::networkReplyFinished);
26 connect(reply, &QNetworkReply::errorOccurred,
27 this, &QGeoCodeReplyOsm::networkReplyError);
28 connect(
this, &QGeoCodeReply::aborted, reply, &QNetworkReply::abort);
29 connect(
this, &QObject::destroyed, reply, &QObject::deleteLater);
34QGeoCodeReplyOsm::~QGeoCodeReplyOsm()
41 address.setText(object.value(QStringLiteral(
"display_name")).toString());
42 QJsonObject ao = object.value(QStringLiteral(
"address")).toObject();
44 address.setCountry(ao.value(QStringLiteral(
"country")).toString());
46 address.setCountryCode(ao.value(QStringLiteral(
"country_code")).toString());
48 address.setState(ao.value(QStringLiteral(
"state")).toString());
50 if (ao.contains(QLatin1String(
"city")))
51 address.setCity(ao.value(QStringLiteral(
"city")).toString());
52 else if (ao.contains(QLatin1String(
"town")))
53 address.setCity(ao.value(QLatin1String(
"town")).toString());
54 else if (ao.contains(QLatin1String(
"village")))
55 address.setCity(ao.value(QLatin1String(
"village")).toString());
57 address.setCity(ao.value(QLatin1String(
"hamlet")).toString());
59 address.setDistrict(ao.value(QStringLiteral(
"suburb")).toString());
61 address.setPostalCode(ao.value(QStringLiteral(
"postcode")).toString());
63 address.setStreet(ao.value(QStringLiteral(
"road")).toString());
64 address.setStreetNumber(ao.value(QStringLiteral(
"house_number")).toString());
68static void injectExtra(QGeoLocation &location,
const QJsonObject &object)
71 static const QList<QString> extraKeys = { QStringLiteral(
"geojson"),
72 QStringLiteral(
"icon"),
73 QStringLiteral(
"importance"),
74 QStringLiteral(
"type"),
75 QStringLiteral(
"osm_id"),
76 QStringLiteral(
"osm_type"),
77 QStringLiteral(
"licence"),
78 QStringLiteral(
"place_id"),
79 QStringLiteral(
"class") };
81 for (
const auto &k: extraKeys) {
82 if (object.contains(k)) {
83 extra[k] = object.value(k).toVariant();
84 if (k == QStringLiteral(
"geojson"))
85 extra[QStringLiteral(
"geojson_model")] =
86 QGeoJson::importGeoJson(QJsonDocument::fromVariant(extra[k]));
90 location.setExtendedAttributes(extra);
93void QGeoCodeReplyOsm::networkReplyFinished()
95 QNetworkReply *reply =
static_cast<QNetworkReply *>(sender());
98 if (reply->error() != QNetworkReply::NoError)
101 QList<QGeoLocation> locations;
102 QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
104 if (document.isObject()) {
105 QJsonObject object = document.object();
107 QGeoCoordinate coordinate;
109 coordinate.setLatitude(object.value(QStringLiteral(
"lat")).toString().toDouble());
110 coordinate.setLongitude(object.value(QStringLiteral(
"lon")).toString().toDouble());
112 QGeoLocation location;
113 location.setCoordinate(coordinate);
114 location.setAddress(parseAddressObject(object));
116 if (m_includeExtraData)
117 injectExtra(location, object);
118 locations.append(location);
120 setLocations(locations);
121 }
else if (document.isArray()) {
122 QJsonArray results = document.array();
124 for (
int i = 0; i < results.count(); ++i) {
125 if (!results.at(i).isObject())
128 QJsonObject object = results.at(i).toObject();
130 QGeoCoordinate coordinate;
132 coordinate.setLatitude(object.value(QStringLiteral(
"lat")).toString().toDouble());
133 coordinate.setLongitude(object.value(QStringLiteral(
"lon")).toString().toDouble());
135 QGeoRectangle rectangle;
137 if (object.contains(QStringLiteral(
"boundingbox"))) {
138 QJsonArray a = object.value(QStringLiteral(
"boundingbox")).toArray();
139 if (a.count() == 4) {
140 rectangle.setTopLeft(QGeoCoordinate(a.at(1).toString().toDouble(),
141 a.at(2).toString().toDouble()));
142 rectangle.setBottomRight(QGeoCoordinate(a.at(0).toString().toDouble(),
143 a.at(3).toString().toDouble()));
147 QGeoLocation location;
148 location.setCoordinate(coordinate);
149 location.setBoundingShape(rectangle);
150 location.setAddress(parseAddressObject(object));
151 if (m_includeExtraData)
152 injectExtra(location, object);
153 locations.append(location);
158 setLocations(locations);
162void QGeoCodeReplyOsm::networkReplyError(QNetworkReply::NetworkError error)
165 QNetworkReply *reply =
static_cast<QNetworkReply *>(sender());
166 reply->deleteLater();
167 setError(QGeoCodeReply::CommunicationError, reply->errorString());
The QNetworkReply class contains the data and headers for a request sent with QNetworkAccessManager.
static QGeoAddress parseAddressObject(const QJsonObject &object)
static void injectExtra(QGeoLocation &location, const QJsonObject &object)