Make NEXRAD radar range a magic number

This commit is contained in:
XANTRONIX Industrial 2025-02-11 16:06:21 -05:00
parent 0726782ee8
commit 408f462a98
3 changed files with 79 additions and 2 deletions

View file

@ -38,6 +38,8 @@ def parse(text: str):
return Coord(sign_lat * lat, sign_lon * lon)
RADAR_RANGE = 230000
class Radar():
__slots__ = 'wban', 'call', 'name', 'coord', 'site_elevation', 'tower_height',

74
lib/nexrad/s3.py Normal file
View file

@ -0,0 +1,74 @@
import re
import datetime
S3_BUCKET = 'noaa-nexrad-level2'
S3_KEY_RE = re.compile(r'^(\d{4})/(\d{2})/(\d{2})/([A-Z]{4})/([A-Z]{4})(\d{4})(\d{2})(\d{2})_(\d{2})(\d{2})(\d{2})[_\.]')
def key_matches(key: str,
start: datetime.datetime,
end: datetime.datetime):
match = S3_KEY_RE.match(key)
if match is None:
return False
date = datetime.datetime(
year = int(match[6]),
month = int(match[7]),
day = int(match[8]),
hour = int(match[9]),
minute = int(match[10]),
second = int(match[11]),
tzinfo = datetime.UTC
)
return date >= start and date <= end
class S3Bucket():
def __init__(self, s3, name: str=S3_BUCKET):
self.s3 = s3
self.name = name
self.cache = dict()
def each_key_by_prefix(self, prefix: str):
if prefix in self.cache:
for key in self.cache[prefix]:
yield key
else:
result = self.s3.list_objects_v2(
Bucket = self.name,
Prefix = prefix
)
cache = list()
self.cache[prefix] = cache
if result is None or 'Contents' not in result:
return
for item in result['Contents']:
key = item['Key']
cache.append(key)
yield key
def each_matching_key(self,
radars: list,
start: datetime.datetime,
end: datetime.datetime):
elapsed = end - start
for radar in radars:
for day in range(0, 1+elapsed.days):
date = start + datetime.timedelta(days=day)
prefix = '%04d/%02d/%02d/%s/' % (
date.year,
date.month,
date.day,
radar[1]
)
for key in self.each_key_by_prefix(prefix):
if key_matches(key, start, end):
yield key

View file

@ -3,6 +3,7 @@ import csv
import datetime
from nexrad.coord import Coord, COORD_SYSTEM
from nexrad.radar import RADAR_RANGE
def time_from_str(time: str):
size = len(time)
@ -124,10 +125,10 @@ class StormReport():
from
nexrad_radar
where
distance <= 230000
distance <= {range}
order by
distance asc
""".format(csr=COORD_SYSTEM)
""".format(csr=COORD_SYSTEM, range=RADAR_RANGE)
radars = list()