2017-08-23 1 views
0

Ich benutze die Überführungs-API, um Informationen über Krankenhäuser in einem bestimmten Gebiet zu erhalten. Dies ist die URL Ich verwende die Daten zu erhalten:Unerwartetes Token <in JSON an Position 0 in der Überführungs-API-Anforderung

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; 

Da die Krankenhäuser auch, wie andere sein können als einfacher Knoten, ich habe sie anders zu behandeln, so kann ich dies tun:

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 
    } 

Dann Ich benutze lat und lon, um einen Marker auf die Karte zu setzen.
Die Erklärung dafür ist, dass ein "Weg" keine einzige lat-lon-Information hat, sondern von mehreren Knoten gebildet wird. Dies ist ein Beispiel:

{ 
"type": "way", 
"id": 107248762, 
"nodes": [ 
1233017145, 
1233017732, 
1233017520, 
1233017183, 
1233018290, 
2144891055, 
1233017895, 
1233017145 
], 
"tags": { 
"amenity": "hospital", 
"wheelchair": "yes" 
} 
}, 

Also, die lat lon Informationen zu erhalten, habe ich die „id“ Eigenschaft verwenden, um die Mitte des Gebäudes zu erhalten, indem die urlWay in dem obigen Code mit Angabe out center meta. Ich benutze elements[0], weil das Array nur ein Element hat. Sie können ein Beispiel für die Ausgabe anzeigen, indem Sie auf here klicken.
Das Problem ist, dass zu einem bestimmten Zeitpunkt, während der Informationen über die Möglichkeiten, Abrufen und Markierungen auf der Karte setzt, stoppt das Programm und gibt mir den Fehler:

SyntaxError: Unexpected token < in JSON at position 0 in overpass api request 

Ich gehe davon aus (weiß nicht, ob Ich habe recht, dass es eine dieser JSON-Dateien gibt, die ich nicht richtig geschrieben habe, also frage ich mich, wie ich diese Ausnahme verhindern kann, indem ich einfach eine schlecht formatierte Datei ignoriere.

EDIT: Ich habe den Code geändert, wie von Benutzer MMD in den Antworten vorgeschlagen und funktionierte korrekt, so war es wahrscheinlich ein Fehler im Zusammenhang mit der Begrenzung der Rate.

+1

Wenn Sie auf die Registerkarte Netzwerk der Debug-Tools Ihres Browsers gehen, können Sie die tatsächliche Antwort der Anfrage sehen, um zu sehen, was passiert. Es besteht die große Chance, dass das Skript, das Sie aufrufen, auf eine HTML-Fehler- oder Warnseite reagiert, so dass das erste Zeichen ein '<' ist. Passiert mir viel – Kaddath

+0

Können Sie eine echte [MCVE] zur Verfügung stellen? Sie haben [Syntaxfehler] (http://jsbin.com/gifuwopewi/1/edit?js,console) in dem Code, den Sie geteilt haben und erwarten, dass jeder, der Ihren Test ausprobieren möchte, um sie selbst zu beheben, unangemessen ist. – Quentin

+0

Das Problem ist, dass ich nicht weiß, welcher der Aufrufe für die verschiedenen IDs den Fehler gibt, also suche ich nach einer Möglichkeit, diesen Fehler zu vermeiden, indem ich diese Dateien a priori möglicherweise ignoriere. @Quentin Ich werde die Frage ändern. – User999

Antwort

1

Das Problem bezieht sich höchstwahrscheinlich auf Ratenbegrenzung oder andere Fehlerbedingungen. In diesem Fall erhalten Sie eine XML-formatierte Fehlermeldung, obwohl der HTTP-Statuscode möglicherweise immer noch HTTP 200 lautet! Diese Nachricht kann nicht als JSON-String analysiert werden, daher die Fehlermeldung.

Im Allgemeinen ist Ihr Ansatz, die Overpass-API einzeln abzufragen, ziemlich ineffizient. Stattdessen können Sie auch mehrere IDs auf einmal bereitstellen. Es wird dringend empfohlen, Anforderungen auf diese Weise zu bündeln, anstatt eine Anfrage für jede einzelne ID zu senden, was die Chancen auf eine Begrenzung der Trefferrate stark erhöht.

way(id:1000,1002,1003,1004)[amenity=hospital]

In Wunder, warum Sie nicht out:center in Ihrer ursprünglichen Abfrage verwenden Sie erhalten alle Details auf einen Schlag bekommen.

[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

Nach einiger Zeit wirft die api 429 zu viele Anfragen Fehler. Versuchen Sie ein Timeout zu Ihren API-Anrufen hinzuzufügen.

Verwandte Themen