Weather and airspace
UAT 304 UAS Mission Planning and Autonomous Flight
Lesson
By the end of this module you will be able to
- Read a METAR report group by group and decode it with a program
- Use METAR data in flight decisions while knowing the limits of the report
- Check flight points against the CAAT 9 km aerodrome conditions
- Check area boundaries horizontally, vertically and in time
Why this matters
The drone knowledge base’s unit on METAR and TAF teaches decoding the station, time, wind, visibility and cloud, and understanding the limits of the report. Its unit on aeronautical charts and information warns to check area boundaries horizontally, vertically and in time, not just by colour on a map. This module does both with programs so that the checks can be repeated every time. The data in the examples is hypothetical.
Reading a METAR
A METAR is an aerodrome’s routine hourly weather report. In Thailand, AIP GEN 3.5 states that the Thai Meteorological Department provides aeronautical meteorological services and that aerodrome meteorological offices issue METAR and TAF. Following the NOAA Aviation Weather Center’s description, the wind group is a three-digit direction followed by the speed, with G and the gust speed if there are gusts, in KT (knots). International reports give visibility in metres (9999 means 10 km or more). Temperature and dew point are in °C with M for negative values, and pressure is Q followed by hPa. CAVOK means visibility of 10 km or more, no cloud below 1,500 m, no cumulonimbus and no significant weather.
Example 1 Decoding two METAR reports
import re
reports = [
"METAR VTBD 150100Z 21012G22KT 9999 FEW020 SCT100 30/24 Q1008 NOSIG",
"METAR VTBD 150700Z 24018G32KT 4000 TSRA FEW015CB BKN030 27/25 Q1006",
]
KT = 0.5144
def decode(r):
out = {"station": r.split()[1]}
m = re.search(r"\b(\d{2})(\d{2})(\d{2})Z\b", r)
out["utc"] = f"day {m.group(1)} {m.group(2)}:{m.group(3)}Z"
m = re.search(r"\b(\d{3}|VRB)(\d{2,3})(?:G(\d{2,3}))?KT\b", r)
out["wind"] = f"{m.group(1)} deg {int(m.group(2)) * KT:.1f} m/s" + (f", gust {int(m.group(3)) * KT:.1f} m/s" if m.group(3) else "")
m = re.search(r"KT (\d{4})\b", r)
vis = int(m.group(1))
out["visibility"] = ">= 10 km" if vis == 9999 else f"{vis / 1000:.1f} km"
out["thunderstorm"] = bool(re.search(r"\bTS|CB\b", r))
m = re.search(r"\b(M?\d{2})/(M?\d{2})\b", r)
t, td = (int(x.replace("M", "-")) for x in m.groups())
out["temp/dew"] = f"{t}/{td} C, spread {t - td} C"
out["QNH"] = int(re.search(r"\bQ(\d{4})\b", r).group(1))
return out
for r in reports:
print(decode(r))
{'station': 'VTBD', 'utc': 'day 15 01:00Z', 'wind': '210 deg 6.2 m/s, gust 11.3 m/s', 'visibility': '>= 10 km', 'thunderstorm': False, 'temp/dew': '30/24 C, spread 6 C', 'QNH': 1008}
{'station': 'VTBD', 'utc': 'day 15 07:00Z', 'wind': '240 deg 9.3 m/s, gust 16.5 m/s', 'visibility': '4.0 km', 'thunderstorm': True, 'temp/dew': '27/25 C, spread 2 C', 'QNH': 1006}
The morning report (08:00 Thai time) has gusts of about 11 m/s and good visibility. The afternoon report (14:00) has a thunderstorm with cumulonimbus, visibility down to 4 km, and only 2 °C between temperature and dew point, which means very humid air. Remember that a METAR is measured at the aerodrome; a site several kilometres away can differ a lot, so use it together with other sources as in Module 1.
The 9 km aerodrome distance
The 2018 CAAT notice on permitting flights within 9 km (5 nautical miles) of an aerodrome or temporary landing site refers to the ban on flying within 9 km of an aerodrome unless its owner or operator permits it, with the relevant air traffic control unit consulted first. Distance is measured from the runway midpoint. The notice also sets height limits: no flight in the approach or departure path or within 1 km of the runway midpoint, no more than 45 m at 1–4 km, and no more than 90 m at 4–9 km. The operator must also be registered, give a reason, and have written consent from the landowner.
Example 2 Checking flight points against the 9 km conditions
A hypothetical aerodrome has its runway midpoint at (0, 0) and runway direction 030/210 degrees. The team treats a 1 km-wide strip along the runway axis out to 9 km as the approach and departure path (the team’s assumption, to be confirmed with the real aerodrome). Coordinates are metres east and north.
import math
RWY_HDG = 30 # degrees
CORRIDOR_HALF = 500 # m, half-width of the approach path (team assumption)
points = {"A": (2500, 900, 40), "B": (1600, 2800, 40), "C": (5600, 3000, 80), "D": (9500, 1000, 110)} # x, y, height m
u = (math.sin(math.radians(RWY_HDG)), math.cos(math.radians(RWY_HDG))) # unit vector along the runway
for name, (x, y, alt) in points.items():
d = math.hypot(x, y)
across = abs(x * u[1] - y * u[0]) # perpendicular distance from the runway axis
if d > 9000:
verdict = f"outside 9 km, general 90 m limit -> {'ok' if alt <= 90 else 'TOO HIGH'}"
elif d < 1000 or across < CORRIDOR_HALF:
verdict = "NOT ALLOWED (within 1 km or in approach/departure path)"
else:
limit = 45 if d <= 4000 else 90
verdict = f"needs aerodrome permission, max {limit} m -> {'ok' if alt <= limit else 'TOO HIGH'}"
print(f"{name}: {d / 1000:.2f} km from runway midpoint, {across:.0f} m off axis, {alt} m -> {verdict}")
A: 2.66 km from runway midpoint, 1715 m off axis, 40 m -> needs aerodrome permission, max 45 m -> ok
B: 3.22 km from runway midpoint, 14 m off axis, 40 m -> NOT ALLOWED (within 1 km or in approach/departure path)
C: 6.35 km from runway midpoint, 3350 m off axis, 80 m -> needs aerodrome permission, max 90 m -> ok
D: 9.55 km from runway midpoint, 7727 m off axis, 110 m -> outside 9 km, general 90 m limit -> TOO HIGH
Point A is far enough from the runway axis but within 1–4 km, so it must stay at or below 45 m. Point B, although only at 40 m, is less than 500 m from the runway axis and so lies in the approach path under the team’s assumption: no flight. Point C is at 4–9 km and may fly up to 90 m with permission. Point D is outside 9 km but still subject to the general conditions, a maximum of 90 m, which the planned 110 m exceeds, so the plan must change.
Vertical and time limits
Some prohibited and danger areas apply only at certain heights or times, and CAAT can add or cancel areas as circumstances change. Before every job, check the latest notices on the UAS Portal and the relevant area notices, and record the date and number of each notice checked in the mission file.
Module lab
Lab: checking the weather and airspace for the job day
- Fetch the METAR and TAF of the aerodrome nearest to campus, decode them with Example 1 and by hand to compare
- Compare them with the site anemometer and explain the differences
- Measure the distance from the site to the nearest runway midpoint and check the conditions with Example 2
- Check the latest CAAT area notices and record their numbers and dates
- Add the results to the mission file from Module 1
Common mistakes
Watch out
- Reading METAR times as Thai time when they are UTC (Z)
- Forgetting to convert knots to m/s before comparing with manufacturer limits
- Using the aerodrome METAR as the conditions at the site
- Measuring from the passenger terminal instead of the runway midpoint
- Judging by colour on a map without checking the height and time limits of an area
Summary
- A METAR contains the station, UTC time, wind, visibility, weather, cloud, temperature and dew point, and pressure, and can be decoded by a program
- A METAR is measured at the aerodrome and must be combined with site data
- Within 9 km of the runway midpoint needs permission; no flight in the approach path or within 1 km; up to 45 m at 1–4 km and 90 m at 4–9 km
- Check areas horizontally, vertically and in time, and record the notices checked
Check your understanding
- What does the group 18015G25KT mean?
- What Thai time is a METAR issued at 150300Z?
- A point 3 km from the runway midpoint and outside the approach path may fly at most how high with permission?
- What does a temperature of 26 and dew point of 25 indicate?
- Why might an aerodrome METAR not match the conditions at the site?
Answers
- Wind from 180 degrees at 15 kt, gusting 25 kt
- 10:00 (UTC + 7)
- 45 m
- Very humid air near saturation, with a risk of fog or low cloud
- It is measured at the aerodrome, some distance away, where terrain and height differ
Key formulas
| Distance from the runway midpoint | |
| Temperature–dew point spread |
Key references
- NOAA National Weather Service Aviation Weather Center. Aviation weather data (help). link
- Civil Aviation Authority of Thailand. (2024). AIP Thailand GEN 3.5 Meteorological services (AIRAC 2024-03-21). link
- Federal Aviation Administration. (2016). Aviation weather (AC 00-6B). link
- สำนักงานการบินพลเรือนแห่งประเทศไทย. (2561). ประกาศ สำนักงานการบินพลเรือนแห่งประเทศไทย เรื่อง แนวทางในการพิจารณาอนุญาตให้อากาศยานซึ่งไม่มีนักบิน ประเภทอากาศยานที่ควบคุมการบินจากภายนอกทำการบินภายในระยะเก้ากิโลเมตร (ห้าไมล์ทะเล) จากสนามบินหรือที่ขึ้นลงชั่วคราวของอากาศยาน พ.ศ. 2561. link
- สำนักงานการบินพลเรือนแห่งประเทศไทย. (2569). ข่าว กพท. ฉบับที่ 4/2569 ประกาศฉบับที่ 15 เงื่อนไขการบังคับอากาศยานซึ่งไม่มีนักบิน. link
Further reading
Study the assigned knowledge units in advance, review media and take the module quiz
Reading METAR and TAF step by step
Reading charts and aeronautical information
In class / field
Lab or field practice from worksheets with a safety checklist
Learning evidence: Checked worksheets and quiz results