d
Dang Coffee Roaster
River Watch
API สาธารณะ (Open Data)
ข้อมูลระดับน้ำจุดนี้เปิดให้นำไปใช้ต่อได้ฟรี ไม่ต้องขอ API key ไม่ต้องล็อกอิน
เริ่มต้น
Base URL — https://flood.dangcoffeeroaster.com
ทุก endpoint เป็น GET ตอบกลับเป็น JSON
(ยกเว้นที่ระบุว่าเป็นภาพหรือ CSV) เปิด CORS ให้ทุกโดเมน
เรียกจากหน้าเว็บของคุณได้โดยตรง
ข้อมูลใหม่ทุก 30 นาที ดึงถี่กว่านั้นจะได้ค่าเดิม
รบกวนทำ cache ฝั่งคุณ และเรียกไม่ถี่กว่าทุก 5 นาที
curl -s https://flood.dangcoffeeroaster.com/api/latest
# ย้อนหลัง 7 วันเป็น CSV
curl -s "https://flood.dangcoffeeroaster.com/api/readings.csv?hours=168" -o river.csv
รายการ endpoint
GET /api/stationข้อมูลสถานี วิธีวัด เกณฑ์เฝ้าระวัง รอยน้ำท่วมในอดีต และสัญญาอนุญาต เรียกอันนี้ก่อนถ้าจะเอาค่าไปตีความ
GET /api/latestค่าล่าสุดหนึ่งรายการ พร้อมสถานะ แนวโน้ม และระยะถึงรอยน้ำท่วมที่ใกล้ที่สุด
GET /api/readingshours, limitรายการค่าย้อนหลังตามช่วงเวลา เรียงจากเก่าไปใหม่
GET /api/readings.csvhours, limitข้อมูลชุดเดียวกันในรูปแบบ CSV สำหรับ Excel หรือเครื่องมือวิเคราะห์
GET /api/summaryhoursสรุปช่วงเวลา ต่ำสุด สูงสุด เฉลี่ย อัตราเปลี่ยนแปลงเป็น ซม./ชม. และจำนวนชั่วโมงที่คาดว่าจะถึงระดับเฝ้าระวังหรือวิกฤต
GET /api/reading/{id}รายละเอียดของค่าหนึ่งรายการ รวมผลดิบจากตัวอ่าน
GET /api/frameshoursรายการภาพที่มีให้เล่นย้อนหลัง พร้อมเวลาและค่าระดับของแต่ละภาพ
GET /api/image/{id}ภาพต้นฉบับจากกล้องของค่านั้น (JPEG)
GET /api/thumb/{id}.jpgภาพย่อ 480x360 โหลดเร็วกว่า
GET /api/overlay/{id}ภาพเดียวกันที่วาดสเกลไม้วัดและเส้นผิวน้ำที่ตรวจจับได้ทับไว้ ใช้ตรวจสอบค่า
GET /card/{id}.pngการ์ดสรุปสำเร็จรูป เหมาะกับการแชร์ต่อ
GET /qr.pngQR code ของเว็บไซต์
GET /poster.pngใบประกาศ A4 สำหรับพิมพ์แจก
GET /healthสถานะระบบ และเวลาที่เก็บข้อมูลล่าสุด
GET /openapi.jsonสเปก OpenAPI ของทุก endpoint (หน้าเอกสารที่ /docs)
hours คือจำนวนชั่วโมงย้อนหลัง
limit คือจำนวนรายการสูงสุด
ช่วงชั่วโมงแรกที่เปิดระบบใช้ตัวอ่านรุ่นทดลองซึ่งคลาดเคลื่อนหลายสิบเซนติเมตร
ค่าเหล่านั้นถูกกรองออกให้โดยอัตโนมัติ หากต้องการดูด้วยให้ใส่
?include_experimental=true
ตัวอย่างผลลัพธ์ /api/latest
{
"id": 12,
"captured_at": "2026-09-27T18:49:11+07:00",
"level_m": 2.338,
"method": "cv",
"trend": "steady",
"status": "ok",
"confidence": 0.993,
"spread_m": 0.002,
"samples": 3,
"thresholds": {"warn_m": 2.9, "alert_m": 3.05,
"flood_marks_m": {"2554": 3.92, "2553": 3.06, "2564": 2.98}},
"next_flood_mark": {"year": "2564", "level_m": 2.98, "headroom_m": 0.642},
"image_url": "/api/image/12",
"overlay_url": "/api/overlay/12"
}
level_m คือระดับน้ำเป็นเมตรบนไม้วัดจุดนี้ ·
status เป็น ok / warn /
alert · trend เป็น rising /
falling / steady ·
confidence กับ spread_m บอกว่าภาพทั้งสามเฟรมอ่านตรงกันแค่ไหน
ถ้า level_m เป็น null
แปลว่ารอบนั้นอ่านไม่ได้ และเหตุผลอยู่ในช่อง error
ระบบจะไม่เดาค่าให้
ตัวอย่างโค้ด
JavaScript
const r = await fetch("https://flood.dangcoffeeroaster.com/api/latest").then(r => r.json());
console.log(r.level_m, r.status, r.trend);
Python
import urllib.request, json
url = "https://flood.dangcoffeeroaster.com/api/summary?hours=24"
data = json.load(urllib.request.urlopen(url))
print(data["max_m"], data["rate_cm_per_hour"], data["hours_to_warn"])
ข้อควรรู้ก่อนนำไปใช้
ค่าที่ได้คือระดับบนไม้วัดจุดนี้
ไม่ใช่ค่าอ้างอิงระดับทะเลปานกลาง จึงนำไปเทียบกับสถานีอื่นโดยตรงไม่ได้
เว้นแต่จะทราบค่าศูนย์ของไม้วัดนี้
อ่านด้วยคอมพิวเตอร์จากภาพกล้อง
กลางคืนหรือตอนทัศนวิสัยไม่ดีอาจอ่านไม่ได้
ไม่ใช่ประกาศเตือนภัยทางการ
หากนำไปแสดงต่อสาธารณะ กรุณาระบุข้อความนี้กำกับไว้
และแนะนำให้ผู้ใช้ยึดประกาศจากเทศบาล กรมชลประทาน และ ปภ. เป็นหลัก