c++ qt geolocation location coordinates

¿Cómo obtener latitud/longitud desde una dirección geográfica usando Qt c++ en Windows?



geolocation location (2)

Creo que es posible. Aunque nunca lo intenté. Por favor, intente con el siguiente código.

Nota: Los atributos de la dirección están normalizados para los nombres de las funciones de EE. UU. Y pueden correlacionarse con los niveles de las funciones locales (por ejemplo, Estado coincide con "Bundesland" en Alemania). (Documentación de formulario copiada)

//Create a geo address object. QGeoAddress *add = new QGeoAddress(); //Assumed for USA. //Try below order so that search may be bit quicker. add->setCountry("Country name"); add->setCountryCode("country code"); add->setState("state"); add->setCity("city name"); add->setCounty("county name"); add->setStreet("street name") add->setPostalCode("Zip Code") //Create a geo location object QGeoLocation *loc = new QGeoLocation(); QGeoLocation::setAddress(add); //Set the QGeoLocation object //Get the coordinates by QGeoCoordinate QGeoCoordinate cord = loc->coordinate(); //Now get the coordinates for latitude and longitude. double latitude = cord.latitude(); doublelongitude = cord.longitude();

Es posible obtener las coordenadas (latitud y longitud), de una ubicación geográfica utilizando solo la dirección geográfica (país, estado, ciudad, calle, etc.), en Qt c ++?

Conozco las bibliotecas QGeoCoordinates, QGeoLocation y QGeoAddress, pero no sé si es posible obtener coordenadas de una dirección a través de ellas.

Toda ayuda es bienvenida.


Necesitaba algo de tiempo para dominar esto, pero finalmente lo conseguí trabajando.

Al principio probé las clases mencionadas por usted: QGeoAddress , QGeoLocation , QGeoCoordinate :

// standard C++ header: #include <iostream> // Qt header: #include <QGeoAddress> #include <QGeoCoordinate> #include <QGeoLocation> using namespace std; int main() { // build address QGeoAddress qGeoAddr; qGeoAddr.setCountry(QString::fromUtf8("Germany")); qGeoAddr.setPostalCode(QString::fromUtf8("88250")); qGeoAddr.setCity(QString::fromUtf8("Weingarten")); qGeoAddr.setStreet(QString::fromUtf8("Heinrich-Hertz-Str. 6")); QGeoLocation qGeoLoc.setAddress(qGeoAddr); QGeoCoordinate qGeoCoord = qGeoLoc.coordinate(); cout << "Lat.: " << qGeoCoord.latitude() << endl << "Long.: " << qGeoCoord.longitude() << endl << "Alt.: " << qGeoCoord.altitude() << endl; return 0; }

Esto se compila y ejecuta pero la salida no es muy divertida:

$ ./testQGeoAddress Qt Version: 5.6.2 Lat.: nan Long.: nan Alt.: nan

Entonces, ¿qué pasa con el código? Recostándome y pensando un poco sobre esto, tengo una pista: falta algún tipo de servicio que pueda transformar la dirección en coordenadas. ¿Qué podría ser esto? maps.google.com o algo similar?

Busqué en Google un tiempo y finalmente encontré hits relacionados con la biblioteca de location Qt. Después de experimentar y jugar un poco, finalmente obtuve este ejemplo en ejecución:

Archivo testQGeoAddress.pro :

SOURCES = testQGeoAddress.cc QT += widgets QT += positioning QT += location

Archivo testQGeoAddress.cc :

