# วิธีค้นหาจุดจอดขนส่งใกล้เคียงด้วย API ?

> ค้นพบการค้นหาจุดจอดใกล้เคียงด้วย ROOTE API: พิกัด รัศมี ตัวอย่าง JavaScript การอ่านผลลัพธ์ และการจัดการข้อผิดพลาด

Source: https://www.roote.ai/th/guides/%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2%E0%B8%88%E0%B8%B8%E0%B8%94%E0%B8%88%E0%B8%AD%E0%B8%94%E0%B8%A2%E0%B8%B2%E0%B8%99%E0%B8%9E%E0%B8%B2%E0%B8%AB%E0%B8%99%E0%B8%B0%E0%B9%83%E0%B8%81%E0%B8%A5%E0%B9%89%E0%B9%80%E0%B8%84%E0%B8%B5%E0%B8%A2%E0%B8%87%E0%B8%94%E0%B9%89%E0%B8%A7%E0%B8%A2api/
Language: th
Author: ROOTE

ในการค้นหาจุดจอดรอบๆ จุดหนึ่ง ให้นำละติจูด ลองจิจูด และรัศมีส่งไปยัง API ของพื้นที่ใกล้เคียง ตรวจสอบสถานะการตอบกลับ เอนทิตีที่ส่งคืน และข้อมูลความครอบคลุมก่อนแสดงผลเป็นรายการหรือแผนที่

ในเอกสารสัญญา ROOTE roote-1.0.0 เส้นทาง GET /v1/transit/nearby จะค้นหาสถานที่ขนส่งที่อยู่ใกล้ ไม่ดึงข้อมูลการออกเดินทางหรือการแจ้งเตือนแบบเรียลไทม์ การค้นหาสถานที่กับการค้นหาการเดินทางครั้งถัดไปเป็นสองกระบวนการแยกกัน

## กำหนดพารามิเตอร์

คำขอจะใช้ lat สำหรับละติจูด และ lng สำหรับลองจิจูด ชื่อแทน lon ก็อธิบายไว้ในเอกสารพารามิเตอร์ radius แสดงรัศมีเป็นเมตร; limit กำหนดจำนวนผลลัพธ์ที่ต้องการ ตัวกรอง modes สามารถกำหนดประเภทของการขนส่งได้

| พารามิเตอร์ | ตัวอย่าง | ความหมาย |
| --- | --- | --- |
| lat | 44.8378 | ละติจูดของจุดค้นหา |
| lng | -0.5792 | ลองจิจูดของจุดค้นหา |
| radius | 600 | รัศมีที่ต้องการเป็นเมตร |
| limit | 10 | ขีดจำกัดจำนวนผลลัพธ์ที่ต้องการ |
| modes | bus,tram | ประเภทการขนส่งที่ค้นหา |

