QGeoCodingManager没有错误但没有结果

时间:2018-05-27 02:11:05

标签: c++ qt qt5 qt5.7

我正在尝试获得QGeoLocation。我的Qt版本是5.7.1,顺便说一下,我在Debian上运行它。

我看过这篇文章how to get latitude/longitude from one geo address using Qt c++ on windows?

我从Scheff的答案中复制并粘贴了工作解决方案,但仍然没有错误和0个位置。这与我的设置/环境有关吗?

这个较短的代码具有相同的效果:

#include <QApplication>
#include <QGeoAddress>
#include <QGeoCodingManager>
#include <QGeoCoordinate>
#include <QGeoLocation>
#include <QGeoServiceProvider>
#include <QtDebug>

int main( int argc, char **argv)
{
    QCoreApplication app( argc, argv );

    QGeoServiceProvider geoSrv( "osm" );
    QGeoCodingManager *geoCoder = geoSrv.geocodingManager();
    QGeoAddress addr;
    addr.setCountry( "China" );
    QGeoCodeReply *geoCode = geoCoder->geocode( addr );

    if ( geoCode->error() )
        qDebug() << "error";

    qDebug() << geoCode->locations().length();

    return app.exec();
}

2 个答案:

答案 0 :(得分:1)

我在遇到相同问题时找到了您的帖子。对我来说,QGeoServiceProvider代码突然停止使用OpenStreetmap。我很快尝试了“ here” api,它似乎可以使用完全相同的代码。通过Wireshark快速检查后,我很容易发现了问题。

QGeoServiceProvider尝试通过以下URL连接到OpenStreetMap api:http://nominatim.openstreetmap.org,在这里它通过HTTP 303重定向到https://nominatim.openstreetmap.org。显然,QGeoServiceProvider无法正确处理此重定向。我通过在 osm.geocoding.host 参数中提供新的网址来解决此问题。使用您的代码将如下所示:

#include <QApplication>
#include <QGeoAddress>
#include <QGeoCodingManager>
#include <QGeoCoordinate>
#include <QGeoLocation>
#include <QGeoServiceProvider>
#include <QtDebug>

int main( int argc, char **argv)
{
   QCoreApplication app( argc, argv );

   //Add this
   QMap<QString,QVariant> params;
   params["osm.geocoding.host"] = "https://nominatim.openstreetmap.org";

   QGeoServiceProvider geoSrv( "osm", params );

   QGeoCodingManager *geoCoder = geoSrv.geocodingManager();
   QGeoAddress addr;
   addr.setCountry( "China" );
   QGeoCodeReply *geoCode = geoCoder->geocode( addr );

   if ( geoCode->error() )
       qDebug() << "error";

   qDebug() << geoCode->locations().length();

   return app.exec();
}

希望这会有所帮助!

答案 1 :(得分:1)

代替使用

QGeoServiceProvider geoSrv( "osm", params );
QGeoCodingManager *geoCoder = geoSrv.geocodingManager();

如果您改用指针:

QGeoServiceProvider* geoSrv = new QGeoServiceProvider( "osm", params );
QGeoCodingManager *geoCoder = geoSrv->geocodingManager();

应该可以(至少对我有用)