gofawer / qt-google-maps

Automatically exported from code.google.com/p/qt-google-maps
0 stars 0 forks source link

Problem with postal addres #1

Open GoogleCodeExporter opened 9 years ago

GoogleCodeExporter commented 9 years ago
What steps will reproduce the problem?
1. Put postal anddres 
2. Click Boton GO
3. Window with message "Cannot convert to JSON Format"

What is the expected output? What do you see instead?
Window with message "Cannot convert to JSON Format"

What version of the product are you using? On what operating system?
Windows 7

Please provide any additional information below.

Original issue reported on code.google.com by animecom...@gmail.com on 13 Nov 2013 at 12:29

GoogleCodeExporter commented 9 years ago
same with ubuntu 12.04

Qt reveals; "JSon Scanner::yylex - unknown char, returning -1" upon trying to 
search for a postal address.

Original comment by Josef.Pr...@gmail.com on 16 Feb 2014 at 1:16

GoogleCodeExporter commented 9 years ago
update: Google error, reports that the program is trying to use automated 
requests.. gives link to https://support.google.com/websearch/answer/86640

Original comment by Josef.Pr...@gmail.com on 16 Feb 2014 at 1:29

GoogleCodeExporter commented 9 years ago
I believe I am experiencing a similar issue here.

It took me some time to get QJson running (see my comment at 
http://code.google.com/p/qt-google-maps/wiki/HowToCompileProject ) and getting 
a API key (apparently Google did some changes to their console ).

In the end, I got it running as a "API Key for server apps" with "Any IP 
allowed".

Now, the program runs and at the start the "Google Maps Browser" shows a map. 
Nice, I was very happy :-)

But as soon as I enter a postal address and press "Go", I get a "Geocode Error" 
telling me "Cannot convert to QJson object" (see attached screenshot).

My assumption is that the qt-google-maps program sends out a Json-request to 
Google Maps, but gets this error back from Google saying "Sorry can't process 
request".

This baffles me, as when I go to my developers-account at Google, they tell me 
that they received 4 requests for the API, so this means they have definitely 
received my requests, and I am far from over my quota.

Still, maybe I did something wrong with registering my API key?
Or a miscommunication between qt-google-maps and QJson ??

If any additional information is needed, please let me know and I will provide. 

The console gives me the following output:
URL =   QUrl( 
"http://maps.google.com/maps/geo?q=Berwang,+Austria&key=AIzaSyB6P_WbiYJfC3lVgMA4
bGr8jpeBFa-OEvY&output=json&oe=utf8&sensor=false" )  
json_parser - syntax error found,  forcing abort, Line 1 Column 1 

Kind greetings,

Wim

Original comment by zerped...@gmail.com on 5 Mar 2014 at 9:40

Attachments:

GoogleCodeExporter commented 9 years ago
Okay, interesting update:

I tried the QUrl in my browser and trimmed it to simply 
http://maps.google.com/maps/geo?q=Berwang,+Austria .

Now, the result is quite interesting: 

{
  "Status": {
    "code": 610,
    "request": "geocode",
    "error_message": "The Geocoding API v2 has been turned down on September 9th, 2013. The Geocoding API v3 should be used now. Learn more at https://developers.google.com/maps/documentation/geocoding/"
  }
}

Apparently, the qt-google-maps program uses the "old" v2 of the Geocoding API, 
and should now use v3.

Okay, I will try to solve this this evening and when I manage to succeed, I 
will post the results.

Kind greetings,

Wim (vvim)

Original comment by zerped...@gmail.com on 5 Mar 2014 at 9:43

GoogleCodeExporter commented 9 years ago
Guess I found a solution and turned the API from v2 to v3 by doing the 
following:

1. change the URL:

in "geocode_data_manager.cpp", function void 
GeocodeDataManager::getCoordinates(const QString& address), change the url to:

    QString url = QString("https://maps.googleapis.com/maps/api/geocode/json?address=%1&key=%2&oe=utf8&sensor=false").arg(address).arg(apiKey);

for the google_maps.html, you do not have to change the url.

2. change the code of the function "void 
GeocodeDataManager::replyFinished(QNetworkReply* reply)" in the file 
"geocode_data_manager.cpp" to the following

void GeocodeDataManager::replyFinished(QNetworkReply* reply)
{
    QString json = reply->readAll();
    qDebug() << "Reply = " << json;
    qDebug() << "URL = " << reply->url();
    QString strUrl = reply->url().toString();

    QJson::Parser parser;

    bool ok;

    // json is a QString containing the data to convert
    QVariant result = parser.parse (json.toLatin1(), &ok);
    if(!ok)
    {
        emit errorOccured(QString("Cannot convert to QJson object: %1").arg(json));
        return;
    }

/* old version of Geocoding API Application v2
    int code = result.toMap()["Status"].toMap()["code"].toInt();
    if(code != 200)
    {
        emit errorOccured(QString("Code of request is: %1").arg(code));
        return;
    }
*/

    // <vvim> upgrade to v3
    if(result.toMap()["status"].toString() != "OK")
    {
        emit errorOccured(QString("Code of request is: %1").arg(result.toMap()["status"].toString()));
        return;
    }
    // </vvim>

/* old version of Geocoding API Application v2
    QVariantList placeMarks = result.toMap()["Placemark"].toList();
    if(placeMarks.count() == 0)
    {
        emit errorOccured(QString("Cannot find any locations"));
        return;
    }

    double east  = placeMarks[0].toMap()["Point"].toMap()["coordinates"].toList()[0].toDouble();
    double north = placeMarks[0].toMap()["Point"].toMap()["coordinates"].toList()[1].toDouble();

    emit coordinatesReady(east, north);
*/

    // <vvim> upgrade to v3
    QVariantList nestedList = result.toMap()["results"].toList();
    QVariantList::Iterator it = nestedList.begin();
    if(it == nestedList.end())
    {
        emit errorOccured(QString("Cannot find any locations"));
        return;
    }
    QVariantMap locationOfResult = (*it).toMap()["geometry"].toMap()["location"].toMap();
    qDebug() << "location" << locationOfResult["lng"].toDouble() << locationOfResult["lat"].toDouble();

    emit coordinatesReady(locationOfResult["lng"].toDouble(), locationOfResult["lat"].toDouble()); // <vvim: handel omdraaien :-) eerst lng dan lat>
    // </vvim>

}

// warning: not extensively bug-tested, any comments welcome!!!
// For example: when Google Maps returns several results, only the first 
location will be taken (but I believe that is the way the original code works 
as well)// If I am granted access to the git, I am very willing to upload this 
.cpp for use

Original comment by zerped...@gmail.com on 7 Mar 2014 at 6:18

GoogleCodeExporter commented 9 years ago
This app is no longer working. I did everything the post above mine said but 
now i get an error "Cannot convert QJson object: " if anyone could provide any 
help i would be grateful!  

Original comment by geo.i...@gmail.com on 25 Aug 2014 at 2:32

GoogleCodeExporter commented 9 years ago
Adding to "zerped" changes (which have help immensely may i add, thank you very 
much zerped), some people may have issues where their google maps API key isnt 
valid.

I found that if you change the line (as modified by zerped):
   QString url = QString("https://maps.googleapis.com/maps/api/geocode/json?address=%1&key=%2&oe=utf8&sensor=false").arg(address).arg(apiKey);

too this instead: (simply removing the key)
   QString url = QString("https://maps.googleapis.com/maps/api/geocode/json?address=%1&oe=utf8&sensor=false").arg(address);

the map will now be able to goto the typed location, and add a marker there too.

Original comment by russellc...@gmail.com on 7 Mar 2015 at 1:43