7#include <QtCore/QJsonDocument>
8#include <QtCore/QJsonObject>
9#include <QtCore/QJsonArray>
10#include <QtPositioning/QGeoCoordinate>
11#include <QtPositioning/QGeoAddress>
12#include <QtPositioning/QGeoLocation>
13#include <QtPositioning/QGeoRectangle>
14#include <QtLocation/private/qgeojson_p.h>
22 setError(UnknownError, QStringLiteral(
"Null reply"));
25 connect(reply, &QNetworkReply::finished,
26 this, &QGeoCodeReplyOsm::networkReplyFinished);
27 connect(reply, &QNetworkReply::errorOccurred,
28 this, &QGeoCodeReplyOsm::networkReplyError);
29 connect(
this, &QGeoCodeReply::aborted, reply, &QNetworkReply::abort);
30 connect(
this, &QObject::destroyed, reply, &QObject::deleteLater);
35QGeoCodeReplyOsm::~QGeoCodeReplyOsm()
42 address.setText(object.value(QStringLiteral(
"display_name")).toString());
43 QJsonObject ao = object.value(QStringLiteral(
"address")).toObject();
45 address.setCountry(ao.value(QStringLiteral(
"country")).toString());
47 address.setCountryCode(ao.value(QStringLiteral(
"country_code")).toString());
49 address.setState(ao.value(QStringLiteral(
"state")).toString());
51 if (ao.contains(QLatin1String(
"city")))
52 address.setCity(ao.value(QStringLiteral(
"city")).toString());
53 else if (ao.contains(QLatin1String(
"town")))
54 address.setCity(ao.value(QLatin1String(
"town")).toString());
55 else if (ao.contains(QLatin1String(
"village")))
56 address.setCity(ao.value(QLatin1String(
"village")).toString());
58 address.setCity(ao.value(QLatin1String(
"hamlet")).toString());
60 address.setDistrict(ao.value(QStringLiteral(
"suburb")).toString());
62 address.setPostalCode(ao.value(QStringLiteral(
"postcode")).toString());
64 address.setStreet(ao.value(QStringLiteral(
"road")).toString());
65 address.setStreetNumber(ao.value(QStringLiteral(
"house_number")).toString());
69static void injectExtra(QGeoLocation &location,
const QJsonObject &object)
72 static const QList<QString> extraKeys = { QStringLiteral(
"geojson"),
73 QStringLiteral(
"icon"),
74 QStringLiteral(
"importance"),
75 QStringLiteral(
"type"),
76 QStringLiteral(
"osm_id"),
77 QStringLiteral(
"osm_type"),
78 QStringLiteral(
"licence"),
79 QStringLiteral(
"place_id"),
80 QStringLiteral(
"class") };
82 for (
const auto &k: extraKeys) {
83 if (object.contains(k)) {
84 extra[k] = object.value(k).toVariant();
85 if (k == QStringLiteral(
"geojson"))
86 extra[QStringLiteral(
"geojson_model")] =
87 QGeoJson::importGeoJson(QJsonDocument::fromVariant(extra[k]));
91 location.setExtendedAttributes(extra);
94void QGeoCodeReplyOsm::networkReplyFinished()
96 QNetworkReply *reply =
static_cast<QNetworkReply *>(sender());
99 if (reply->error() != QNetworkReply::NoError)
102 QList<QGeoLocation> locations;
103 QJsonDocument document = QJsonDocument::fromJson(reply->readAll());
105 if (document.isObject()) {
106 QJsonObject object = document.object();
108 QGeoCoordinate coordinate;
110 coordinate.setLatitude(object.value(QStringLiteral(
"lat")).toString().toDouble());
111 coordinate.setLongitude(object.value(QStringLiteral(
"lon")).toString().toDouble());
113 QGeoLocation location;
114 location.setCoordinate(coordinate);
115 location.setAddress(parseAddressObject(object));
117 if (m_includeExtraData)
118 injectExtra(location, object);
119 locations.append(location);
121 setLocations(locations);
122 }
else if (document.isArray()) {
123 QJsonArray results = document.array();
125 for (
int i = 0; i < results.count(); ++i) {
126 if (!results.at(i).isObject())
129 QJsonObject object = results.at(i).toObject();
131 QGeoCoordinate coordinate;
133 coordinate.setLatitude(object.value(QStringLiteral(
"lat")).toString().toDouble());
134 coordinate.setLongitude(object.value(QStringLiteral(
"lon")).toString().toDouble());
136 QGeoRectangle rectangle;
138 if (object.contains(QStringLiteral(
"boundingbox"))) {
139 QJsonArray a = object.value(QStringLiteral(
"boundingbox")).toArray();
140 if (a.count() == 4) {
141 rectangle.setTopLeft(QGeoCoordinate(a.at(1).toString().toDouble(),
142 a.at(2).toString().toDouble()));
143 rectangle.setBottomRight(QGeoCoordinate(a.at(0).toString().toDouble(),
144 a.at(3).toString().toDouble()));
148 QGeoLocation location;
149 location.setCoordinate(coordinate);
150 location.setBoundingShape(rectangle);
151 location.setAddress(parseAddressObject(object));
152 if (m_includeExtraData)
153 injectExtra(location, object);
154 locations.append(location);
159 setLocations(locations);
163void QGeoCodeReplyOsm::networkReplyError(QNetworkReply::NetworkError error)
166 QNetworkReply *reply =
static_cast<QNetworkReply *>(sender());
167 reply->deleteLater();
168 setError(QGeoCodeReply::CommunicationError, reply->errorString());
The QNetworkReply class contains the data and headers for a request sent with QNetworkAccessManager.
Combined button and popup list for selecting options.
static QGeoAddress parseAddressObject(const QJsonObject &object)
static void injectExtra(QGeoLocation &location, const QJsonObject &object)