เบื้องหลังการสร้างแผนที่ความกดอากาศบน Barometer.today
เจาะลึกอัลกอริทึม Python ที่ใช้สร้างเส้นไอโซบาร์ แสดงความกดอากาศโลกจากข้อมูล ECMWF พร้อมวิธีแก้ปัญหาพื้นที่ภูเขาสูง

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- เว็บไซต์ barometer.today แสดงความกดอากาศทั่วโลกผ่านแผนที่เส้นไอโซบาร์เคลื่อนไหวได้
- ใช้ Python ร่วมกับไลบรารีอย่าง numpy, scipy, contourpy และ shapely ในการประมวลผลข้อมูล
- แก้ปัญหาความกดอากาศเพี้ยนเหนือที่สูงด้วยเทคนิค normalized convolution และมาสก์ภูเขา
- จัดการรอยต่อแผนที่โลกด้วยการเพิ่มคอลัมน์จำลองและลดความซับซ้อนของเส้นด้วย Douglas-Peucker
เว็บไซต์ barometer.today ทำหน้าที่แสดงค่าความกดอากาศของเมืองต่างๆ ทั่วโลก โดยบอกทั้งค่าปัจจุบัน การเปลี่ยนแปลงจากเมื่อวาน และแนวโน้มในสัปดาห์หน้า จุดเด่นสำคัญคือแผนที่เส้นไอโซบาร์ (Isobar) ทั่วโลกที่แสดงผลแบบเคลื่อนไหวรายชั่วโมง ย้อนหลังไป 1 วัน และล่วงหน้าไปอีก 4 วัน
บทความเบื้องหลังการพัฒนาได้อธิบายถึงแนวคิดและอัลกอริทึมที่ใช้ในการวาดเส้นความกดอากาศเหล่านี้ โดยพัฒนาด้วยภาษา Python ผ่านไลบรารี numpy, scipy, contourpy และ shapely ซึ่งเป็นเครื่องมือมาตรฐานสำหรับนักพัฒนาที่ต้องสร้างแผนที่คอนทัวร์จากข้อมูลกริด (Gridded data)
เส้นไอโซบาร์ (Isobars) คือเส้นที่เชื่อมโยงจุดที่มีความกดอากาศเท่ากันบนแผนที่อุตุนิยมวิทยา ในทางอุตุนิยมวิทยา การที่เส้นไอโซบาร์วางตัวชิดกันแสดงว่าความกดอากาศเปลี่ยนแปลงอย่างรวดเร็วในระยะทางสั้น ซึ่งมักบ่งบอกถึงกระแสลมแรง ขณะที่เส้นที่กระจายตัวห่างกันบ่งบอกถึงสภาพอากาศที่สงบ โดยมีศูนย์กลางความกดอากาศสูง (H) และต่ำ (L) เป็นจุดสังเกตสำคัญ ซึ่งหลุมอากาศต่ำที่ล้อมรอบด้วยวงแหวนแน่นหนาก็คือพายุหมุนนั่นเอง
ข้อมูลดิบที่นำมาใช้นั้นมาจากแบบจำลองพยากรณ์อากาศโลก ECMWF ซึ่งส่งข้อมูลกริดความกดอากาศที่ระดับน้ำทะเลทุกๆ 0.25องศา หรือประมาณ 28 กิโลเมตรทั่วโลก โดยโมเดลนี้มีการอัปเดตวันละ 4 ครั้ง และหลังจากอัปเดตแต่ละครั้ง ระบบจะประมวลผลสร้างเฟรมภาพรายชั่วโมงรวมราว 120 เฟรม
เนื่องจากข้อมูลดิบจากโมเดลมีความหยักตามเซลล์กริด การนำมาวาดเส้นตรงๆ จึงทำให้เส้นเกิดอาการสั่นไหว ทีมพัฒนาจึงเลือกใช้เทคนิค Gaussian blur ที่ค่า sigma เท่ากับ 1 เซลล์ หรือ 28 กิโลเมตร เพื่อให้เส้นนุ่มนวลขึ้น โดยหลีกเลี่ยงการใช้ค่าเบลอที่กว้างเกินไป เช่น 110 กิโลเมตร ซึ่งอาจทำให้พายุเฮอร์ริเคนที่มีแกนกลางความกดอากาศ 936 hPa กลายเป็นพายุดีเปรสชันอ่อนๆ ที่ 993 hPa ได้
ปัญหาสำคัญของการคำนวณความกดอากาศที่ระดับน้ำทะเลคือพื้นที่ภูเขาสูง เช่น ที่ราบสูงทิเบตหรือเทือกเขาแอนดีส ซึ่งค่าคำนวณมักจะสูงเกินจริง ทีมงานจึงแก้ปัญหาด้วยวิธี normalized convolution เพื่อให้เซลล์ผลลัพธ์เป็นค่าเฉลี่ยถ่วงน้ำหนักเฉพาะเซลล์ที่ใช้งานได้จริงรอบๆ นั้น โดยอิงจากมาสก์พื้นที่สูงกว่า 2,500 เมตร ที่มีความกว้างระดับภูมิภาค เช่น เทือกเขาแอนดีส ทิเบต กรีนแลนด์ และแอนตาร์กติกา

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ในส่วนของการวาดเส้นคอนทัวร์ ทางทีมงานใช้อัลกอริทึม Marching squares ซึ่งเป็นมาตรฐานเดียวกับที่ matplotlib ใช้ พร้อมกับการจัดการเส้นแบ่งเขตวันสากล (International Date Line) ด้วยการคัดลอกคอลัมน์ขอบฝั่งตรงข้ามมาเติม (Padding) เพื่อให้เส้นไอโซบาร์สามารถลากผ่านมหาสมุทรแปซิฟิกได้อย่างต่อเนื่องไม่สะดุด จากนั้นจึงลดความซับซ้อนของเส้นด้วยอัลกอริทึม Douglas-Peucker ที่ความละเอียด 0.05 องศา เพื่อให้ไฟล์ GeoJSON มีขนาดเล็กเพียงไม่กี่ร้อยกิโลไบต์
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น