26 กันยายน 2558

Published 9/26/2558 by with 0 comment

ดึง Open Data รายงานสภาวะอากาศมารายงานบนแผนที่ด้วยภาษาไพทอน

สวัสดีผู้อ่านทุกท่านครับ หลังจากที่ทางภาครัฐได้มีการส่งเสริมการขับเคลื่อนนโยบายดิจิทัลเพื่อเศรษฐกิจและสังคม (Digital Economy) และมาในวันนี้ทางกรมอุตุนิยมวิทยาได้มีการเปิด API สำหรับเข้าถึงข้อมูลสภาวะอากาศ ปรากฏการณ์ธรรมชาติ แผ่นดินไหว พยากรณ์อากาศ ในชื่อ "TMDAPI" (ปัจจุบันยังไม่มีการเปิดให้บริการอย่างเป็นทางการ)


หน้าเว็บ Open Data ของกรมอุตุนิยมวิทยา http://data.tmd.go.th/api/index1.php

แนะนำ ให้ทำการลงทะเบียนการใช้งาน API ตัวนี้ได้ที่ http://data.tmd.go.th/api/index1.php

ในบทความนี้ผมขอใช้ API ที่ชื่อว่า Weather3Hours ซึ่งเป็นระบบรายงานผลการตรวจวัดลักษณะอากาศราย 3 ชั่วโมงทุกสถานี
อ่านเอกสารการใช้งาน Weather3Hours ได้ที่ http://data.tmd.go.th/api/doc/reference/Weather3Hours.pdf

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

บทความนี้ใช้โมดูลในภาษาไพทอนดังนี้

ไฟล์ข้อมูล API อยู่ที่ http://data.tmd.go.th/api/Weather3Hours/V1/ เป็นไฟล์ข้อมูลชนิด json
เริ่มแรกผม import โมดูลเข้ามาก่อน แล้วเข้าคำสั่งให้โมดูล requests ทำการดึงไฟล์ข้อมูล API เข้ามา
import requests,folium
r = requests.get('http://data.tmd.go.th/api/Weather3Hours/V1/')

แต่หากใช้คำสั่ง r.text ออกมาเลย เป็นข้อมูลสตริง แต่ภายในสตริงมีข้อมูลชนิด dict อยู่ จึงไม่สามารถนำไปใช้งาน ต้องใช้คำสั่ง eval() เข้ามาช่วยดึงข้อมูล dict ออกมา และจากเอกสารการใช้งาน Weather3Hours จะเห็นได้ว่าข้อมูลที่ต้องการอยู่ในคีย์ Stations ผมเลยกำหนดตัวแปรสำหรับใช้เก็บค่าไว้ขึ้นมา
doc = eval(r.text)
a = doc['Stations']
DateTime = doc['Header']['LastBuiltDate'] # ดึงข้อมูลวัน เวลาของข้อมูลที่ดึง

ต่อไปสร้างแผนที่ประเทศไทย และสร้างตัวแปรสำหรับการลูป

สร้างแผนที่ HTML ด้วย Folium ในภาษาไพทอน

imap = folium.Map(location=[15.0000, 100.0000], zoom_start=7)
i = 0

ต่อไปลูปสร้าง Markers ผมขออธิบายคำสั่งของโมดูล folium เพิ่มเติมสั้น ๆ ตามนี้ครับ
คำสั่ง

ตัวแปรแผนที่.simple_marker(location=[ละติจูด,ลองติจูด],popup=ข้อมูลที่แสดง)

เมื่อได้อ่านรายละเอียดไฟล์จะเห็นได้ว่า ข้อมูลตำแหน่งของสถานีอยู่คนละคีย์กับข้อมูลสภาพอากาศ แต่มีสิ่งที่เหมือนกันคือ เมื่อกำหนดคีย์ เราสามารถดึงค่าข้อมูลได้โดยใช้คีย์ Value
อ่านเอกสารการใช้งาน Weather3Hours ได้ที่ http://data.tmd.go.th/api/doc/reference/Weather3Hours.pdf

มาลงมือเขียนโค้ดกันต่อครับ

[python]
while i < len(a): # หาก i มีค่าน้อยกว่าจำนวน index ของ dict ในตัวแปร a
c = a[i] # ดึงข้อมูลตามค่า i
Latitude = c['Latitude']['Value']
Longitude = c['Longitude']['Value']
c1 = c['Observe']
BarometerTemperature = c1['BarometerTemperature']['Value']
StationPressure = c1['StationPressure']['Value']
MeanSeaLevelPressure = c1['MeanSeaLevelPressure']['Value']
DewPoint = c1['DewPoint']['Value']
RelativeHumidity = c1['RelativeHumidity']['Value']
VaporPressure = c1['VaporPressure']['Value']
LandVisibility = c1['LandVisibility']['Value']
WindDirection = c1['WindDirection']['Value']
WindSpeed = c1['WindSpeed']['Value']
Rainfall = c1['Rainfall']['Value']
popup1= """สถานี : %s
วัน - เวลา : %s
อุณหภูมิบาโรมิเตอร์ : %s องศาเซลซียส
ความกดอากาศที่สถานี : %.2f มิลลิบาร์
ความกดอากาศที่ระดับน้ำทะเล : %.2f มิลลิบาร์
อุณหภูมิจุดน้ำค้าง : %s องศาเซลซียส
ความชื้นสัมพัทธ์ : %s เปอร์เซ็นต์
ความดันไอ : %.2f มิลลิบาร์
ทัศนวิสัยทางบก : %.2f กิโลเมตร
ทิศทางลม : %s องศา
ความเร็วลม : %.2f กิโลเมตร/ชั่วโมง
ปริมาณฝน : %.2f มิลลิเมตร
""" %(c['StationNameTh'],DateTime,BarometerTemperature,StationPressure,MeanSeaLevelPressure,DewPoint,RelativeHumidity,VaporPressure,LandVisibility,WindDirection,WindSpeed,Rainfall)
imap.simple_marker(location=[Latitude,Longitude],popup=popup1) # สร้าง Markers
i+=1 # เพิ่มค่าอีก 1
[/python]

หลังลูปเสร็จแล้วใช้คำสั่งสร้างแผนที่ออกมาในรูปแบบ HTML

[python]imap.create_map(path='thai_weather3hours.html')[/python]

เมื่อแสดงไฟล์ thai_weather3hours.html (สามารถดูตัวอย่างได้ที่ https://python3.wannaphong.com/lab/thai_weather3hours.html)

thaiรายงานสภาวะอากาศมารายงานบนแผนที่ด้วยภาษาไพทอน

เมื่อคลิกที่ Markers ตัวหนึ่ง

ดึง Open Data รายงานสภาวะอากาศมารายงานบนแผนที่ด้วยภาษาไพทอน

โค้ดฉบับเต็ม

ติดตามบทความภาษาไพทอนกับ Open Data ของภาครัฐไทย ได้ที่นี่เร็ว ๆ นี้
ลองนำความรู้ที่ได้ไปประยุกต์ใช้งานกันดูครับ

ติดตามบทความต่อไปนะครับ
ขอบคุณครับ

0 ความคิดเห็น:

แสดงความคิดเห็น

แสดงความคิดเห็นได้ครับ :)