# Hvordan søke etter transportstopp i nærheten med en API?

> Oppdag hvordan du søker etter nærliggende stopp med ROOTE API: koordinater, radius, JavaScript-eksempel, lesing av resultater og feilbehandling.

Source: https://www.roote.ai/no/guides/hvordan-soke-etter-nartransportstopp-med-en-api/
Language: no
Author: ROOTE

For å søke etter stopp rundt et punkt, send inn dets breddegrad, lengdegrad og en radius til en nærhets-API. Sjekk deretter status på svaret, de returnerte enhetene og dekningsinformasjonen før du viser listen eller kartet.

I ROOTE-kontrakten roote-1.0.0 oppdager GET /v1/transit/nearby ruten transportsteder i nærheten. Den henter ikke avganger eller varsler i sanntid. Å søke etter et sted og å søke etter dets neste avgang er to separate operasjoner.

## Definer parametrene

Forespørselen bruker lat for breddegrad og lng for lengdegrad. Aliaset lon er også beskrevet i kontrakten. Parameteren radius angir radiusen i meter; limit setter grensen for antall ønskede resultater. Filteret modes kan spesifisere transportmåter.

| Parameter | Eksempel | Betydning |
| --- | --- | --- |
| lat | 44.8378 | Breddegrad for søkepunktet |
| lng | -0.5792 | Lengdegrad for søkepunktet |
| radius | 600 | Etterspurt radius i meter |
| limit | 10 | Etterspurt grense for antall resultater |
| modes | bus,tram | Søkte transportmåter |

Disse koordinatene tjener som et søkeeksempel i Bordeaux; de angir ikke et garantert stopp. Se [ROOTE OpenAPI-kontrakten](https://api.roote.ai/openapi.json) for nåværende grenser, felter og betingelser.

## Send en første forespørsel på serversiden

Her er et JavaScript-eksempel for et Node.js-miljø med fetch. Tokenet, hvis din tilgang bruker ett, holdes i en miljøvariabel på serversiden. Eksemplet krever ikke at en hemmelighet legges i nettleseren.

```
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
  };
}
```

Den konsulterte kontrakten tillater anonym eller token-basert tilgang, avhengig av gjeldende regler. Sjekk dine rettigheter og tilganger. Et korrekt HTTP-svar fritar deg ikke fra å validere innholdet; i produksjon bruk også objektvalidering mot skjemaet.

## Les enhetene og deres relasjoner

Samlingen stations inneholder de returnerte stedene. For hver, se spesielt på id, name, entity_kind, location og distance_meters. Referansene line_ids og operator_ids kobler til samlingene lines og operators når de er tilgjengelige.

Vis geografisk distanse som den er. Ikke konverter den til gåtid uten ruteanalyser. Guiden [finn et nærliggende stopp](https://www.roote.ai/no/guides/hvordan-finne-naermeste-bussholdeplass-eller-trikkeholdeplass/) forklarer hvorfor tilganger kan endre den faktiske bevegelsen.

Behandle også ukjente opplysninger eksplisitt. I kontrakten kan accessibility.wheelchair ha verdien unknown: denne tilsvarer verken yes eller no. En kapasitet på annonserte avganger utgjør ikke en liste over avganger.

## Vis en liste eller et kart

Bruk identifikatoren for stabilisering av UI-elementer, navnet for merking, og location for posisjon. Koble linjer med referanser, ikke ved å sammenligne navn.

Hvis du viser linjefarger eller etiketter fra data, behandle disse som eksternt input som må valideres. For navn, bruk tekst, ikke injisert HTML.

Behold kildenes krediteringer og vis de som kontrakten krever.

## Håndtere tomt resultat, delvis svar og feil

Et empty-resultat beskriver et søk uten resultater i kjent område. Det beviser ikke fysisk fravær av transport. Et partial-svar kan inneholde nyttige steder samtidig som det varsler om begrensninger: vis resultater og passende advarsel.

Les coverage, warnings og begrensninger fra meta. En avkortet liste beskriver ikke fullstendig dekning. Ved nettverks- eller HTTP-feil, vis utilgjengelighet uten å erstatte resultatet med «ingen stopp».

For kode 429, følg retningslinjer for retry og eventuelle tjenesteoverskrifter. Unngå uendelige gjentakelser.

## Skill på stasjoner, soner og plattformer

Feltet entity_kind skiller ulike nivåer av steder. To nære resultater kan tilhøre ulike plattformer; to like navn kan stamme fra ulike kilder.

Slå ikke sammen steder automatisk basert kun på nærhet. Bruk relasjoner og identiteter dokumentert av tjenesten. Vår guide [GTFS, GTFS-RT og GBFS](https://www.roote.ai/no/guides/gtfs-gtfs-rt-og-gbfs-hva-er-forskjellene/) forklarer datakonteksten.

## Forbered integrasjon i produksjon

Utløs søk når posisjon eller filtre endres meningsfullt. Grupper like kall, sett tidsavbrudd og tilpass cache etter datatyper og tjenesteforhold.

En liste over steder og sanntidstilgjengelighet har ulike krav til ferskhet. Valider flyten med komplette, tomme, delvise og feilsvar før søket presenteres for brukere.

## Utvid søket til bytjenester

Stoppene og bytjenestene bruker ulike ruter. For å søke etter toaletter rundt samme punkt, venter GET-ruten /v1/services/nearby på lat og lon, med types=toilets. Ikke send modes=toilets til denne ruten: dette vokabularet tilhører kart-URL-en, ikke tjenestefilteret.

Følgende JavaScript-eksempel bygger en Services-URL for en radius på 600 meter. Den utløser ikke forespørselen; bruk HTTP- og kontrrollene beskrevet tidligere. Den forventede samlingen blir services i stedet for stations. Behold service_type, location, distance_meters og de faktiske tilstedeværende attributtene.

REST-kontrakten dokumenterer blant annet toilets, drinking_water, fountain, wifi, parking, charging, aed og locker. Typene som eksponeres av MCP kan variere. For aksepterte parametre, deres grenser og begrensninger i tilgangen din, se skjemaet for det brukte grensesnittet.

Attributtene til en tjeneste garanterer ikke at den er åpen ved søketidspunktet. Ukjent tilgjengelighet tilsvarer ikke utilgjengelig tjeneste; en tom liste grunnet feil beviser ikke fravær av toaletter. Behold data som er spesifikke for hver familie heller enn å redusere dem til et navn og et punkt.

For et kombinert kart, associer resultatene med deres familie og identifikatorer. Vis en Services-feil uten å slette stopp returnert av Transit. Søket forblir sentrert på samme punkt, men status og dekning kan variere.

```
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());
```

[Diagnostiser et tomt eller feilende søk](https://www.roote.ai/no/guides/ingen-resultat-eller-api-feil-slik-skal-du-skille/)

[Integrer et filtrert kart direkte på et nettsted](https://www.roote.ai/no/guides/integrere-mobilitetskart-pa-nettsiden/)

[Bygg en assistent basert på disse søkene](https://www.roote.ai/no/guides/hvordan-lage-en-assistent-som-finner-mobilitet-rundt-en-adresse/)

## Ofte stilte spørsmål

### Gir Nearby de neste avganger?

Ikke i denne kontrakten. Denne ruten oppdager transportsteder; avganger krever en separat kapasitet.

### Kan man vise en tom liste etter en feil?

Vis utilgjengelighet. En feil beviser ikke fravær av stopp.

### Kan API-token plasseres i nettleseren?

En hemmelighet skal forbli på serversiden. Bruk tilgangsmodellen som er tilpasset applikasjonen og kontoen din.