// standard C++ header: #include <iostream> #include <string> // Qt header: #include <QApplication> #include <QGeoAddress> #include <QGeoCodingManager> #include <QGeoCoordinate> #include <QGeoLocation> #include <QGeoServiceProvider> using namespace std; int main(int argc, char **argv) { cout << "Qt Version: " << QT_VERSION_STR << endl; // main application #undef qApp // undef macro qApp out of the way QCoreApplication qApp(argc, argv); // check for available services QStringList qGeoSrvList = QGeoServiceProvider::availableServiceProviders(); for (QString entry : qGeoSrvList) { cout << "Try service: " << entry.toStdString() << endl; // choose provider QGeoServiceProvider qGeoService(entry); QGeoCodingManager *pQGeoCoder = qGeoService.geocodingManager(); if (!pQGeoCoder) { cerr << "GeoCodingManager ''" << entry.toStdString() << "'' not available!" << endl; continue; } QLocale qLocaleC(QLocale::C, QLocale::AnyCountry); pQGeoCoder->setLocale(qLocaleC); // build address QGeoAddress qGeoAddr; qGeoAddr.setCountry(QString::fromUtf8("Germany")); qGeoAddr.setPostalCode(QString::fromUtf8("88250")); qGeoAddr.setCity(QString::fromUtf8("Weingarten")); qGeoAddr.setStreet(QString::fromUtf8("Heinrich-Hertz-Str. 6")); QGeoCodeReply *pQGeoCode = pQGeoCoder->geocode(qGeoAddr); if (!pQGeoCode) { cerr << "GeoCoding totally failed!" << endl; continue; } cout << "Searching..." << endl; QObject::connect(pQGeoCode, &QGeoCodeReply::finished, [&qApp, &qGeoAddr, pQGeoCode](){ cout << "Reply: " << pQGeoCode->errorString().toStdString() << endl; switch (pQGeoCode->error()) { #define CASE(ERROR) / case QGeoCodeReply::ERROR: cerr << #ERROR << endl; break CASE(NoError); CASE(EngineNotSetError); CASE(CommunicationError); CASE(ParseError); CASE(UnsupportedOptionError); CASE(CombinationError); CASE(UnknownError); #undef CASE default: cerr << "Undocumented error!" << endl; } if (pQGeoCode->error() != QGeoCodeReply::NoError) return; // eval. result QList<QGeoLocation> qGeoLocs = pQGeoCode->locations(); cout << qGeoLocs.size() << " location(s) returned." << endl; for (QGeoLocation &qGeoLoc : qGeoLocs) { qGeoLoc.setAddress(qGeoAddr); QGeoCoordinate qGeoCoord = qGeoLoc.coordinate(); cout << "Lat.: " << qGeoCoord.latitude() << endl << "Long.: " << qGeoCoord.longitude() << endl << "Alt.: " << qGeoCoord.altitude() << endl; } qApp.exit(0); }); return qApp.exec(); } return 0; }

Compila con g ++ en cygwin en Windows 10 (64 bit):

$ qmake-qt5 $ make g++ -c -pipe -fno-keep-inline-dllexport -O2 -std=gnu++11 -Wall -W -D_REENTRANT -fexceptions -DQT_NO_DEBUG -DQT_WIDGETS_LIB -DQT_LOCATION_LIB -DQT_QUICK_LIB -DQT_GUI_LIB -DQT_POSITIONING_LIB -DQT_QML_LIB -DQT_NETWORK_LIB -DQT_CORE_LIB -I. -I/usr/include/qt5 -I/usr/include/qt5/QtWidgets -I/usr/include/qt5/QtLocation -I/usr/include/qt5/QtQuick -I/usr/include/qt5/QtGui -I/usr/include/qt5/QtPositioning -I/usr/include/qt5/QtQml -I/usr/include/qt5/QtNetwork -I/usr/include/qt5/QtCore -I. -I/usr/lib/qt5/mkspecs/cygwin-g++ -o testQGeoAddress.o testQGeoAddress.cc g++ -o testQGeoAddress.exe testQGeoAddress.o -lQt5Widgets -lQt5Location -lQt5Quick -lQt5Gui -lQt5Positioning -lQt5Qml -lQt5Network -lQt5Core -lGL -lpthread $ ./testQGeoAddress.exe Qt Version: 5.6.2 Try service: mapbox GeoCodingManager ''mapbox'' not available! Try service: osm Searching... Reply: NoError 1 location(s) returned. Lat.: 47.8198 Long.: 9.63105 Alt.: nan $

No está mal para el primer intento. Acerca del valor de QGeoCoordinate::altitude() : es posible que no esté disponible en Open Street Map ( osm ).

Para verificar si el resultado es correcto, resolví la coordenada de salida en maps.google.com :

El globo rojo es el resultado de la búsqueda. Agregué el punto azul en GIMP para señalar la posición correcta. Bueno, la búsqueda estuvo cerca de la posición correcta. La diferencia puede deberse a la precisión limitada de las coordenadas ...