Search code examples
google-maps-api-3geolocationgeocodingnode-red

Geocoding node-red-node-google. Error "Invalid request. Invalid 'latlng' parameter"


I´m not an expert in node-red and truly appreciate some help on using the node-red-node-google geocoding node. link to Google Geolocation node-red node

I'm trying to obtain the location address via google Geolocation API from previously obtained coordinates using the node mentioned above (geocode by coordinates option). I take latitude and length via POST from an external application.

How should the latitude and longitude data be fed into the geocode node to get the correct address data? After tens of tests, I always obtain the same error: "Invalid request. Invalid 'latlng' parameter". What I'm doing is:

  1. Take data generated via POST http://my_public_ip:1880/geo?id={device}&time={time}&lat={lat}&lng={lng}&radius={radius} The first node of the flow is a node-red Http In node, that implements the htp end-point, gets the info from that callback. Te info is retrieved correctly (see debug output) : {"id":"18A834","time":"1503231980","lat":"40.xxxxxxxxxxxxxx","lng":"-3.xxxxxxxxxxxxxx","radius":"1651"} Note: coordinates shadowed by privacy reasons.
  2. If lng and lat values from the HTTP In node are fed into the Google Geocoding node, the message error "Invalid request. Invalid 'latlng' parameter" is received.

I fill the dialog box this way:

Latitude text box: msg.payload.lat

Longitude Text box:msg.payload.lng

  1. I have tried several options inserting the coords function node: convert the latitude and longitude values to float, keep only the first 7 decimals, convert again to strings ..., and always the same error is received: "Invalid request. Invalid 'latlng' parameter"

The coords function node configuration:

var coords ={};
latitude= parseFloat(msg.payload.lat).toFixed(7);
latitude1 = parseFloat(latitude);
var length = parseFloat(msg.payload.lng).toFixed(7);
var length1= parseFloat(length);
coords.payload = {lat:latitude1, lng:length1};
return coords;

The function output seems to be correct: {"lat":40.xxxxxxx,"lng":-3.xxxxxxx}

So I expected to fill the text boxes with msg.payload.lat and msg.payload.lng should be ok. Clearly something is wrong ...

Does anybody know which is the correct way to feed longitude and latitude values to the node-red-node-google google-geocoding to get no errors? Find below node-red used code (remember, also tested different types of variable and also tested with no function at all):

[{"id":"4dadb4d9.246a1c","type":"http in","z":"76138ea1.88752","name":"get_coords_from_post","url":"/geo","method":"get","upload":false,"swaggerDoc":"","x":300,"y":200,"wires":[["4a0b74fb.d10fcc","fb89b080.ef1cf","dac1b7ce.4cc2c8"]]},{"id":"fb89b080.ef1cf","type":"function","z":"76138ea1.88752","name":"coords","func":"var coords ={};\nlatitude= parseFloat(msg.payload.lat).toFixed(7);\nlatitude1 = parseFloat(latitude);\nvar length = parseFloat(msg.payload.lng).toFixed(7);\nvar length1= parseFloat(length);\ncoords.payload = {lat:latitude1, lng:length1};\nreturn coords; \n","outputs":1,"noerr":0,"x":510,"y":200,"wires":[["a24b08cf.22ebf8","dac1b7ce.4cc2c8"]]},{"id":"4a0b74fb.d10fcc","type":"http response","z":"76138ea1.88752","name":"","statusCode":"","headers":{},"x":484,"y":131,"wires":[]},{"id":"dac1b7ce.4cc2c8","type":"debug","z":"76138ea1.88752","name":"","active":true,"console":"false","complete":"false","x":990,"y":480,"wires":[]},{"id":"a24b08cf.22ebf8","type":"google geocoding","z":"76138ea1.88752","name":"find_address_from_coords","geocodeBy":"coordinates","address":"","lat":"msg.payload.lat","lon":"msg.payload.lng","googleAPI":"","bounds":"","language":"es","region":"","components":"","x":740,"y":200,"wires":[["dac1b7ce.4cc2c8"]]}]

Solution

  • You shouldn't be putting msg.payload.lat or msg.payload.lon in the config dialog. If you are passing those values in via a message object you need to leave them blank in the config dialog.

    Next, as mentioned in the README.md and the info bar in Node-RED, you need to set the msg.location.lat and msg.location.lon on the incoming message to pass those value to the node.

    So basically your function node should look a little bit more like this:

    var coords ={};
    latitude= parseFloat(msg.payload.lat).toFixed(7);
    latitude1 = parseFloat(latitude);
    var length = parseFloat(msg.payload.lng).toFixed(7);
    var length1= parseFloat(length);
    coords.location = {lat:latitude1, lon:length1};
    return coords;