💾 Archived View for bacaliu.de › 20220727-regenradar.html captured on 2023-07-10 at 13:51:49.
-=-=-=-=-=-=-
<!DOCTYPE html> <html lang="de"> <head> <!-- 2023-06-26 Mo 07:33 --> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>Regenradar</title> <meta name="description" content="Die Implementierung des Radar-Plots" /> <meta name="keywords" content="Wetter, DWD, Python, Bokeh, Regenradar" /> <meta name="generator" content="Org Mode" /> <meta property="og:type" content="article"> <meta property="og:site_name" content="Bacaliu.de"> <link rel="stylesheet" type="text/css" href="/css/modus.css"> <link rel="shortcut icon" href="/favicon.ico" sizes="65x65"> <script src=/static/js/htmx.min.js></script> <link rel="stylesheet" type="text/css" href="/css/colors/auto.css" id="ef-theme" hx-swap="outerHTML" hx-get="/data/colorscheme" hx-trigger="load"> </head> <body> <header id="preamble" class="status"> <a id='top'></a> <pre style='text-align: left; font-size: min(2vw, 1rem); display: inline-block;'> ___ _ _ _ | _ ) __ _ __ __ _| (_)_ _ __| |___ | _ \/ _` / _/ _` | | | || |_/ _` / -_) |___/\__,_\__\__,_|_|_|\_,_(_)__,_\___| </pre><br> <a href='#top'>↑</a> - <a href='/index.html'>Home</a> - <a href='/search.html'>Search</a> - <a href='#bottom'>↓</a> <br> <div hx-get="/data/colorlist" hx-trigger="load"></div> <hr> </header> <main id="content" class="content"> <header> <h1 class="title">Regenradar</h1> <p class="subtitle" role="doc-subtitle">DWD-Daten zu Diagramm mit Python-Bokeh</p> </header><nav id="table-of-contents" role="doc-toc"> <h2>Inhaltsverzeichnis</h2> <div id="text-table-of-contents" role="doc-toc"> <ul> <li><a href="#der-plan">1. Der Plan</a></li> <li><a href="#das-vorgehen">2. Das Vorgehen</a> <ul> <li><a href="#laden-der-daten">2.1. Laden der Daten</a></li> <li><a href="#speichern-als-pickle">2.2. Speichern als .pickle</a></li> <li><a href="#laden-der-arrays">2.3. Laden der Arrays und Timestamps</a></li> <li><a href="#stereographische-umwandlung">2.4. Stereographische Umwandlung</a></li> <li><a href="#fehlerpruefung-richtige-koordinaten">2.5. FehlerprĂĽfung: richtige Koordinaten?</a></li> <li><a href="#endlich-das-plotten">2.6. Endlich: das Plotten</a></li> </ul> </li> <li><a href="#bibliography">3. Bibliography</a></li> <li><a href="#nav">Nav</a></li> </ul> </div> </nav> <div id="outline-container-der-plan" class="outline-2"> <h2 id="der-plan"><span class="section-number-2">1.</span> <a href="#der-plan">Der Plan</a></h2> <div class="outline-text-2" id="text-1"> <p> Der <a href="https://www.dwd.de">DWD</a> stellt auf <a href="https://opendata.dwd.de">https://opendata.dwd.de</a> auch einige Radar-Daten zum Download bereit. Diese möchte ich nutzen, um eine kurzfristige Niederschlagsprognose zu erstelen. Insbesondere fĂĽr das Planen von Radtouren oder Wanderungen ist es von Vorteil 5-minĂĽtige Daten zu haben, statt nur 1-StĂĽndige des MOSMIX, die zudem nur alle 6 Stunden aktualisiert werden.<br> </p> <p> Bei der Recherche stoĂźe ich auf Bokeh (<a href="#citeproc_bib_item_2">Van de Ven</a>). Vorteile gegenĂĽber Matplotlib sehe ich mehrere:<br> </p> <ul class="org-ul"> <li>Geschwindigkeit: Um einige Matplotlib-Figuren abzuspeichern werden mehrere Sekunden benötigt, Bokeh schafft das Erstellen in einem Bruchteil der Zeit, weil erst am Endgerät gerendert wird<br> <ul class="org-ul"> <li>daher habe ich auch <code>mosmix.py</code> auf Bokeh umgestellt<br></li> </ul></li> <li>Interaktivität: Der User kann zoomen, verschieben etc. und die Achsbeschriftungen „wandern mit“, im gegensatz dazu ein langes <code>.png</code> in einem x-scrollable-DIV zu stecken.<br></li> </ul> </div> </div> <div id="outline-container-das-vorgehen" class="outline-2"> <h2 id="das-vorgehen"><span class="section-number-2">2.</span> <a href="#das-vorgehen">Das Vorgehen</a></h2> <div class="outline-text-2" id="text-2"> <p> Zwecks dessen schreibe ich ein Skript, welches dieses darstellt. FolgendermaĂźen stelle ich <b>schematisch</b> dar, wie das funktioniert.<br> </p> </div> <div id="outline-container-laden-der-daten" class="outline-3"> <h3 id="laden-der-daten"><span class="section-number-3">2.1.</span> <a href="#laden-der-daten">Laden der Daten</a></h3> <div class="outline-text-3" id="text-2-1"> <div class="org-src-container"> <label class="org-src-name"><span class="listing-number">Programmlisting 1: </span>Herunterladen</label><pre class="src src-python"><span class="org-tree-sitter-hl-faceXkeyword">def</span> <span class="org-tree-sitter-hl-faceXfunction">reload_data</span>(): <span class="org-tree-sitter-hl-faceXvariable">link</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"https://opendata.dwd.de/weather/radar/composit/rv/DE1200_RV_LATEST.tar.bz2"</span> os.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">system</span></span>(<span class="org-tree-sitter-hl-faceXstring">f"rm </span>{PATH}<span class="org-tree-sitter-hl-faceXstring">/DE1200*"</span>) os.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">system</span></span>(<span class="org-tree-sitter-hl-faceXstring">f"wget </span>{link}<span class="org-tree-sitter-hl-faceXstring"> -O </span>{os.path.join(PATH, 'data.bz2')}<span class="org-tree-sitter-hl-faceXstring">"</span>) os.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">system</span></span>(<span class="org-tree-sitter-hl-faceXstring">f"tar -xf </span>{os.path.join(PATH, 'data.bz2')}<span class="org-tree-sitter-hl-faceXstring"> -C </span>{PATH}<span class="org-tree-sitter-hl-faceXstring">"</span>) </pre> </div> <p> Die Daten liegen hinter dem angegebenen link. Man lösche zunächst vorhandene Daten, die alle mit "DE1200" beginnen, nicht aber die später im gleichen Ordner erzeugten <kbd>.pkl</kbd>-Dateien, damit auch <i>während</i> des neuladens Diagramme erstellt werden können. Dann lade man den link herunter und extrahiere die <kbd>.tar.gz</kbd>. Es entstehen fĂĽr jede 5 Minuten eine Datei, die einfach <code>DE1200{TIMESTAMP}</code> heiĂźt.<br> </p> </div> </div> <div id="outline-container-speichern-als-pickle" class="outline-3"> <h3 id="speichern-als-pickle"><span class="section-number-3">2.2.</span> <a href="#speichern-als-pickle">Speichern als .pickle</a></h3> <div class="outline-text-3" id="text-2-2"> <div class="org-src-container"> <label class="org-src-name"><span class="listing-number">Programmlisting 2: </span>Umwandeln und Abspeichern</label><pre class="src src-python"><span class="org-tree-sitter-hl-faceXkeyword">def</span> <span class="org-tree-sitter-hl-faceXfunction">bin_to_array</span>(<span class="org-tree-sitter-hl-faceXvariableXparameter">f</span>, <span class="org-tree-sitter-hl-faceXvariableXparameter">shape</span>): <span class="org-tree-sitter-hl-faceXvariable">start</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">len</span></span>(f) <span class="org-tree-sitter-hl-faceXoperator">-</span> (shape[<span class="org-tree-sitter-hl-faceXnumber">0</span>]<span class="org-tree-sitter-hl-faceXoperator">*</span>shape[<span class="org-tree-sitter-hl-faceXnumber">1</span>])<span class="org-tree-sitter-hl-faceXoperator">*</span><span class="org-tree-sitter-hl-faceXnumber">2</span> <span class="org-tree-sitter-hl-faceXvariable">array</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">zeros</span></span>((shape[<span class="org-tree-sitter-hl-faceXnumber">0</span>], shape[<span class="org-tree-sitter-hl-faceXnumber">1</span>])) <span class="org-tree-sitter-hl-faceXvariable">index</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> start <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">i</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">reversed</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">range</span></span>(shape[<span class="org-tree-sitter-hl-faceXnumber">0</span>])): <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">j</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">range</span></span>(shape[<span class="org-tree-sitter-hl-faceXnumber">1</span>]): <span class="org-tree-sitter-hl-faceXvariable">num</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> (f[index<span class="org-tree-sitter-hl-faceXoperator">+</span><span class="org-tree-sitter-hl-faceXnumber">1</span>] <span class="org-tree-sitter-hl-faceXoperator">%</span> <span class="org-tree-sitter-hl-faceXnumber">16</span>)<span class="org-tree-sitter-hl-faceXoperator">*</span><span class="org-tree-sitter-hl-faceXnumber">256</span><span class="org-tree-sitter-hl-faceXoperator">+</span>f[index] <span class="org-tree-sitter-hl-faceXvariable">des</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> f[index]<span class="org-tree-sitter-hl-faceXoperator">//</span><span class="org-tree-sitter-hl-faceXnumber">16</span> <span class="org-tree-sitter-hl-faceXkeyword">if</span> des <span class="org-tree-sitter-hl-faceXoperator">>=</span> <span class="org-tree-sitter-hl-faceXnumber">8</span>: <span class="org-variable-name">array</span>[<span class="org-tree-sitter-hl-faceXvariable">i</span>, <span class="org-tree-sitter-hl-faceXvariable">j</span>] <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXconstantXbuiltin">None</span> <span class="org-tree-sitter-hl-faceXkeyword">else</span>: <span class="org-tree-sitter-hl-faceXvariable">num</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> num<span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">100</span><span class="org-tree-sitter-hl-faceXoperator">*</span><span class="org-tree-sitter-hl-faceXnumber">12</span> <span class="org-tree-sitter-hl-faceXkeyword">if</span> des <span class="org-tree-sitter-hl-faceXoperator">>=</span> <span class="org-tree-sitter-hl-faceXnumber">4</span> <span class="org-tree-sitter-hl-faceXoperator">and</span> <span class="org-variable-name">num</span>: <span class="org-tree-sitter-hl-faceXvariable">num</span> <span class="org-tree-sitter-hl-faceXoperator">*=</span> <span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXnumber">1</span> <span class="org-variable-name">array</span>[<span class="org-tree-sitter-hl-faceXvariable">i</span>, <span class="org-tree-sitter-hl-faceXvariable">j</span>] <span class="org-tree-sitter-hl-faceXoperator">=</span> num <span class="org-tree-sitter-hl-faceXvariable">index</span> <span class="org-tree-sitter-hl-faceXoperator">+=</span> <span class="org-tree-sitter-hl-faceXnumber">2</span> <span class="org-tree-sitter-hl-faceXkeyword">return</span> array <span class="org-tree-sitter-hl-faceXkeyword">def</span> <span class="org-tree-sitter-hl-faceXfunction">load_arrays</span>(): <span class="org-tree-sitter-hl-faceXvariable">files</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> os.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">listdir</span></span>(<span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">PATH</span></span>) <span class="org-tree-sitter-hl-faceXvariable">files</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">filter</span></span>(<span class="org-tree-sitter-hl-faceXkeyword">lambda</span> <span class="org-tree-sitter-hl-faceXvariableXparameter">f</span>: <span class="org-tree-sitter-hl-faceXstring">'DE1200'</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> f, files) <span class="org-tree-sitter-hl-faceXvariable">files</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">list</span></span>(files) files.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">sort</span></span>() <span class="org-tree-sitter-hl-faceXvariable">arrays</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> [] <span class="org-tree-sitter-hl-faceXvariable">timestamps</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> [] <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">n</span>, <span class="org-tree-sitter-hl-faceXvariable">file</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">enumerate</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall">tqdm</span>(files, <span class="org-tree-sitter-hl-faceXlabel">desc</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXstring">"lese Binärdaten"</span>)): <span class="org-tree-sitter-hl-faceXvariable">num</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(<span class="org-builtin">file</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">split</span></span>(<span class="org-tree-sitter-hl-faceXstring">"_"</span>)[<span class="org-tree-sitter-hl-faceXnumber">2</span>]) <span class="org-tree-sitter-hl-faceXvariable">tstr</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> re.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">findall</span></span>(<span class="org-tree-sitter-hl-faceXstring">"[0-9]{10}"</span>, <span class="org-builtin">file</span>)[<span class="org-tree-sitter-hl-faceXnumber">0</span>] <span class="org-tree-sitter-hl-faceXvariable">dt</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> datetime.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">strptime</span></span>(<span class="org-tree-sitter-hl-faceXstring">"20"</span><span class="org-tree-sitter-hl-faceXoperator">+</span>tstr, <span class="org-tree-sitter-hl-faceXstring">"%Y%m%d%H%M"</span>) <span class="org-tree-sitter-hl-faceXvariable">dt</span> <span class="org-tree-sitter-hl-faceXoperator">+=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">timedelta</span>(<span class="org-tree-sitter-hl-faceXlabel">minutes</span><span class="org-tree-sitter-hl-faceXoperator">=</span>num) timestamps.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">append</span></span>(dt) <span class="org-tree-sitter-hl-faceXkeyword">with</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">open</span></span>(os.<span class="org-tree-sitter-hl-faceXproperty">path</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">join</span></span>(<span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">PATH</span></span>, <span class="org-builtin">file</span>), <span class="org-tree-sitter-hl-faceXstring">"rb"</span>) <span class="org-tree-sitter-hl-faceXkeyword">as</span> f: <span class="org-tree-sitter-hl-faceXvariable">f</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> f.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">read</span></span>() <span class="org-tree-sitter-hl-faceXvariable">array</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">bin_to_array</span>(f, (<span class="org-tree-sitter-hl-faceXnumber">1200</span>, <span class="org-tree-sitter-hl-faceXnumber">1100</span>)) arrays.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">append</span></span>(array) <span class="org-tree-sitter-hl-faceXvariable">arrays</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">array</span></span>(arrays) <span class="org-tree-sitter-hl-faceXkeyword">with</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">open</span></span>(os.<span class="org-tree-sitter-hl-faceXproperty">path</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">join</span></span>(<span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">PATH</span></span>, <span class="org-tree-sitter-hl-faceXstring">"timestamps.pkl"</span>), <span class="org-tree-sitter-hl-faceXstring">"wb"</span>) <span class="org-tree-sitter-hl-faceXkeyword">as</span> f: pickle.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">dump</span></span>(timestamps, f) <span class="org-tree-sitter-hl-faceXkeyword">with</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">open</span></span>(os.<span class="org-tree-sitter-hl-faceXproperty">path</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">join</span></span>(<span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">PATH</span></span>, <span class="org-tree-sitter-hl-faceXstring">"arrays.pkl"</span>), <span class="org-tree-sitter-hl-faceXstring">"wb"</span>) <span class="org-tree-sitter-hl-faceXkeyword">as</span> f: pickle.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">dump</span></span>(arrays, f) </pre> </div> <p> <code>bin_to_array</code> stellt hier eine Hifsfunktion dar um die Radardaten aufzubereiten. Diese liest die Binärdaten ein und fĂĽhrt einfache Kalkulationen durch um z.B. das Vorzeichen umzukehren wenn ein bestimmtes Bit gesetzt ist. Näheres dazu findet man im <a href="https://www.dwd.de/DE/leistungen/radolan/radolan_info/radolan_radvor_op_komposit_format_pdf.pdf?__blob=publicationFile&v=5">PDF zu den Radarprodukten des DWD</a>.<br> </p> <p> Diese Funktion wird von <code>load_arrays</code> fĂĽr jede der Dateien aufgerufen wird um ein Array zu erhalten. Es werden dann jeweils Array und Zeitstempel (aus dem Dateinamen) in Listen geschrieben und letztlich in <code>timestamp.pkl</code> und <code>arrays.pkl</code> gepickelt.<br> </p> </div> </div> <div id="outline-container-laden-der-arrays" class="outline-3"> <h3 id="laden-der-arrays"><span class="section-number-3">2.3.</span> <a href="#laden-der-arrays">Laden der Arrays und Timestamps</a></h3> <div class="outline-text-3" id="text-2-3"> <p> Wie es sich fĂĽr ein gutes Programm gehört, werden getter und setter genutzt.<br> </p> <div class="org-src-container"> <label class="org-src-name"><span class="listing-number">Programmlisting 3: </span>get_arrays</label><pre class="src src-python"><span class="org-tree-sitter-hl-faceXkeyword">def</span> <span class="org-tree-sitter-hl-faceXfunction">get_arrays</span>(): <span class="org-tree-sitter-hl-faceXkeyword">with</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">open</span></span>(os.<span class="org-tree-sitter-hl-faceXproperty">path</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">join</span></span>(<span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">PATH</span></span>, <span class="org-tree-sitter-hl-faceXstring">"arrays.pkl"</span>), <span class="org-tree-sitter-hl-faceXstring">"rb"</span>) <span class="org-tree-sitter-hl-faceXkeyword">as</span> f: <span class="org-tree-sitter-hl-faceXkeyword">return</span> pickle.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">load</span></span>(f) </pre> </div> <div class="org-src-container"> <label class="org-src-name"><span class="listing-number">Programmlisting 4: </span>get_timestamps</label><pre class="src src-python"><span class="org-tree-sitter-hl-faceXkeyword">def</span> <span class="org-tree-sitter-hl-faceXfunction">get_timestamps</span>(): <span class="org-tree-sitter-hl-faceXkeyword">with</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">open</span></span>(os.<span class="org-tree-sitter-hl-faceXproperty">path</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">join</span></span>(<span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">PATH</span></span>, <span class="org-tree-sitter-hl-faceXstring">"timestamps.pkl"</span>), <span class="org-tree-sitter-hl-faceXstring">"rb"</span>) <span class="org-tree-sitter-hl-faceXkeyword">as</span> <span class="org-variable-name">f</span>: <span class="org-tree-sitter-hl-faceXvariable">timestamps</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> pickle.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">load</span></span>(f) <span class="org-tree-sitter-hl-faceXvariable">timestamps</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> [<span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">UTC</span></span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">localize</span></span>(t).<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">astimezone</span></span>(<span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">CET</span></span>).<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">replace</span></span>(<span class="org-tree-sitter-hl-faceXlabel">tzinfo</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXconstantXbuiltin">None</span>) <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">t</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> timestamps] <span class="org-tree-sitter-hl-faceXkeyword">return</span> timestamps </pre> </div> <p> In <code>get_timestamps</code> wandle ich zwar die Zeiten in CET um, aber ersetze die <code>tzinfo</code> des <code>datetime</code>-Objekts jeweils durch <code class="src src-python"><span class="org-tree-sitter-hl-faceXconstantXbuiltin">None</span></code>. Grund dafĂĽr ist, dass <code>Bokeh</code> nicht besonders gut mit Zeitzonen umgeht, und ich mir den Stress erspare. Das Radar ist nur fĂĽr Abdeckung in Deutschland, also reicht es auch nur dessen Zeitzone zu verwenden.<br> </p> </div> </div> <div id="outline-container-stereographische-umwandlung" class="outline-3"> <h3 id="stereographische-umwandlung"><span class="section-number-3">2.4.</span> <a href="#stereographische-umwandlung">Stereographische Umwandlung</a></h3> <div class="outline-text-3" id="text-2-4"> <p> Der Benutzer wird seine Koordinaten in lat/lon angeben oder durch eingabe eines Suchtermes ĂĽber (<a href="#citeproc_bib_item_1">“Nominatim” 2022</a>) welche generieren. Diese mĂĽssen nun aber umgewandelt werden in die Pixel, die das Rader bietet. Auch hier half o.g. PDF-Dokument des DWD, um eine Funktion zu definieren.<br> </p> <div class="org-src-container"> <label class="org-src-name"><span class="listing-number">Programmlisting 5: </span>latlon2xy</label><pre class="src src-python"><span class="org-tree-sitter-hl-faceXkeyword">def</span> <span class="org-tree-sitter-hl-faceXfunction">latlon2xy</span>(<span class="org-tree-sitter-hl-faceXvariableXparameter">lat</span>, <span class="org-tree-sitter-hl-faceXvariableXparameter">lon</span>): <span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant"><span class="org-tree-sitter-hl-faceXvariable">R</span></span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXnumber">6370.04</span> <span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant"><span class="org-tree-sitter-hl-faceXvariable">M</span></span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXkeyword">lambda</span> <span class="org-tree-sitter-hl-faceXvariableXparameter">p</span>: (<span class="org-tree-sitter-hl-faceXnumber">1</span><span class="org-tree-sitter-hl-faceXoperator">+</span>np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">sin</span></span>(<span class="org-tree-sitter-hl-faceXnumber">60</span><span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">180</span><span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty">pi</span>))<span class="org-tree-sitter-hl-faceXoperator">/</span>(<span class="org-tree-sitter-hl-faceXnumber">1</span><span class="org-tree-sitter-hl-faceXoperator">+</span>np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">sin</span></span>(p<span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">180</span><span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty">pi</span>)) <span class="org-tree-sitter-hl-faceXvariable">p</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> lat <span class="org-tree-sitter-hl-faceXvariable">l</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> lon <span class="org-tree-sitter-hl-faceXvariable">x</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">R</span></span><span class="org-tree-sitter-hl-faceXoperator">*</span><span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">M</span></span></span>(p)<span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">cos</span></span>(p<span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">180</span><span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty">pi</span>)<span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">sin</span></span>((l<span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXnumber">10</span>)<span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">180</span><span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty">pi</span>) <span class="org-tree-sitter-hl-faceXvariable">y</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">R</span></span><span class="org-tree-sitter-hl-faceXoperator">*</span><span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">M</span></span></span>(p)<span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">cos</span></span>(p<span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">180</span><span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty">pi</span>)<span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">cos</span></span>((l<span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXnumber">10</span>)<span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">180</span><span class="org-tree-sitter-hl-faceXoperator">*</span>np.<span class="org-tree-sitter-hl-faceXproperty">pi</span>) <span class="org-tree-sitter-hl-faceXkeyword">return</span> x <span class="org-tree-sitter-hl-faceXoperator">-</span> (<span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXnumber">543.4628665604781</span>), <span class="org-tree-sitter-hl-faceXnumber">1200</span> <span class="org-tree-sitter-hl-faceXoperator">-</span> y <span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXnumber">4808.644645330335</span> </pre> </div> </div> </div> <div id="outline-container-fehlerpruefung-richtige-koordinaten" class="outline-3"> <h3 id="fehlerpruefung-richtige-koordinaten"><span class="section-number-3">2.5.</span> <a href="#fehlerpruefung-richtige-koordinaten">FehlerprĂĽfung: richtige Koordinaten?</a></h3> <div class="outline-text-3" id="text-2-5"> <p> Um Fehler aufgrund unerlaubter Koordinaten zu vermeiden rufe ich bei jeder Nutzereingabe <code>is_valid_koordinate</code> auf.<br> </p> <div class="org-src-container"> <label class="org-src-name"><span class="listing-number">Programmlisting 6: </span>valide Koordinaten?</label><pre class="src src-python"><span class="org-tree-sitter-hl-faceXkeyword">def</span> <span class="org-tree-sitter-hl-faceXfunction">is_valid_koordinate</span>(<span class="org-tree-sitter-hl-faceXvariableXparameter">lat</span>, <span class="org-tree-sitter-hl-faceXvariableXparameter">lon</span>): <span class="org-tree-sitter-hl-faceXvariable">x</span>, <span class="org-tree-sitter-hl-faceXvariable">y</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">latlon2xy</span>(lat, lon) <span class="org-tree-sitter-hl-faceXvariable">arrays</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">get_arrays</span>() <span class="org-tree-sitter-hl-faceXvariable">x_max</span>, <span class="org-tree-sitter-hl-faceXvariable">y_max</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> arrays[<span class="org-tree-sitter-hl-faceXnumber">0</span>].<span class="org-tree-sitter-hl-faceXproperty">shape</span> <span class="org-tree-sitter-hl-faceXkeyword">return</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">all</span></span>([x<span class="org-tree-sitter-hl-faceXoperator">>=</span><span class="org-tree-sitter-hl-faceXnumber">0</span>, x<span class="org-tree-sitter-hl-faceXoperator"><</span>x_max, y<span class="org-tree-sitter-hl-faceXoperator">>=</span><span class="org-tree-sitter-hl-faceXnumber">0</span>, y<span class="org-tree-sitter-hl-faceXoperator"><</span>y_max]) </pre> </div> <p> Die Arrays werden geladen und deren Shape gibt Auskunft darĂĽber ob die gewählten Koordinaten im Bereich liegen.<br> </p> </div> </div> <div id="outline-container-endlich-das-plotten" class="outline-3"> <h3 id="endlich-das-plotten"><span class="section-number-3">2.6.</span> <a href="#endlich-das-plotten">Endlich: das Plotten</a></h3> <div class="outline-text-3" id="text-2-6"> <div class="org-src-container"> <label class="org-src-name"><span class="listing-number">Programmlisting 7: </span>plotten</label><pre class="src src-python"><span class="org-tree-sitter-hl-faceXkeyword">def</span> <span class="org-tree-sitter-hl-faceXfunction">bok_rain</span>(<span class="org-tree-sitter-hl-faceXvariableXparameter">lat</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXnumber">51.85</span>, <span class="org-tree-sitter-hl-faceXvariableXparameter">lon</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXnumber">7.49</span>): <span class="org-tree-sitter-hl-faceXvariable">arrays</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">get_arrays</span>() <span class="org-tree-sitter-hl-faceXvariable">timestamps</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">get_timestamps</span>() <span class="org-tree-sitter-hl-faceXvariable">x</span>, <span class="org-tree-sitter-hl-faceXvariable">y</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">latlon2xy</span>(lat, lon) <span class="org-tree-sitter-hl-faceXvariable">radius</span><span class="org-tree-sitter-hl-faceXoperator">=</span>[<span class="org-tree-sitter-hl-faceXnumber">1</span>, <span class="org-tree-sitter-hl-faceXnumber">2</span>, <span class="org-tree-sitter-hl-faceXnumber">4</span>] <span class="org-tree-sitter-hl-faceXvariable">max_intense</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> [ a[ <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(y<span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(radius)), <span class="org-tree-sitter-hl-faceXnumber">0</span>):<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">min</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(y<span class="org-tree-sitter-hl-faceXoperator">+</span><span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(radius)), <span class="org-tree-sitter-hl-faceXnumber">1200</span>), <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(x<span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(radius)), <span class="org-tree-sitter-hl-faceXnumber">0</span>):<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">min</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(x<span class="org-tree-sitter-hl-faceXoperator">+</span><span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(radius)), <span class="org-tree-sitter-hl-faceXnumber">1100</span>) ].<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">max</span></span>() <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">a</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> arrays ] <span class="org-tree-sitter-hl-faceXvariable">plot</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">figure</span>( <span class="org-tree-sitter-hl-faceXlabel">title</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXstring">f"Niederschlagsradar für </span>{lat}<span class="org-tree-sitter-hl-faceXstring">ºN/</span>{lon}<span class="org-tree-sitter-hl-faceXstring">ºE"</span>, <span class="org-tree-sitter-hl-faceXlabel">x_range</span><span class="org-tree-sitter-hl-faceXoperator">=</span>( timestamps[<span class="org-tree-sitter-hl-faceXnumber">0</span>], timestamps[<span class="org-tree-sitter-hl-faceXoperator">-</span><span class="org-tree-sitter-hl-faceXnumber">1</span>] ), <span class="org-tree-sitter-hl-faceXlabel">x_axis_type</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXstring">"datetime"</span>, <span class="org-tree-sitter-hl-faceXlabel">tools</span><span class="org-tree-sitter-hl-faceXoperator">=</span>[<span class="org-tree-sitter-hl-faceXstring">"save"</span>, <span class="org-tree-sitter-hl-faceXstring">"xpan"</span>, <span class="org-tree-sitter-hl-faceXstring">"xwheel_zoom"</span>, <span class="org-tree-sitter-hl-faceXstring">"reset"</span>, <span class="org-tree-sitter-hl-faceXstring">"xzoom_in"</span>, <span class="org-tree-sitter-hl-faceXstring">"xzoom_out"</span>], <span class="org-tree-sitter-hl-faceXlabel">active_scroll</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXstring">"xwheel_zoom"</span>, <span class="org-tree-sitter-hl-faceXlabel">y_range</span><span class="org-tree-sitter-hl-faceXoperator">=</span>[<span class="org-tree-sitter-hl-faceXnumber">0</span>, <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(max_intense)<span class="org-tree-sitter-hl-faceXoperator">*</span><span class="org-tree-sitter-hl-faceXnumber">1.01</span>, <span class="org-tree-sitter-hl-faceXnumber">1</span>)], ) <span class="org-tree-sitter-hl-faceXkeyword">try</span>: <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">radius</span>, <span class="org-tree-sitter-hl-faceXvariable">alpha</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">zip</span></span>( [<span class="org-tree-sitter-hl-faceXnumber">1</span>, <span class="org-tree-sitter-hl-faceXnumber">2</span>, <span class="org-tree-sitter-hl-faceXnumber">4</span>], [<span class="org-tree-sitter-hl-faceXnumber">1</span>, <span class="org-tree-sitter-hl-faceXnumber">0.7</span>, <span class="org-tree-sitter-hl-faceXnumber">0.4</span>] ): <span class="org-tree-sitter-hl-faceXvariable">intense</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> [ a[ <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(y<span class="org-tree-sitter-hl-faceXoperator">-</span>radius), <span class="org-tree-sitter-hl-faceXnumber">0</span>):<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">min</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(y<span class="org-tree-sitter-hl-faceXoperator">+</span>radius), <span class="org-tree-sitter-hl-faceXnumber">1200</span>), <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">max</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(x<span class="org-tree-sitter-hl-faceXoperator">-</span>radius), <span class="org-tree-sitter-hl-faceXnumber">0</span>):<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">min</span></span>(<span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">int</span></span>(x<span class="org-tree-sitter-hl-faceXoperator">+</span>radius), <span class="org-tree-sitter-hl-faceXnumber">1100</span>) ].<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">max</span></span>() <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">a</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> arrays ] plot.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">line</span></span>( np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">array</span></span>(timestamps), intense, <span class="org-tree-sitter-hl-faceXlabel">legend_label</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXstring">f"Radius von </span>{radius}<span class="org-tree-sitter-hl-faceXstring">km"</span>, <span class="org-tree-sitter-hl-faceXlabel">line_color</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXstring">"#458588"</span>, <span class="org-tree-sitter-hl-faceXlabel">line_alpha</span><span class="org-tree-sitter-hl-faceXoperator">=</span>alpha ) plot.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">line</span></span>( np.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXmethodXcall">array</span></span>(timestamps), [ <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">sum</span></span>(intense[:i])<span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">12</span> <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">i</span>, <span class="org-tree-sitter-hl-faceXconstant"><span class="org-tree-sitter-hl-faceXvariable">_</span></span> <span class="org-tree-sitter-hl-faceXoperator">in</span> <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">enumerate</span></span>(intense) ], <span class="org-tree-sitter-hl-faceXlabel">line_dash</span><span class="org-tree-sitter-hl-faceXoperator">=</span>[<span class="org-tree-sitter-hl-faceXnumber">4</span>, <span class="org-tree-sitter-hl-faceXnumber">4</span>], <span class="org-tree-sitter-hl-faceXlabel">line_color</span><span class="org-tree-sitter-hl-faceXoperator">=</span><span class="org-tree-sitter-hl-faceXstring">"#458588"</span>, <span class="org-tree-sitter-hl-faceXlabel">line_alpha</span><span class="org-tree-sitter-hl-faceXoperator">=</span>alpha<span class="org-tree-sitter-hl-faceXoperator">/</span><span class="org-tree-sitter-hl-faceXnumber">2</span> ) <span class="org-tree-sitter-hl-faceXkeyword">except</span> (): <span class="org-tree-sitter-hl-faceXfunctionXcall"><span class="org-tree-sitter-hl-faceXfunctionXbuiltin">print</span></span>(<span class="org-tree-sitter-hl-faceXstring">"AAAAAAAAAAAAAAAAAAAA no Error-Handling"</span>) plot.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">width</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXnumber">1024</span> plot.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">height</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXnumber">384</span> plot.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">background_fill_alpha</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXnumber">0</span> plot.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">border_fill_alpha</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXnumber">0</span> plot.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">sizing_mode</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"stretch_width"</span> plot.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">outline_line_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> plot.<span class="org-tree-sitter-hl-faceXproperty">title</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">text_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> plot.<span class="org-tree-sitter-hl-faceXproperty">legend</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">label_text_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> plot.<span class="org-tree-sitter-hl-faceXproperty">legend</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">background_fill_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> plot.<span class="org-tree-sitter-hl-faceXproperty">legend</span>.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">background_fill_alpha</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXnumber">0.125</span> <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">axis</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> [plot.<span class="org-tree-sitter-hl-faceXproperty">xaxis</span>, plot.<span class="org-tree-sitter-hl-faceXproperty">yaxis</span>]: axis.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">axis_label_text_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> axis.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">axis_line_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> axis.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">major_label_text_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> axis.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">major_tick_line_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> axis.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">minor_tick_line_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> <span class="org-tree-sitter-hl-faceXkeyword">for</span> <span class="org-tree-sitter-hl-faceXvariable">grid</span> <span class="org-tree-sitter-hl-faceXoperator">in</span> [plot.<span class="org-tree-sitter-hl-faceXproperty">xgrid</span>, plot.<span class="org-tree-sitter-hl-faceXproperty">ygrid</span>]: grid.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">grid_line_color</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXstring">"gray"</span> grid.<span class="org-tree-sitter-hl-faceXproperty"><span class="org-tree-sitter-hl-faceXvariable">grid_line_alpha</span></span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXnumber">0.5</span> <span class="org-tree-sitter-hl-faceXvariable">script</span>, <span class="org-tree-sitter-hl-faceXvariable">divs</span> <span class="org-tree-sitter-hl-faceXoperator">=</span> <span class="org-tree-sitter-hl-faceXfunctionXcall">components</span>(plot, <span class="org-tree-sitter-hl-faceXconstructor"><span class="org-tree-sitter-hl-faceXconstant">CDN</span></span>) <span class="org-tree-sitter-hl-faceXkeyword">return</span> script, divs </pre> </div> <p> Die tolle Funktion mit dem Namen <code>bok_rain</code> (im gegensatz zu <code>plot_rain</code> eine Implementation mit <code>Bokeh</code>, daher der Name) ruft nun die Daten auf und berechnet zunächst die maximale intensität im maximalen Radius ĂĽber die gesamte Zeit.<br> </p> <p> Die Radien dienen dazu, auch Regen in der Umgebung berĂĽcksichtigen zu können; zieht etwa in 80 Minuten ein sehr Starker und kleiner Schauer in 2km vorbei, so sollte man dennoch mit Regen rechnen, denn er könnte wachsen.<br> </p> <p> Dieser Radius wird dann als obere Schranke fĂĽr das Diagramm eingestellt, minimal aber 1 (in Liter pro Quadratmeter und Stunde).<br> </p> <p> Bokeh geben wir als Tools nur die x-zoom varianten, denn ein Zoom in alle Richtungen lässt einen schnell den Plot verlieren. Dann wird versucht (und bei Fehlern passiert nichts) fĂĽr jeden Radius mit unterschiedlichen Transparenzwerten eine Linie zu plotten.<br> </p> <p> Nach einigen Einstellungen bezĂĽglich der Farben, viel "gray", damit das Diagramm im hellen und dunklen Modus gleich gut funktioniert, wird es mit <code>components</code> als skript und div exportiert und auf der Seite eingebettet.<br> </p> </div> </div> </div> <div id="outline-container-bibliography" class="outline-2"> <h2 id="bibliography"><span class="section-number-2">3.</span> <a href="#bibliography">Bibliography</a></h2> <div class="outline-text-2" id="text-3"> <style>.csl-entry{text-indent: -0; margin-left: 0;}</style><div class="csl-bib-body"> <div class="csl-entry"><a id="citeproc_bib_item_1"></a>“Nominatim,”. 2022. July 12, 2022, URL: <a href="https://nominatim.openstreetmap.org/ui/search.html">https://nominatim.openstreetmap.org/ui/search.html</a>, retrieved on July 27, 2022.</div> <div class="csl-entry"><a id="citeproc_bib_item_2"></a>Van de Ven, B. 2022. “Bokeh,” July 7, 2022, URL: <a href="https://bokeh.org">https://bokeh.org</a>, retrieved on July 27, 2022.</div> </div> </div> </div> <div id="outline-container-nav" class="outline-2"> <h2 id="nav"><a href="#nav">Nav</a></h2> <div class="outline-text-2" id="text-nav"> <ul class="org-ul"> <li>Tags: <a href="./tags/Meta.html">Meta</a> - <a href="./tags/Wetter.html">Wetter</a> - <a href="./tags/Python.html">Python</a><br></li> </ul> <!-- BEGIN insert Backlinks (but there are no) --> <ul class="org-ul"> <li>Formats: <a href="./20220727-regenradar.md">md</a> - <a href="./20220727-regenradar.txt">txt</a> - <a href="./20220727-regenradar.html">html</a> - <a href="./20220727-regenradar.gmi">gmi</a></li> </ul> </div> </div> </main> <footer id="postamble" class="status"> <hr> 2022-07-27 <br> <img alt="CC BY-4.0" style="border-width:0; vertical-align: middle; height: 1em;" src="/icons/cc-by-4.0-80x15.svg"> <a rel='license' href='http://creativecommons.org/licenses/by/4.0/'> CC BY-4.0. </a> <br> running at <a href='https://www.hosting.de/'>hosting.de</a> <br> Creator: <a href="https://www.gnu.org/software/emacs/">Emacs</a> 28.2 (<a href="https://orgmode.org">Org</a> mode 9.5.5); <br> <a href='/impressum-datenschutz.html' id='impressum-dings'> Impressum und Datenschutzerklärung </a> <a id='bottom'></a> </footer> </body> </html>