尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗เว็บแสดงสถานการณ์น้ำท่วมจาก Google Sheets สาธารณะ รันทั้งหมดผ่าน GitHub (ไม่ต้อง deploy Apps Script)
.github/workflows/pages.yml) ทำงานทุก 30 นาทีและเมื่อ pushfetch_data.cjs อ่านชีตเป็น CSV (ชีตต้องเปิดแบบ "ทุกคนที่มีลิงก์อ่านได้") แล้วแปลงด้วยตรรกะเดียวกับ Code.gs → docs/data.jsonbuild_pages.py รวมหน้าเว็บเป็น docs/index.htmlSettings → Pages → Source: GitHub Actions (Pages บน repo private ต้องใช้แพ็กเกจเสียเงิน)
node test.cjs
node fetch_data.cjs
python build_pages.py
python -m http.server 8000 --directory docs
ย้ายมาจากโปรเจกต์ SAT_flood: พาดหัวข่าวน้ำท่วม, Word Cloud (TF-IDF) และ Google Trends
news/news_scraper.py อ่าน RSS (Google News, มติชน, Thai PBS, ไทยรัฐ) ย้อนหลัง 30 ชม. → docs/news_data/news.json (เก็บเฉพาะพาดหัว/แหล่ง/ลิงก์/เวลา ไม่เก็บเนื้อหาข่าว)news/trends_scraper.py อ่าน Google Trends → docs/news_data/trends.json ถ้าอ่านไม่ได้ (pytrends ไม่เป็นทางการ อาจถูกจำกัดบน GitHub runner) จะแสดงสถานะ "ไม่พร้อมใช้งาน" ไม่ใช้ข้อมูลสมมติparts ใน trends.json) เส้นแนวโน้มลองใหม่ 1 ครั้งเมื่อเจอ 429flood_web/data-model.js (lifecycle) และพิมพ์สูตรไว้บนหน้า คำของแต่ละระยะกำหนดใน news/trends_scraper.py (PHASES) ไม่ใช่จำนวนการค้นหาจริงหรือจำนวนผู้ประสบภัยpages.yml ก่อน build และ continue-on-error จึงไม่ทำให้ deploy แดชบอร์ดล้ม ไฟล์ JSON ไม่ถูก commit (อยู่ใน docs/)news.json/trends.json ใหม่), ชิปคำค้นหาที่พุ่ง และอันดับจังหวัด ทุกตัวเลขมาจากสองไฟล์นี้เท่านั้น ไม่มีค่าประมาณflood_web/news-view.js (บล็อก <!--@pages-only-begin--> ใน template.html ถูกตัดออกจากแพ็กเกจ Apps Script โดย build.py และใส่กลับใน build_pages.py)python news/test_news.py · รันในเครื่อง: pip install -r news/requirements.txt && python news/news_scraper.py && python news/trends_scraper.py ก่อน python build_pages.pyแสดงตำบลที่ pipeline น้ำขัง (repo geeks_project_google) ประเมินว่าพบน้ำจากภาพดาวเทียมร่วมกับรายงานระดับอำเภอของ ปภ. อ่านอย่างเดียว ไม่เขียนกลับ Sheet
flood_waterlogged (1 แถว/ตำบล 21 คอลัมน์) และ flood_waterlogged_amphoe (1 แถว/อำเภอ 22 คอลัมน์ รวมระดับ 2P2R ของอำเภอและของจังหวัด แทนชีตเดิม flood_waterlogged_district และ flood_2p2r_province) หัวคอลัมน์ต้องครบ ไม่ครบ = ชีตนั้นเป็น error. ทุกค่าในชีตเป็นข้อความ ค่าว่างเป็น null (ไม่ใช่ 0) เวลาเป็นเวลาไทยOPTIONAL): fetch_data.cjs อ่านซ้ำ 1 ครั้งแล้วข้าม ไม่ทำให้ deploy ล้ม ชีตที่อ่านไม่ได้/ว่างทำให้แท็บแสดง "ยังไม่มีข้อมูลรอบนี้" แท็บอื่นทำงานปกติserver.py อ่านสองชีตนี้ด้วยชื่อแท็บ (gviz) เพราะไม่มี gid (SHEETS[...] = None); Code.gs (transform_) และ fetch_data.cjs ให้ผลเหมือนกันflood_web/waterlogged-view.js อ่าน window.dashboardData และวาดใหม่เมื่อมี event dashboard:data; ตรรกะบริสุทธิ์ (จัดกลุ่มสถานะ นับ เรียง กรอง ความสด) อยู่ใน data-model.js (waterRows, waterSummary, waterFilter, waterFreshness ...) มีเทสต์ใน test_model.cjs. ตารางใช้ window.DashboardTables (table()/paginateTables ของ dashboard.js)DashboardModel.WATERLOGGED_SOURCES ไม่ใส่ใน SOURCES (เหมือน RISK_SOURCES)basis (แท็บอำเภอ): ภาพดาวเทียม + ปภ. หรือ ปภ. (ไม่มีภาพดาวเทียม) (จังหวัดที่ไม่มีภาพดาวเทียมพบน้ำ แต่ ปภ. รายงานอำเภอต่อเนื่อง ≥ 3 วัน) แถวกลุ่มหลังไม่มีตำบลในแท็บตำบล คอลัมน์จำนวนตำบล/พื้นที่/max_run_days เป็นค่าว่าง (null) หน้าเว็บแสดง "–" ไม่แสดง 0 เรียงไว้ท้ายตาราง มีป้ายเด่น ตัวกรองที่มา การ์ดแยก และคลิกแล้วแจ้งว่าไม่มีรายการตำบลstatus และ reasonsstatus มี 5 ค่า (น้ำขัง, เฝ้าระวัง, พบน้ำใหม่, ข้อมูลไม่พอ, พบน้ำล่าสุด (ไม่มีภาพใหม่)) ไม่มีสถานะ "รอยืนยัน" แยก: น้ำขัง เป็นป้ายเดียวกันทุกตำบล ระดับหลักฐานอยู่ที่ confidence (สูง = "ยืนยันด้วยภาพ", กลาง = "ตาม ปภ.") หน้าเว็บแสดงป้ายเล็กในตาราง/รายละเอียด การ์ดน้ำขังแสดงยอดแยกใต้ตัวเลข ตารางเรียง confidence สูงก่อนกลาง และแผนที่ใช้ขอบประสำหรับระดับกลาง (สีเดียวกัน)สรุปความเสี่ยงรายจังหวัดที่เฝ้าระวัง จากข้อมูลที่ pipeline flood_prep_pipeline (repo geeks_project_google, วันละ 2 รอบ 09:00 และ 13:00 น.) เขียนลง Google Sheet เดียวกับแดชบอร์ด
flood_risk (รายจังหวัด: ระดับความเสี่ยง ฝนจริง/ฝนพยากรณ์ สถานีน้ำระดับ 5/4 ประกาศเตือน เหตุผล) และ flood_wl_critical (สถานีน้ำระดับ 4-5 พร้อมพิกัดและแนวโน้ม)OPTIONAL ใน flood_web/server.py → optional ใน Config.gs): ถ้าอ่านไม่ได้ fetch_data.cjs ข้ามชีตนั้นแทนที่จะทำให้ deploy ล้ม และแท็บนี้แสดงข้อความแจ้ง แท็บอื่นไม่ได้รับผลกระทบflood_web/risk-view.js อ่านข้อมูลจาก window.dashboardData (ที่ dashboard.js เผยแพร่) และวาดใหม่เมื่อมี event dashboard:data; กฎคำนวณล้วน (จัดเรียง สรุป แนวโน้มระดับน้ำ ความสดของข้อมูล) อยู่ใน data-model.js และมีทดสอบใน test_model.cjsDashboardModel.RISK_SOURCES ไม่ใส่ใน SOURCES โดยตั้งใจ เพื่อไม่ให้ไปปรากฏในแถบแจ้งเตือน ฟุตเตอร์ หรือปุ่มรีเฟรชของแท็บหลักflood_risk: forecast_start, forecast_fetched_at, forecast_daily_mm (ฝนรายวันคั่นด้วย | ช่องว่าง = ไม่มีข้อมูลวันนั้น), cap_headlines, tmd_warning_title, tmd_warning_text; ใน flood_wl_critical: amphoe, basin_nameVulnerable_group ที่แดชบอร์ดอ่านอยู่แล้ว (จับคู่ด้วยชื่อจังหวัด) ไม่ต้องมีข้อมูลเพิ่มResizeObserver และไม่ fit ขณะคอนเทนเนอร์ขนาด 0 (แท็บถูกซ่อน/กริดยังไม่จัด)REQUIRED/NUMERIC/DATES และ transform() ใน flood_web/server.py กับ transform_ ใน Code.gs ให้ตรงกัน แล้วรัน python build.pyแสดงผลประเมินสุขาภิบาลสิ่งแวดล้อมของศูนย์พักพิงชั่วคราวจากแท็บ doh_shelter ในชีตเดียวกัน (ชีตต้องเปิดแบบ "ทุกคนที่มีลิงก์อ่านได้")
doh_shelter/build_doh_shelter.py อ่าน CSV ของแท็บ → docs/doh_shelter.json (แปลงวันที่ พ.ศ./ค.ศ., เลือกการประเมินล่าสุดต่อศูนย์ is_latest, คำนวณร้อยละผ่านเกณฑ์ score, ตรวจว่าคอลัมน์ที่ต้องใช้ครบ ถ้าไม่ครบจะล้มพร้อมข้อความ) รันใน pages.yml แบบ continue-on-errorflood_web/shelter-doh-view.js (บล็อก pages-only ใน template.html เหมือนแท็บข่าว)python doh_shelter/test_doh_shelter.py · รันในเครื่อง: python doh_shelter/build_doh_shelter.py && python build_pages.pySTALE_DAYS ใน build_doh_shelter.py)Water_Level_Trend, เฉพาะแถว "กำลังประสบภัย", เลือกวันรายงานได้; เพิ่มขึ้น/ทรงตัว/ลดลง ใช้สีเดียวกับป้ายในตารางหลัก, ถ้าจังหวัดมีหลายแถวใช้แนวโน้มที่แย่สุด) จังหวัดที่ไม่อยู่ในรายงานไม่ได้แปลว่าไม่ท่วมITEMS ใน build_doh_shelter.py) แต่ละข้อได้ ดี / พอใช้ / ต้องปรับปรุง ตามคำตอบ (ต้นทางเรียก ผ่าน / ติดตาม) (ข้อ "พบปัญหา..." กลับขั้ว; Q09 และผลคลอรีน ตัดสินจากข้อความคำตอบ) ระดับมิติ = ข้อที่แย่สุดในมิติ ระดับศูนย์ = มิติที่แย่สุด ไม่นับข้อที่ไม่ได้ตอบ ข้อ Q16/Q18 ใช้ตามต้นทาง (ไม่ใช่ = ต้องปรับปรุง) ซึ่งต่างจากตารางใน แนวทางจัดระดับศพพ.docx (พอใช้) ข้อ 3.2, 4, 12, 19.1, 19.2 (รวมผลคลอรีน) และ 21 ยังประเมินและแสดงรายข้อ แต่ไม่ถูกนับในระดับมิติ (อนุมานจากตัวเลขของต้นทาง ควรยืนยันกับเจ้าของแดชบอร์ด) ตัวเลขรายมิติตรงกับต้นทาง; ช่องข้อความ/ตัวเลข (จำนวนห้องส้วม ฯลฯ) เก็บเป็นข้อมูลประกอบ (SUPPLEMENTARY) ไม่นำมาคำนวณflood_web/ (template.html, dashboard.js, data-model.js, dashboard.css, GeoJSON, server.py สำหรับทดสอบในเครื่อง)Index.html, Dashboard.html, DataModel.html, RiskView.html, WaterloggedView.html, Styles.html, *GeoJSON.html, Config.gs, schema.json, appsscript.json สร้างด้วย python build.py แล้ว commitCode.gs (อ่านชีต แปลงข้อมูล แคช 5 นาทีเมื่อรันบน Apps Script), fetch_data.cjs, build_pages.py, test.cjsลำดับหลังแก้หน้าเว็บ:
node flood_web/test_model.cjs
python flood_web/test_server.py
python build.py # สร้างไฟล์ Apps Script จาก flood_web/
node test.cjs
ทดสอบหน้าจริงกับชีต: python flood_web/server.py แล้วเปิด http://127.0.0.1:8765/
Code.gs และไฟล์ที่สร้างอัตโนมัติยังใช้เป็น Apps Script ได้เหมือนเดิม (Deploy แยกได้) ส่วนเวอร์ชัน Pages ใช้ Code.gs ชุดเดียวกันผ่าน fetch_data.cjsdata.json ที่ Actions สร้างไว้ก่อน (เร็ว แต่ GitHub รัน schedule ไม่ตรงเวลา อาจเก่าหลายชั่วโมง) แล้วอ่านชีตสดจากเบราว์เซอร์ทันทีด้วย flood_web/live-sheets.js ซึ่งรัน Config.gs + Code.gs ชุดเดียวกับที่สร้าง data.json (ผลเหมือนกันทุกฟิลด์) แล้วเปลี่ยนเป็นข้อมูลสด ปุ่ม "รีเฟรชข้อมูล" และ "ลองใหม่" อ่านชีตสดเช่นกัน ถ้าแท็บไหนอ่านไม่ได้จะคงข้อมูลเดิมของแท็บนั้น ถ้าอ่านไม่ได้ทั้งหมดใช้ data.json และป้ายอายุข้อมูลจะบอก ใช้ได้เพราะชีตเปิดแบบ "ทุกคนที่มีลิงก์อ่านได้" และ Google ยอมรับ origin ของหน้า (CSV ทั้ง 5 แท็บรวมราว 3 MB ก่อนบีบอัด ต่อผู้เข้าชม 1 คนต่อครั้งที่อ่าน) แคช 5 นาทีมีผลเฉพาะบน Apps Scriptflood_web/ (python3 build.py แล้ว git diff --exit-code) หากไม่ตรงให้รัน python build.py แล้ว commitแท็บ กทม. แสดง “เพิ่ม–คงตัว–ลด” ในตารางสถานีและการ์ดนับเขตตามพื้นที่ที่เลือก โดยอ่าน water_status_vs_24h_avg จาก BKK_water_DB ซึ่งเป็นผลเปรียบเทียบกับค่าเฉลี่ย 24 ชั่วโมงของสถานีนั้นตามเกณฑ์ต้นทาง ไม่ใช่รายงานแนวโน้มจาก ปภ. และไม่เปลี่ยนสถานะเตือนภัยเดิม ข้อมูลเกิน 24 ชั่วโมง เวลาไม่ถูกต้อง ระดับน้ำว่าง/-99 หรือไม่มีผลเทียบที่รู้จัก จะไม่ถูกนับในการ์ดและแสดง “ข้อมูลไม่เพียงพอ” ในตาราง คอลัมน์นี้เป็น optional เพื่อให้ชีตรุ่นเก่ายังอ่านได้
พรีวิวแผนที่ กทม.: สีพื้นและการ์ด เพิ่ม–คงตัว–ลด ใช้หน่วย เขต แต่ละเขตนับครั้งเดียวตามกลุ่มสถานีที่มีจำนวนมากที่สุดในเขตนั้น หากจำนวนสูงสุดเท่ากันใช้ “แนวโน้มผสม” และหากไม่มีผลที่ใช้ได้ใช้ “ข้อมูลไม่เพียงพอ” (แสดงจำนวนสองกลุ่มนี้แยกจากสามการ์ดหลัก) ตารางข้างแผนที่แสดงหนึ่งรายการต่อเขต ผลรวมทุกกลุ่มเท่ากับ 50 เขตเมื่อไม่กรอง หรือ 1 เขตเมื่อเลือกเขต รายสถานียังคงดูได้ใน popup และตารางรายละเอียดสถานี
flood_waterlogged_amphoeDATA.floodWaterloggedAmphoedistrict_codeamp_codeamphoe.geojsonprovince_level_codeprovince_reasons#E24B4A#EF9F27#F2D43D#4CAF50level_codephaseplanlevel_codeWATER_2P2Rstatus, confidence, reasons ตามที่ pipeline เขียน. ไม่ใช่ประกาศทางการ; "ไม่เห็นน้ำ ≠ น้ำลด"; ปภ. ระบุแค่ระดับอำเภอ; พบน้ำล่าสุด (ไม่มีภาพใหม่) ไม่ใช่น้ำขังdata-external ที่ปุ่มแท็บใน template.html เพื่อไม่ให้ตัวจับคลิกแท็บของ dashboard.js เปลี่ยน state.tabWaterloggedView ด้วย (สร้างโดย build.py)