diff --git a/src/plugins/runner/nominatim-reversegeocoding/OsmNominatimReverseGeocodingRunner.cpp b/src/plugins/runner/nominatim-reversegeocoding/OsmNominatimReverseGeocodingRunner.cpp index d86e3ed3a..bc3bcabf0 100644 --- a/src/plugins/runner/nominatim-reversegeocoding/OsmNominatimReverseGeocodingRunner.cpp +++ b/src/plugins/runner/nominatim-reversegeocoding/OsmNominatimReverseGeocodingRunner.cpp @@ -1,152 +1,152 @@ // // This file is part of the Marble Virtual Globe. // // This program is free software licensed under the GNU LGPL. You can // find a copy of this license in LICENSE.txt in the top directory of // the source code. // // Copyright 2010 Dennis Nienhüser // #include "OsmNominatimReverseGeocodingRunner.h" #include "MarbleDebug.h" #include "MarbleLocale.h" #include "GeoDataPlacemark.h" #include "GeoDataExtendedData.h" #include "GeoDataData.h" #include "HttpDownloadManager.h" #include "osm/OsmPlacemarkData.h" #include #include #include #include #include namespace Marble { OsmNominatimRunner::OsmNominatimRunner( QObject *parent ) : ReverseGeocodingRunner( parent ), m_manager(this) { connect(&m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleResult(QNetworkReply*))); } OsmNominatimRunner::~OsmNominatimRunner() { // nothing to do } void OsmNominatimRunner::returnNoReverseGeocodingResult() { emit reverseGeocodingFinished( m_coordinates, GeoDataPlacemark() ); } void OsmNominatimRunner::reverseGeocoding( const GeoDataCoordinates &coordinates ) { m_coordinates = coordinates; - QString base = "http://nominatim.openstreetmap.org/reverse?format=xml&addressdetails=1"; + QString base = "https://nominatim.openstreetmap.org/reverse?format=xml&addressdetails=1"; // @todo: Alternative URI with addressdetails=1 could be used for shorther placemark name QString query = "&lon=%1&lat=%2&accept-language=%3"; double lon = coordinates.longitude( GeoDataCoordinates::Degree ); double lat = coordinates.latitude( GeoDataCoordinates::Degree ); QString url = QString( base + query ).arg( lon ).arg( lat ).arg( MarbleLocale::languageCode() ); m_request.setUrl(QUrl(url)); m_request.setRawHeader("User-Agent", HttpDownloadManager::userAgent("Browser", "OsmNominatimRunner") ); QEventLoop eventLoop; QTimer timer; timer.setSingleShot( true ); timer.setInterval( 15000 ); connect( &timer, SIGNAL(timeout()), &eventLoop, SLOT(quit())); connect( this, SIGNAL(reverseGeocodingFinished(GeoDataCoordinates,GeoDataPlacemark)), &eventLoop, SLOT(quit()) ); // @todo FIXME Must currently be done in the main thread, see bug 257376 QTimer::singleShot( 0, this, SLOT(startReverseGeocoding()) ); timer.start(); eventLoop.exec(); } void OsmNominatimRunner::startReverseGeocoding() { QNetworkReply *reply = m_manager.get( m_request ); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(returnNoReverseGeocodingResult())); } void OsmNominatimRunner::handleResult( QNetworkReply* reply ) { if ( !reply->bytesAvailable() ) { returnNoReverseGeocodingResult(); return; } QDomDocument xml; if ( !xml.setContent( reply->readAll() ) ) { mDebug() << "Cannot parse osm nominatim result " << xml.toString(); returnNoReverseGeocodingResult(); return; } QDomElement root = xml.documentElement(); QDomNodeList places = root.elementsByTagName(QStringLiteral("result")); if ( places.size() == 1 ) { QString address = places.item( 0 ).toElement().text(); GeoDataPlacemark placemark; placemark.setVisualCategory(GeoDataPlacemark::Coordinate); placemark.setAddress( address ); placemark.setCoordinate( m_coordinates ); QDomNode details = root.firstChildElement(QStringLiteral("addressparts")); extractChildren( details, placemark ); emit reverseGeocodingFinished( m_coordinates, placemark ); } else { returnNoReverseGeocodingResult(); } } void OsmNominatimRunner::extractChildren(const QDomNode &node, GeoDataPlacemark &placemark) { QMap tagTranslator; tagTranslator["house_number"] = "addr:housenumber"; tagTranslator["road"] = "addr:street"; tagTranslator["suburb"] = "addr:suburb"; tagTranslator["city"] = "addr:city"; tagTranslator["state_district"] = "addr:district"; tagTranslator["state"] = "addr:state"; tagTranslator["postcode"] = "addr:postcode"; tagTranslator["country_code"] = "addr:country"; // correct mapping // @todo Find a proper mapping for those //tagTranslator["village"] = ""; //tagTranslator["town"] = ""; GeoDataExtendedData data; OsmPlacemarkData osmData; QDomNodeList nodes = node.childNodes(); for (int i=0, n=nodes.length(); i // #include "OsmNominatimSearchRunner.h" #include "MarbleDebug.h" #include "MarbleLocale.h" #include "GeoDataPlacemark.h" #include "GeoDataExtendedData.h" #include "GeoDataData.h" #include "GeoDataLatLonAltBox.h" #include "HttpDownloadManager.h" #include "StyleBuilder.h" #include "osm/OsmPlacemarkData.h" #include #include #include #include #include #include namespace Marble { OsmNominatimRunner::OsmNominatimRunner( QObject *parent ) : SearchRunner( parent ), m_manager() { connect(&m_manager, SIGNAL(finished(QNetworkReply*)), this, SLOT(handleResult(QNetworkReply*))); } OsmNominatimRunner::~OsmNominatimRunner() { // nothing to do } void OsmNominatimRunner::returnNoResults() { emit searchFinished( QVector() ); } void OsmNominatimRunner::search( const QString &searchTerm, const GeoDataLatLonBox &preferred ) { - QString base = "http://nominatim.openstreetmap.org/search?"; + QString base = "https://nominatim.openstreetmap.org/search?"; QString query = "q=%1&format=xml&addressdetails=1&accept-language=%2"; QString url = QString(base + query).arg(searchTerm).arg(MarbleLocale::languageCode()); if( !preferred.isEmpty() ) { GeoDataCoordinates::Unit deg = GeoDataCoordinates::Degree; QString viewbox( "&viewbox=%1,%2,%3,%4&bounded=1" ); // left, top, right, bottom url += viewbox.arg(preferred.west(deg)) .arg(preferred.north(deg)) .arg(preferred.east(deg)) .arg(preferred.south(deg)); } m_request.setUrl(QUrl(url)); m_request.setRawHeader("User-Agent", HttpDownloadManager::userAgent("Browser", "OsmNominatimRunner") ); QEventLoop eventLoop; QTimer timer; timer.setSingleShot( true ); timer.setInterval( 15000 ); connect( &timer, SIGNAL(timeout()), &eventLoop, SLOT(quit())); connect( this, SIGNAL(searchFinished(QVector)), &eventLoop, SLOT(quit()) ); // @todo FIXME Must currently be done in the main thread, see bug 257376 QTimer::singleShot( 0, this, SLOT(startSearch()) ); timer.start(); eventLoop.exec(); } void OsmNominatimRunner::startSearch() { QNetworkReply *reply = m_manager.get( m_request ); connect(reply, SIGNAL(error(QNetworkReply::NetworkError)), this, SLOT(returnNoResults())); } GeoDataExtendedData OsmNominatimRunner::extractChildren(const QDomNode &node) { GeoDataExtendedData data; QDomNodeList nodes = node.childNodes(); for (int i=0, n=nodes.length(); ireadAll())) { qWarning() << "Cannot parse osm nominatim result"; + qWarning() << reply->error(); returnNoResults(); return; } QVector placemarks; QDomElement root = xml.documentElement(); QDomNodeList places = root.elementsByTagName(QStringLiteral("place")); for (int i=0; isetName( placemarkName ); placemark->setDescription(description); placemark->setAddress(desc); placemark->setCoordinate( lon.toDouble(), lat.toDouble(), 0, GeoDataCoordinates::Degree ); const auto category = StyleBuilder::determineVisualCategory(data); placemark->setVisualCategory( category ); placemark->setExtendedData(placemarkData); placemark->setOsmData(data); placemarks << placemark; } } emit searchFinished( placemarks ); } } // namespace Marble #include "moc_OsmNominatimSearchRunner.cpp"