Module 2/5 · Weeks 4–6 · 27 h

Weather and airspace

UAT 304 UAS Mission Planning and Autonomous Flight

About 85 minDraft, awaiting reviewLast updated 28 September 2026

Lesson

By the end of this module you will be able to

  1. Read a METAR report group by group and decode it with a program
  2. Use METAR data in flight decisions while knowing the limits of the report
  3. Check flight points against the CAAT 9 km aerodrome conditions
  4. Check area boundaries horizontally, vertically and in time

Prerequisites: UAT 304 Module 1 · UAT 313 Module 2 (registration and permissions)

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 morning METAR split into groups, each in a coloured box: station VTBD, time 150100Z, wind 21012G22KT, visibility 9999, cloud FEW020 SCT100, temperature and dew point 30/24, and pressure Q1008, with a short explanation under each box
Figure 1 Groups in a METAR report

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.

Top view with a runway at an angle in the centre, circles of 1, 4 and 9 kilometres around the runway midpoint, a pink strip along the runway axis for the approach path, and points A, B, C and D; B lies in the pink strip and D outside the 9 kilometre circle
Figure 2 The 9 km conditions around a hypothetical aerodrome

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

  1. Fetch the METAR and TAF of the aerodrome nearest to campus, decode them with Example 1 and by hand to compare
  2. Compare them with the site anemometer and explain the differences
  3. Measure the distance from the site to the nearest runway midpoint and check the conditions with Example 2
  4. Check the latest CAAT area notices and record their numbers and dates
  5. 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

  1. What does the group 18015G25KT mean?
  2. What Thai time is a METAR issued at 150300Z?
  3. A point 3 km from the runway midpoint and outside the approach path may fly at most how high with permission?
  4. What does a temperature of 26 and dew point of 25 indicate?
  5. Why might an aerodrome METAR not match the conditions at the site?
Answers
  1. Wind from 180 degrees at 15 kt, gusting 25 kt
  2. 10:00 (UTC + 7)
  3. 45 m
  4. Very humid air near saturation, with a risk of fog or low cloud
  5. 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

  1. NOAA National Weather Service Aviation Weather Center. Aviation weather data (help). link
  2. Civil Aviation Authority of Thailand. (2024). AIP Thailand GEN 3.5 Meteorological services (AIRAC 2024-03-21). link
  3. Federal Aviation Administration. (2016). Aviation weather (AC 00-6B). link
  4. สำนักงานการบินพลเรือนแห่งประเทศไทย. (2561). ประกาศ สำนักงานการบินพลเรือนแห่งประเทศไทย เรื่อง แนวทางในการพิจารณาอนุญาตให้อากาศยานซึ่งไม่มีนักบิน ประเภทอากาศยานที่ควบคุมการบินจากภายนอกทำการบินภายในระยะเก้ากิโลเมตร (ห้าไมล์ทะเล) จากสนามบินหรือที่ขึ้นลงชั่วคราวของอากาศยาน พ.ศ. 2561. link
  5. สำนักงานการบินพลเรือนแห่งประเทศไทย. (2569). ข่าว กพท. ฉบับที่ 4/2569 ประกาศฉบับที่ 15 เงื่อนไขการบังคับอากาศยานซึ่งไม่มีนักบิน. link

Further reading

Study the assigned knowledge units in advance, review media and take the module quiz

In class / field

Lab or field practice from worksheets with a safety checklist

Learning evidence: Checked worksheets and quiz results

Module quiz

This is a formative self-check, not a graded exam

Knowledge domain: Mission planning, flight and simulation · Control, autopilot and navigation