• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

marble

  • sources
  • kde-4.14
  • kdeedu
  • marble
  • src
  • plugins
  • runner
  • nominatim-reversegeocoding
OsmNominatimReverseGeocodingRunner.cpp
Go to the documentation of this file.
1 //
2 // This file is part of the Marble Virtual Globe.
3 //
4 // This program is free software licensed under the GNU LGPL. You can
5 // find a copy of this license in LICENSE.txt in the top directory of
6 // the source code.
7 //
8 // Copyright 2010 Dennis Nienhüser <earthwings@gentoo.org>
9 //
10 
11 #include "OsmNominatimReverseGeocodingRunner.h"
12 
13 #include "MarbleDebug.h"
14 #include "MarbleLocale.h"
15 #include "GeoDataDocument.h"
16 #include "GeoDataPlacemark.h"
17 #include "GeoDataExtendedData.h"
18 #include "TinyWebBrowser.h"
19 
20 #include <QString>
21 #include <QVector>
22 #include <QUrl>
23 #include <QTimer>
24 #include <QNetworkAccessManager>
25 #include <QNetworkReply>
26 #include <QDomDocument>
27 
28 namespace Marble
29 {
30 
31 OsmNominatimRunner::OsmNominatimRunner( QObject *parent ) :
32  ReverseGeocodingRunner( parent ),
33  m_manager(this)
34 {
35  connect(&m_manager, SIGNAL(finished(QNetworkReply*)),
36  this, SLOT(handleResult(QNetworkReply*)));
37 }
38 
39 OsmNominatimRunner::~OsmNominatimRunner()
40 {
41  // nothing to do
42 }
43 
44 
45 void OsmNominatimRunner::returnNoReverseGeocodingResult()
46 {
47  emit reverseGeocodingFinished( m_coordinates, GeoDataPlacemark() );
48 }
49 
50 void OsmNominatimRunner::reverseGeocoding( const GeoDataCoordinates &coordinates )
51 {
52  m_coordinates = coordinates;
53  QString base = "http://nominatim.openstreetmap.org/reverse?format=xml&addressdetails=1";
54  // @todo: Alternative URI with addressdetails=1 could be used for shorther placemark name
55  QString query = "&lon=%1&lat=%2&accept-language=%3";
56  double lon = coordinates.longitude( GeoDataCoordinates::Degree );
57  double lat = coordinates.latitude( GeoDataCoordinates::Degree );
58  QString url = QString( base + query ).arg( lon ).arg( lat ).arg( MarbleLocale::languageCode() );
59 
60  m_request.setUrl(QUrl(url));
61  m_request.setRawHeader("User-Agent", TinyWebBrowser::userAgent("Browser", "OsmNominatimRunner") );
62 
63  QEventLoop eventLoop;
64 
65  QTimer timer;
66  timer.setSingleShot( true );
67  timer.setInterval( 15000 );
68 
69  connect( &timer, SIGNAL(timeout()),
70  &eventLoop, SLOT(quit()));
71  connect( this, SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)),
72  &eventLoop, SLOT(quit()) );
73 
74  // @todo FIXME Must currently be done in the main thread, see bug 257376
75  QTimer::singleShot( 0, this, SLOT(startReverseGeocoding()) );
76  timer.start();
77 
78  eventLoop.exec();
79 }
80 
81 void OsmNominatimRunner::startReverseGeocoding()
82 {
83  QNetworkReply *reply = m_manager.get( m_request );
84  connect(reply, SIGNAL(error(QNetworkReply::NetworkError)),
85  this, SLOT(returnNoReverseGeocodingResult()));
86 }
87 
88 void OsmNominatimRunner::handleResult( QNetworkReply* reply )
89 {
90  if ( !reply->bytesAvailable() ) {
91  returnNoReverseGeocodingResult();
92  return;
93  }
94 
95  QDomDocument xml;
96  if ( !xml.setContent( reply->readAll() ) ) {
97  mDebug() << "Cannot parse osm nominatim result " << xml.toString();
98  returnNoReverseGeocodingResult();
99  return;
100  }
101 
102  QDomElement root = xml.documentElement();
103  QDomNodeList places = root.elementsByTagName( "result" );
104  if ( places.size() == 1 ) {
105  QString address = places.item( 0 ).toElement().text();
106  GeoDataPlacemark placemark;
107  placemark.setAddress( address );
108  placemark.setCoordinate( m_coordinates );
109 
110  QDomNodeList details = root.elementsByTagName( "addressparts" );
111  if ( details.size() == 1 ) {
112  GeoDataExtendedData extendedData;
113  addData( details, "road", &extendedData );
114  addData( details, "house_number", &extendedData );
115  addData( details, "village", &extendedData );
116  addData( details, "city", &extendedData );
117  addData( details, "county", &extendedData );
118  addData( details, "state", &extendedData );
119  addData( details, "postcode", &extendedData );
120  addData( details, "country", &extendedData );
121  placemark.setExtendedData( extendedData );
122  }
123 
124  emit reverseGeocodingFinished( m_coordinates, placemark );
125  } else {
126  returnNoReverseGeocodingResult();
127  }
128 }
129 
130 void OsmNominatimRunner::addData( const QDomNodeList &node, const QString &key, GeoDataExtendedData *extendedData )
131 {
132  QDomNodeList child = node.item( 0 ).toElement().elementsByTagName( key );
133  if ( child.size() > 0 ) {
134  QString text = child.item( 0 ).toElement().text();
135  extendedData->addValue( GeoDataData( key, text ) );
136  }
137 }
138 
139 } // namespace Marble
140 
141 #include "OsmNominatimReverseGeocodingRunner.moc"
QObject::child
QObject * child(const char *objName, const char *inheritsClass, bool recursiveSearch) const
GeoDataDocument.h
QTimer::setInterval
void setInterval(int msec)
QDomElement::elementsByTagName
QDomNodeList elementsByTagName(const QString &tagname) const
Marble::GeoDataCoordinates
A 3d point representation.
Definition: GeoDataCoordinates.h:52
Marble::MarbleLocale::languageCode
static QString languageCode()
Definition: MarbleLocale.cpp:50
TinyWebBrowser.h
QDomNodeList::item
QDomNode item(int index) const
QEventLoop
QNetworkRequest::setUrl
void setUrl(const QUrl &url)
QDomDocument::toString
QString toString(int indent) const
QNetworkReply
QDomNodeList
QDomDocument::documentElement
QDomElement documentElement() const
GeoDataExtendedData.h
Marble::GeoDataCoordinates::latitude
qreal latitude(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
retrieves the latitude of the GeoDataCoordinates object use the unit parameter to switch between Radi...
Definition: GeoDataCoordinates.cpp:751
MarbleDebug.h
Marble::GeoDataCoordinates::Degree
Definition: GeoDataCoordinates.h:66
Marble::OsmNominatimRunner::reverseGeocoding
virtual void reverseGeocoding(const GeoDataCoordinates &coordinates)
Start a reverse geocoding request.
Definition: OsmNominatimReverseGeocodingRunner.cpp:50
QDomNode::toElement
QDomElement toElement() const
Marble::OsmNominatimRunner::~OsmNominatimRunner
~OsmNominatimRunner()
Definition: OsmNominatimReverseGeocodingRunner.cpp:39
QDomElement::text
QString text() const
QTimer
QEventLoop::exec
int exec(QFlags< QEventLoop::ProcessEventsFlag > flags)
QObject
QIODevice::readAll
QByteArray readAll()
QString
MarbleLocale.h
GeoDataPlacemark.h
QIODevice::bytesAvailable
virtual qint64 bytesAvailable() const
Marble::GeoDataCoordinates::longitude
qreal longitude(GeoDataCoordinates::Unit unit=GeoDataCoordinates::Radian) const
retrieves the longitude of the GeoDataCoordinates object use the unit parameter to switch between Rad...
Definition: GeoDataCoordinates.cpp:739
QUrl
QDomDocument
OsmNominatimReverseGeocodingRunner.h
QNetworkRequest::setRawHeader
void setRawHeader(const QByteArray &headerName, const QByteArray &headerValue)
Marble::OsmNominatimRunner::OsmNominatimRunner
OsmNominatimRunner(QObject *parent=0)
Definition: OsmNominatimReverseGeocodingRunner.cpp:31
Marble::ReverseGeocodingRunner
Definition: ReverseGeocodingRunner.h:25
QTimer::start
void start(int msec)
Marble::TinyWebBrowser::userAgent
static QByteArray userAgent(const QString &platform, const QString &plugin)
Definition: TinyWebBrowser.cpp:106
QNetworkAccessManager::get
QNetworkReply * get(const QNetworkRequest &request)
QDomNodeList::size
int size() const
Marble::ReverseGeocodingRunner::reverseGeocodingFinished
void reverseGeocodingFinished(const GeoDataCoordinates &coordinates, const GeoDataPlacemark &placemark)
Reverse geocoding is finished, result in the given placemark.
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
QDomElement
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Marble::GeoDataPlacemark
a class representing a point of interest on the map
Definition: GeoDataPlacemark.h:54
Marble::mDebug
QDebug mDebug()
a function to replace qDebug() in Marble library code
Definition: MarbleDebug.cpp:36
QDomDocument::setContent
bool setContent(const QByteArray &data, bool namespaceProcessing, QString *errorMsg, int *errorLine, int *errorColumn)
QTimer::setSingleShot
void setSingleShot(bool singleShot)
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:13:41 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

marble

Skip menu "marble"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members
  • Related Pages

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal