# Wie sucht man Verkehrshaltestellen in der Nähe mit einer API?

> Erfahren Sie, wie Sie Verkehrshaltestellen in der Nähe mit der ROOTE API suchen: Koordinaten, Radius, JavaScript-Beispiel, Ergebnisinterpretation und Fehlerbehandlung.

Source: https://www.roote.ai/de/guides/wie-sucht-man-in-der-naehe-liegende-verkehrshaltestellen-mit-einer-api/
Language: de
Author: ROOTE

Um Haltestellen um einen Punkt zu suchen, übermitteln Sie dessen Breiten- und Längengrad sowie einen Radius an eine Nahbereichs-API. Prüfen Sie danach den Antwortstatus, die zurückgegebenen Objekte und die Abdeckung, bevor Sie die Liste oder Karte anzeigen.

Im ROOTE Vertrag roote-1.0.0 findet die Route GET /v1/transit/nearby nahegelegene Verkehrsstellen. Diese ruft keine Abfahrten oder Echtzeitwarnungen ab. Die Suche nach einem Ort und die Suche nach der nächsten Abfahrt sind zwei getrennte Vorgänge.

## Parameter definieren

Die Anfrage verwendet lat für den Breitengrad und lng für den Längengrad. Das Alias lon ist im Vertrag ebenfalls beschrieben. Der Parameter radius gibt den Suchradius in Metern an; limit begrenzt die Anzahl der gewünschten Ergebnisse. Der Filter modes kann die Verkehrsmittel spezifizieren.

| Parameter | Beispiel | Bedeutung |
| --- | --- | --- |
| lat | 44.8378 | Breitengrad des Suchpunkts |
| lng | -0.5792 | Längengrad des Suchpunkts |
| radius | 600 | Angefragter Radius in Metern |
| limit | 10 | Begrenzung der Ergebnisanzahl |
| modes | bus,tram | Gesuchte Verkehrsmittel |

Diese Koordinaten dienen als Suchbeispiel für Bordeaux; sie garantieren keine Haltestelle. Siehe den [ROOTE OpenAPI Vertrag](https://api.roote.ai/openapi.json) für aktuelle Grenzen, Felder und Bedingungen.

## Erste Anfrage vom Server senden

Hier ein JavaScript-Beispiel für eine Node.js-Umgebung mit fetch. Das Token, falls für Ihren Zugang benötigt, bleibt serverseitig in einer Umgebungsvariable. Das Beispiel erfordert kein Geheimnis im Browser zu platzieren.

```
async function rechercherArrets(token = process.env.ROOTE_API_TOKEN) {
  const url = new URL('https://api.roote.ai/v1/transit/nearby');
  url.search = new URLSearchParams({
    lat: '44.8378',
    lng: '-0.5792',
    radius: '600',
    limit: '10',
    modes: 'bus,tram'
  }).toString();

  const headers = { Accept: 'application/json' };
  if (token) headers.Authorization = `Bearer ${token}`;

  const response = await fetch(url, {
    headers,
    signal: AbortSignal.timeout(10000)
  });
  if (!response.ok) {
    throw new Error(`Erreur HTTP ${response.status}`);
  }

  const data = await response.json();
  if (data.contract_version !== 'roote-1.0.0') {
    throw new Error('Version du contrat non reconnue');
  }
  if (!['success', 'empty', 'partial'].includes(data.status)) {
    throw new Error('Recherche indisponible');
  }
  if (!Array.isArray(data.stations)) {
    throw new Error('Réponse sans collection stations valide');
  }

  return {
    status: data.status,
    stations: data.stations,
    lines: data.lines,
    operators: data.operators,
    coverage: data.coverage,
    warnings: data.warnings,
    attributions: data.attributions,
    meta: data.meta
  };
}
```

Der geprüfte Vertrag sieht anonymen oder tokenbasierten Zugang vor, abhängig von den geltenden Richtlinien. Prüfen Sie Ihre Rechte und Zugriffslimits. Eine korrekte HTTP-Antwort ersetzt nicht die Inhaltsvalidierung; verwenden Sie in Produktion auch eine Objektvalidierung gegen das Schema.

## Entitäten und ihre Beziehungen lesen

Die Sammlung stations enthält die zurückgegebenen Orte. Prüfen Sie für jeden u.a. id, name, entity_kind, location und distance_meters. Die Referenzen line_ids und operator_ids erlauben die Zuordnung zu collections lines und operators, sofern vorhanden.

Stellen Sie eine geografische Distanz als solche dar. Wandeln Sie diese nicht ohne Routenberechnung in Fußgehzeit um. Der Leitfaden [nahegelegene Haltestelle finden](https://www.roote.ai/de/guides/nahegelegene-bushaltestelle-oder-tramhaltestelle-finden/) erklärt, warum Zugänge die reale Wegeführung beeinflussen können.

Behandeln Sie auch explizit unbekannte Informationen. Im Vertrag kann accessibility.wheelchair den Wert unknown annehmen: dieser entspricht weder yes noch no. Eine gekennzeichnete Abfahrtskapazität ist keine Abfahrtstabelle.

## Liste oder Karte anzeigen

Nutzen Sie die ID zur Stabilisierung der Interface-Elemente, den Namen für die Beschriftung und location für die Position. Verknüpfen Sie Linien über Referenzen, statt diese über Namen abzugleichen.

Wenn Sie Linienfarben oder Beschriftungen aus den Daten zeigen, betrachten Sie diese als externe Eingaben, die validiert werden müssen. Verwenden Sie für Namen Text, nicht eingespritztes HTML.

Bewahren Sie Quellenangaben und zeigen Sie die vom Vertrag geforderten an.

## Umgang mit leeren Ergebnissen, Teilantworten und Fehlern

Ein Ergebnis empty beschreibt eine Suche ohne Resultate im bekannten Bereich. Es beweist nicht die physische Abwesenheit von Verkehr. Eine partial Antwort kann nützliche Orte enthalten und zugleich Limitierungen signalisieren: zeigen Sie Ergebnisse und passende Warnhinweise.

Lesen Sie coverage, warnings und angewandte Limits in meta aus. Eine gekürzte Liste beschreibt keine vollständige Abdeckung. Bei Netzwerk- oder HTTP-Fehlern zeigen Sie eine Nichtverfügbarkeit, ohne das Resultat durch ‚keine Haltestelle‘ zu ersetzen.

Bei HTTP 429 beachten Sie Wiederanweisungen und mögliche Service-Header. Vermeiden Sie Dauerversuche.

## Stationen, Zonen und Bahnsteige unterscheiden

Das Feld entity_kind unterscheidet mehrere Ortsarten. Zwei nahe Ergebnisse können unterschiedliche Bahnsteige sein; ähnliche Namen können aus unterschiedlichen Quellen stammen.

Führen Sie Orte nicht nur anhand von Nähe zusammen. Nutzen Sie die vom Dienst dokumentierten Beziehungen und Identitäten. Unser Leitfaden [GTFS, GTFS-RT und GBFS](https://www.roote.ai/de/guides/gtfs-gtfs-rt-und-gbfs-was-sind-die-unterschiede/) erklärt den Kontext der Daten.

## Für die Produktion vorbereiten

Starten Sie Suchvorgänge, wenn Position oder Filter sinnvoll geändert werden. Fassen Sie gleiche Aufrufe zusammen, definieren Sie Timeout und passen Sie Cache an Datentyp und Servicestatus an.

Eine Liste von Orten und Echtzeit-Verfügbarkeit haben unterschiedliche Anforderungen an Aktualität. Testen Sie Ablauf mit kompletten, leeren, teilweisen Antworten und Fehlern, bevor Sie die Suche Nutzern zeigen.

## Suche auf städtische Dienste ausweiten

Haltestellen und städtische Dienste verwenden unterschiedliche Routen. Um Toiletten um denselben Punkt herum zu suchen, erwartet die GET-Route /v1/services/nearby lat und lon mit types=toilets. Senden Sie kein modes=toilets an diese Route: Diese Terminologie gehört zur Karten-URL, nicht zum Services-Filter.

Das folgende JavaScript-Beispiel baut eine Services-URL für einen Radius von 600 Metern auf. Es löst die Anfrage selbst nicht aus; verwenden Sie die oben beschriebenen HTTP- und Vertragsprüfungen erneut. Die erwartete Kollektion lautet services statt stations. Behalten Sie service_type, location, distance_meters und die tatsächlich vorhandenen Attribute bei.

Der REST-Vertrag dokumentiert insbesondere toilets, drinking_water, fountain, wifi, parking, charging, aed und locker. Die vom MCP bereitgestellten Typen können abweichen. Für akzeptierte Parameter, ihre Grenzen und Ihre Zugangsbeschränkungen konsultieren Sie das jeweilige Schnittstellenschema.

Die Attribute eines Dienstes garantieren nicht seine Verfügbarkeit zum Zeitpunkt der Suche. Eine unbekannte Zugänglichkeit entspricht nicht einem nicht verfügbaren Dienst; eine leere Liste aufgrund eines Fehlers beweist nicht das Fehlen von Toiletten. Bewahren Sie datenspezifische Informationen jeder Kategorie, statt sie nur auf Namen und Punkt zu reduzieren.

Für eine kombinierte Karte ordnen Sie die Ergebnisse ihrer Kategorie und deren IDs zu. Zeigen Sie eine Services-Fehlermeldung an, ohne die von Transit zurückgegebenen Haltestellen zu löschen. Die Suche bleibt um denselben Punkt zentriert, aber Status und Abdeckung können variieren.

```
const url = new URL('https://api.roote.ai/v1/services/nearby');
url.search = new URLSearchParams({
  lat: '44.8416106', lon: '-0.5810938',
  radius: '600', limit: '10', types: 'toilets'
}).toString();
console.log(url.toString());
```

[Eine leere oder fehlerhafte Suche diagnostizieren](https://www.roote.ai/de/guides/kein-ergebnis-oder-api-fehler-wie-unterscheiden/)

[Eine vorgefilterte Karte direkt in eine Website einbinden](https://www.roote.ai/de/guides/mobilitaetskarte-in-website-integrieren/)

[Einen Assistenten rund um diese Suchfunktionen bauen](https://www.roote.ai/de/guides/mobility-assistent-adresse-erstellen/)

## FAQ

### Gibt Nearby die nächsten Abfahrten aus?

Nicht im hier gezeigten Vertrag. Diese Route liefert Verkehrsstelle; Abfahrten erfordern einen separaten Endpoint.

### Kann ich nach einem Fehler eine leere Liste anzeigen?

Zeigen Sie eine Nichtverfügbarkeit. Ein Fehler beweist keine Abwesenheit von Haltestellen.

### Kann ich den API-Token im Browser ablegen?

Ein Geheimnis sollte serverseitig bleiben. Nutzen Sie das vorgesehene Zugriffsmodell für Ihre Anwendung und Ihren Account.