พิกัดนี้ใช้เป็นตัวอย่างสำหรับการค้นหาในเมืองบอร์โดซ์; ไม่ได้หมายถึงจุดจอดใดที่รับประกัน โปรดดูที่ [เอกสารสัญญา OpenAPI ROOTE](https://api.roote.ai/openapi.json) เพื่อดูขอบเขต ฟิลด์ และเงื่อนไขล่าสุด

## ส่งคำขอครั้งแรกฝั่งเซิร์ฟเวอร์

นี่คือตัวอย่าง JavaScript สำหรับสภาพแวดล้อม Node.js ที่รองรับ fetch โทเค็น หากมีการใช้งาน จะเก็บในตัวแปรแวดล้อมฝั่งเซิร์ฟเวอร์ ตัวอย่างนี้ไม่จำเป็นต้องวางความลับในเบราว์เซอร์

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

สัญญาที่ใช้อนุญาตให้เข้าถึงแบบไม่ระบุชื่อหรือโดยใช้โทเค็น ตามนโยบายที่บังคับใช้ ตรวจสอบสิทธิ์และขีดจำกัดการเข้าถึงของคุณ การตอบกลับ HTTP ที่ถูกต้องไม่ใช่การยืนยันเนื้อหาเสมอไป; ในสภาพแวดล้อมจริง ควรตรวจสอบวัตถุตามโครงสร้างข้อมูลที่กำหนด

## อ่านเอนทิตีและความสัมพันธ์ระหว่างพวกมัน

ชุดข้อมูล stations ประกอบด้วยสถานที่ที่ส่งคืน สำหรับแต่ละรายการ ให้ดูข้อมูล id, name, entity_kind, location และ distance_meters การอ้างอิง line_ids และ operator_ids ช่วยเชื่อมชุดข้อมูล lines และ operators เมื่อมีให้

แสดงระยะทางทางภูมิศาสตร์ตามนั้น อย่าแปลงเป็นเวลาเดินโดยไม่มีการคำนวณเส้นทาง คู่มือ [ค้นหาจุดจอดใกล้เคียง](https://www.roote.ai/th/guides/%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2%E0%B8%9B%E0%B9%89%E0%B8%B2%E0%B8%A2%E0%B8%A3%E0%B8%96%E0%B9%80%E0%B8%A1%E0%B8%A5%E0%B9%8C%E0%B8%AB%E0%B8%A3%E0%B8%B7%E0%B8%AD%E0%B8%A3%E0%B8%96%E0%B8%A3%E0%B8%B2%E0%B8%87%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B9%83%E0%B8%81%E0%B8%A5%E0%B9%89%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%AA%E0%B8%B8%E0%B8%94/) อธิบายว่าทำไมการเข้าถึงโดยทางเดินอาจเปลี่ยนแปลงเส้นทางจริง

ควรจัดการกับข้อมูลที่ไม่ทราบโดยชัดเจน ในเอกสาร accessibility.wheelchair อาจเป็น unknown ซึ่งไม่เท่ากับ yes หรือ no ความสามารถในการประกาศการออกเดินทางไม่เหมือนกับรายการการออกเดินทางจริง

## แสดงรายการหรือแผนที่

ใช้รหัสประจำตัวเพื่อให้รายการในอินเทอร์เฟซเสถียร ใช้ชื่อสำหรับป้ายกำกับ และ location สำหรับตำแหน่ง เชื่อมโยงเส้นทางโดยการอ้างอิง แทนการจับคู่จากชื่อ

หากแสดงสีเส้นหรือป้ายกำกับจากข้อมูล ให้นำมาปฏิบัติเป็นข้อมูลภายนอกที่ต้องตรวจสอบ สำหรับชื่อ ควรใช้ข้อความแทน HTML ฝังกรณี Injection

เก็บรักษาแหล่งที่มาและแสดงผลลัพธ์ตามที่เอกสารระบุว่าจำเป็น

## จัดการผลลัพธ์ว่าง การตอบกลับบางส่วน และข้อผิดพลาด

ผลลัพธ์ empty คือการค้นหาที่ไม่มีผลลัพธ์ในพื้นที่ที่รู้จัก ไม่ได้หมายความว่าไม่มีการขนส่งจริง การตอบ partial อาจมีสถานที่ที่มีประโยชน์แต่เตือนข้อจำกัด ต้องแสดงผลลัพธ์และคำเตือนอย่างเหมาะสม

อ่านข้อมูล coverage, warnings และข้อจำกัดใน meta รายการที่ถูกตัดทอนไม่ได้แสดงความครอบคลุมทั้งหมด หากเกิดข้อผิดพลาดเครือข่ายหรือ HTTP ควรแสดงสถานะไม่สามารถใช้ได้โดยไม่เปลี่ยนผลลัพธ์เป็น 'ไม่มีจุดจอด'

สำหรับรหัส 429 ให้ดูคำแนะนำสำหรับการลองใหม่และส่วนหัวที่บริการเป็นไปได้ หลีกเลี่ยงการเรียกซ้ำอย่างต่อเนื่อง

## แยกความแตกต่างระหว่างสถานี โซน และชานชลา

ฟิลด์ entity_kind แยกระดับสถานที่ต่างๆ ผลลัพธ์สองรายการที่อยู่ใกล้กันอาจเป็นชานชลาด้านต่างกัน ชื่อที่คล้ายกันอาจมาจากแหล่งข้อมูลแตกต่างกัน

อย่ารวมสถานที่โดยอัตโนมัติแค่จากความใกล้ ใช้ความสัมพันธ์และตัวตนตามเอกสารของบริการ คู่มือของเรา [GTFS, GTFS-RT และ GBFS](https://www.roote.ai/th/guides/gtfs-gtfs-rt-et-gbfs-%E0%B8%84%E0%B8%A7%E0%B8%B2%E0%B8%A1%E0%B9%81%E0%B8%95%E0%B8%81%E0%B8%95%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B8%84%E0%B8%B7%E0%B8%AD%E0%B8%AD%E0%B8%B0%E0%B9%84%E0%B8%A3/) อธิบายบริบทของข้อมูล

## เตรียมการผสานใช้งานในสภาพแวดล้อมจริง

ส่งคำค้นหาหลังตำแหน่งหรือการตั้งค่าตัวกรองเปลี่ยนแปลงอย่างเป็นประโยชน์ รวมคำขอที่เหมือนกัน กำหนดเวลาเผื่อ และปรับแคชให้เหมาะสมกับประเภทข้อมูลและสภาวะของบริการ

รายการสถานที่และข้อมูลเวลาจริงมีข้อกำหนดความสดที่ต่างกัน ตรวจสอบเส้นทางด้วยคำตอบครบถ้วน, ว่าง, บางส่วน และข้อผิดพลาดก่อนแสดงผลให้ผู้ใช้

## ขยายการค้นหาไปยังบริการในเมือง

ป้ายและบริการในเมืองใช้เส้นทางที่แยกกัน สำหรับการค้นหาห้องน้ำรอบจุดเดียวกัน เส้นทาง GET /v1/services/nearby จะรอรับ lat และ lon พร้อมพารามิเตอร์ types=toilets อย่าส่ง modes=toilets ไปยังเส้นทางนี้ เพราะศัพท์นี้ใช้กับ URL แผนที่ ไม่ใช่ตัวกรองบริการ

ตัวอย่าง JavaScript ต่อไปนี้สร้าง URL บริการสำหรับรัศมี 600 เมตร ซึ่งยังไม่ทำการเรียกขอข้อมูล; ใช้ควบคุม HTTP และสัญญาที่อธิบายไว้ก่อนหน้า การเก็บรวบรวมข้อมูลที่คาดหวังคือ services แทน stations เก็บ service_type, location, distance_meters และแอตทริบิวต์ที่มีจริงไว้

สัญญา REST เอกสารอธิบายบริการ ได้แก่ toilets, drinking_water, fountain, wifi, parking, charging, aed และ locker ประเภทที่ MCP แสดงอาจแตกต่างกัน สำหรับพารามิเตอร์ที่รับได้ ขอบเขต และข้อจำกัดของการเข้าถึง กรุณาตรวจสอบสกีมาของอินเทอร์เฟซที่ใช้งาน

แอตทริบิวต์ของบริการไม่ได้หมายความว่าจะเปิดใช้งานในช่วงเวลาค้นหา การไม่ทราบความพร้อมใช้งานไม่เท่ากับบริการไม่สามารถใช้งานได้ รายการว่างจากข้อผิดพลาดไม่แสดงว่าห้องน้ำไม่มีอยู่จริง จงเก็บข้อมูลเฉพาะของแต่ละกลุ่มบริการแทนที่จะลดเหลือเพียงชื่อและจุด

สำหรับแผนที่ผสม ให้เชื่อมโยงผลลัพธ์กับกลุ่มและรหัสประจำตัว แสดงข้อความผิดพลาดของบริการโดยไม่ลบป้ายที่คืนจาก Transit การค้นหายังคงใช้จุดศูนย์กลางเดียวกัน แต่สถานะและการครอบคลุมอาจแตกต่างกัน

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

[วินิจฉัยการค้นหาที่ไม่มีผลลัพธ์หรือมีข้อผิดพลาด](https://www.roote.ai/th/guides/%E0%B8%9C%E0%B8%A5%E0%B8%A5%E0%B8%9A-api-%E0%B8%AB%E0%B8%A3%E0%B8%B7%E0%B8%AD-%E0%B8%82%E0%B9%89%E0%B8%AD%E0%B8%9C%E0%B8%B4%E0%B8%94%E0%B8%9E%E0%B8%A5%E0%B8%B2%E0%B8%94-%E0%B9%81%E0%B8%A2%E0%B8%81%E0%B9%81%E0%B8%A2%E0%B8%B0%E0%B8%AD%E0%B8%A2%E0%B9%88%E0%B8%B2%E0%B8%87%E0%B9%84%E0%B8%A3/)

[ฝังแผนที่ที่กรองข้อมูลไว้ในเว็บไซต์โดยตรง](https://www.roote.ai/th/guides/%E0%B8%A7%E0%B8%B4%E0%B8%98%E0%B8%B5%E0%B8%9D%E0%B8%B1%E0%B8%87%E0%B9%81%E0%B8%9C%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%84%E0%B8%A5%E0%B8%B7%E0%B9%88%E0%B8%AD%E0%B8%99%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B9%83%E0%B8%99%E0%B9%80%E0%B8%A7%E0%B9%87%E0%B8%9A%E0%B9%84%E0%B8%8B%E0%B8%95%E0%B9%8C%E0%B8%82%E0%B8%AD%E0%B8%87%E0%B8%84%E0%B8%B8%E0%B8%93/)

[สร้างผู้ช่วยรอบการค้นหาเหล่านี้](https://www.roote.ai/th/guides/%E0%B8%AA%E0%B8%A3%E0%B9%89%E0%B8%B2%E0%B8%87%E0%B8%9C%E0%B8%B9%E0%B9%89%E0%B8%8A%E0%B9%88%E0%B8%A7%E0%B8%A2%E0%B8%84%E0%B9%89%E0%B8%99%E0%B8%AB%E0%B8%B2%E0%B8%81%E0%B8%B2%E0%B8%A3%E0%B9%80%E0%B8%94%E0%B8%B4%E0%B8%99%E0%B8%97%E0%B8%B2%E0%B8%87%E0%B8%A3%E0%B8%AD%E0%B8%9A%E0%B8%97%E0%B8%B5%E0%B9%88%E0%B8%AD%E0%B8%A2%E0%B8%B9%E0%B9%88/)

## คำถามที่พบบ่อย

### Nearby ให้ข้อมูลการออกเดินทางครั้งถัดไปหรือไม่?

ไม่มีในเอกสารนี้ เส้นทางนี้ไปค้นหาสถานที่ขนส่ง ส่วนข้อมูลการเดินทางต้องใช้ความสามารถแยกต่างหาก

### แสดงรายการว่างหลังข้อผิดพลาดได้ไหม?

ควรแสดงสถานะไม่พร้อมใช้งาน ข้อผิดพลาดไม่ได้แสดงว่าไม่มีจุดจอดจริง

### เก็บโทเค็น API ไว้ในเบราว์เซอร์ได้ไหม?

ความลับควรเก็บไว้ฝั่งเซิร์ฟเวอร์ ใช้แบบจำลองการเข้าถึงตามที่ออกแบบสำหรับแอปพลิเคชันและบัญชีของคุณ
