Вызов Google Elevation работает с браузером, но не с node.js

TL;DR

Я создаю приложение с помощью node.js, который извлекает высоту, начиная с массива точек широты / долготы.

Чтобы получить высоту от координаты широта / долгота, я использую API GoogleMaps, в частности, API Google Elevation (см. Здесь документы)

Почему этот URL

// FOR OBVIOUS REASONS, THE API_KEY WAS REPLACED WITH XXXX_XXXX

https://maps.googleapis.com/maps/api/elevation/json?locations=enc:wyitGexebA?PB\&key=XXXX_XXXX

работать и возвращать данные через браузер, пока то же самое не происходит в node.js, что приводит к следующей ошибке ответа?

{ results: [], status: 'INVALID_REQUEST' }

Для самых смелых

Вот координаты, которые я использую и которые доставляют мне неприятности:

lat="45.4391630", lon="11.0120330"
lat="45.4391600", lon="11.0119420"
lat="45.4391410", lon="11.0117930"

Я использую модуль полилинии для преобразования координат с помощью алгоритма полилинии, и он прекрасно работает. Координаты преобразуются в следующую строку:

wyitGexebA?PB\

Вы можете дважды проверить достоверность результата прямо из утилиты Google Polilyne здесь, но я гарантирую, что строка верна.

Пока проблем нет, я радостно строю URL запроса и вот результат

// FOR OBVIOUS REASONS, THE API_KEY WAS REPLACED WITH XXXX_XXXX

https://maps.googleapis.com/maps/api/elevation/json?locations=enc:wyitGexebA?PB\&key=XXXX_XXXX

URL работает как брелок в браузере, вывод следующий

{
   "results" : [
      {
         "elevation" : 57.68282699584961,
         "location" : {
            "lat" : 45.43916,
            "lng" : 11.01203
         },
         "resolution" : 19.08790397644043
      },
      {
         "elevation" : 57.85408401489258,
         "location" : {
            "lat" : 45.43916,
            "lng" : 11.01194
         },
         "resolution" : 19.08790397644043
      },
      {
         "elevation" : 58.09893417358398,
         "location" : {
            "lat" : 45.43914,
            "lng" : 11.01179
         },
         "resolution" : 19.08790397644043
      }
   ],
   "status" : "OK"
}

К сожалению, тот же URL не работает внутри узла. Я использую модуль запроса здесь, чтобы выполнить грязную работу следующим образом:

var polyline = require('polyline');
var request = require('request');

var poly = polyline.encode([
    ['45.4391630', '11.0120330'],
    ['45.4391600', '11.0119420'],
    ['45.4391410', '11.0117930']
]);
var url = 'https://maps.googleapis.com/maps/api/elevation/json?locations=enc:' + poly + '&key=XXXX_XXXX';
request(url, function(err, res, body){
    if(err || res.statusCode != 200){
        console.log({err: err, status: 'Erorr'});
    }else{
        console.log(url);
        console.log(JSON.parse(body));
    }
});

Запустив это с узлом, выдает в консоли следующее:

https://maps.googleapis.com/maps/api/elevation/json?locations=enc:wyitGexebA?PB\&key=XXXX_XXXX
{ results: [], status: 'INVALID_REQUEST' }

Эта проблема не связана с логикой кода, поскольку та же самая логика использовалась для безошибочного извлечения с отметок 15k-30k. Если вы мне не верите (и должны это делать), вы можете проверить следующие координаты

var poly = polyline.encode([
    ['45.4393160', '11.0129670'],
    ['45.4393160', '11.0129200'],
    ['45.4392910', '11.0128690']
]);

Любой намек или помощь? Почему это другое поведение? заранее спасибо

1 ответ

Решение

В зависимости от того, как вы формируете строки, обратная косая черта может сбить вас с толку. Последний раздел вашего URL:

enc:wyitGexebA?PB\&key=XXXX_XXXX

когда он вставлен в строку, этот обратный слеш будет рассматриваться как экранирующий символ и исчезнет. Замени это %5C с помощью encodeURIComponent (или просто запустите весь URI через encodeURI)

Другие вопросы по тегам