立交桥 api 请求中位置 0 中 JSON 中的意外标记 <
Unexpected token < in JSON at position 0 in overpass api request
我正在使用立交桥 api 来获取特定地区医院的信息。
这是我用来获取数据的url:
https://overpass-api.de/api/interpreter?data=[out:json][timeout:25];(node[amenity=hospital](41.862018386633096,12.380561828613283,41.9435317956981,12.612133026123049);way[amenity=hospital](41.862018386633096,12.380561828613283,41.9435317956981,12.612133026123049););out;
由于医院也可以是简单节点以外的其他方式,因此我必须区别对待它们,所以我这样做:
fetch(url).then(response => {
return response.json();
}).then(results => {
results.elements.forEach(e => {
console.log('Name '+e.tags["name"])
if(e.type == "way"){
console.log('ID: ' + e.id)
let urlWay = `https://overpass-api.de/api/interpreter?data=[out:json][timeout:25];(way[amenity=hospital](${e.id}););out%20center%20meta;`;
fetch(urlWay).then(response=> {
return response.json()
}).then(result => {
lat = result.elements[0].center["lat"]
lon = result.elements[0].center["lon"]
})
} else {
//get lat lon info normally
}
然后我用纬度和经度在地图上做个标记。
对此的解释是,一个"way"并没有单一的经纬度信息,而是由若干个节点组成。这是一个例子:
{
"type": "way",
"id": 107248762,
"nodes": [
1233017145,
1233017732,
1233017520,
1233017183,
1233018290,
2144891055,
1233017895,
1233017145
],
"tags": {
"amenity": "hospital",
"wheelchair": "yes"
}
},
因此,为了获取经纬度信息,我使用 "id" 属性 获取建筑物的中心,方法是在上面的代码中使用 urlWay
,指定 out center meta
。我使用 elements[0]
因为数组只有一个元素。您可以通过单击 here.
查看输出示例
问题是,在获取有关方式的信息并将标记放在地图上的某个时刻,程序停止并给我错误:
SyntaxError: Unexpected token < in JSON at position 0 in overpass api request
我假设(不知道我是否正确)我得到的这些 JSON 文件中有一个没有正确写入,所以我想知道如何防止这种情况发生异常,也许只是忽略格式错误的文件。
编辑:我已经修改了用户 mmd 在答案中提出的代码并且工作正常,所以它可能是与速率限制相关的错误。
问题很可能与速率限制或其他错误情况有关,在这种情况下,您会收到 XML 格式的错误消息,尽管 HTTP 状态代码可能仍为 HTTP 200!此消息无法解析为 JSON 字符串,因此出现错误消息。
一般来说,您逐一查询 Overpass API 的方法效率很低。相反,您也可以一次性提供多个 ID。强烈建议以这种方式捆绑请求,而不是为每个 ID 发送一个请求,这会严重增加达到速率限制的机会。
way(id:1000,1002,1003,1004)[amenity=hospital]
奇怪,为什么您不在原始查询中使用 out:center
一次性获取所有详细信息。
[out:json][timeout:25];
(node[amenity=hospital](41.862018386633096,12.380561828613283,41.9435317956981,12.612133026123049);
way[amenity=hospital](41.862018386633096,12.380561828613283,41.9435317956981,12.612133026123049););
out center;
一段时间后,api 抛出 429 请求过多错误。
尝试为您的 api 通话增加一些时间。
我正在使用立交桥 api 来获取特定地区医院的信息。 这是我用来获取数据的url:
https://overpass-api.de/api/interpreter?data=[out:json][timeout:25];(node[amenity=hospital](41.862018386633096,12.380561828613283,41.9435317956981,12.612133026123049);way[amenity=hospital](41.862018386633096,12.380561828613283,41.9435317956981,12.612133026123049););out;
由于医院也可以是简单节点以外的其他方式,因此我必须区别对待它们,所以我这样做:
fetch(url).then(response => {
return response.json();
}).then(results => {
results.elements.forEach(e => {
console.log('Name '+e.tags["name"])
if(e.type == "way"){
console.log('ID: ' + e.id)
let urlWay = `https://overpass-api.de/api/interpreter?data=[out:json][timeout:25];(way[amenity=hospital](${e.id}););out%20center%20meta;`;
fetch(urlWay).then(response=> {
return response.json()
}).then(result => {
lat = result.elements[0].center["lat"]
lon = result.elements[0].center["lon"]
})
} else {
//get lat lon info normally
}
然后我用纬度和经度在地图上做个标记。
对此的解释是,一个"way"并没有单一的经纬度信息,而是由若干个节点组成。这是一个例子:
{
"type": "way",
"id": 107248762,
"nodes": [
1233017145,
1233017732,
1233017520,
1233017183,
1233018290,
2144891055,
1233017895,
1233017145
],
"tags": {
"amenity": "hospital",
"wheelchair": "yes"
}
},
因此,为了获取经纬度信息,我使用 "id" 属性 获取建筑物的中心,方法是在上面的代码中使用 urlWay
,指定 out center meta
。我使用 elements[0]
因为数组只有一个元素。您可以通过单击 here.
查看输出示例
问题是,在获取有关方式的信息并将标记放在地图上的某个时刻,程序停止并给我错误:
SyntaxError: Unexpected token < in JSON at position 0 in overpass api request
我假设(不知道我是否正确)我得到的这些 JSON 文件中有一个没有正确写入,所以我想知道如何防止这种情况发生异常,也许只是忽略格式错误的文件。
编辑:我已经修改了用户 mmd 在答案中提出的代码并且工作正常,所以它可能是与速率限制相关的错误。
问题很可能与速率限制或其他错误情况有关,在这种情况下,您会收到 XML 格式的错误消息,尽管 HTTP 状态代码可能仍为 HTTP 200!此消息无法解析为 JSON 字符串,因此出现错误消息。
一般来说,您逐一查询 Overpass API 的方法效率很低。相反,您也可以一次性提供多个 ID。强烈建议以这种方式捆绑请求,而不是为每个 ID 发送一个请求,这会严重增加达到速率限制的机会。
way(id:1000,1002,1003,1004)[amenity=hospital]
奇怪,为什么您不在原始查询中使用 out:center
一次性获取所有详细信息。
[out:json][timeout:25];
(node[amenity=hospital](41.862018386633096,12.380561828613283,41.9435317956981,12.612133026123049);
way[amenity=hospital](41.862018386633096,12.380561828613283,41.9435317956981,12.612133026123049););
out center;
一段时间后,api 抛出 429 请求过多错误。 尝试为您的 api 通话增加一些时间。