Thailand Hydrometeorological Seasonal Forecasts
ระบบพยากรณ์ตามฤดูกาลด้านอุทกอุ
การพยากรณ์มีบทบาทสำคัญในการวางแผนและเตรียมพร้อมรับมือกับสถานการณ์ที่อาจเกิดขึ้นในอนาคต ช่วยให้การตัดสินใจและการเตรียมความพร้อมมีความเหมาะสมและแม่นยำมากขึ้น สำหรับบริบทด้านอุทกอุตุนิยมวิทยา ซึ่งเน้นการศึกษาและการคาดการณ์ปรากฏการณ์ที่เกี่ยวข้องกับภูมิอากาศและน้ำ การพยากรณ์มีความสำคัญอย่างยิ่งต่อการคาดการณ์เหตุการณ์ธรรมชาติและผลกระทบที่อาจตามมา โดยเฉพาะอย่างยิ่งเมื่อสภาพภูมิอากาศเปลี่ยนแปลงอย่างรวดเร็วและทวีความรุนแรงมากขึ้น ข้อมูลพยากรณ์ที่มีความละเอียดเชิงสูงพื้นที่ในระดับท้องถิ่นสามารถให้ข้อมูลที่แม่นยำและมีความละเอียดมากขึ้น ซึ่งช่วยเพิ่มประสิทธิภาพในการเตรียมความพร้อมและการตอบสนองต่อสถานการณ์ที่เปลี่ยนแปลงได้อย่างมีประสิทธิภาพและเหมาะสม
เมื่อเปรียบเทียบกับข้อมูลสาธารณะของตัวแปรต่างๆ ทางอุตุอุทกวิทยาที่มีอยู่ในปัจจุบัน มักมีความละเอียดเชิงพื้นที่ค่อนข้างต่ำ (ประมาณ 25 กิโลเมตร) ดังนั้นข้อมูลพยากรณ์ที่มีความละเอียดสูง (1 กิโลเมตร) จากระบบพยากรณ์นี้สามารถให้ผลลัพท์ที่ชัดเจนและละเอียดมากขึ้นเกี่ยวกับรูปแบบสภาพอากาศและเหตุการณ์ทางอุทกวิทยาในพื้นที่ระดับท้องถิ่น ซึ่งความละเอียดในระดับนี้มีประโยชน์อย่างยิ่งสำหรับหลายภาคส่วน เช่น เกษตรกรรม เกษตรกรสามารถใช้ข้อมูลดังกล่าวในการวางแผนจัดการแปลงเกษตรด้วยความแม่นยำ เช่น ระบุพื้นที่ของแปลงนาที่ขาดน้ำหรือธาตุอาหาร ทำให้สามารถให้น้ำหรือใส่ปุ๋ยได้อย่างแม่นยำและคุ้มค่า นอกจากนี้ การพยากรณ์ฝนตก ปริมาณน้ำฝน ช่วงเวลา และอุณหภูมิในพื้นที่เล็กยังช่วยให้เกษตรกรตัดสินใจได้ดีขึ้นเกี่ยวกับการให้น้ำ การเพาะปลูก และการเก็บเกี่ยว ซึ่งส่งผลต่อการจัดการทรัพยากรน้ำ ลดการสิ้นเปลืองทรัพยากร และรักษาคุณภาพของผลผลิตให้มีความแม่นยำสูงขึ้น
เช่นเดียวกับภาคส่วนอื่นๆ เช่น การจัดการภัยพิบัติ การวางแผนโครงสร้างพื้นฐาน และการบริหารจัดการทรัพยากรน้ำ ยังได้รับประโยชน์อย่างมากจากจากข้อมูลพยากรณ์ละเอียดเพิ่มขึ้นนี้ ด้วยข้อมูลที่แม่นยำผู้มีส่วนเกี่ยวข้องสามารถวางแผนพัฒนากลยุทธ์การเตรียมพร้อมและการตอบสนองได้ดีขึ้น ดังนั้นจึงเป็นประโยชน์ต่อเกษตรกรและผู้กำหนดนโยบายในการตัดสินใจวางแผนการจัดการพืชผลและกลยุทธ์การปรับตัวเพื่อรับมือกับสภาพภูมิอากาศและสถานการณ์ต่างๆ ที่กำลังจะเกิดขึ้นได้อย่างเหมาะสม นำไปสู่การบริหารจัดการทรัพยากรและความเสี่ยงที่มีประสิทธิภาพและน่าเชื่อถือมากยิ่งขึ้น
รายงานความคืบหน้าของโครงการ:
โครงการ THSF ได้รับการสนับสนุนจากสำนักงานพัฒนาการวิจัยการเกษตร (องค์การมหาชน) ตั้งแต่เดือนมิถุนายน 2567 ถึงเดือนมิถุนายน 2568 แม้ว่าโครงการจะสิ้นสุดระยะเวลาสนับสนุนอย่างเป็นทางการแล้ว แต่ทางคณะผู้วิจัยยังคงดำเนินการจัดทำรายงานประจำสัปดาห์ โดยใช้เงินทุนจากแหล่งอื่นเพื่อการให้บริการดำเนินไปอย่างต่อเนื่อง
เนื่องจากข้อจำกัดด้านงบประมาณ คณะผู้วิจัยจึงได้ปรับกระบวนการทำงานและรูปแบบข้อมูลให้สอดคล้องกับทรัพยากรที่มีอยู่ โดยมีการปรับเปลี่ยนดังนี้:
- ปรับการอัปเดตข้อมูลเป็นรายเดือนเพื่อลดค่าใช้จ่ายด้านการประมวลผล
- ลดจำนวนตัวแปรเพื่อประหยัดพื้นที่จัดเก็บข้อมูล
- จัดทำข้อมูลในระดับความถี่รายเดือน
คณะผู้วิจัยจะยังคงดำเนินการสนับสนุนข้อมูลอย่างต่อเนื่องต่อไปตราบเท่าที่งบประมาณเอื้ออำนวย ขอขอบคุณในความเข้าใจและการสนับสนุนอย่างต่อเนื่องของท่าน
ความละเอียดเชิงพื้นที่: พื้นที่กริด 0.01 (ประมาณ 1 กิโลเมตร)
ความละเอียดเชิงเวลา: 1 วัน และ 1 เดือน
ช่วงเวลา: คาดการณ์ล่วงหน้า 6 เดือนจากปัจจุบัน
รูปแบบไฟล์: NetCDF, GeoTIFF, Excel
การอัปเดต: ทุกๆเดือน
| ตัวแปร | ชื่อภาษาอังกฤษ | ชื่อภาษาไทย | หน่วย | สถานะ |
|---|---|---|---|---|
| AvgSurfT | Average Surface Temperature | อุณหภูมิพื้นผิวเฉลี่ย | K | Available |
| EF | Evapotranspiration Fraction | สัดส่วนการระเหย | – | Discontinued |
| ESoil | Bare Soil Evaporation | การระเหยจากดิน | gC/m²s | Discontinued |
| Evap | Evapotranspiration | ปริมาณการคายระเหย | kg/m²s | Available |
| GPP | Gross Primary Production | อัตราการผลิตปฐมภูมิรวม | gC/m²s | Discontinued |
| GWS | Groundwater Storage | การกักเก็บน้ำใต้ดิน | mm | Available |
| LAI | Leaf Area Index | อัตราส่วนของพื้นที่ใบต่อพื้นที่ปลูก | m²/m² | Discontinued |
| Lwnet | Net Longwave Radiation | ปริมาณรังสีสุทธิคลื่นยาว | W/m² | Discontinued |
| NEE | Net Ecosystem Exchange | การแลกเปลี่ยนคารบ์อนสุทธิ | gC/m²s | Discontinued |
| NPP | Net Primary Production | อัตราการผลิตปฐมภูมิสุทธิ | gC/m²s | Discontinued |
| Qg | Ground Heat Flux | ความร้อนในดิน | W/m² | Discontinued |
| Qh | Sensible Heat Flux | ความร้อนที่รู้สึกได้ | W/m² | Discontinued |
| Qle | Latent Heat Flux | ความร้อนแฝง | W/m² | Discontinued |
| Qs | Surface Runoff | ปริมาณน้ำท่าผิวดิน | kg/m²s | Available |
| Qsb | Subsurface Runoff | ปริมาณน้ำท่าใต้ดิน | kg/m²s | Available |
| Rainf_f | Rainfall Rate | ปริมาณน้ำฝน | kg/m²s | Discontinued |
| SoilMoist01 | Average layer 1 soil moisture (10 cm) | ค่าเฉลี่ยความชื้นในดินชั้นที่ 1 (ความหนาชั้นดิน 10 ซ.ม.) | m³/m³ | Available |
| SoilMoist02 | Average layer 2 soil moisture (30 cm) | ค่าเฉลี่ยความชื้นในดินชั้นที่ 2 (ความหนาชั้นดิน 30 ซ.ม.) | m³/m³ | Discontinued |
| SoilMoist03 | Average layer 3 soil moisture (60 cm) | ค่าเฉลี่ยความชื้นในดินชั้นที่ 3 (ความหนาชั้นดิน 60 ซ.ม.) | m³/m³ | Discontinued |
| SoilMoist04 | Average layer 4 soil moisture (100 cm) | ค่าเฉลี่ยความชื้นในดินชั้นที่ 4 (ความหนาชั้นดิน 100 ซ.ม.) | m³/m³ | Discontinued |
| SoilTemp01 | Average layer 1 soil temperature (10 cm) | ค่าเฉลี่ยอุณหภูมิในดินชั้นที่ 1 (ความหนาชั้นดิน 10 ซ.ม.) | K | Discontinued |
| SoilTemp02 | Average layer 2 soil temperature (30 cm) | ค่าเฉลี่ยอุณหภูมิในดินชั้นที่ 2 (ความหนาชั้นดิน 30 ซ.ม.) | K | Discontinued |
| SoilTemp03 | Average layer 3 soil temperature (60 cm) | ค่าเฉลี่ยอุณหภูมิในดินชั้นที่ 3 (ความหนาชั้นดิน 60 ซ.ม.) | K | Discontinued |
| SoilTemp04 | Average layer 4 soil temperature (100 cm) | ค่าเฉลี่ยอุณหภูมิในดินชั้นที่ 4 (ความหนาชั้นดิน 100 ซ.ม.) | K | Discontinued |
| Swnet | Net Shortwave Radiation | ปริมาณรังสีสุทธิคลื่นสั้น | W/m² | Discontinued |
| Tair_f | Air Temperature | อุณหภูมิอากาศ | K | Discontinued |
| TVeg | Vegetation Transpiration | การคายน้ำ | kg/m²s | Discontinued |
| TWS | Terrestrial Water Storage | ปริมาณการกักเก็บนํ้าทั้งหมด | mm | Available |
ชุดข้อมูลนี้เปิดให้ใช้งานได้ฟรี โดยไม่มีค่าใช้จ่ายใดๆ ซึ่งเป็นส่วนหนึ่งของความมุ่งมั่นของผู้ให้บริการข้อมูล เพื่อการพัฒนาข้อมูล ความรู้ความเข้าใจทางวิทยาศาสตร์ และส่งเสริมการทำงานร่วมกัน การลงทะเบียนช่วยให้ผู้ใช้ข้อมูลเข้าใจขอบเขตและผลกระทบของการใช้ข้อมูลได้ดีขึ้น รวมถึงช่วยให้ผู้ให้บริการข้อมูลสามารถจัดลำดับความสำคัญเพื่อการพัฒนาปรับปรุงข้อมูลในอนาคต นอกจากนี้ผู้ใช้ข้อมูลสามารถรับข้อมูลเกี่ยวกับการอัปเดตหรือการแก้ไขที่สำคัญ ดังนั้น การมีส่วนร่วมในการใช้งานข้อมูลนี้จะช่วยสนับสนุนความยั่งยืนและการพัฒนาโครงการบริการข้อมูลสาธารณะอันเป็นประโยชน์นี้ และทางผู้ให้บริการข้อมูลหวังเป็นอย่างยิ่งว่าจะสามารถพัฒนาข้อมูล ปรับปรุงแก้ไขได้อย่างต่อเนื่องและมีคุณภาพตรงตามวัตถุประสงค์ของผู้ใช้งานจริง
ในการเข้าถึง การดาวน์โหลด หรือการใช้ชุดข้อมูลนี้ กรุณา เข้าสู่ระบบ หรือ สมัครลงทะเบียน เพื่อเข้าถึงข้อมูล เนื่องจากทางผู้ใช้ข้อมูลจำเป็นต้องรับทราบว่าได้อ่านรายละเอียดการใช้งาน ทำความเข้าใจข้อบังคับใช้ และยอมรับข้อกำหนดและเงื่อนไขสำหรับชุดข้อมูล
ข้อมูลจากโครงการระบบพยากรณ์ตามฤดูกาลด้านอุตุอุทกนิยมวิทยาของประเทศไทย (THSF) ถูกนำเสนอในรูปแบบต่างๆ เพื่อความสะดวกของผู้ใช้งาน โดยข้อมูลประเภทราสเตอร์ (raster) จะถูกจัดทำในรูปแบบ NetCDF และ Geotiff ซึ่งรองรับการวิเคราะห์เชิงพื้นที่ ส่วนข้อมูลประเภทอนุกรมเวลา (Time Series) จะถูกจัดทำในรูปแบบ Excel ซึ่งเหมาะสำหรับการศึกษาในระดับลุ่มน้ำ จังหวัด หรืออำเภอ ข้อมูลจะถูกอัปเดตทุกๆ เดือน และประกอบด้วยข้อมูลอุตุอุทกนิยมวิทยาสำหรับฤดูกาลถัดไป (ล่วงหน้า 6 เดือน)
Figure 1: High-resolution hydrometeorological forecast provides comprehensive variables 6 months in advance, giving a clear, localized view of changes and offering valuable insights for agriculture, water resource management, climate studies, and other sectors. This level of detail enhances the ability to make informed decisions and apply forecasts effectively at a local scale.
คำแนะนำ
ผู้ใช้บริการข้อมูลสามารถอ่านคำแนะนำได้โดยคลิกที่รูปภาพ หรือ หัวข้อที่ต้องการ เมื่อคลิกแล้วรายละเอียดเนื้อหาจะปรากฏด้านล่าง
วิธีการลงทะเบียน/เข้าสู่ระบบ/ดาวน์โหลด
ข้อมูลจากโครงการสามารถใช้งานได้โดยไม่เสียค่าใช้จ่ายใดๆ แต่จำเป็นต้องลงทะเบียนเพื่อยอมรับเงื่อนไขในการใช้งาน จึงสามารถเข้าถึงการดาวน์โหลดได้ คำแนะนำนี้ช่วยอธิบายขั้นตอนการลงทะเบียนพร้อมรูปภาพในแต่ละขั้นตอน เพื่อให้แน่ใจว่าผู้ใช้บริการข้อมูลสามารถใช้งานได้อย่างราบรื่นไม่ว่าจะมีพื้นฐานมากน้อยเพียงใด
ในการสร้างบัญชี ให้ไปที่แท็บด้านล่าง:
- เข้าสู่ระบบ
- ลงทะเบียน
📋 ขั้นตอนการลงทะเบียน
- กรอกชื่อและนามสกุลของคุณ
- ระบุอีเมลขององค์กร
- สร้างรหัสผ่าน
- กรอกชื่อองค์กรของคุณ
✅ ยอมรับเงื่อนไขการใช้งานด้วยการคลิกเครื่องหมายในช่องสี่เหลี่ยม
จากนั้น คลิก "Submit" ระบบจะส่งอีเมลยืนยันไปยังอีเมลที่คุณระบุ โดยทั่วไปอีเมลนี้จะมาถึงภายในไม่กี่นาที แต่บางครั้งอาจใช้เวลานานขึ้นขึ้นอยู่กับผู้ให้บริการอีเมลของคุณ
หลังจากที่คุณยืนยันที่อยู่อีเมลเพื่อเปิดใช้งานบัญชีแล้ว คุณจะสามารถใช้งานแพลตฟอร์มเพื่อค้นหาและดาวน์โหลดข้อมูลที่ต้องการได้ ดังตัวอย่างด้านล่าง:
| ตัวแปร | ชื่อ | หน่วย | NetCDF | GeoTiff | รูปภาพ | Excel |
|---|---|---|---|---|---|---|
| AvgSurfT | Average Surface Temperature | °C | download | download | download | download |
| EF | Evapotranspiration Fraction | - | download | download | download | download |
| ESoil | Soil Evaporation | mm/day | download | download | download | download |
| Evap | Evapotranspiration | mm/day | download | download | download | download |
| GPP | Gross Primary Production | gC/m2/day | download | download | download | download |
| GWS | Groundwater Storage | mm | download | download | download | download |
| LAI | Leaf Area Index | - | download | download | download | download |
| LWdown_f | Downward Longwave Radiation | W/m2 | download | download | download | download |
| Lwnet | Net Longwave Radiation | W/m2 | download | download | download | download |
| NEE | Net Ecosystem Exchange | gC/m2/day | download | download | download | download |
| NPP | Net Primary Production | gC/m2/day | download | download | download | download |
| Qair_f | Specific Humidity | kg/kg | download | download | download | download |
| Qg | Ground Heat Flux | W/m2 | download | download | download | download |
| Qh | Sensible Heat Flux | W/m2 | download | download | download | download |
| Qle | Latent Heat Flux | W/m2 | download | download | download | download |
| Qs | Surface Runoff | mm/day | download | download | download | download |
| Qsb | Subsurface Runoff | mm/day | download | download | download | download |
| Rainf_f | Rainfall Rate | mm/day | download | download | download | download |
| SoilMoist01 | Soil Moisture (Layer 1) | m3/m3 | download | download | download | download |
| SoilMoist02 | Soil Moisture (Layer 2) | m3/m3 | download | download | download | download |
| SoilMoist03 | Soil Moisture (Layer 3) | m3/m3 | download | download | download | download |
| SoilMoist04 | Soil Moisture (Layer 4) | m3/m3 | download | download | download | download |
| SoilTemp01 | Soil Temperature (Layer 1) | °C | download | download | download | download |
| SoilTemp02 | Soil Temperature (Layer 2) | °C | download | download | download | download |
| SoilTemp03 | Soil Temperature (Layer 3) | °C | download | download | download | download |
| SoilTemp04 | Soil Temperature (Layer 4) | °C | download | download | download | download |
| SWdown_f | Downward Shortwave Radiation | W/m2 | download | download | download | download |
| Swnet | Net Shortwave Radiation | W/m2 | download | download | download | download |
| Tair_f | Air Temperature | °C | download | download | download | download |
| TVeg | Vegetation Transpiration | mm/day | download | download | download | download |
| TWS | Terrestrial Water Storage | mm | download | download | download | download |
หมายเหตุ:เฉพาะข้อมูลอุณหภูมิพื้นผิวเฉลี่ย (AvgSurT) เท่านั้นที่สามารถนำไปใช้ได้
วิธีการประมวลผลข้อมูลด้วย Google Earth Engine (GEE)
วิธีการประมวลผลข้อมูลโดยใช้ GEE โมดูลการเรียนการสอนนี้นำเสนอวิธีการสามแบบที่แตกต่างกันสำหรับการประมวลผลข้อมูลใน Google Earth Engine โดยให้คำแนะนำโดยละเอียดเกี่ยวกับการใช้ GEE Code Editor สำหรับการวิเคราะห์ผ่านเบราว์เซอร์ การรวม Google Colab สำหรับกระบวนการทำงานในรูปแบบสมุดบันทึก และการใช้ Python API สำหรับการพัฒนาแอปพลิเคชันแต่ละส่วน รวมถึงตัวอย่างโค้ดที่ใช้งานได้จริงและกรณีศึกษา เพื่อช่วยให้ผู้ใช้งานสามารถใช้ความสามารถในการประมวลผลของ GEE ได้อย่างมีประสิทธิภาพ
- GEE Setup
- GEE Editor
- Google Colab
- Python API
บทนำเกี่ยวกับ Google Earth Engine (GEE)
Google Earth Engine (GEE) เป็นแพลตฟอร์มบนคลาวด์ที่ช่วยให้ผู้ใช้วิเคราะห์และแสดงผลข้อมูลภูมิศาสตร์ในระดับโลก โดยมีข้อมูลภาพดาวเทียมและชุดข้อมูลภูมิศาสตร์หลากหลาย พร้อมเครื่องมือสำหรับการวิเคราะห์และแสดงผลข้อมูล
GEE เหมาะสำหรับ:
- การติดตามสภาพแวดล้อม
- การทำแผนที่การใช้ประโยชน์ที่ดินและสภาพพื้นที่
- การวิจัยด้านภูมิอากาศ
- การตอบสนองต่อภัยพิบัติ
- การวิเคราะห์ด้านเกษตรกรรม
- การวางผังเมือง
1. เริ่มต้นใช้งาน Google Earth Engine
ลงทะเบียนเพื่อเข้าถึง GEE:
- ไปที่หน้าสมัคร Earth Engine Signup
- ใช้บัญชี Google ของคุณในการลงทะเบียน
- เลือกประเภทผู้ใช้ เช่น การศึกษา / วิจัย / ไม่แสวงหาผลกำไร
- รอการอนุมัติ (ปกติใช้เวลา 1-2 วันทำการ)
สร้างโปรเจกต์ใน Google Cloud:
- ไปที Google Cloud Console
- สร้างโปรเจกต์ใหม่ หรือใช้โปรเจกต์ที่มีอยู่
- เปิดใช้งาน Earth Engine API สำหรับโปรเจกต์ของคุณ
- หากคุณใช้บัญชีองค์กรและไม่สามารถสร้างโปรเจกต์ได้ ให้ติดต่อผู้ดูแลระบบ IT

