Compare commits
2 commits
8c4b93d50e
...
93da3d701f
Author | SHA1 | Date | |
---|---|---|---|
93da3d701f | |||
ed7c5bf317 |
2 changed files with 27 additions and 4 deletions
|
@ -5,8 +5,8 @@ import cairo
|
||||||
import shapely
|
import shapely
|
||||||
|
|
||||||
from xmet.db import Database
|
from xmet.db import Database
|
||||||
from xmet.sounding import Sounding
|
from xmet.sounding import Sounding, SoundingParams
|
||||||
from xmet.skew_t import SkewTGraph, SkewTLegend
|
from xmet.skew_t import SkewTOptions, SkewTGraph, SkewTLegend
|
||||||
from xmet.hodograph import Hodograph
|
from xmet.hodograph import Hodograph
|
||||||
|
|
||||||
IMAGE_WIDTH = 800
|
IMAGE_WIDTH = 800
|
||||||
|
@ -18,6 +18,19 @@ GRAPH_HEIGHT = 800 - 128
|
||||||
def plot_skew_t(sounding: Sounding, output: str):
|
def plot_skew_t(sounding: Sounding, output: str):
|
||||||
print(f"Plotting Skew-T chart of {sounding.station} sounding at {sounding.timestamp_observed} to {output}")
|
print(f"Plotting Skew-T chart of {sounding.station} sounding at {sounding.timestamp_observed} to {output}")
|
||||||
|
|
||||||
|
opts = SkewTOptions()
|
||||||
|
opts.skew = 1.0
|
||||||
|
opts.draw_virtual_temp = True
|
||||||
|
opts.draw_lcl = True
|
||||||
|
opts.draw_lfc = True
|
||||||
|
opts.draw_el = True
|
||||||
|
opts.draw_moist_adiabats = True
|
||||||
|
opts.draw_cape_mixing_ratio = True
|
||||||
|
opts.draw_cape_dry_adiabat = True
|
||||||
|
opts.draw_cape_moist_adiabat = True
|
||||||
|
|
||||||
|
#params = SoundingParams.from_sounding(sounding)
|
||||||
|
|
||||||
with cairo.SVGSurface(output, IMAGE_WIDTH, IMAGE_HEIGHT) as surface:
|
with cairo.SVGSurface(output, IMAGE_WIDTH, IMAGE_HEIGHT) as surface:
|
||||||
cr = cairo.Context(surface)
|
cr = cairo.Context(surface)
|
||||||
|
|
||||||
|
@ -25,7 +38,7 @@ def plot_skew_t(sounding: Sounding, output: str):
|
||||||
cr.rectangle(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT)
|
cr.rectangle(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT)
|
||||||
cr.fill()
|
cr.fill()
|
||||||
|
|
||||||
skew_t = SkewTGraph(GRAPH_WIDTH, GRAPH_HEIGHT)
|
skew_t = SkewTGraph(GRAPH_WIDTH, GRAPH_HEIGHT, opts)
|
||||||
skew_t.draw(cr, 64, 64, sounding)
|
skew_t.draw(cr, 64, 64, sounding)
|
||||||
|
|
||||||
cr.set_source_rgb(0, 0, 0)
|
cr.set_source_rgb(0, 0, 0)
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
import argparse
|
import argparse
|
||||||
import cairo
|
import cairo
|
||||||
|
|
||||||
|
from xmet.db import Database
|
||||||
from xmet.spc import SPCOutlookParser, SPCOutlook, SPCOutlookMap
|
from xmet.spc import SPCOutlookParser, SPCOutlook, SPCOutlookMap
|
||||||
|
|
||||||
ASSETS = {
|
ASSETS = {
|
||||||
|
@ -20,6 +21,8 @@ ASSETS = {
|
||||||
def render_categorical(conus: SPCOutlookMap,
|
def render_categorical(conus: SPCOutlookMap,
|
||||||
outlook: SPCOutlook,
|
outlook: SPCOutlook,
|
||||||
args):
|
args):
|
||||||
|
db = Database.connect(args.db)
|
||||||
|
|
||||||
assets = ASSETS['dark'] if args.dark else ASSETS['light']
|
assets = ASSETS['dark'] if args.dark else ASSETS['light']
|
||||||
|
|
||||||
with cairo.SVGSurface(args.categorical, conus.width, conus.height) as surface:
|
with cairo.SVGSurface(args.categorical, conus.width, conus.height) as surface:
|
||||||
|
@ -27,6 +30,7 @@ def render_categorical(conus: SPCOutlookMap,
|
||||||
|
|
||||||
conus.draw_base_map_from_file(cr, assets['map'])
|
conus.draw_base_map_from_file(cr, assets['map'])
|
||||||
conus.draw_categories(cr, outlook)
|
conus.draw_categories(cr, outlook)
|
||||||
|
conus.draw_cities(cr, db)
|
||||||
conus.draw_logo(cr, assets['logo'])
|
conus.draw_logo(cr, assets['logo'])
|
||||||
|
|
||||||
if args.dark:
|
if args.dark:
|
||||||
|
@ -39,6 +43,8 @@ def render_probabilistic(conus: SPCOutlookMap,
|
||||||
hazard: str,
|
hazard: str,
|
||||||
path: str,
|
path: str,
|
||||||
args):
|
args):
|
||||||
|
db = Database.connect(args.db)
|
||||||
|
|
||||||
assets = ASSETS['dark'] if args.dark else ASSETS['light']
|
assets = ASSETS['dark'] if args.dark else ASSETS['light']
|
||||||
|
|
||||||
with cairo.SVGSurface(path, conus.width, conus.height) as surface:
|
with cairo.SVGSurface(path, conus.width, conus.height) as surface:
|
||||||
|
@ -46,14 +52,18 @@ def render_probabilistic(conus: SPCOutlookMap,
|
||||||
|
|
||||||
conus.draw_base_map_from_file(cr, assets['map'])
|
conus.draw_base_map_from_file(cr, assets['map'])
|
||||||
conus.draw_probabilities(cr, outlook, hazard.upper())
|
conus.draw_probabilities(cr, outlook, hazard.upper())
|
||||||
|
conus.draw_cities(cr, db)
|
||||||
conus.draw_logo(cr, assets['logo'])
|
conus.draw_logo(cr, assets['logo'])
|
||||||
|
|
||||||
if args.dark:
|
if args.dark:
|
||||||
cr.set_source_rgb(1, 1, 1)
|
cr.set_source_rgb(1, 1, 1)
|
||||||
|
|
||||||
conus.draw_annotation(cr, f"Day {outlook.day} Probabilistic {hazard.lower().capitalize()} Risk")
|
hazard = ' '.join(map(lambda p: p.lower().capitalize(), hazard.split(' ')))
|
||||||
|
|
||||||
|
conus.draw_annotation(cr, f"Day {outlook.day} Probabilistic {hazard} Risk")
|
||||||
|
|
||||||
argparser = argparse.ArgumentParser(description='Render graphical SPC outlooks from text file')
|
argparser = argparse.ArgumentParser(description='Render graphical SPC outlooks from text file')
|
||||||
|
argparser.add_argument('db', help='Spatialite database file')
|
||||||
argparser.add_argument('--dark', action='store_true', help='Output dark mode graphics')
|
argparser.add_argument('--dark', action='store_true', help='Output dark mode graphics')
|
||||||
argparser.add_argument('--categorical', type=str, help='Output categorical risk graphic file')
|
argparser.add_argument('--categorical', type=str, help='Output categorical risk graphic file')
|
||||||
argparser.add_argument('--any-severe', type=str, help='Output probabilistic severe risk graphic file')
|
argparser.add_argument('--any-severe', type=str, help='Output probabilistic severe risk graphic file')
|
||||||
|
|
Loading…
Add table
Reference in a new issue