Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
51 changes: 32 additions & 19 deletions blueprints/weather_bp.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,9 @@

import requests
from lxml import etree
from flask import Blueprint, jsonify
from flask import Blueprint, jsonify, request
from shapely.geometry import shape, Point, Polygon
import json

weather_blueprint = Blueprint('weather', __name__)

Expand Down Expand Up @@ -36,28 +38,39 @@ def _metar(airport):
metar_text = response.content.decode('utf-8')
return jsonify([metar_text])


@weather_blueprint.route('/sigmets')
def _get_sigmets():
artcc_id = request.args.get('artcc')
response = requests.get(
'https://aviationweather.gov/api/data/airsigmet?format=xml')
sigmet_list = []
tree = etree.fromstring(response.content)
for entry in tree.iter('AIRSIGMET'):
try:
sigmet_entry = {
'text': entry.find('raw_text').text,
'hazard': dict(entry.find('hazard').attrib),
'area': [[p.find('longitude').text, p.find('latitude').text] for p in entry.find('area').iter('point')],
'altitude': dict(entry.find('altitude').attrib),
'airsigmet_type': entry.find('airsigmet_type').text,
}
sigmet_list.append(sigmet_entry)
except Exception as e:
pass
# logging.Logger(str(e))
return jsonify(sigmet_list)
'https://aviationweather.gov/api/data/airsigmet?format=json').json()

if artcc_id:
# Load ARTCC boundary polygon
with open('resources/ArtccBoundaries.geojson') as f:
geojson = json.load(f)
artcc_poly = None
for feature in geojson['features']:
if feature['properties']['id'].upper() == artcc_id.upper():
artcc_poly = shape(feature['geometry'])
break
if not artcc_poly:
return jsonify([]) # or handle error

filtered_sigmets = []
for sigmet in response:
coords = sigmet.get('coords', [])
for coord in coords:
pt = Point(coord['lon'], coord['lat'])
if artcc_poly.contains(pt):
filtered_sigmets.append(sigmet)
break
# Check distance to polygon boundary
if artcc_poly.exterior.distance(pt) * 60 <= 150: # degrees to nm approx
filtered_sigmets.append(sigmet)
break
return jsonify(filtered_sigmets)

return jsonify(response)

@weather_blueprint.route('/datis/airport/<airport>')
def _get_datis(airport):
Expand Down
2 changes: 1 addition & 1 deletion libs/helpers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import re

from math import radians, sin, cos, sqrt, atan2

def matches_airway_format(s: str) -> bool:
return bool(re.match(r'^[A-Z]{1,2}\d+$', s))
Expand Down
3 changes: 3 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,10 @@ itsdangerous==2.2.0
Jinja2==3.1.6
lxml==5.3.2
MarkupSafe==3.0.2
numpy==2.3.2
pymongo==4.11.3
python-dotenv==1.1.1
requests==2.32.3
shapely==2.1.1
urllib3==2.3.0
Werkzeug==3.1.3