การเข้าถึง Earth Engine:
- Code Editor: code.earthengine.google.com
- Python API: ใช้ร่วมกับ Jupyter/Colab
- REST API: สำหรับระบบที่พัฒนาขึ้นเอง
2. สำรวจส่วนติดต่อของ Code Editor
- Script Panel: สำหรับเขียน JavaScript
- Map Panel: แสดงผลลัพธ์
- Console Panel: แสดง log และ error
- Asset Manager: จัดการข้อมูลที่นำเข้า
- Documentation Panel: ดูฟังก์ชันและคำอธิบาย
3. การทำงานกับข้อมูล
ค้นหาและนำเข้าชุดข้อมูล:
- ไปที่ “Datasets”
- ค้นหาข้อมูล เช่น "Landsat", "MODIS", ฯลฯ
- นำเข้าข้อมูลภายนอกผ่านเมนู Assets หรือใช้ API
4. การตั้งค่าโปรเจกต์และการยืนยัน
JavaScript:
ee.initialize({
projectId: 'my-project-id' #เปลี่ยนชื่อโปรเจกต์เป็นของคุณเอง
});
Python:
import ee
ee.Authenticate()
ee.Initialize(project='my-project-id') #เปลี่ยนชื่อโปรเจกต์เป็นของคุณเอง
5. การติดตั้ง Python API
pip install earthengine-api
ยืนยันตัวตน:
import ee
ee.Authenticate()
ee.Initialize()
ทำตามคำแนะนำนี้ คุณจะสามารถเข้าถึง Google Earth Engine และเริ่มพัฒนาโปรเจกต์การวิเคราะห์ข้อมูลภูมิศาสตร์ของตัวคุณเองได้อย่างเต็มที่
🔍 ตัวอย่างโค้ดบน GEE:
เปิดตัวอย่างบน GEE
การทำงานและประมวลผลบน Google Earth Engine (GEE)
ขั้นตอนที่ 1: สำรวจและแสดงข้อมูลใน GEE Code Editor
เข้าสู่ระบบ Code Editor ไปที่ Earth Engine Code Editor
ขั้นตอนที่ 2: ทำความเข้าใจฟีเจอร์ต่างๆ ใน Code Editor GEE
Code Editor เป็น IDE ที่ใช้เว็บสำหรับ Earth Engine JavaScript API ซึ่งถูกออกแบบมาเพื่อวิเคราะห์ข้อมูลภูมิสารสนเทศ โดยมี:
ขั้นตอนที่ 3: การดาวโหลดข้อมูลใน Code Editor GEE
// Load temperature image from project assets
var temperature = ee.Image("projects/ee-udomporn/assets/AvgSurfT");
// Calculate statistics
var stats = temperature.reduceRegion({
reducer: ee.Reducer.minMax(),
geometry: temperature.geometry(),
scale: 1000,
bestEffort: true
});
// Print statistics
print("Min/Max:", stats);
print("Bands:", temperature.bandNames());
print("Resolution:", temperature.projection().nominalScale());
print("Projection:", temperature.projection());
print("Image Geometry:", temperature.geometry());
// Load Thailand boundary (Example: FAO GAUL dataset)
var thailand = ee.FeatureCollection('FAO/GAUL/2015/level0')
.filter(ee.Filter.eq('ADM0_NAME', 'Thailand'));
});
ขั้นตอนที่ 4: การเลือก band และการตั้งค่าการแสดงผล
// Select the first month of temperature data
var month1 = temperature.select('b1');
palette: ['blue', 'cyan', 'yellow', 'orange', 'red']
// Visualization settings
var visParams = {
min: 290,
max: 315,
palette: ['blue', 'cyan', 'yellow', 'orange', 'red']
ขั้นตอนที่ 5: การแสดงผลข้อมูลและการปรับแต่งแผนที่
// Display results on map
Map.centerObject(thailand, 6);
Map.addLayer(month1, visParams, 'Temperature');
Map.addLayer(thailand.style({color: 'black', width: 1}), {}, 'Boundary');
Map
ขั้นตอนที่ 6: การเลือกและตัดข้อมูล ตัวอย่างขอบเขตกรุงเทพฯ
ขั้นตอนที่ 7: การส่งออกข้อมูลแผนที่ไปยัง Google Drive
Export.image.toDrive({
image: month1,
description: 'Thailand_SurfaceTemp',
folder: 'GEE', // Creates a folder named "GEE" in Google Drive
fileNamePrefix: 'AvgSurfT_Thailand',
region: thailand.geometry(),
scale: 1000, // Resolution in meters
crs: 'EPSG:4326',
maxPixels: 1e13
ขั้นตอนที่ 8: การดำเนินการการส่งออก
🔍 ตัวอย่างโค้ดบน :
GEE code editor
การใช้ GEE Asset และ Project ทำงานและประมวลบน Google Colab
ขั้นตอนที่ 1: ติดตั้งแพ็คเกจที่จำเป็น
จำเป็นต้องติดตั้งแพ็คเกจสำหรับการทำงานกับ Google Earth Engine ใน Colab:
# ติดตั้งแพ็คเกจที่จำเป็น
!pip install geemap rasterio localtileserver
ขั้นตอนที่ 2: นำเข้าไลบรารี
import ee
import geemap
import os
from google.colab import drive
import matplotlib.pyplot as plt
import rasterio
from rasterio.plot import show
import numpy as np
ขั้นตอนที่ 3: เชื่อมต่อ Google Drive กับเซสชัน Colab ของคุณ
Google Colab ไม่สามารถเข้าถึงไฟล์โดยตรงได้ ดังนั้นจึงจำเป็นต้องเชื่อมต่อกับ Google Drive ก่อนการใช้งาน:
# เมาท์ Google Drive
drive.mount('/content/drive')
การให้สิทธิ์การเข้าถึง
การเข้าถึงไฟล์ใน Google Drive
!ls /content/drive/MyDrive/
ขั้นตอนที่ 4: ยืนยันตัวตนกับ Earth Engine
Earth Engine จำเป็นต้องมีการยืนยันตัวตนและการเริ่มต้นก่อนใช้งานฟังก์ชันต่างๆ
# เริ่มต้น Earth Engine
ee.Authenticate()
ขั้นตอนการยืนยันตัวตน
ขั้นตอนที่ 5: เริ่มต้น Earth Engine ด้วยโปรเจกต์ของคุณ
# เริ่มต้น Earth Engine
ee.Initialize(project='ee-udomporn') # ชื่อโปรเจกต์ GEE ของคุณ
ขั้นตอนที่ 6: โหลดข้อมูลจาก GEE Asset
# โหลดข้อมูลจาก GEE Asset
asset_id = "projects/ee-udomporn/assets/AvgSurfT"
temperature_image = ee.Image(asset_id)
ขั้นตอนที่ 7: ตรวจสอบค่าต่ำสุด/สูงสุดสำหรับแต่ละแบนด์
เพื่อวิเคราะห์ช่วงของค่าสำหรับแต่ละแบนด์ (แต่ละเดือน) ให้วนลูปผ่านแบนด์และตรวจสอบค่าต่ำสุด/สูงสุด
for i in range(1, 6):
band_name = f'b{i}'
stats = temperature_image.select(band_name).reduceRegion(
reducer=ee.Reducer.minMax(),
geometry=temperature_image.geometry(),
scale=1000, # ความละเอียดในหน่วยเมตร
maxPixels=1e9
).getInfo()
print(f'{band_name}: {stats}')
ขั้นตอนที่ 8: เลือก band และขอบเขตประเทศไทย
# เลือกแบนด์ 1 (เดือนที่ 1)
month1 = temperature_image.select('b1')
# โหลดขอบเขตประเทศไทยจาก FAO GAUL
# Load FAO GAUL Boundaries
fao_admin = ee.FeatureCollection("FAO/GAUL_SIMPLIFIED_500m/2015/level1")
# Filter for Thailand
thailand = fao_admin.filter(ee.Filter.eq('ADM0_NAME', 'Thailand'))
ขั้นตอนที่ 9: เลือกข้อมูล
ดึงแบนด์ 1 (เดือนที่ 1) และตัดให้พอดีกับขอบเขตของประเทศไทย
# เลือกแบนด์ 1 (เดือนที่ 1)
month1 = temperature_image.select('b1')
ขั้นตอนที่ 10: แสดงข้อมูลใน geemap
สร้างแผนที่แบบอินเทอร์แอคทีฟโดยให้ประเทศไทยอยู่ตรงกลาง
Map = geemap.Map(center=[13, 101], zoom=6)
# กำหนดพารามิเตอร์การแสดงผล
vis_params = {
'min': 290,
'max': 315,
'palette': ['blue', 'cyan', 'yellow', 'orange', 'red']
}
# สร้างสไตล์สำหรับเส้นขอบเขต
thailand_outline = thailand.style(
color='black', # สีเส้น
width=0.5, # ความกว้างเส้น
fillColor='00000000' # สีพื้นหลังแบบโปร่งใส
)
# เพิ่มเลเยอร์ลงในแผนที่
Map.addLayer(month1, vis_params, 'Surface Temp')
Map.addLayer(thailand_outline, {}, 'Thailand Boundary (Thin)')
Map.add_colorbar(vis_params, label='Temperature (K)')
Map.addLayerControl()
Map
ขั้นตอนที่ 11: การเลือกและตัดข้อมูล ตัวอย่างขอบเขตกรุงเทพฯ
# กรองขอบเขตเฉพาะกรุงเทพฯ
bangkok = thailand.filter(ee.Filter.eq('ADM1_NAME', 'Bangkok'))
# ตัดข้อมูลเฉพาะกรุงเทพฯ
bangkok_clipped = month1.clip(bangkok)
# การแสดงผลข้อมูลอุณหภูมิเฉพาะกรุงเทพฯ
Map.addLayer(bangkok_clipped, vis_params, 'Surface Temperature for Bangkok') # มีศูนย์กลางที่กรุงเทพฯ
Map
ขั้นตอนที่ 12: ส่งออกข้อมูลไปยัง Google Drive
# ส่งออกไปยัง Google Drive
task = ee.batch.Export.image.toDrive(
image=clipped_image,
description='Thailand_SurfaceTemp',
folder='GEE_Export', # โฟลเดอร์ใน Google Drive ของคุณ
fileNamePrefix='AvgSurfT_Thailand',
region=thailand.geometry(),
scale=1000,
crs='EPSG:4326',
maxPixels=1e13
)
task.start()
print('เริ่มงานส่งออกแล้ว ตรวจสอบแท็บ Earth Engine Tasks')
หลังจากการส่งออกเสร็จสมบูรณ์ในแท็บ GEE Task
# ดาวน์โหลดจาก Drive ไปยัง Colab
!cp /content/drive/MyDrive/GEE_Export/AvgSurfT_Thailand.tif /content/
# ดาวน์โหลดไปยังคอมพิวเตอร์ของคุณ
files.download('/content/AvgSurfT_Thailand.tif')
🔍 ตัวอย่างโค้ดบน : Google Colab
การใช้งาน Google Earth Engine สำหรับการวิเคราะห์ข้อมูลเชิงพื้นที่ใน Python
บทแนะนำนี้แสดงวิธีการวิเคราะห์และแสดงผลข้อมูลอุณหภูมิเชิงพื้นที่โดยใช้ Google Earth Engine (GEE) และ Python เราจะครอบคลุมการยืนยันตัวตน, การโหลดข้อมูลจาก Earth Engine, การประมวลผลข้อมูล และการสร้างแผนที่แบบโต้ตอบ
ขั้นตอนการทำงานกับ Earth Engine
ขั้นตอนที่ 1. การติดตั้ง geemap และไลบรารีที่จำเป็น:
# ติดตั้ง geemap และไลบรารีที่เกี่ยวข้อง
!pip install geemap earthengine-api
ขั้นตอนที่ 2. การยืนยันตัวตนกับ Earth Engine
import ee
# ยืนยันตัวตน
ee.Authenticate()
ขั้นตอนที่ 3. เริ่มต้นใช้งาน Earth Engine กับโปรเจกต์ของคุณ
# เริ่มต้นใช้งาน Earth Engine กับโปรเจกต์เฉพาะของคุณ
ee.Initialize(project='ee-udomporn') # แทนที่ด้วยชื่อโปรเจกต์ GEE ของคุณ
ขั้นตอนที่ 4. โหลดข้อมูลจากแหล่งข้อมูล GEE
# โหลดข้อมูลอุณหภูมิจากแหล่งข้อมูล Earth Engine ของคุณ
asset_id = "projects/ee-udomporn/assets/AvgSurfT"
temperature_image = ee.Image(asset_id)
# พิมพ์ข้อมูลพื้นฐานเกี่ยวกับภาพ
print(temperature_image.bandNames().getInfo())
ขั้นตอนที่ 5. ตรวจสอบค่าต่ำสุด/สูงสุดสำหรับแต่ละแบนด์
# ฟังก์ชันเพื่อรับค่าสถิติต่ำสุด/สูงสุดสำหรับแบนด์
def get_band_stats(image, band_name):
stats = image.select(band_name).reduceRegion(
reducer=ee.Reducer.minMax(),
geometry=image.geometry(),
scale=1000,
maxPixels=1e9
)
return stats.getInfo()
# รับชื่อแบนด์
band_names = temperature_image.bandNames().getInfo()
# พิมพ์สถิติสำหรับแต่ละแบนด์
for band in band_names:
stats = get_band_stats(temperature_image, band)
print(f"แบนด์ {band}: ต่ำสุด = {stats[band+'_min']}, สูงสุด = {stats[band+'_max']}")
ขั้นตอนที่ 6. โหลดขอบเขตประเทศไทยจาก FAO GAUL
# โหลดขอบเขตประเทศไทยจากชั้นข้อมูลหน่วยการปกครองทั่วโลกของ FAO
thailand = ee.FeatureCollection('FAO/GAUL/2015/level0')\
.filter(ee.Filter.eq('ADM0_NAME', 'Thailand'))
# พิมพ์ข้อมูลเกี่ยวกับขอบเขต
print(f"ขอบเขตประเทศไทย: {thailand.first().getInfo()['properties']['ADM0_NAME']}")
ขั้นตอนที่ 7. แสดงข้อมูลใน GeeMap
import geemap
# สร้างแผนที่โดยมีศูนย์กลางที่ประเทศไทย
Map = geemap.Map(center=[13, 101], zoom=6)
# กำหนดพารามิเตอร์การแสดงผล
vis_params = {
'min': 290,
'max': 315,
'palette': ['blue', 'cyan', 'yellow', 'orange', 'red']
}
# สร้างพจนานุกรมสไตล์สำหรับเส้นขอบเขตบาง
thailand_outline = thailand.style(
color='black', # สีเส้น
width=0.5, # ความกว้างเส้น
fillColor='00000000' # สีพื้นโปร่งใส
)
# เพิ่มชั้นข้อมูลลงในแผนที่
Map.addLayer(clipped_image, vis_params, 'อุณหภูมิพื้นผิวประเทศไทย')
Map.addLayer(thailand_outline, {}, 'ขอบเขตประเทศไทย (บาง)')
Map.add_colorbar(vis_params, label='อุณหภูมิ (K)')
Map.addLayerControl()
# แสดงแผนที่
Map
ขั้นตอนที่ 8. การเลือกและตัดข้อมูลตามขอบเขตกรุงเทพฯ
# โหลดขอบเขตการปกครองระดับ 1 ของไทย (จังหวัด)
provinces = ee.FeatureCollection('FAO/GAUL/2015/level1')\
.filter(ee.Filter.eq('ADM0_NAME', 'Thailand'))
# กรองเพื่อรับเฉพาะกรุงเทพฯ
bangkok = provinces.filter(ee.Filter.eq('ADM1_NAME', 'Bangkok'))
# พิมพ์ชื่อเพื่อตรวจสอบ
print(f"พื้นที่ที่เลือก: {bangkok.first().getInfo()['properties']['ADM1_NAME']}")
# เลือกแบนด์ 1 (เดือน 1)
month1 = temperature_image.select('b1')
# ตัดภาพตามขอบเขตกรุงเทพฯ
bangkok_clipped = month1.clip(bangkok)
ขั้นตอนที่ 9. การแสดงผลข้อมูลอุณหภูมิกรุงเทพฯ
# สร้างแผนที่โดยมีศูนย์กลางที่กรุงเทพฯ
Map = geemap.Map(center=[13.7563, 100.5018], zoom=10) # มีศูนย์กลางที่กรุงเทพฯ
# กำหนดพารามิเตอร์การแสดงผล
vis_params = {
'min': 290,
'max': 315,
'palette': ['blue', 'cyan', 'yellow', 'orange', 'red']
}
# สร้างพจนานุกรมสไตล์สำหรับเส้นขอบเขตบาง
bangkok_outline = bangkok.style(
color='black', # สีเส้น
width=1, # ความกว้างเส้น
fillColor='00000000' # สีพื้นโปร่งใส
)
# เพิ่มชั้นข้อมูลลงในแผนที่
Map.addLayer(bangkok_clipped, vis_params, 'อุณหภูมิพื้นผิวกรุงเทพฯ')
Map.addLayer(bangkok_outline, {}, 'ขอบเขตกรุงเทพฯ')
Map.add_colorbar(vis_params, label='อุณหภูมิ (K)')
Map.addLayerControl()
# แสดงแผนที่
Map
ขั้นตอนที่ 10. การส่งออกข้อมูล Earth Engine ไปยังไดรฟ์ในเครื่องของคุณ
# ส่งออกเป็นรูปภาพ PNG
Map.to_image('bangkok_temperature_map.png')
print("ส่งออกแผนที่เป็น PNG สำเร็จแล้ว")
# ส่งออกเป็นไฟล์ JPG
Map.to_jpg('bangkok_temperature_map.jpg')
print("ส่งออกแผนที่เป็น JPG สำเร็จแล้ว")
# ส่งออกเป็นไฟล์ PDF
Map.to_pdf('bangkok_temperature_map.pdf')
print("ส่งออกแผนที่เป็น PDF สำเร็จแล้ว")
import os
# ตั้งค่าไดเรกทอรีสำหรับบันทึกไฟล์
output_dir = './exports'
if not os.path.exists(output_dir):
os.makedirs(output_dir)
# กำหนด path ที่จะบันทึกไฟล์
output_file = os.path.join(output_dir, 'bangkok_temp.tif')
# ส่งออกข้อมูลเป็นไฟล์ GeoTIFF แบบไม่ผ่าน Google Drive
geemap.ee_export_image(
bangkok_clipped, # ภาพที่ต้องการส่งออก
filename=output_file, # ชื่อไฟล์
scale=100, # ความละเอียด
region=bangkok.geometry(), # พื้นที่ที่ต้องการส่งออก
file_per_band=False
)
print(f"ส่งออกข้อมูลไปยัง {output_file} สำเร็จแล้ว")
การใช้ geemap ใน Jupyter Notebook ทำให้คุณสามารถวิเคราะห์และแสดงผลข้อมูลเชิงพื้นที่ได้อย่างมีประสิทธิภาพ และสามารถส่งออกผลลัพธ์ในรูปแบบต่างๆ ตามความต้องการของคุณได้
🔍 ตัวอย่างโค้ดบน Jupyter Notebook
การอ่านข้อมูลเชิงพื้นที่ใน Python
การทำงานกับข้อมูลภูมิสารสนเทศในเครื่องมีข้อดีมากมาย เช่น การประมวลผลที่รวดเร็วขึ้น ความเป็นส่วนตัวที่เพิ่มขึ้น และความสามารถในการทำงานโดยไม่ต้องเชื่อมต่อกับอินเทอร์เน็ต คู่มือนี้มุ่งเน้นไปที่รูปแบบข้อมูลภูมิสารสนเทศที่สำคัญสองประเภท ได้แก่ ไฟล์ GeoTIFF และ NetCDF โดยให้คำแนะนำที่ครอบคลุมเกี่ยวกับการตั้งค่าสภาพแวดล้อม การโหลดข้อมูล เทคนิคการแสดงผล และการปฏิบัติการเชิงพื้นที่ขั้นสูง
ไม่ว่าคุณจะกำลังวิเคราะห์ภาพจากการสำรวจระยะไกล ข้อมูลสภาพภูมิอากาศ หรือสร้างแผนที่เฉพาะทาง คำแนะนำทีละขั้นตอนเหล่านี้จะช่วยให้คุณสร้างกระบวนการทำงานภูมิสารสนเทศแบบออฟไลน์ที่มีประสิทธิภาพใน Python ได้ เมื่อจบคู่มือนี้ คุณจะสามารถจัดการข้อมูลภูมิสารสนเทศได้อย่างมั่นใจ สร้างภาพข้อมูลที่ให้ความรู้ และดำเนินการทางภูมิศาสตร์ทั่วไป เช่น การตัดข้อมูลให้เข้ากับภูมิภาคที่เฉพาะเจาะจง
- การตั้งค่า Python
- การอ่าน GeoTIFF
- การอ่าน NetCDF
การตั้งค่าสภาพแวดล้อม Python สำหรับภูมิสารสนเทศ (Windows)
ขั้นตอนที่ 1: ติดตั้ง Anaconda (แนะนำ Python 3.10):
ดาวน์โหลด Anaconda ได้ที่ Anaconda Download
คู่มือนี้จะแนะนำวิธีการตั้งค่าสภาพแวดล้อม Python สำหรับภูมิสารสนเทศใน Windows พร้อมกับไลบรารีที่สำคัญทั้งหมดสำหรับการวิเคราะห์ข้อมูลภูมิสารสนเทศ การแสดงผล และการประมวลผล
ขั้นตอนที่ 2. สร้างสภาพแวดล้อม Conda ใหม่ (geo_env)
conda create -n geo_env python=3.10
conda activate geo_env
ขั้นตอนที่ 3. ติดตั้งแพ็คเกจ GeoPython ที่จำเป็น
conda install -c conda-forge rasterio geopandas xarray geemap localtileserver jupyterlab notebook earthengine-api ipykernel
ขั้นตอนที่ 4. เพิ่ม geo_env ไปยังเคอร์เนล Jupyter Notebook
python -m ipykernel install --user --name=geo_env --display-name "Python (geo_env)"
ขั้นตอนที่ 5. เปิด Jupyter Notebook
jupyter notebook
✅ ทดสอบการตั้งค่าของคุณ
import rasterio
import geemap
print("ทุกอย่างทำงานได้ ✅")
conda activate geo_env
jupyter notebook
6. การแก้ไขปัญหาทั่วไป
conda install -c conda-forge rasterio
conda install -c conda-forge geopandas
conda install -c conda-forge xarray
# และอื่นๆ...
conda install -c conda-forge gdal
ข้อผิดพลาดหน่วยความจำระหว่างการติดตั้ง
ความขัดแย้งของเวอร์ชัน Python
conda create -n geo_env python=3.9 # หรือเวอร์ชันอื่น
การอัปเดตสภาพแวดล้อมของคุณ
conda update --all
pip install rasterio geopandas xarray geemap
แพ็คเกจที่เป็นประโยชน์เพิ่มเติม
conda install -c conda-forge matplotlib seaborn plotly contextily folium rasterstats
🔗 พิเศษ: การตั้งค่าการยืนยันตัวตน Google Earth Engine
หากคุณกำลังใช้ Google Earth Engine (GEE) คุณจะต้องยืนยันตัวตน:
import ee
ee.Authenticate() # ทำตามคำแนะนำในเบราว์เซอร์ของคุณ
ee.Initialize()
การจัดการข้อมูล GeoTIFF และการแสดงผล
คู่มือแนะนำนี้แสดงวิธีการทำงานกับข้อมูล GeoTIFF แบบออฟไลน์โดยใช้ Python คุณจะได้เรียนรู้วิธีการดาวน์โหลด อ่าน แสดงผล และปรับเปลี่ยนข้อมูลแรสเตอร์ภูมิสารสนเทศ โดยทั้งหมดจะดำเนินการในเครื่องของคุณเอง วิธีนี้เหมาะอย่างยิ่งสำหรับสภาพแวดล้อมที่มีการเชื่อมต่ออินเทอร์เน็ตจำกัดหรือเมื่อทำงานกับชุดข้อมูลขนาดใหญ่
ข้อกำหนดเบื้องต้น – ตรวจสอบการติดตั้งแพ็คเกจ เพื่อให้มั่นใจว่าแพ็คเกจทั้งหมดถูกติดตั้งอย่างถูกต้อง:
ตรวจสอบการติดตั้งแพ็กเกจ
# ทดสอบการนำเข้าแต่ละแพ็กเกจ
import rasterio
import geopandas
import matplotlib
import numpy
import requests
print("นำเข้าแพ็กเกจทั้งหมดสำเร็จ!")
ขั้นตอนการทำงาน
ขั้นตอนที่ 1. ดาวน์โหลด GeoTIFF จากแพลตฟอร์มของเราและบันทึกในเครื่อง
import requests
# ลิงก์ดาวน์โหลดโดยตรงจากแพลตฟอร์ม
url = "https://dl.dropboxusercontent.com/scl/fi/ijfjpdntc1qv068wjlbbb/AvgSurfT.tif?rlkey=wx9lgdgkcf2ahrymemln1y37v&dl=0"
output_path = "AvgSurfT.tif"
# ดาวน์โหลดและบันทึกในเครื่อง
response = requests.get(url)
with open(output_path, "wb") as f:
f.write(response.content)
print("ดาวน์โหลดไฟล์และบันทึกเป็น:", output_path)
ขั้นตอนที่ 2. อ่านไฟล์ GeoTIFF และสำรวจคุณสมบัติ
import rasterio
# เปิดไฟล์ GeoTIFF
with rasterio.open("AvgSurfT.tif") as dataset:
print("ข้อมูลเมตา:", dataset.profile)
print("CRS:", dataset.crs)
print("จำนวนแบนด์:", dataset.count)
ขั้นตอนที่ 3. อ่านข้อมูลแบนด์และคำนวณสถิติ
import numpy as np
with rasterio.open("AvgSurfT.tif") as dataset:
band1 = dataset.read(1).astype("float64") # อ่านแบนด์แรก
valid_data = band1[~np.isnan(band1)] # ตัด NaNs ออก
stats = {
'min': float(np.min(valid_data)),
'max': float(np.max(valid_data)),
'mean': float(np.mean(valid_data)),
'std': float(np.std(valid_data))
}
print("สถิติแบนด์ 1:", stats)
ขั้นตอนที่ 4. แสดงภาพข้อมูลแบนด์
import matplotlib.pyplot as plt
plt.figure(figsize=(6, 8))
plt.imshow(band1, cmap='hot_r', vmin=280, vmax=320)
plt.colorbar(label="อุณหภูมิ (K)")
plt.title("AvgSurfT - แบนด์ 1")
plt.xlabel("X (พิกเซล)")
plt.ylabel("Y (พิกเซล)")
plt.show()
ขั้นตอนที่ 5. แทนที่พิกัดพิกเซลด้วยพิกัดภูมิศาสตร์
with rasterio.open("AvgSurfT.tif") as src:
band1 = src.read(1)
transform = src.transform
from rasterio.transform import xy
# รับขนาด
nrows, ncols = band1.shape
# รับลองจิจูด/ละติจูดของมุมบนซ้ายและมุมล่างขวา
lon_min, lat_max = xy(transform, 0, 0)
lon_max, lat_min = xy(transform, nrows - 1, ncols - 1)
# สร้างขอบเขต
extent = [lon_min, lon_max, lat_min, lat_max]
plt.figure(figsize=(10, 6))
plt.imshow(band1, cmap='hot_r', vmin=280, vmax=320, extent=extent)
plt.colorbar(label="อุณหภูมิ (K)")
plt.title("AvgSurfT - แบนด์ 1")
plt.xlabel("ลองจิจูด")
plt.ylabel("ละติจูด")
plt.show()
ขั้นตอนที่ 6. แสดงภาพทุกแบนด์
# เปิดชุดข้อมูล
with rasterio.open("AvgSurfT.tif") as dataset:
num_bands = dataset.count # จำนวนแบนด์
transform = dataset.transform
height = dataset.height
width = dataset.width
# รับขอบเขตภูมิศาสตร์
lon_min, lat_max = xy(transform, 0, 0)
lon_max, lat_min = xy(transform, height - 1, width - 1)
extent = [lon_min, lon_max, lat_min, lat_max]
# สร้างแผนภาพย่อยสำหรับแต่ละแบนด์
fig, axes = plt.subplots(1, num_bands, figsize=(5 * num_bands, 6))
if num_bands == 1:
axes = [axes] # ทำให้แน่ใจว่า axes เป็นรูปแบบที่วนซ้ำได้เสมอ
for i in range(num_bands):
band = dataset.read(i + 1) # อ่านแบนด์ (ดัชนีเริ่มที่ 1)
ax = axes[i]
im = ax.imshow(band, cmap='hot_r', vmin=280, vmax=320, extent=extent)
ax.set_title(f"แบนด์ {i + 1}")
ax.set_xlabel("ลองจิจูด")
ax.set_ylabel("ละติจูด")
plt.colorbar(im, ax=ax, shrink=1)
plt.tight_layout()
plt.show()
ขั้นตอนที่ 7. ตัดข้อมูล GeoTIFF ให้เป็นพื้นที่เฉพาะ (ขอบเขตประเทศไทย)
import geopandas as gpd
from rasterio.mask import mask
# โหลดไฟล์ shapefile GADM ระดับ 1 สำหรับประเทศไทย
thailand = gpd.read_file("path/to/your/shapefile.shp") # อัปเดตด้วยพาธของคุณ
# ตัดเฉพาะจังหวัดที่ต้องการ
bangkok = thailand[thailand["shapeName"] == "Bangkok"]
# เปิด GeoTIFF และทำการตัด
with rasterio.open("AvgSurfT.tif") as src:
if bangkok.crs != src.crs:
bangkok = bangkok.to_crs(src.crs)
# ตัดราสเตอร์
out_image, out_transform = mask(src, bangkok.geometry, crop=True)
out_meta = src.meta.copy()
# อัปเดตข้อมูลเมตาสำหรับผลลัพธ์
out_meta.update({
"height": out_image.shape[1],
"width": out_image.shape[2],
"transform": out_transform
})
ขั้นตอนที่ 8. บันทึกและแสดงภาพผลลัพธ์ที่ตัดแล้ว
# บันทึก GeoTIFF ที่ตัดแล้ว
with rasterio.open("AvgSurfT_bkk.tif", "w", **out_meta) as dest:
dest.write(out_image)
# รับจำนวนแถวและคอลัมน์
nrows, ncols = out_image.shape[1], out_image.shape[2]
# รับพิกัดขอบเขตโดยใช้การแปลงแบบ affine
lon_min, lat_max = xy(out_transform, 0, 0)
lon_max, lat_min = xy(out_transform, nrows - 1, ncols - 1)
# สร้างขอบเขตสำหรับ imshow (ซ้าย, ขวา, ล่าง, บน)
extent = [lon_min, lon_max, lat_min, lat_max]
# แสดงราสเตอร์และขอบเขต
fig, ax = plt.subplots(figsize=(10, 6))
raster = ax.imshow(out_image[0], cmap='hot_r', vmin=300, vmax=320, extent=extent)
bangkok.boundary.plot(ax=ax, edgecolor='black', linewidth=0.5)
plt.colorbar(raster, ax=ax, label="อุณหภูมิ (K)")
ax.set_title("AvgSurfT - ตัดขอบเขตกรุงเทพฯ พร้อมแสดงเส้นขอบ")
ax.set_xlabel("ลองจิจูด")
ax.set_ylabel("ละติจูด")
ax.set_axis_on()
plt.savefig("AvgSurfT_bkk_with_boundary.png", dpi=300)
plt.show()
บทสรุป
หมายเหตุ: บทเรียนนี้สันนิษฐานว่าคุณมีความคุ้นเคยพื้นฐานกับการเขียนโปรแกรม Python และแนวคิดเชิงพื้นที่ สำหรับคำอธิบายที่ละเอียดเกี่ยวกับฟังก์ชันเฉพาะ โปรดดูเอกสารประกอบสำหรับ rasterio, GeoPandas และ Matplotlib
🔍 ตัวอย่างโค้ดบน : GeoTiff in Python
การประมวลผลและการแสดงผลข้อมูล NetCDF
คู่มือนี้มีคำแนะนำอย่างครบถ้วนเกี่ยวกับการทำงานกับไฟล์ NetCDF (.nc) โดยใช้ Python รวมถึงการโหลดข้อมูล การวิเคราะห์ และการสร้างภาพข้อมูลหลากหลายประเภท โดยเน้นไปที่ข้อมูลทางอุตุนิยมวิทยาและภูมิสารสนเทศ
ข้อกำหนดเบื้องต้น – ดาวน์โหลดไฟล์ NetCDF
ขั้นตอนที่ 1. การติดตั้งไลบรารีที่จำเป็น
pip install xarray netCDF4 matplotlib numpy scipy cartopy geopandas
ขั้นตอนที่ 2. การโหลดและสำรวจข้อมูล NetCDF
import xarray as xr
import os
import matplotlib.pyplot as plt
import geopandas as gpd
import numpy as np
import pandas as pd
# เส้นทางไปยังไฟล์ NetCDF ของคุณ
nc_file_path = r"C:\Users\ASUS\Jupyter\ALICE\data\AvgSurfT.nc"
# เปิดชุดข้อมูล
ds = xr.open_dataset(nc_file_path)
# สำรวจโครงสร้างชุดข้อมูล
print("ภาพรวมชุดข้อมูล:")
print(ds)
# ดูตัวแปรที่มีอยู่ในชุดข้อมูล
print(f"ตัวแปรที่มีอยู่: {list(ds.data_vars)}")
# แยกตัวแปรที่สนใจ
var_data = ds['AvgSurfT'] # แทนที่ด้วยชื่อตัวแปรของคุณหากแตกต่าง
# ตรวจสอบข้อมูลเมตาและคุณลักษณะ
print(f"คุณลักษณะของตัวแปร: {var_data.attrs}")
print(f"มิติ: {var_data.dims}")
print(f"พิกัด: {var_data.coords}")
print(f"รูปร่าง: {var_data.shape}")
ขั้นตอนที่ 3. สถิติพื้นฐานและการสำรวจข้อมูล
# คำนวณสถิติพื้นฐาน
ds_mean_value = var_data.mean().values
ds_min_value = var_data.min().values
ds_max_value = var_data.max().values
ds_std_dev = var_data.std().values
# รับช่วงเวลา
min_date = str(var_data.time.values.min())[:10]
max_date = str(var_data.time.values.max())[:10]
# แสดงสถิติ
print(f"ช่วงเวลา: {min_date} ถึง {max_date}")
print(f"ค่าเฉลี่ย: {ds_mean_value:.4f} {var_data.attrs.get('units', '')}")
print(f"ค่าต่ำสุด: {ds_min_value:.4f} {var_data.attrs.get('units', '')}")
print(f"ค่าสูงสุด: {ds_max_value:.4f} {var_data.attrs.get('units', '')}")
print(f"ค่าเบี่ยงเบนมาตรฐาน: {ds_std_dev:.4f} {var_data.attrs.get('units', '')}")
# สถิติเชิงพื้นที่เพิ่มเติม
print("\nการวิเคราะห์เชิงพื้นที่:")
spatial_mean = var_data.mean(dim=['lat', 'lon']).values
print(f"ค่าเฉลี่ยในทุกตำแหน่ง: {spatial_mean.mean():.4f}")
# สถิติเชิงเวลา
print("\nการวิเคราะห์เชิงเวลา:")
if 'time' in var_data.dims:
temporal_mean = var_data.mean(dim='time')
print(f"รูปร่างค่าเฉลี่ยเชิงเวลา: {temporal_mean.shape}")
print(f"ค่าสูงสุดในค่าเฉลี่ยเชิงเวลา: {temporal_mean.max().values:.4f}")
print(f"ค่าต่ำสุดในค่าเฉลี่ยเชิงเวลา: {temporal_mean.min().values:.4f}")
ขั้นตอนที่ 4. การแสดงผลภาพเชิงพื้นที่พร้อมขอบเขตทางภูมิศาสตร์
# โหลดขอบเขตประเทศไทย
thailand_boundary = gpd.read_file("https://geodata.ucdavis.edu/gadm/gadm4.1/json/gadm41_THA_0.json")
# สร้างรูปภาพที่มีสองแผนภาพย่อย
fig, axes = plt.subplots(1, 2, figsize=(14, 6), constrained_layout=True)
# ค่าเฉลี่ยเชิงพื้นที่ในอดีต (แผนภาพย่อยซ้าย)
temp = ds # ใช้ชุดข้อมูลเดิม
temp['AvgSurfT'].mean(dim="time").plot(
cmap="hot_r", ax=axes[0], vmin=290, vmax=310,
cbar_kwargs={"label": "ค่าเฉลี่ย AvgSurfT ในอดีต (K)"}
)
thailand_boundary.plot(edgecolor="black", facecolor="none", lw=0.7, ax=axes[0])
axes[0].set_title(f"ค่าเฉลี่ย AvgSurfT ในอดีต\n{min_date} ถึง {max_date}")
axes[0].set_xlabel("ลองจิจูด")
axes[0].set_ylabel("ละติจูด")
# แผนภาพค่าเบี่ยงเบนมาตรฐาน (แผนภาพย่อยขวา)
temp['AvgSurfT'].std(dim="time").plot(
cmap="viridis", ax=axes[1],
cbar_kwargs={"label": "ค่าเบี่ยงเบนมาตรฐานของ AvgSurfT (K)"}
)
thailand_boundary.plot(edgecolor="black", facecolor="none", lw=0.7, ax=axes[1])
axes[1].set_title(f"ความแปรปรวนของ AvgSurfT\n{min_date} ถึง {max_date}")
axes[1].set_xlabel("ลองจิจูด")
axes[1].set_ylabel("ละติจูด")
# บันทึกรูปภาพ
fig.savefig(r"C:\Users\ASUS\Jupyter\ALICE\data\AvgSurfT\ncAvgSurfT_map.png", dpi=300, bbox_inches='tight')
plt.show()
ขั้นตอนที่ 5. การแสดงผลภาพหลายช่วงเวลา
# รับจำนวนช่วงเวลาที่มีอยู่
time_steps = len(var_data.time)
# กำหนดจำนวนที่จะแสดง (สูงสุด 6)
n_plots = min(time_steps, 6)
# สร้างแผนภาพย่อย 1xn
fig, axes = plt.subplots(nrows=1, ncols=n_plots, figsize=(4*n_plots, 4), constrained_layout=True)
# หากมีแผนภาพย่อยเพียงหนึ่ง ทำให้ axes เป็นรูปแบบที่วนซ้ำได้
if n_plots == 1:
axes = [axes]
# แสดงแต่ละช่วงเวลาในแผนภาพย่อยของมัน
for i, time_idx in enumerate(range(n_plots)):
ax = axes[i]
time_value = var_data.time.values[time_idx]
time_data = var_data.sel(time=time_value)
# แสดงอุณหภูมิและซ้อนทับขอบเขต
time_data.plot(ax=ax, cmap="hot_r", vmin=280, vmax=315,
cbar_kwargs={'label': '' if i < n_plots-1 else 'AvgSurfT (K)'}) # แสดงป้ายแถบสีเฉพาะแผนภาพสุดท้าย
thailand_boundary.plot(ax=ax, edgecolor="black", facecolor="none", linewidth=0.7)
# จัดรูปแบบสตริงเวลาสำหรับชื่อเรื่อง
time_str = str(time_value)[:10] # รับรูปแบบ YYYY-MM-DD
ax.set_title(f"{time_str}")
ax.set_xlabel("")
ax.set_ylabel("" if i > 0 else "ละติจูด")
# เพิ่มป้ายลองจิจูดเฉพาะในแผนภาพด้านล่าง
if i == n_plots // 2:
ax.set_xlabel("ลองจิจูด")
# ชื่อเรื่องรวม
plt.suptitle(f"แผนที่ AvgSurfT ({min_date} ถึง {max_date})", fontsize=16, y=1.05)
# บันทึกรูปภาพ
plt.savefig(r"C:\Users\ASUS\Jupyter\ALICE\data\AvgSurfT\ncAvgSurfT_allmap.png", dpi=300, bbox_inches='tight')
plt.show()
ขั้นตอนที่ 6. ตัดข้อมูล NetCDF ให้เป็นพื้นที่เฉพาะ (ขอบเขตกรุงเทพฯ)
import rioxarray as rio
# ทำให้แน่ใจว่าข้อมูล NetCDF มีมิติเชิงพื้นที่และ CRS ที่เหมาะสม
ds_geo = temp['AvgSurfT'].rio.set_spatial_dims(x_dim="lon", y_dim="lat")
ds_geo = ds_geo.rio.write_crs("EPSG:4326") # ตั้งค่าเป็นระบบพิกัด WGS84
# กรองกรอบข้อมูลเชิงภูมิศาสตร์เพื่อเลือกเฉพาะกรุงเทพฯ
thailand_boundary = gpd.read_file("https://geodata.ucdavis.edu/gadm/gadm4.1/json/gadm41_THA_1.json")
bangkok = thailand_boundary[thailand_boundary["NAME_1"].isin(["BangkokMetropolis"])]
# ตรวจสอบว่าขอบเขตอยู่ใน CRS ที่ถูกต้อง
if bangkok.crs != "EPSG:4326":
bangkok = bangkok.to_crs("EPSG:4326")
# ตัดข้อมูล NetCDF ให้เป็นขอบเขตกรุงเทพฯ
bangkok_data = ds_geo.rio.clip(bangkok.geometry, bangkok.crs)
# คำนวณค่าเฉลี่ยเชิงเวลาสำหรับการแสดงผลภาพ
bangkok_mean = bangkok_data.mean(dim='time')
# แสดงผลภาพข้อมูลที่ตัดแล้ว
plt.figure(figsize=(10, 8))
im = bangkok_mean.plot(cmap='hot_r', vmin=300, vmax=315, add_colorbar=False) # ลบแถบสีเริ่มต้น
plt.colorbar(im, shrink=0.8) # เพิ่มแถบสีที่มีขนาดกำหนดเอง (ปรับค่า shrink ตามต้องการ)
bangkok.boundary.plot(edgecolor='black', linewidth=1.5, ax=plt.gca())
plt.title(f"อุณหภูมิพื้นผิวเฉลี่ยในกรุงเทพฯ\n{min_date} ถึง {max_date}")
plt.xlabel("ลองจิจูด")
plt.ylabel("ละติจูด")
plt.tight_layout()
# บันทึกข้อมูลที่ตัดแล้วหากจำเป็น
plt.savefig("Bangkok_AvgSurfT.png", dpi=300, bbox_inches='tight')
plt.show()
บทสรุป
เมื่อทำงานกับไฟล์ NetCDF (.nc) ใน Python โปรดจำขั้นตอนสำคัญเหล่านี้:
1. การสำรวจเบื้องต้น: เปิดไฟล์ด้วย xarray และตรวจสอบโครงสร้าง ตัวแปร และมิติของมัน
2. การสกัดข้อมูล: เลือกตัวแปรและพื้นที่เฉพาะที่สนใจจากชุดข้อมูล
3. การวิเคราะห์ทางสถิติ: คำนวณสถิติพื้นฐานและทำการวิเคราะห์เชิงเวลา/เชิงพื้นที่
4. การแสดงผลภาพ: สร้างแผนภาพที่มีความหมายเพื่อแสดงผลภาพข้อมูลของคุณ (อนุกรมเวลา แผนที่ ฯลฯ)
5. การส่งออกข้อมูล: บันทึกข้อมูลที่ประมวลผลแล้วและผลลัพธ์ในรูปแบบที่เหมาะสม
โดยการปฏิบัติตามคู่มือนี้ คุณควรจะสามารถประมวลผล วิเคราะห์ และแสดงผลภาพข้อมูลจากไฟล์ NetCDF สำหรับการประยุกต์ใช้ด้านอุตุนิยมวิทยา สภาพภูมิอากาศ และข้อมูลเชิงพื้นที่ได้อย่างมีประสิทธิภาพ
โปรดจำไว้เสมอว่าให้ตรวจสอบระบบพิกัด หน่วย และข้อมูลเมตาของไฟล์ NetCDF ของคุณ เนื่องจากสิ่งเหล่านี้อาจแตกต่างกันไปขึ้นอยู่กับแหล่งที่มาและประเภทของข้อมูล
🔍 ตัวอย่างโค้ดบน : NetCDF in Python
การประมวลผลข้อมูล Time Series
ข้อมูลอนุกรมเวลามีความสำคัญสำหรับการติดตามการเปลี่ยนแปลงตามช่วงเวลา—ไม่ว่าจะเป็นการวัดสภาพภูมิอากาศ แนวโน้มทางอุทกวิทยา หรือตัวชี้วัดด้านสิ่งแวดล้อม ในกระบวนการด้านภูมิสารสนเทศ เรามักทำงานกับข้อมูลอนุกรมเวลาจากแหล่งต่าง ๆ เช่น Google Earth Engine (GEE) หรือ Excel คู่มือนี้จะแนะนำคุณเกี่ยวกับสองกระบวนการทำงานเพื่อจัดการกับข้อมูลอนุกรมเวลาโดยใช้ Python:
- ประมวลผลข้อมูล Google Earth Engine บน Python
- ประมวลผลข้อมูล Excel บน Python
การอ่านข้อมูลอนุกรมเวลาจาก GEE เข้าสู่ Python
Google Earth Engine (GEE) เป็นแพลตฟอร์มที่ทรงพลังสำหรับการวิเคราะห์ข้อมูลเชิงพื้นที่ ช่วยให้ผู้ใช้สามารถจัดเก็บ ประมวลผล และแสดงภาพถ่ายดาวเทียมและชุดข้อมูลเชิงพื้นที่อื่น ๆ บางครั้ง คุณอาจส่งออกข้อมูลอนุกรมเวลา (เช่น สภาพภูมิอากาศ การใช้ที่ดิน อุณหภูมิ) จาก GEE ในรูปแบบ FeatureCollection (รูปแบบตาราง) คู่มือนี้จะแนะนำวิธีการอ่านและวิเคราะห์ข้อมูลตารางอนุกรมเวลาในภาษา Python โดยใช้ earthengine-api และ pandas ไม่ว่าคุณจะติดตามอุณหภูมิผิวน้ำตามเวลาหรือปริมาณน้ำฝนในลุ่มน้ำต่าง ๆ คู่มือนี้จะให้เครื่องมือที่คุณต้องการเพื่อประมวลผลและแสดงผลได้อย่างง่ายดาย
ขั้นตอนที่ 1. ติดตั้งไลบรารีที่จำเป็น
pip install earthengine-api pandas matplotlib
ตัวเลือกเพิ่มเติม: หากใช้ Jupyter ให้ติดตั้ง ipython, notebook หรือ jupyterlab
ขั้นตอนที่ 2. การยืนยันตัวตนและเริ่มต้น Earth Engine
import ee
# การยืนยันตัวตนครั้งแรก
ee.Authenticate()
# เริ่มต้น Earth Engine API
ee.Initialize()
ขั้นตอนที่ 3. โหลดข้อมูลอนุกรมเวลาของโครงการจากตัวอย่าง
asset_path = "projects/ee-udomporn/assets/AvgSurfT_basin"
basin_fc = ee.FeatureCollection(asset_path)
ขั้นตอนที่ 4. แปลงเป็น pandas DataFrame
import pandas as pd
features = basin_fc.getInfo()['features']
records = [f['properties'] for f in features]
basin_df = pd.DataFrame(records)
ขั้นตอนที่ 5. แยกวิเคราะห์วันที่และตั้งค่าดัชนีเวลา
# แปลงเป็น datetime และตั้งค่าดัชนี
basin_df['Date'] = pd.to_datetime(basin_df[['Year', 'Month', 'Day']])
basin_df.set_index('Date', inplace=True)
# ตัวเลือก: ลบส่วนวันที่แยก
basin_df.drop(columns=['Day', 'Month', 'Year'], inplace=True, errors='ignore')
ขั้นตอนที่ 6. วิเคราะห์ข้อมูลทางสถิติ
# เลือกเฉพาะคอลัมน์ตัวเลข
numeric_data = basin_df.select_dtypes(include='number')
# สถิติพื้นฐาน
stats = pd.DataFrame({
'Mean (K)': numeric_data.mean(),
'Min (K)': numeric_data.min(),
'Max (K)': numeric_data.max(),
'Std Dev (K)': numeric_data.std()
}).round(2)
print(stats)
stats['Mean (K)'].sort_values().plot(kind='barh', figsize=(10, 6), color='skyblue')
plt.title('อุณหภูมิผิวน้ำเฉลี่ยตามลุ่มน้ำ')
plt.xlabel('อุณหภูมิ (K)')
plt.grid(True)
plt.tight_layout()
plt.show()
ขั้นตอนที่ 7. แสดงผลอนุกรมเวลา (ตัวอย่าง)
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 4))
plt.plot(basin_df.index, basin_df['Chi'], label='ลุ่มน้ำชี', color='tab:blue')
plt.title('อุณหภูมิผิวน้ำ - ลุ่มน้ำชี')
plt.xlabel('วันที่')
plt.ylabel('อุณหภูมิผิวน้ำเฉลี่ย (K)')
plt.grid(True)
plt.legend()
plt.tight_layout()
plt.show()
basins = ['Chi', 'Mun', 'Ping']
fig, axes = plt.subplots(1, 3, figsize=(18, 4), constrained_layout=True)
for i, basin in enumerate(basins):
axes[i].plot(basin_df.index, basin_df[basin], label=basin)
axes[i].set_title(basin)
axes[i].set_xlabel('วันที่')
axes[i].set_ylabel('อุณหภูมิผิวน้ำเฉลี่ย (K)')
axes[i].grid(True)
plt.suptitle('อุณหภูมิผิวน้ำเฉลี่ย - ลุ่มน้ำที่เลือก')
plt.show()
ขั้นตอนที่ 8. การบันทึกข้อมูลที่ประมวลผลแล้ว
# บันทึกข้อมูลที่ประมวลผลแล้วลงในไฟล์ Excel ใหม่
output_path = "processed_basin_data.xlsx"
basin_df.to_excel(output_path)
print(f"บันทึกข้อมูลที่ประมวลผลแล้วไปยัง {output_path}")
# บันทึกกราฟเป็นไฟล์ภาพ
fig.savefig("basin_plot.png", dpi=300, bbox_inches='tight')
print("บันทึกกราฟเป็นไฟล์ภาพแล้ว")
บทสรุป
ตอนนี้คุณได้เรียนรู้วิธี:
🔍 ตัวอย่างโค้ดบน GEE into Python
การประมวลผลและแสดงผลข้อมูลอนุกรมเวลาจาก Excel
คู่มือนี้จะแนะนำคุณผ่านกระบวนการอ่าน ประมวลผล และแสดงผลข้อมูลอนุกรมเวลาจากไฟล์ Excel โดยใช้ Python เราจะครอบคลุมการติดตั้งไลบรารีที่จำเป็น การโหลดข้อมูล การเตรียมข้อมูล การวิเคราะห์ทางสถิติ และการสร้างการแสดงผลหลากหลายรูปแบบ
ข้อกำหนดเบื้องต้น — ดาวน์โหลดไฟล์ Excel จากแพลตฟอร์มของเรา:
ขั้นตอนที่ 1. การติดตั้งไลบรารีที่จำเป็น
pip install pandas matplotlib numpy scipy seaborn openpyxl
ขั้นตอนที่ 2. การโหลดข้อมูลจาก Excel
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
from scipy import stats
# ตั้งค่าเส้นทางไปยังไฟล์ Excel ของคุณ
basin_excel_path = r"C:\data\AvgSurfT\AvgSurfT_basin.xlsx"
# ดูตัวอย่างข้อมูล
basin_df = pd.read_excel(basin_excel_path)
print(basin_df.head()) # แสดง 5 แถวแรก
print(basin_df.columns) # แสดงชื่อคอลัมน์
# อ่านไฟล์ Excel อีกครั้ง โดยข้ามแถวแรก (สำหรับหัวคอลัมน์ภาษาไทย)
basin_df = pd.read_excel(basin_excel_path, skiprows=1)
print(basin_df.columns) # แสดงชื่อคอลัมน์หลังจากข้ามแถวแรก
ขั้นตอนที่ 3. การเตรียมข้อมูล
# แปลงคอลัมน์ที่เกี่ยวข้องกับวันที่เป็นตัวเลขจำนวนเต็ม
basin_df['Year'] = basin_df['Year'].astype(int)
basin_df['Month'] = basin_df['Month'].astype(int)
basin_df['Day'] = basin_df['Day'].astype(int)
# แปลงเป็น datetime และตั้งเป็นดัชนี
basin_df['Date'] = pd.to_datetime(basin_df[['Year', 'Month', 'Day']])
basin_df.set_index('Date', inplace=True)
# ลบคอลัมน์วันที่เดิมหากต้องการ
basin_df.drop(columns=['Year', 'Month', 'Day'], inplace=True)
# ตรวจสอบข้อมูลที่ประมวลผลแล้ว
print(basin_df.info())
print(basin_df.describe())
ขั้นตอนที่ 4. การวิเคราะห์ข้อมูลเบื้องต้น
# ตรวจสอบค่าที่หายไป
print("\nค่าที่หายไปในแต่ละคอลัมน์:")
print(basin_df.isna().sum())
# สถิติพื้นฐานสำหรับแต่ละลุ่มน้ำ
print("\nสถิติพื้นฐาน:")
print(basin_df.describe())
# ตรวจสอบช่วงเวลาของข้อมูล
print("\nข้อมูลครอบคลุมตั้งแต่:", basin_df.index.min(), "ถึง", basin_df.index.max())
# ตรวจสอบค่าผิดปกติโดยใช้ Z-score
z_scores = stats.zscore(basin_df)
potential_outliers = (abs(z_scores) > 3).any(axis=1)
print("\nจำนวนค่าผิดปกติที่อาจเกิดขึ้น:", potential_outliers.sum())
# รูปแบบรายเดือนและตามฤดูกาล
basin_df['Month'] = basin_df.index.month
basin_df['Year'] = basin_df.index.year
# คำนวณค่าเฉลี่ยรายเดือน
monthly_avg = basin_df.groupby('Month').mean()
print("\nค่าเฉลี่ยรายเดือน:")
print(monthly_avg)
# ลบคอลัมน์ที่เพิ่มเข้าไปหากไม่จำเป็นต้องใช้อีกต่อไป
basin_df.drop(columns=['Month', 'Year'], inplace=True, errors='ignore')
ขั้นตอนที่ 5. การแสดงผลเชิงภาพพื้นฐาน
plt.figure(figsize=(10, 4))
plt.plot(basin_df.index, basin_df['Chi'], color='tab:blue')
plt.title('อุณหภูมิผิวน้ำเฉลี่ย - ลุ่มน้ำชี')
plt.xlabel('วันที่')
plt.ylabel('อุณหภูมิผิวน้ำเฉลี่ย (K)')
plt.grid(True)
plt.tight_layout()
plt.show()
basins_to_plot = ['Chi', 'Mun', 'Ping']
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(18, 4), sharey=True)
for i, basin in enumerate(basins_to_plot):
axes[i].plot(basin_df.index, basin_df[basin], label=basin, color=f'tab:{["blue", "orange", "green"][i]}')
axes[i].set_title(f'ลุ่มน้ำ{basin}')
axes[i].set_xlabel('วันที่')
axes[i].grid(True)
axes[0].set_ylabel('อุณหภูมิผิวน้ำเฉลี่ย (K)')
plt.suptitle('อุณหภูมิผิวน้ำเฉลี่ย - ลุ่มน้ำที่เลือก', fontsize=16)
plt.tight_layout(rect=[0, 0, 1, 0.95])
plt.show()
ขั้นตอนที่ 6. การบันทึกข้อมูลที่ประมวลผลแล้ว
# บันทึกข้อมูลที่ประมวลผลแล้วลงในไฟล์ Excel ใหม่
output_path = "processed_basin_data.xlsx"
basin_df.to_excel(output_path)
print(f"บันทึกข้อมูลที่ประมวลผลแล้วไปยัง {output_path}")
# บันทึกกราฟเป็นไฟล์ภาพ
fig.savefig("basin_plot.png", dpi=300, bbox_inches='tight')
print("บันทึกกราฟเป็นไฟล์ภาพแล้ว")
ด้วยการทำตามคู่มือที่ครอบคลุมนี้ คุณสามารถประมวลผล วิเคราะห์ และแสดงผลข้อมูลอนุกรมเวลาจากไฟล์ Excel โดยใช้ Python ได้อย่างมีประสิทธิภาพ เทคนิคที่แสดงสามารถนำไปใช้กับข้อมูลอนุกรมเวลาประเภทต่าง ๆ
🔍 ตัวอย่างโค้ดบน Python Time series










