意外的令牌<位于JSON中的立交桥api请求中的位置0
我使用立交api获取有关某个地区医院的信息。 这是我用它来获取数据的网址:意外的令牌<位于JSON中的立交桥api请求中的位置0
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
}
然后我使用lat和lon在地图上放置一个标记。
对此的解释是,“方式”没有单个纬度信息,但它由多个节点组成。这是一个例子:
{
"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调用添加一些超时。
如果您转到浏览器调试工具的网络选项卡,您可以看到请求的实际响应,以帮助您了解发生了什么。您正在调用的脚本很有可能会响应html错误或警告页面,所以第一个字符是' Kaddath
你能提供一个真实的[mcve]吗?你在共享的代码中有[语法错误](http://jsbin.com/gifuwopewi/1/edit?js,console),并期望每个想要测试你的测试的人都可以自己修复它们,这是不合理的。 – Quentin
问题是,我不知道哪个不同ID的调用给出了错误,所以我正在寻找一种方法来避免这个错误,或许可以先验地忽略这些文件。 @Quentin我会修改这个问题。 – User999