Google 海拔调用适用于浏览器,但不适用于 node.js
Google Elevation call works with browser but not with node.js
TL;DR
我正在使用 node.js 构建一个应用程序,它从 latitude/longidtude 个点的数组开始检索海拔高度。
为了从 lat/lon 坐标获取高程,我使用 GoogleMaps API,特别是 Google 高程 API(查找文档 here)
为什么会这样 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
通过浏览器工作和 return 数据,而在 node.js 中不会发生同样的情况,导致以下响应错误?
{ results: [], status: 'INVALID_REQUEST' }
为了最勇敢的人
这是我正在使用但给我带来麻烦的坐标:
lat="45.4391630", lon="11.0120330"
lat="45.4391600", lon="11.0119420"
lat="45.4391410", lon="11.0117930"
我正在使用 polyline module to convert the coordinates with the Polyline Algorithm,效果很好。坐标转换为以下字符串:
wyitGexebA?PB\
您可以直接从 Google 的 Polilyne 实用程序 here 仔细检查结果的有效性,但我保证字符串是正确的。
到目前为止没有问题,我很高兴地构建了请求 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"
}
不幸的是,same url 在节点中不起作用。我在这里使用 request 模块来完成以下脏工作:
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']
]);
有什么提示或帮助吗?为什么会有这种不同的行为?提前致谢
根据您构建字符串的方式,反斜杠可能会误导您。你的后半部分URL:
enc:wyitGexebA?PB\&key=XXXX_XXXX
当插入字符串时,反斜杠将被视为转义字符并消失。通过 encodeURIComponent
将其替换为 %5C
(或者只是 运行 通过 encodeURI
的整个 URI)
TL;DR
我正在使用 node.js 构建一个应用程序,它从 latitude/longidtude 个点的数组开始检索海拔高度。
为了从 lat/lon 坐标获取高程,我使用 GoogleMaps API,特别是 Google 高程 API(查找文档 here)
为什么会这样 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
通过浏览器工作和 return 数据,而在 node.js 中不会发生同样的情况,导致以下响应错误?
{ results: [], status: 'INVALID_REQUEST' }
为了最勇敢的人
这是我正在使用但给我带来麻烦的坐标:
lat="45.4391630", lon="11.0120330"
lat="45.4391600", lon="11.0119420"
lat="45.4391410", lon="11.0117930"
我正在使用 polyline module to convert the coordinates with the Polyline Algorithm,效果很好。坐标转换为以下字符串:
wyitGexebA?PB\
您可以直接从 Google 的 Polilyne 实用程序 here 仔细检查结果的有效性,但我保证字符串是正确的。
到目前为止没有问题,我很高兴地构建了请求 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"
}
不幸的是,same url 在节点中不起作用。我在这里使用 request 模块来完成以下脏工作:
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']
]);
有什么提示或帮助吗?为什么会有这种不同的行为?提前致谢
根据您构建字符串的方式,反斜杠可能会误导您。你的后半部分URL:
enc:wyitGexebA?PB\&key=XXXX_XXXX
当插入字符串时,反斜杠将被视为转义字符并消失。通过 encodeURIComponent
将其替换为 %5C
(或者只是 运行 通过 encodeURI
的整个 URI)