我正在尝试获得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();
}
答案 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();
应该可以(至少对我有用)