立交桥 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 通话增加一些时间。