From 37c5b1f77a23af3be675a6cbdfbd07c5bec3f4fb Mon Sep 17 00:00:00 2001
From: XANTRONIX Industrial <xan@xantronix.com>
Date: Tue, 25 Feb 2025 21:37:45 -0500
Subject: [PATCH] Skip plotting invalid samples

---
 bin/xmet-sounding-graph | 51 +++++++++++++++++++++++++++++++++++++++++
 lib/xmet/skew_t.py      |  3 +++
 2 files changed, 54 insertions(+)
 create mode 100755 bin/xmet-sounding-graph

diff --git a/bin/xmet-sounding-graph b/bin/xmet-sounding-graph
new file mode 100755
index 0000000..609de25
--- /dev/null
+++ b/bin/xmet-sounding-graph
@@ -0,0 +1,51 @@
+#! /usr/bin/env python3
+
+import argparse
+import cairo
+import shapely
+
+from xmet.db       import Database
+from xmet.sounding import Sounding
+from xmet.skew_t   import SkewTGraph, SkewTLegend
+
+IMAGE_WIDTH  = 800
+IMAGE_HEIGHT = 800
+
+GRAPH_WIDTH  = 800 - 128
+GRAPH_HEIGHT = 800 - 128
+
+parser = argparse.ArgumentParser(
+    description = 'Graph most recent valid sounding for location'
+)
+
+parser.add_argument('db',        help='XMET SQLite3 database')
+parser.add_argument('lat',       help='Latitude')
+parser.add_argument('lon',       help='Longitude')
+parser.add_argument('timestamp', help='Timestamp in YYYY-MM-DD HH:MM:SS (UTC)')
+parser.add_argument('output',    help='Output SVG file')
+
+args = parser.parse_args()
+
+db = Database.connect(args.db)
+
+location = shapely.Point(float(args.lon), float(args.lat))
+sounding = Sounding.valid_by_location(db, location, args.timestamp)
+
+print(f"Graphing {sounding.station} sounding at {sounding.timestamp_observed}")
+
+skew_t = SkewTGraph(GRAPH_WIDTH, GRAPH_HEIGHT)
+
+with cairo.SVGSurface(args.output, IMAGE_WIDTH, IMAGE_HEIGHT) as surface:
+    cr = cairo.Context(surface)
+
+    cr.set_source_rgb(1, 1, 1)
+    cr.rectangle(0, 0, IMAGE_WIDTH, IMAGE_HEIGHT)
+    cr.fill()
+
+    skew_t.draw(cr, 64, 64, sounding.samples)
+
+    cr.set_source_rgb(0, 0, 0)
+    cr.rectangle(64, 64, GRAPH_WIDTH, GRAPH_HEIGHT)
+    cr.stroke()
+
+    SkewTLegend.draw_for_graph(cr, skew_t, 64, 64)
diff --git a/lib/xmet/skew_t.py b/lib/xmet/skew_t.py
index 556261b..29c54ab 100644
--- a/lib/xmet/skew_t.py
+++ b/lib/xmet/skew_t.py
@@ -112,6 +112,9 @@ class SkewTGraph():
         first = True
 
         for sample in samples:
+            if sample.pressure < 0 or sample.pressure is None:
+                continue
+
             if sample.pressure < PRESSURE_MIN:
                 break