2017-08-23 46 views
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在答案中提出的代碼並正確工作,因此可能是與速率限制相關的錯誤。

+1

如果您轉到瀏覽器調試工具的網絡選項卡,您可以看到請求的實際響應,以幫助您瞭解發生了什麼。您正在調用的腳本很有可能會響應html錯誤或警告頁面,所以第一個字符是'<'。發生在我身上很多 – Kaddath

+0

你能提供一個真實的[mcve]嗎?你在共享的代碼中有[語法錯誤](http://jsbin.com/gifuwopewi/1/edit?js,console),並期望每個想要測試你的測試的人都可以自己修復它們,這是不合理的。 – Quentin

+0

問題是,我不知道哪個不同ID的調用給出了錯誤,所以我正在尋找一種方法來避免這個錯誤,或許可以先驗地忽略這些文件。 @Quentin我會修改這個問題。 – User999

回答

1

該問題很可能與速率限制或其他錯誤條件有關,在這種情況下,您會收到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; 
0

經過一段時間api拋出429太多的請求錯誤。 嘗試給你的API調用添加一些超時。

相關問題