Unidata Developer's BlogUnidata Developer's Bloghttps://www.unidata.ucar.edu/blogs/developer/en/feed/entries/atom2024-03-18T20:14:52-06:00Apache Rollerhttps://www.unidata.ucar.edu/blogs/developer/entry/metpy-mondays-259-virtual-environmentsMetPy Mondays #259 - Virtual Environments (How to use this Conda alternative)John Leeman2022-11-22T13:56:30-07:002022-11-22T13:56:30-07:00<p>Learn how to use virtual environments and how they stack up to Conda in this week's #MetPyMonday!</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/h6AtpBSEf2Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
https://www.unidata.ucar.edu/blogs/developer/entry/learn-design-develop-my-summerLearn, Design, Develop: My Summer with Unidata AWIPSUnidata News2022-08-05T13:00:00-06:002022-08-05T13:52:07-06:00<div class="img_l" style="width: 150px;">
<img width="150" src="/blog_content/images/2022/20220606_rfiutak.jpg" alt="Rhoen Fiutak" />
<div class="caption">
Rhoen Fiutak
</div>
<p></div></p>
<p class="byline">
by
<a href="/community/internship/#2022rf">Rhoen Fiutak</a>
<br />2022 Unidata summer intern
</p>
<p>
This summer, I worked with <a href="https://www.unidata.ucar.edu/software/awips2/">Unidata AWIPS</a> (Advanced Weather
Interactive Processing System), contributing to educational resources for and outreach
within Unidata's user community. Unidata AWIPS supports two visualization frameworks for
rendering meteorological and geographic data: CAVE, a graphical user interface (GUI)
application, and Python-AWIPS, a programmatic application programming interface (API) for
EDEX. Users can learn about each through multiple resources, including blog posts on
topical updates and tutorials via <a href="https://www.unidata.ucar.edu/blogs/news/tags/awipstips">AWIPS Tips</a>,
eLearning courses like Learn AWIPS CAVE,
and examples of data plotting with Python-AWIPS.
</p>
<div class="img_l" style="width: 150px;">
<a class="lightbox" title="Rhoen Fiutak" href="/blog_content/images/2022/20220606_rfiutak.jpg">
<img width="150" src="/blog_content/images/2022/20220606_rfiutak.jpg" alt="Rhoen Fiutak" />
</a>
<div class="caption">
Rhoen Fiutak
</div>
<p></div></p>
<p class="byline">
by
<a href="/community/internship/#2022rf">Rhoen Fiutak</a>
<br />2022 Unidata summer intern
</p>
<p>
This summer, I worked with <a href="https://www.unidata.ucar.edu/software/awips2/">Unidata AWIPS</a> (Advanced Weather
Interactive Processing System), contributing to educational resources for and outreach
within Unidata's user community. Unidata AWIPS supports two visualization frameworks for
rendering meteorological and geographic data: CAVE, a graphical user interface (GUI)
application, and Python-AWIPS, a programmatic application programming interface (API) for
EDEX. Users can learn about each through multiple resources, including blog posts on
topical updates and tutorials via <a href="https://www.unidata.ucar.edu/blogs/news/tags/awipstips">AWIPS Tips</a>,
eLearning courses like Learn AWIPS CAVE,
and examples of data plotting with Python-AWIPS.
</p>
<div class="img_l" style="width: 200px;">
<a class="lightbox" title="Instructional design process used in creating the eLearning module for Python-AWIPS." href="/blog_content/images/2022/20220802_devblog_intern_rhoen_f1.jpg">
<img width="200" src="/blog_content/images/2022/20220802_devblog_intern_rhoen_f1.jpg" alt="Instructional design process" />
</a>
<div class="caption">
Creating an eLearning module for Python-AWIPS (click to enlarge)
</div>
<p></div></p>
<p>
I was motivated to not only contribute to these educational resources being
offered, but also to gain experience in the process of designing these learning tools for
users, from interviewing professors or working with subject matter experts to delivering
a finished resource. I have always loved exploring today’s problems in the Earth and
environment through the lens of numbers. During my time teaching mathematics to high
schoolers or tutoring intro physics while an undergraduate, I realized how much I enjoyed sharing
those interests. However, I found myself wanting to reach a wider audience and
contribute to communicating the research that was occurring at a higher level. I am
currently pursuing a degree in Computational Applied Mathematics through Colorado School
of Mines. This internship has given me the opportunity to explore how to bridge the gap
between my interest in STEM and my interest in education through instructional design.
Unidata AWIPS serves a large University community of professors and students interested
in using visualization tools, like CAVE and Python-AWIPS, in the lab and classroom. Our
mission at Unidata is to provide those tools as well as the services to support them.
</p>
<div class="img_r" style="width: 200px;">
<a class="lightbox" title="Screenshot of interactive info block from Learn Python-AWIPS eLearning module lesson on plotting data." href="/blog_content/images/2022/20220802_devblog_intern_rhoen_f2.jpg">
<img width="200" src="/blog_content/images/2022/20220802_devblog_intern_rhoen_f2.jpg" alt="AWIPS eLearning module" />
</a>
<div class="caption">
From the AWIPS eLearning module
</div>
<p></div></p>
<p>
Coming into this internship, I had little to no experience in Python coding, Jupyter
notebooks, creating a pull request through git on Github, and much more. However, with
the help of existing resources supported by Unidata, like Pythia Foundations
tutorials, and thorough documentation, I was swiftly brought up to speed on foundational
skills. Additionally, I had very little knowledge of meteorology. Going through our
eLearning course on AWIPS CAVE gave me a better idea of displaying meteorological data
as well as the presentation of information through interactive lessons, challenge
activities, and assessment in the course.
</p>
<p>
As an introductory student of these resources, I offered feedback in my experience of
the course in CAVE and acted as a troubleshooter for new functionalities in CAVE, helping with
new development for the next release. In addition to troubleshooting from the user
perspective in CAVE as well as the data plotting examples in Python-AWIPS, I contributed
new material to existing resources as well as creating some that were entirely new.
</p>
<ul>
<li>I formatted sections of a data plotting example notebook and made changes using
markdown and html, ultimately creating a pull request that was merged with
Unidata/python-awips for the <a href="http://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html">METAR
Station Plot with MetPy example notebook</a>.</li>
<li>I created a video and drafted the blog post for <em>
Using Drawing Properties with WWA
Display in CAVE
</em>, walking users through a new properties window added to AWIPS CAVE for
customizing Watches, Warnings, and Advisories displays.</li>
<li>I took the lead on creating a new eLearning module for working in Python-AWIPS,
working with Unidata’s educational designer and AWIPS subject matter experts throughout
the process from understanding who our learners are to designing learning objectives to
developing the lesson blocks themselves.</li>
</ul>
<p>
I am grateful for the opportunity to create these resources and contribute to
ongoing development of these tools and services. My mentors — Shay Carter, Nicole
Corbin, and Tiffany Meyer — guided and supported me through every step. They made me
feel I was more than a summer intern, but a team member contributing to work that would
continue past my internship. The most influential takeaway from this experience is
the significance of community outreach and working with our user groups. We must
understand what resources are needed and who needs them the most to have the
greatest impact in increasing access and use of data tools in the geosciences.
</p>
<p>
It was a wonderful summer of learning, designing and developing with Unidata AWIPS.
I would highly recommend this internship. I look forward to applying the skills
learned here in my future career.
</p>
https://www.unidata.ucar.edu/blogs/developer/entry/metpy-mondays-233-parsing-airmetMetPy Mondays #233 - Parsing AIRMET SIGMET CSV files to PolygonsJohn Leeman2022-05-16T21:04:07-06:002022-05-16T21:04:07-06:00<p>Parsing text files is one thing, but turning them into GIS ready polygons is another! This week we look at parsing a CSV of AIRMETS and SIGMETS.</p>
<iframe width="560" height="315" src="https://www.youtube.com/embed/Izu6fI9rY9Y" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
https://www.unidata.ucar.edu/blogs/developer/entry/what-s-new-in-awipsWhat's New in AWIPS 18.1.1$entry.creator.screenName2018-07-31T13:24:42-06:002018-07-31T13:24:42-06:00<p>In the forthcoming 18.1.1 AWIPS release:</p>
<ul>
<li>Inclusion of new AWIPS Hazards plugins for decision assistance (new product generation tools and hydro configurations to integrate with WarnGen and the Hydro perspective).</li>
<li>New Space Weather Prediction Center plugins for Geomagnetic Data, Solar Imagery, Generic High Cadence Data, and Time Series displays).</li>
<li>Unidata now has the source code to build 64-bit Hydro Applications (these Hydroapps were supplied as 32-bit binaries in the Vlab source code repositories, which were disabled in previous Unidata AWIPS releases).</li>
<li>OGC and Data Delivery plugins will be made available in the 18.1.1 release as an optional add-on to a standard EDEX Data Server installation (two additional RPMs).</li>
<li>OHD and Hydro Applications will also be made available as optional EDEX add-ons in the awips2-edex-dat and awips2-hydroapps RPMs.</li>
<li>New roles/permissions framework.</li>
<li>Database reconfiguration (moved from /awips2/data to /awips2/database/data, now with 'awipsadmin' ownership).</li>
<li>Fix CAVE crash when starting GFE for non-activated site.</li>
<li>Updates to allow dynamic contributions to the Volume Browser.</li>
<li>Updates to the Qpid Broker and Localization REST configuration including Protected File status.</li>
<li>New viz method IGLMesh for easier extensibility.</li>
<li>Ability to handle derived parameter cubes at a single point.</li>
<li>Search By Name has been added to the Localization Perspective.</li>
<li>ADE updates for Eclipse 4.6.1.</li>
<li>Geotools updated to 16.4.</li>
<li>Cython updated to 0.28.3.</li>
<li>httpd-pypies updated to 2.4.27.</li>
<li>python-dateutil updated to 2.7.3.</li>
<li>qpid-lib updated to 1.38.0.</li>
<li>werkzeug updated to 0.14.1.</li>
<li>yajsw updated to 12.09.</li>
</ul>
https://www.unidata.ucar.edu/blogs/developer/entry/awips-nexrad-level-3-renderedAWIPS NEXRAD Level 3 Rendered with Matplotlib$entry.creator.screenName2017-02-02T19:45:03-07:002017-02-03T17:56:12-07:00<p>Shown here are plots for Base Reflectivity (N0Q, 94) and Base Velocity
(N0U, 99) using AWIPS data rendered with Matplotlib, Cartopy, and MetPy.
This example improves upon existing Level 3 Python rendering by doing
the following:</p>
<ul>
<li>Display scaled and labeled colorbar below each figure.</li>
<li>Plot radar radial images as coordinate maps in Cartopy and label with
lat/lon.</li>
<li>8 bit Z and V colormap and data scaling added to MetPy from operational AWIPS.</li>
<li>Level 3 data are retrieved from the <a href="http://unidata.github.io/awips2/docs/install/install-cave.html#how-to-run-cave">Unidata EDEX Cloud
server</a>
(<code class="docutils literal"><span class="pre">edex-cloud.unidata.ucar.edu</span></code>)</li>
<li>Raw HDF5 byte data are converted to product values.</li>
</ul>
<p>Shown here are plots for Base Reflectivity (N0Q, 94) and Base Velocity
(N0U, 99) using AWIPS data rendered with Matplotlib, Cartopy, and MetPy.
This example improves upon existing Level 3 Python rendering by doing
the following:</p>
<ul>
<li><p class="first">Display scaled and labeled colorbar below each figure.</p>
</li>
<li><p class="first">Plot radar radial images as coordinate maps in Cartopy and label with
lat/lon.</p>
</li>
<li><p class="first">8 bit Z and V colormap and data scaling added to MetPy from
operational AWIPS.</p>
</li>
<li><p class="first">Level 3 data are retrieved from the <a class="reference external" href="http://unidata.github.io/awips2/docs/install/install-cave.html#how-to-run-cave">Unidata EDEX Cloud
server</a>
(<code class="docutils literal"><span class="pre">edex-cloud.unidata.ucar.edu</span></code>)</p>
</li>
<li><p class="first">Raw HDF5 byte data are converted to product values and scaled
according to (page 3-34
<a class="reference external" href="https://www.roc.noaa.gov/wsr88d/PublicDocs/ICDS/2620001U.pdf">https://www.roc.noaa.gov/wsr88d/PublicDocs/ICDS/2620001U.pdf</a>)</p>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">The</span> <span class="n">threshold</span> <span class="n">level</span> <span class="n">fields</span> <span class="n">are</span> <span class="n">used</span> <span class="n">to</span> <span class="n">describe</span> <span class="p">(</span><span class="n">up</span> <span class="n">to</span><span class="p">)</span> <span class="mi">256</span> <span class="n">levels</span> <span class="k">as</span> <span class="n">follows</span><span class="p">:</span>
<span class="n">halfword</span> <span class="mi">31</span> <span class="n">contains</span> <span class="n">the</span> <span class="n">minimum</span> <span class="n">data</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">m</span><span class="o">/</span><span class="n">s</span><span class="o">*</span><span class="mi">10</span> <span class="p">(</span><span class="ow">or</span> <span class="n">dBZ</span><span class="o">*</span><span class="mi">10</span><span class="p">)</span>
<span class="n">halfword</span> <span class="mi">32</span> <span class="n">contains</span> <span class="n">the</span> <span class="n">increment</span> <span class="ow">in</span> <span class="n">m</span><span class="o">/</span><span class="n">s</span><span class="o">*</span><span class="mi">10</span> <span class="p">(</span><span class="ow">or</span> <span class="n">dBZ</span><span class="o">*</span><span class="mi">10</span><span class="p">)</span>
<span class="n">halfword</span> <span class="mi">33</span> <span class="n">contains</span> <span class="n">the</span> <span class="n">number</span> <span class="n">of</span> <span class="n">levels</span> <span class="p">(</span><span class="mi">0</span> <span class="o">-</span> <span class="mi">255</span><span class="p">)</span>
</pre></div>
</div>
</li>
</ul>
<p>According to the <a class="reference external" href="https://www.roc.noaa.gov/WSR88D/PublicDocs/NewTechnology/B17_2620003W_draft.pdf">ICD for the Product
Specification</a>,
<em>“the 256 data levels of the digital product cover a range of
reflectivity between -32.0 to +94.5 dBZ, in increments of 0.5 dBZ. Level
codes 0 and 1 correspond to ‘Below Threshold’ and ‘Range Folded’,
respectively, while level codes 2 through 255 correspond to the
reflectivity data itself”</em>.</p>
<p>So it’s really 254 color values between -32 and +94.5 dBZ.</p>
<p>The ICD lists 16 specific color levels and directs 256-level
reflectivity products to use corresponding colors, leaving it the
rendering application to scale and blend between the 16 color values,
and to make decisions about discrete color changes, apparently. <img alt="image0" src="http://i.imgur.com/cqphoe3.png" /></p>
<p>For AWIPS, the National Weather Service uses a mostly-blended color
scale with a discrete jump to red at reflectivity values of 50 dBZ:</p>
<div class="figure">
<img alt="" src="http://i.imgur.com/o18gmio.png" />
</div>
<p>50 dBZ corresponds to the 16-level color <em>light red</em> (<strong>FF6060</strong>). Note
that <code class="docutils literal"><span class="pre">FF6060</span></code> is not used in the NWS AWIPS color scale, instead RGB
value is given as <code class="docutils literal"><span class="pre">255,0,0</span></code> (hex code <strong>FF0000</strong>). 60 dBZ is not quite
exactly where white starts, but it makes sense that it would. Obviously
the AWIPS D2D authors took some liberties with their 256-level
rendering, not adhering strictly to “dark red” for dBZ values between
60-65 (white was for 70 dBZ and above on the 16-level colormap). For
this exercise we will assume 50 dBZ should be red and 60 dBZ white, and
75 dBZ cyan.</p>
<div class="section" id="setup">
<h2>Setup</h2>
<blockquote>
<div>pip install python-awips matplotlib cartopy metpy</div></blockquote>
</div>
<div class="section" id="python-script">
<h2>Python Script</h2>
<p>Download this script as a <a class="reference external" href="http://nbviewer.jupyter.org/github/Unidata/python-awips/blob/master/examples/notebooks/NEXRAD_Level_3_Plot_with_Matplotlib.ipynb">Jupyter
Notebook</a>.</p>
<div class="code python highlight-default"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">awips.dataaccess</span> <span class="k">import</span> <span class="n">DataAccessLayer</span>
<span class="kn">from</span> <span class="nn">awips</span> <span class="k">import</span> <span class="n">ThriftClient</span><span class="p">,</span> <span class="n">RadarCommon</span>
<span class="kn">from</span> <span class="nn">dynamicserialize.dstypes.com.raytheon.uf.common.time</span> <span class="k">import</span> <span class="n">TimeRange</span>
<span class="kn">from</span> <span class="nn">dynamicserialize.dstypes.com.raytheon.uf.common.dataplugin.radar.request</span> <span class="k">import</span> <span class="n">GetRadarDataRecordRequest</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">datetime</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="k">import</span> <span class="n">timedelta</span>
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
<span class="kn">import</span> <span class="nn">numpy</span> <span class="k">as</span> <span class="nn">np</span>
<span class="kn">from</span> <span class="nn">numpy</span> <span class="k">import</span> <span class="n">ma</span>
<span class="kn">from</span> <span class="nn">metpy.plots</span> <span class="k">import</span> <span class="n">ctables</span>
<span class="kn">import</span> <span class="nn">cartopy.crs</span> <span class="k">as</span> <span class="nn">ccrs</span>
<span class="kn">from</span> <span class="nn">cartopy.mpl.gridliner</span> <span class="k">import</span> <span class="n">LONGITUDE_FORMATTER</span><span class="p">,</span> <span class="n">LATITUDE_FORMATTER</span>
<span class="c1"># set EDEX server and radar site definitions</span>
<span class="n">site</span> <span class="o">=</span> <span class="s1">'kmux'</span>
<span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">changeEDEXHost</span><span class="p">(</span><span class="s1">'edex-cloud.unidata.ucar.edu'</span><span class="p">)</span>
<span class="n">request</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">newDataRequest</span><span class="p">()</span>
<span class="n">request</span><span class="o">.</span><span class="n">setDatatype</span><span class="p">(</span><span class="s1">'radar'</span><span class="p">)</span>
<span class="n">request</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="n">site</span><span class="p">)</span>
<span class="c1"># Get latest time for site</span>
<span class="n">datatimes</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableTimes</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">dateTimeStr</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">datatimes</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="n">dateTimeStr</span> <span class="o">=</span> <span class="s2">"2017-02-02 03:53:03"</span>
<span class="n">buffer</span> <span class="o">=</span> <span class="mi">60</span> <span class="c1"># seconds</span>
<span class="n">dateTime</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span><span class="n">dateTimeStr</span><span class="p">,</span> <span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span>
<span class="c1"># Build timerange +/- buffer</span>
<span class="n">beginRange</span> <span class="o">=</span> <span class="n">dateTime</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buffer</span><span class="p">)</span>
<span class="n">endRange</span> <span class="o">=</span> <span class="n">dateTime</span> <span class="o">+</span> <span class="n">timedelta</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">buffer</span><span class="p">)</span>
<span class="n">timerange</span> <span class="o">=</span> <span class="n">TimeRange</span><span class="p">(</span><span class="n">beginRange</span><span class="p">,</span> <span class="n">endRange</span><span class="p">)</span>
<span class="c1"># GetRadarDataRecordRequest to query site with timerange</span>
<span class="n">client</span> <span class="o">=</span> <span class="n">ThriftClient</span><span class="o">.</span><span class="n">ThriftClient</span><span class="p">(</span><span class="s1">'edex-cloud.unidata.ucar.edu'</span><span class="p">)</span>
<span class="n">request</span> <span class="o">=</span> <span class="n">GetRadarDataRecordRequest</span><span class="p">()</span>
<span class="n">request</span><span class="o">.</span><span class="n">setTimeRange</span><span class="p">(</span><span class="n">timerange</span><span class="p">)</span>
<span class="n">request</span><span class="o">.</span><span class="n">setRadarId</span><span class="p">(</span><span class="n">site</span><span class="p">)</span>
<span class="c1"># Map config</span>
<span class="k">def</span> <span class="nf">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="p">,</span> <span class="n">projection</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">()):</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">12</span><span class="p">),</span>
<span class="n">subplot_kw</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">projection</span><span class="o">=</span><span class="n">projection</span><span class="p">))</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_extent</span><span class="p">(</span><span class="n">bbox</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">coastlines</span><span class="p">(</span><span class="n">resolution</span><span class="o">=</span><span class="s1">'50m'</span><span class="p">)</span>
<span class="n">gl</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">gridlines</span><span class="p">(</span><span class="n">draw_labels</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">gl</span><span class="o">.</span><span class="n">xlabels_top</span> <span class="o">=</span> <span class="n">gl</span><span class="o">.</span><span class="n">ylabels_right</span> <span class="o">=</span> <span class="kc">False</span>
<span class="n">gl</span><span class="o">.</span><span class="n">xformatter</span> <span class="o">=</span> <span class="n">LONGITUDE_FORMATTER</span>
<span class="n">gl</span><span class="o">.</span><span class="n">yformatter</span> <span class="o">=</span> <span class="n">LATITUDE_FORMATTER</span>
<span class="k">return</span> <span class="n">fig</span><span class="p">,</span> <span class="n">ax</span>
<span class="c1"># ctable defines the colortable, beginning value, data increment</span>
<span class="c1"># * For N0Q the scale is -20 to +75 dBZ in increments of 0.5 dBZ</span>
<span class="c1"># * For N0U the scale is -100 to +100 kts in increments of 1 kt</span>
<span class="n">nexrad</span> <span class="o">=</span> <span class="p">{}</span>
<span class="n">nexrad</span><span class="p">[</span><span class="s2">"N0Q"</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'id'</span><span class="p">:</span> <span class="mi">94</span><span class="p">,</span>
<span class="s1">'unit'</span><span class="p">:</span><span class="s1">'dBZ'</span><span class="p">,</span>
<span class="s1">'name'</span><span class="p">:</span><span class="s1">'0.5 deg Base Reflectivity'</span><span class="p">,</span>
<span class="s1">'ctable'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'NWSStormClearReflectivity'</span><span class="p">,</span><span class="o">-</span><span class="mf">20.</span><span class="p">,</span> <span class="mf">0.5</span><span class="p">],</span>
<span class="s1">'res'</span><span class="p">:</span> <span class="mf">1000.</span><span class="p">,</span>
<span class="s1">'elev'</span><span class="p">:</span> <span class="s1">'0.5'</span>
<span class="p">}</span>
<span class="n">nexrad</span><span class="p">[</span><span class="s2">"N0U"</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span>
<span class="s1">'id'</span><span class="p">:</span> <span class="mi">99</span><span class="p">,</span>
<span class="s1">'unit'</span><span class="p">:</span><span class="s1">'kts'</span><span class="p">,</span>
<span class="s1">'name'</span><span class="p">:</span><span class="s1">'0.5 deg Base Velocity'</span><span class="p">,</span>
<span class="s1">'ctable'</span><span class="p">:</span> <span class="p">[</span><span class="s1">'NWS8bitVel'</span><span class="p">,</span><span class="o">-</span><span class="mf">100.</span><span class="p">,</span><span class="mf">1.</span><span class="p">],</span>
<span class="s1">'res'</span><span class="p">:</span> <span class="mf">250.</span><span class="p">,</span>
<span class="s1">'elev'</span><span class="p">:</span> <span class="s1">'0.5'</span>
<span class="p">}</span>
<span class="n">grids</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">code</span> <span class="ow">in</span> <span class="n">nexrad</span><span class="p">:</span>
<span class="n">request</span><span class="o">.</span><span class="n">setProductCode</span><span class="p">(</span><span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'id'</span><span class="p">])</span>
<span class="n">request</span><span class="o">.</span><span class="n">setPrimaryElevationAngle</span><span class="p">(</span><span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'elev'</span><span class="p">])</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">sendRequest</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="k">if</span> <span class="n">response</span><span class="o">.</span><span class="n">getData</span><span class="p">():</span>
<span class="k">for</span> <span class="n">record</span> <span class="ow">in</span> <span class="n">response</span><span class="o">.</span><span class="n">getData</span><span class="p">():</span>
<span class="c1"># Get record hdf5 data</span>
<span class="n">idra</span> <span class="o">=</span> <span class="n">record</span><span class="o">.</span><span class="n">getHdf5Data</span><span class="p">()</span>
<span class="n">rdat</span><span class="p">,</span><span class="n">azdat</span><span class="p">,</span><span class="n">depVals</span><span class="p">,</span><span class="n">threshVals</span> <span class="o">=</span> <span class="n">RadarCommon</span><span class="o">.</span><span class="n">get_hdf5_data</span><span class="p">(</span><span class="n">idra</span><span class="p">)</span>
<span class="n">dim</span> <span class="o">=</span> <span class="n">rdat</span><span class="o">.</span><span class="n">getDimension</span><span class="p">()</span>
<span class="n">lat</span><span class="p">,</span><span class="n">lon</span> <span class="o">=</span> <span class="nb">float</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">getLatitude</span><span class="p">()),</span><span class="nb">float</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">getLongitude</span><span class="p">())</span>
<span class="n">radials</span><span class="p">,</span><span class="n">rangeGates</span> <span class="o">=</span> <span class="n">rdat</span><span class="o">.</span><span class="n">getSizes</span><span class="p">()</span>
<span class="c1"># Convert raw byte to pixel value</span>
<span class="n">rawValue</span><span class="o">=</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">rdat</span><span class="o">.</span><span class="n">getByteData</span><span class="p">())</span>
<span class="n">array</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">rec</span> <span class="ow">in</span> <span class="n">rawValue</span><span class="p">:</span>
<span class="k">if</span> <span class="n">rec</span><span class="o"><</span><span class="mi">0</span><span class="p">:</span>
<span class="n">rec</span><span class="o">+=</span><span class="mi">256</span>
<span class="n">array</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">rec</span><span class="p">)</span>
<span class="k">if</span> <span class="n">azdat</span><span class="p">:</span>
<span class="n">azVals</span> <span class="o">=</span> <span class="n">azdat</span><span class="o">.</span><span class="n">getFloatData</span><span class="p">()</span>
<span class="n">az</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">RadarCommon</span><span class="o">.</span><span class="n">encode_radial</span><span class="p">(</span><span class="n">azVals</span><span class="p">))</span>
<span class="n">dattyp</span> <span class="o">=</span> <span class="n">RadarCommon</span><span class="o">.</span><span class="n">get_data_type</span><span class="p">(</span><span class="n">azdat</span><span class="p">)</span>
<span class="n">az</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">az</span><span class="p">,</span><span class="n">az</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
<span class="n">header</span> <span class="o">=</span> <span class="n">RadarCommon</span><span class="o">.</span><span class="n">get_header</span><span class="p">(</span><span class="n">record</span><span class="p">,</span> <span class="nb">format</span><span class="p">,</span> <span class="n">rangeGates</span><span class="p">,</span> <span class="n">radials</span><span class="p">,</span> <span class="n">azdat</span><span class="p">,</span> <span class="s1">'description'</span><span class="p">)</span>
<span class="n">rng</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">rangeGates</span><span class="p">,</span> <span class="n">rangeGates</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span>
<span class="c1"># Convert az/range to a lat/lon</span>
<span class="kn">from</span> <span class="nn">pyproj</span> <span class="k">import</span> <span class="n">Geod</span>
<span class="n">g</span> <span class="o">=</span> <span class="n">Geod</span><span class="p">(</span><span class="n">ellps</span><span class="o">=</span><span class="s1">'clrk66'</span><span class="p">)</span>
<span class="n">center_lat</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">([</span><span class="nb">len</span><span class="p">(</span><span class="n">az</span><span class="p">),</span><span class="nb">len</span><span class="p">(</span><span class="n">rng</span><span class="p">)])</span><span class="o">*</span><span class="n">lat</span>
<span class="n">center_lon</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones</span><span class="p">([</span><span class="nb">len</span><span class="p">(</span><span class="n">az</span><span class="p">),</span><span class="nb">len</span><span class="p">(</span><span class="n">rng</span><span class="p">)])</span><span class="o">*</span><span class="n">lon</span>
<span class="n">az2D</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones_like</span><span class="p">(</span><span class="n">center_lat</span><span class="p">)</span><span class="o">*</span><span class="n">az</span><span class="p">[:,</span><span class="kc">None</span><span class="p">]</span>
<span class="n">rng2D</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">ones_like</span><span class="p">(</span><span class="n">center_lat</span><span class="p">)</span><span class="o">*</span><span class="n">np</span><span class="o">.</span><span class="n">transpose</span><span class="p">(</span><span class="n">rng</span><span class="p">[:,</span><span class="kc">None</span><span class="p">])</span><span class="o">*</span><span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'res'</span><span class="p">]</span>
<span class="n">lons</span><span class="p">,</span><span class="n">lats</span><span class="p">,</span><span class="n">back</span><span class="o">=</span><span class="n">g</span><span class="o">.</span><span class="n">fwd</span><span class="p">(</span><span class="n">center_lon</span><span class="p">,</span><span class="n">center_lat</span><span class="p">,</span><span class="n">az2D</span><span class="p">,</span><span class="n">rng2D</span><span class="p">)</span>
<span class="n">bbox</span> <span class="o">=</span> <span class="p">[</span><span class="n">lons</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">lons</span><span class="o">.</span><span class="n">max</span><span class="p">(),</span> <span class="n">lats</span><span class="o">.</span><span class="n">min</span><span class="p">(),</span> <span class="n">lats</span><span class="o">.</span><span class="n">max</span><span class="p">()]</span>
<span class="c1"># Create 2d array</span>
<span class="n">multiArray</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">reshape</span><span class="p">(</span><span class="n">array</span><span class="p">,</span> <span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="n">rangeGates</span><span class="p">))</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">ma</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">multiArray</span><span class="p">)</span>
<span class="c1"># threshVals[0:2] contains halfwords 31,32,33 (min value, increment, num levels)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">ma</span><span class="o">.</span><span class="n">array</span><span class="p">(</span><span class="n">threshVals</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">/</span><span class="mf">10.</span> <span class="o">+</span> <span class="p">(</span><span class="n">multiArray</span><span class="p">)</span><span class="o">*</span><span class="n">threshVals</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">/</span><span class="mf">10.</span><span class="p">)</span>
<span class="k">if</span> <span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'unit'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'kts'</span><span class="p">:</span>
<span class="n">data</span><span class="p">[</span><span class="n">data</span><span class="o"><-</span><span class="mi">63</span><span class="p">]</span> <span class="o">=</span> <span class="n">ma</span><span class="o">.</span><span class="n">masked</span>
<span class="n">data</span> <span class="o">*=</span> <span class="mf">1.94384</span> <span class="c1"># Convert to knots</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">data</span><span class="p">[</span><span class="n">data</span><span class="o"><=</span><span class="p">((</span><span class="n">threshVals</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">/</span><span class="mf">10.</span><span class="p">)</span><span class="o">+</span><span class="n">threshVals</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">/</span><span class="mf">10.</span><span class="p">)]</span> <span class="o">=</span> <span class="n">ma</span><span class="o">.</span><span class="n">masked</span>
<span class="c1"># Save our requested grids so we can render them multiple times</span>
<span class="n">product</span> <span class="o">=</span> <span class="p">{</span>
<span class="s2">"code"</span><span class="p">:</span> <span class="n">code</span><span class="p">,</span>
<span class="s2">"bbox"</span><span class="p">:</span> <span class="n">bbox</span><span class="p">,</span>
<span class="s2">"lats"</span><span class="p">:</span> <span class="n">lats</span><span class="p">,</span>
<span class="s2">"lons"</span><span class="p">:</span> <span class="n">lons</span><span class="p">,</span>
<span class="s2">"data"</span><span class="p">:</span> <span class="n">data</span>
<span class="p">}</span>
<span class="n">grids</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">product</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Processed "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">grids</span><span class="p">))</span><span class="o">+</span><span class="s2">" grids."</span><span class="p">)</span>
</pre></div>
</div>
<div class="highlight-default"><div class="highlight"><pre><span></span><span class="n">Processed</span> <span class="mi">2</span> <span class="n">grids</span><span class="o">.</span>
</pre></div>
</div>
<div class="section" id="plot-n0q-and-n0u-with-cartopy">
<h3>Plot N0Q and N0U with Cartopy</h3>
<div class="code python highlight-default"><div class="highlight"><pre><span></span><span class="k">for</span> <span class="n">rec</span> <span class="ow">in</span> <span class="n">grids</span><span class="p">:</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"code"</span><span class="p">]</span>
<span class="n">bbox</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"bbox"</span><span class="p">]</span>
<span class="n">lats</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"lats"</span><span class="p">]</span>
<span class="n">lons</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"lons"</span><span class="p">]</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"data"</span><span class="p">]</span>
<span class="c1"># Create figure</span>
<span class="o">%</span><span class="n">matplotlib</span> <span class="n">inline</span>
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="o">=</span><span class="n">bbox</span><span class="p">)</span>
<span class="c1"># Colortable filename, beginning value, increment</span>
<span class="n">ctable</span> <span class="o">=</span> <span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'ctable'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">beg</span> <span class="o">=</span> <span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'ctable'</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>
<span class="n">inc</span> <span class="o">=</span> <span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'ctable'</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span>
<span class="n">norm</span><span class="p">,</span> <span class="n">cmap</span> <span class="o">=</span> <span class="n">ctables</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">get_with_steps</span><span class="p">(</span><span class="n">ctable</span><span class="p">,</span> <span class="n">beg</span><span class="p">,</span> <span class="n">inc</span><span class="p">)</span>
<span class="n">cs</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">pcolormesh</span><span class="p">(</span><span class="n">lons</span><span class="p">,</span> <span class="n">lats</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">norm</span><span class="o">=</span><span class="n">norm</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="n">cmap</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_aspect</span><span class="p">(</span><span class="s1">'equal'</span><span class="p">,</span> <span class="s1">'datalim'</span><span class="p">)</span>
<span class="n">cbar</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">cs</span><span class="p">,</span> <span class="n">extend</span><span class="o">=</span><span class="s1">'both'</span><span class="p">,</span> <span class="n">shrink</span><span class="o">=</span><span class="mf">0.75</span><span class="p">,</span> <span class="n">orientation</span><span class="o">=</span><span class="s1">'horizontal'</span><span class="p">)</span>
<span class="n">cbar</span><span class="o">.</span><span class="n">set_label</span><span class="p">(</span><span class="n">site</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span><span class="o">+</span><span class="s2">" "</span><span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'res'</span><span class="p">]</span><span class="o">/</span><span class="mf">1000.</span><span class="p">)</span> <span class="o">+</span><span class="s2">"km "</span> \
<span class="o">+</span><span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'name'</span><span class="p">]</span><span class="o">+</span><span class="s2">" ("</span><span class="o">+</span><span class="n">code</span><span class="o">+</span><span class="s2">") "</span> \
<span class="o">+</span><span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'unit'</span><span class="p">]</span><span class="o">+</span><span class="s2">" "</span> \
<span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()))</span>
<span class="c1"># Zoom to within +-2 deg of center</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">(</span><span class="n">lon</span><span class="o">-</span><span class="mf">2.</span><span class="p">,</span> <span class="n">lon</span><span class="o">+</span><span class="mf">2.</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">(</span><span class="n">lat</span><span class="o">-</span><span class="mf">2.</span><span class="p">,</span> <span class="n">lat</span><span class="o">+</span><span class="mf">2.</span><span class="p">)</span>
<span class="n">plt</span><span class="o">.</span><span class="n">show</span><span class="p">()</span>
</pre></div>
</div>
<p><img alt="http://python-awips.readthedocs.io/en/latest/_images/NEXRAD_Level_3_Plot_with_Matplotlib_3_0.png" src="http://python-awips.readthedocs.io/en/latest/_images/NEXRAD_Level_3_Plot_with_Matplotlib_3_0.png" />
<img alt="http://python-awips.readthedocs.io/en/latest/_images/NEXRAD_Level_3_Plot_with_Matplotlib_3_1.png" src="http://python-awips.readthedocs.io/en/latest/_images/NEXRAD_Level_3_Plot_with_Matplotlib_3_1.png" /></p>
<p>compare with the same product scan rendered in AWIPS CAVE (slightly
different projections and still some color mapping differences, most
noticeable in ground clutter).</p>
<div class="figure">
<img alt="" src="http://i.imgur.com/q7zPRod.gif" />
<h4>Two-panel plot, zoomed in</h4>
<div class="code python highlight-default"><div class="highlight"><pre><span></span><span class="n">fig</span><span class="p">,</span> <span class="n">axes</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">ncols</span><span class="o">=</span><span class="mi">2</span><span class="p">,</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">12</span><span class="p">,</span><span class="mi">9</span><span class="p">),</span>
<span class="n">subplot_kw</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">projection</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">()))</span>
<span class="n">i</span><span class="o">=</span><span class="mi">0</span>
<span class="k">for</span> <span class="n">rec</span><span class="p">,</span><span class="n">ax</span> <span class="ow">in</span> <span class="nb">zip</span><span class="p">(</span><span class="n">grids</span><span class="p">,</span> <span class="n">axes</span><span class="p">):</span>
<span class="n">code</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"code"</span><span class="p">]</span>
<span class="n">bbox</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"bbox"</span><span class="p">]</span>
<span class="n">lats</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"lats"</span><span class="p">]</span>
<span class="n">lons</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"lons"</span><span class="p">]</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">rec</span><span class="p">[</span><span class="s2">"data"</span><span class="p">]</span>
<span class="c1"># Create figure</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_extent</span><span class="p">(</span><span class="n">bbox</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">coastlines</span><span class="p">(</span><span class="n">resolution</span><span class="o">=</span><span class="s1">'50m'</span><span class="p">)</span>
<span class="n">gl</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">gridlines</span><span class="p">(</span><span class="n">draw_labels</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">gl</span><span class="o">.</span><span class="n">xlabels_top</span> <span class="o">=</span> <span class="n">gl</span><span class="o">.</span><span class="n">ylabels_right</span> <span class="o">=</span> <span class="kc">False</span>
<span class="k">if</span> <span class="n">i</span><span class="o">></span><span class="mi">0</span><span class="p">:</span> <span class="n">gl</span><span class="o">.</span><span class="n">ylabels_left</span> <span class="o">=</span> <span class="kc">False</span> <span class="c1"># hide right-pane left axis label</span>
<span class="n">gl</span><span class="o">.</span><span class="n">xformatter</span> <span class="o">=</span> <span class="n">LONGITUDE_FORMATTER</span>
<span class="n">gl</span><span class="o">.</span><span class="n">yformatter</span> <span class="o">=</span> <span class="n">LATITUDE_FORMATTER</span>
<span class="c1"># Colortable filename, beginning value, increment</span>
<span class="n">colorvals</span><span class="o">=</span><span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'ctable'</span><span class="p">]</span>
<span class="n">ctable</span> <span class="o">=</span> <span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'ctable'</span><span class="p">][</span><span class="mi">0</span><span class="p">]</span>
<span class="n">beg</span> <span class="o">=</span> <span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'ctable'</span><span class="p">][</span><span class="mi">1</span><span class="p">]</span>
<span class="n">inc</span> <span class="o">=</span> <span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'ctable'</span><span class="p">][</span><span class="mi">2</span><span class="p">]</span>
<span class="n">norm</span><span class="p">,</span> <span class="n">cmap</span> <span class="o">=</span> <span class="n">ctables</span><span class="o">.</span><span class="n">registry</span><span class="o">.</span><span class="n">get_with_steps</span><span class="p">(</span><span class="n">ctable</span><span class="p">,</span> <span class="n">beg</span><span class="p">,</span> <span class="n">inc</span><span class="p">)</span>
<span class="n">cs</span> <span class="o">=</span> <span class="n">ax</span><span class="o">.</span><span class="n">pcolormesh</span><span class="p">(</span><span class="n">lons</span><span class="p">,</span> <span class="n">lats</span><span class="p">,</span> <span class="n">data</span><span class="p">,</span> <span class="n">norm</span><span class="o">=</span><span class="n">norm</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="n">cmap</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_aspect</span><span class="p">(</span><span class="s1">'equal'</span><span class="p">,</span> <span class="s1">'datalim'</span><span class="p">)</span>
<span class="n">cbar</span> <span class="o">=</span> <span class="n">fig</span><span class="o">.</span><span class="n">colorbar</span><span class="p">(</span><span class="n">cs</span><span class="p">,</span> <span class="n">orientation</span><span class="o">=</span><span class="s1">'horizontal'</span><span class="p">,</span> <span class="n">ax</span><span class="o">=</span><span class="n">ax</span><span class="p">)</span>
<span class="n">cbar</span><span class="o">.</span><span class="n">set_label</span><span class="p">(</span><span class="n">site</span><span class="o">.</span><span class="n">upper</span><span class="p">()</span><span class="o">+</span><span class="s2">" "</span><span class="o">+</span><span class="n">code</span><span class="o">+</span><span class="s2">" "</span><span class="o">+</span><span class="n">nexrad</span><span class="p">[</span><span class="n">code</span><span class="p">][</span><span class="s1">'unit'</span><span class="p">]</span><span class="o">+</span><span class="s2">" "</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">record</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">()))</span>
<span class="n">plt</span><span class="o">.</span><span class="n">tight_layout</span><span class="p">()</span>
<span class="c1"># Zoom</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_xlim</span><span class="p">(</span><span class="n">lon</span><span class="o">-.</span><span class="mi">1</span><span class="p">,</span> <span class="n">lon</span><span class="o">+.</span><span class="mi">1</span><span class="p">)</span>
<span class="n">ax</span><span class="o">.</span><span class="n">set_ylim</span><span class="p">(</span><span class="n">lat</span><span class="o">-.</span><span class="mi">1</span><span class="p">,</span> <span class="n">lat</span><span class="o">+.</span><span class="mi">1</span><span class="p">)</span>
<span class="n">i</span><span class="o">+=</span><span class="mi">1</span>
</pre></div>
</div>
<p><img alt="http://python-awips.readthedocs.io/en/latest/_images/NEXRAD_Level_3_Plot_with_Matplotlib_6_0.png" src="http://python-awips.readthedocs.io/en/latest/_images/NEXRAD_Level_3_Plot_with_Matplotlib_6_0.png" /></p>
<p>and again compared to CAVE</p>
<p><img alt="" src="http://i.imgur.com/YSr7sKB.png" /></p>
https://www.unidata.ucar.edu/blogs/developer/entry/from-gempak-to-awips-buildingFrom GEMPAK to AWIPS: Building the NSHARP Dynamic Library on OS X$entry.creator.screenName2016-09-14T16:17:32-06:002016-09-30T16:29:36-06:00<p>A little known fact in the world of AWIPS(II) is just how dependent the system still is on NAWIPS-GEMPAK. The entire National Centers Perspective is dependent on pre-built shared object files for 64-bit Linux, which means that all of the D2D plugins which extend NSHARP (for bufr obs, NPP profiles, forecast models, etc.) also depend on these libraries.</p>
<p>This dependency has prevented use of the NSHARP plugin in the first release (15.1.1) of the <a href="https://www.unidata.ucar.edu/downloads/awips2/awips2-cave.dmg">OS X CAVE client</a>. These are the steps taken to build NSHARP and GEMPAK libraries for OS X AWIPS 16.2.2.</p>
<p>A little known fact in the world of AWIPS(II) is just how dependent the system still is on NAWIPS-GEMPAK. The entire National Centers Perspective is dependent on pre-built shared object files for 64-bit Linux, which means that all of the D2D plugins which extend NSHARP (for bufr obs, NPP profiles, forecast models, etc.) also depend on these libraries.</p>
<p>This dependency has prevented use of the NSHARP plugin in the first release (15.1.1) of the <a href="https://www.unidata.ucar.edu/downloads/awips2/awips2-cave.dmg">OS X CAVE client</a>. These are the steps taken to build NSHARP and GEMPAK libraries for OS X AWIPS 16.2.2.</p>
<p>You will need the <a href="https://github.com/Unidata/awips2-gemlibs">https://github.com/Unidata/awips2-gemlibs</a> repository on your Mac, as well as gcc and gfortran (from XCode). Pay attention to any version-specific include path or linked files, such as <code>/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/</code>, always account for the correct versions and locations on your own system.</p>
<h1>NSHARP pre-built libraries</h1>
<h2>libbignsharp.dylib</h2>
<p>Using the script below, the NSHARP dynamic library is built from C and FORTRAN source files (and their required include files supplied by the <code>awips2-gemlibs</code> repository, and as linked against <code>$GEMINC</code>, meaning that GEMPAK for OS X must be built and installed).</p>
<pre><code>git clone https://github.com/Unidata/awips2-gemlibs.git
cd awips2-gemlibs/nsharp/
</code></pre>
<p>An optional step, which can be performed in a separate script or within the build script below, is to create <em>ld-style</em> *.a files in <code>$OS_LIB</code> which can then be referenced with <code>-l</code> flags (e.g. <code>-lgemlib</code>):</p>
<pre><code>libs=(snlist sflist nxmlib gemlib gplt cgemlib rsl device xwp xw ps gn nsharp netcdf textlib)
for file in ${libs[@]}
do
if [ ! -f $OS_LIB/lib$file.a ]; then
echo '$OS_LIB/lib$file.a does not exist'
if [ -f $OS_LIB/$file.a ]; then
cp $OS_LIB/$file.a $OS_LIB/lib$file.a
echo 'copied OS_LIB/$file.a to OS_LIB/lib$file.a for linking'
fi
fi
done
</code></pre>
<p>Build libbignsharp.dylib with the following script (Note the GEMPAK includes and links <code>-I$NSHARP</code>, <code>-I$GEMPAK/include</code>, <code>-L$OS_LIB</code>, etc.).</p>
<pre><code>#!/bin/bash
cd ~/awips2-gemlibs/nsharp/
. $NAWIPS/Gemenviron.profile
CC=gcc
FC=gfortran
export NSHARP=$GEMPAK/source/programs/gui/nsharp
export NWX=$GEMPAK/source/programs/gui/nwx
myLibs='$OS_LIB/ginitp_alt.o $OS_LIB/gendp_alt.o'
myCflags='$CFLAGS -I. -I./Sndglib -I$NSHARP -I$GEMPAK/include -I$OS_INC -I$NWX
-I/opt/X11/include/X11 -I/usr/include/Xm -I/opt/local/include -I/usr/include/malloc -Wcomment -Wno-return-type -Wincompatible-pointer-types -DUNDERSCORE -fPIC -DDEBUG -c'
myFflags='-I. -I$OS_INC -I$GEMPAK/include -I$NSHARP -fPIC -g -c -fno-second-underscore -fmax-errors=200 -std=f95'
myLinkflags='-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/ -L/opt/local/lib -L$OS_LIB -L. -L./Sndglib -L/usr/X11R6/lib
-shared -Wl -Wcomment -Wincompatible-pointer-types -Wimplicit-function-declaration -Wno-return-type,-install_name,libbignsharp.dylib -o libbignsharp.dylib'
myLibsInc='$OS_LIB/ginitp_alt.o $OS_LIB/gendp_alt.o $OS_LIB/libnxmlib.a $OS_LIB/libsnlist.a
$OS_LIB/libsflist.a $OS_LIB/libgemlib.a $OS_LIB/libcgemlib.a $OS_LIB/libgplt.a $OS_LIB/libdevice.a
$OS_LIB/libxwp.a $OS_LIB/libxw.a $OS_LIB/libps.a $OS_LIB/libgn.a $OS_LIB/libcgemlib.a $OS_LIB/libgemlib.a
$OS_LIB/libnetcdf.a $OS_LIB/libtextlib.a $OS_LIB/libxml2.a $OS_LIB/libxslt.a
$OS_LIB/libgemlib.a $OS_LIB/libcgemlib.a $OS_LIB/librsl.a $OS_LIB/libbz2.a'
myLinktail='-I$OS_INC
-I$GEMPAK/include -I$NWX -I$NSHARP -I. -I./Sndglib -I/opt/X11/include/X11 -I/usr/include -I/usr/include/Xm -I/opt/local/include/ -I/opt/local/include -lhdf5 -lgfortran -ljasper -lpng -liconv -lc -lXt -lX11 -lz -lm -lXm'
$CC $myCflags *.c Sndglib/*.c
$FC $myFflags *.f
$CC $myLinkflags *.o $myLibsInc $myLinktail
cp libbignsharp.dylib ~/awips2-ncep/viz/gov.noaa.nws.ncep.ui.nsharp.macosx/
</code></pre>
<h1>GEMPAK pre-built libraries</h1>
<h2>libgempak.dylib</h2>
<p>libgempak.dylib is built in a similar way as libbignsharp.dylib:</p>
<pre><code>#!/bin/bash
cd ~/awips2-gemlibs/gempak/
. $NAWIPS/Gemenviron.profile
CC=gcc
FC=gfortran
myCflags='$CFLAGS -I. -I$GEMPAK/source/diaglib/dg -I$GEMPAK/source/gemlib/er
-I/opt/X11/include/X11 -I/usr/include/Xm -I/opt/local/include -I/usr/include/malloc -fPIC -DDEBUG -c'
myFflags='-I. -I$OS_INC -I$GEMPAK/include -fPIC -g -c -Wtabs -fno-second-underscore'
myLinkflags='-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/ -L/opt/local/lib -L$OS_LIB -L.
-shared -Wl -Wno-return-type,-install_name,libgempak.dylib -o libgempak.dylib'
myLibs='$OS_LIB/ginitp_alt.o $OS_LIB/gendp_alt.o $OS_LIB/libcgemlib.a
$OS_LIB/libsflist.a $OS_LIB/gdlist.a $OS_LIB/libcgemlib.a $OS_LIB/libgemlib.a
$OS_LIB/libcgemlib.a $OS_LIB/libgplt.a $OS_LIB/libdevice.a $OS_LIB/libcgemlib.a
$OS_LIB/libgn.a $OS_LIB/libgemlib.a $OS_LIB/libcgemlib.a $OS_LIB/libnetcdf.a
$OS_LIB/libcgemlib.a $OS_LIB/libtextlib.a $OS_LIB/libxml2.a $OS_LIB/libxslt.a
$OS_LIB/libcgemlib.a $OS_LIB/libgemlib.a $OS_LIB/libcgemlib.a $OS_LIB/libcgemlib.a
$OS_LIB/librsl.a $OS_LIB/libcgemlib.a $OS_LIB/libbz2.a'
myLinktail='-I$OS_INC -I$GEMPAK/include -I. -I/opt/X11/include/X11 -I/usr/include
-I/usr/include/Xm -I/opt/local/include/ -I/opt/local/include
-lhdf5 -lgfortran -ljasper -lpng -liconv -lc -lXt -lX11 -lz -lm -lXm'
$CC $myCflags *.c
$FC $myFflags *.f
$CC $myLinkflags *.o $myLibs $myLinktail
cp libgempak.dylib ~/awips2-ncep/viz/gov.noaa.nws.ncep.viz.gempak.nativelib.macosx/
</code></pre>
<h2>libcnflib.dylib</h2>
<pre><code>#!/bin/bash
cd ~/awips2-gemlibs/cnflib/
. $NAWIPS/Gemenviron.profile
CC=gcc
FC=gfortran
myCflags='$CFLAGS -I/opt/X11/include/X11 -I/usr/include/Xm -I/opt/local/include
-I/usr/include/malloc -Wno-return-type -DUNDERSCORE -fPIC -DDEBUG -g -c'
myLinkflags='-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/ -L/opt/local/lib
-shared -Wl -Wno-return-type,-install_name,libcnflib.dylib -o libcnflib.dylib'
myLinktail='-lgfortran -lc'
myLibs='$OS_LIB/ginitp_alt.o $OS_LIB/gendp_alt.o $OS_LIB/gdlist.a $OS_LIB/gdcfil.a
$OS_LIB/libgemlib.a $OS_LIB/libgplt.a $OS_LIB/libdevice.a $OS_LIB/libgn.a
$OS_LIB/libcgemlib.a $OS_LIB/libgemlib.a $OS_LIB/libnetcdf.a $OS_LIB/libtextlib.a
$OS_LIB/libxslt.a $OS_LIB/libxml2.a -liconv
$OS_LIB/libz.a $OS_LIB/librsl.a -lbz2'
$CC $myCflags *.c
$CC $myLinkflags *.o $myLibs $myLinktail
cp libcnflib.dylib ~/awips2-ncep/viz/gov.noaa.nws.ncep.viz.gempak.nativelib.macosx/
</code></pre>
<h2>libaodtv64.dylib</h2>
<pre><code>#!/bin/bash
CC=gcc
FC=gfortran
cd ~/awips2-gemlibs/aodt/AODTLIB/
gcc -fPIC -g -c -Wall *.c *.h
gcc -shared -Wl,-Wno-return-type,-install_name,libaodtv64.dylib -o libaodtv64.dylib *.o -lc
cp libaodtv64.dylib ~/awips2-ncep/viz/gov.noaa.nws.ncep.viz.gempak.nativelib.macosx/
</code></pre>
<h2>libg2g.dylib</h2>
<pre><code>#!/bin/bash
cd ~/awips2-gemlibs/g2g/
. $NAWIPS/Gemenviron.profile
CC=gcc
FC=gfortran
myCflags='$CFLAGS -I$GEMPAK/include -I. -I$GEMPAK/source/diaglib/dg
-I$GEMPAK/source/gemlib/er -I/opt/X11/include/X11 -I/usr/include/Xm
-I/opt/local/include -I/usr/include/malloc -Wno-return-type -DUNDERSCORE
-fPIC -DDEBUG -c'
myFflags='-I. -I$OS_INC -I$GEMPAK/include -fPIC -g -c -Wtabs -fno-second-underscore'
myLinkflags='-L/usr/local/Cellar/gcc/4.9.2_1/lib/gcc/4.9/ -L/opt/local/lib
-L/usr/X11R6/lib -shared -Wl -Wno-return-type,-install_name,libg2g.dylib -o libg2g.dylib'
myLinktail='-lgfortran $OS_LIB/libjasper.a -lpng -lc'
myLibs='$OS_LIB/ginitp_alt.o $OS_LIB/gendp_alt.o $OS_LIB/gdlist.a
$OS_LIB/gdcfil.a $OS_LIB/libgemlib.a $OS_LIB/libgplt.a $OS_LIB/libdevice.a
$OS_LIB/libgn.a $OS_LIB/libcgemlib.a $OS_LIB/libgemlib.a $OS_LIB/libnetcdf.a
$OS_LIB/libtextlib.a $OS_LIB/libxslt.a $OS_LIB/libxml2.a
-liconv $OS_LIB/libz.a $OS_LIB/librsl.a -lbz2'
$CC $myCflags *.c
$FC $myFflags *.f
$CC $myLinkflags *.o $myLibs $myLinktail
cp libg2g.dylib ~/awips2-ncep/viz/gov.noaa.nws.ncep.viz.gempak.nativelib.macosx/
</code></pre>
https://www.unidata.ucar.edu/blogs/developer/entry/colored-temperature-obs-in-caveColored Temperature Obs in CAVE D2D (NMAP2-style)$entry.creator.screenName2016-09-09T14:32:48-06:002024-03-05T09:57:50-07:00<div class="img_l" style="width: 150px;">
<img width="150" src="http://i.imgur.com/bAsBof2.png" alt=""/>
</div>
<p>One of the new data visualizations available in the upcoming AWIPS 16.2.2 release is a recreation of the legacy GEMPAK/NAWIPS colored temperature ("color_temp") bundle.</p>
<p>One of the new data visualizations available in the upcoming AWIPS 16.2.2 release is a recreation of the legacy GEMPAK/NAWIPS colored temperature ("color_temp") bundle.</p>
<h2>AWIPS CAVE</h2>
<p><img src="https://i.imgur.com/3rllDRL.png" alt="" title="" /></p>
<h2>GEMPAK NMAP2</h2>
<p><img src="https://i.imgur.com/bAsBof2.png" alt="" title="" /></p>
<p>This plugin is available as the first item in the <strong>Surface</strong> menu:</p>
<p><img src="https://i.imgur.com/oRMlex2.png" alt="" title="" /></p>
https://www.unidata.ucar.edu/blogs/developer/entry/requesting-grid-parameters-and-levelsRequesting Grid Parameters and Levels with python-awips$entry.creator.screenName2016-04-20T18:45:32-06:002016-05-12T10:17:15-06:00<p>The <a href="http://python-awips.readthedocs.org/en/latest/index.html">Python AWIPS Data Access Framework</a> can be used to query available grid parameters and levels if given a known Grid name (as of AWIPS 15.1.3 we can not query derived parameters, only parameters which have been directly decoded). </p>
<p>The <a href="http://python-awips.readthedocs.org/en/latest/index.html">Python AWIPS Data Access Framework</a> can be used to query available grid parameters and levels if given a known Grid name (as of AWIPS 15.1.3 we can not query derived parameters, only parameters which have been directly decoded). </p>
<p>This example requests the U and V wind components for the GFS 40km CONUS and plots the wind speed (total vector) as a gridded contour (color-filled isotachs, essentially):</p>
<pre><code>from awips.dataaccess import DataAccessLayer
# Select grid
DataAccessLayer.changeEDEXHost("edex-cloud.unidata.ucar.edu")
request = DataAccessLayer.newDataRequest()
request.setDatatype("grid")
request.setLocationNames("RAP13")
</code></pre>
<p><strong>grid</strong> is given as the data type, and <strong>RAP13</strong> is given as the grid name. The function <strong>getAvailableParameters()</strong> returns a list of parameters:</p>
<pre><code># Print parm list
available_parms = DataAccessLayer.getAvailableParameters(request)
available_parms.sort()
for parm in available_parms:
print parm
</code></pre>
<p>printed as</p>
<pre><code> AV
BLI
CAPE
CFRZR6hr
CICEP6hr
CIn
CP6hr
CRAIN6hr
CSNOW6hr
GH
P
P6hr
PMSL
PVV
PW
RH
SLI
T
TP6hr
VSS
WEASD
WGH
uW
vW
</code></pre>
<h2>List Available Levels for Parameter</h2>
<p>Selecting the u wind component (uW) first and printing the return from <strong>getAvailableLevels()</strong>:</p>
<pre><code>request.setParameters("uW")
available_levels = DataAccessLayer.getAvailableLevels(request)
available_levels.sort()
for level in available_levels:
print level
</code></pre>
<p>prints as</p>
<pre><code> 1000.0MB
950.0MB
925.0MB
900.0MB
875.0MB
850.0MB
825.0MB
800.0MB
775.0MB
725.0MB
600.0MB
575.0MB
0.0_30.0BL
60.0_90.0BL
90.0_120.0BL
0.5PV
2.0PV
30.0_60.0BL
1.0PV
750.0MB
120.0_150.0BL
975.0MB
700.0MB
675.0MB
650.0MB
625.0MB
550.0MB
525.0MB
500.0MB
450.0MB
400.0MB
300.0MB
250.0MB
200.0MB
150.0MB
100.0MB
0.0TROP
1.5PV
150.0_180.0BL
350.0MB
10.0FHAG
0.0MAXW
</code></pre>
<h2>Construct Wind Field from U and V Components</h2>
<p>Calling <strong>setLevels("10.0FHAG")</strong> and selecting the last available time <code>t[-1]</code>:</p>
<pre><code>import numpy
from metpy.units import units
request.setLevels("10.0FHAG")
t = DataAccessLayer.getAvailableTimes(request)
# Select last time for u-wind
response = DataAccessLayer.getGridData(request, [t[-1]])
data_uw = response[-1]
lons,lats = data_uw.getLatLonCoords()
</code></pre>
<p>Requesting the grid for v wind componeents (vW):</p>
<pre><code>request.setParameters("vW")
response = DataAccessLayer.getGridData(request, [t[-1]])
data_vw = response[-1]
print 'Time :', t[-1]
print 'Model:', data_vw.getLocationName()
print 'Unit :', data_vw.getUnit()
print 'Parms :', data_uw.getParameter(), data_vw.getParameter()
print data_vw.getRawData().shape
</code></pre>
<p>prints as</p>
<pre><code> Time : 2016-04-20 18:00:00 (240)
Model: GFS40
Unit : m*sec^-1
Parms : vW vW
(185, 129)
windArray = [[ 1.47078204 1.69705617 0.69296461 ..., 6.98621511 ..., 0.91923875 1.24450791 1.28693426]]
</code></pre>
<h2>Calculate absolute wind speed from U and V</h2>
<p>The data objects <strong>data<em>uw.getRawData()</strong> and <strong>data</em>vw.getRawData()</strong></p>
<pre><code>spd = numpy.sqrt( data_uw.getRawData()**2 + data_vw.getRawData()**2 )
spd = spd * units.knot
print "windArray =", spd
</code></pre>
<h2>Plotting a Grid with Basemap</h2>
<p>Using <strong>matplotlib</strong>, <strong>numpy</strong>, and <strong>basemap</strong>:</p>
<pre><code>python
%matplotlib inline
import matplotlib.tri as mtri
import matplotlib.pyplot as plt
from matplotlib.transforms import offset_copy
from mpl_toolkits.basemap import Basemap, cm
import numpy as np
from numpy import linspace, transpose
from numpy import meshgrid
plt.figure(figsize=(12, 12), dpi=100)
map = Basemap(projection='cyl',
resolution = 'c',
llcrnrlon = lons.min(), llcrnrlat = lats.min(),
urcrnrlon =lons.max(), urcrnrlat = lats.max()
)
map.drawcoastlines()
map.drawstates()
map.drawcountries()
#
# We have to reproject our grid, see https://stackoverflow.com/questions/31822553/m
#
x = linspace(0, map.urcrnrx, data_uw.getRawData().shape[1])
y = linspace(0, map.urcrnry, data_uw.getRawData().shape[0])
xx, yy = meshgrid(x, y)
ngrid = len(x)
rlons = np.repeat(np.linspace(np.min(lons), np.max(lons), ngrid),
ngrid).reshape(ngrid, ngrid)
rlats = np.repeat(np.linspace(np.min(lats), np.max(lats), ngrid),
ngrid).reshape(ngrid, ngrid).T
tli = mtri.LinearTriInterpolator(mtri.Triangulation(lons.flatten(),
lats.flatten()), spd.flatten())
rdata = tli(rlons, rlats)
#cs = map.contourf(rlons, rlats, rdata, latlon=True)
cs = map.contourf(rlons, rlats, rdata, latlon=True, vmin=0, vmax=20, cmap='BuPu')
# Add colorbar
cbar = map.colorbar(cs,location='bottom',pad="5%")
cbar.set_label("Wind Speed (Knots)")
# Show plot
plt.show()
</code></pre>
<p><img src="http://python-awips.readthedocs.org/en/latest/_images/Grid_Levels_and_Parameters_7_0.png" alt="png" /></p>
<p>or use <strong>pcolormesh</strong> rather than <strong>contourf</strong></p>
<pre><code>python
plt.figure(figsize=(12, 12), dpi=100)
map = Basemap(projection='cyl',
resolution = 'c',
llcrnrlon = lons.min(), llcrnrlat = lats.min(),
urcrnrlon =lons.max(), urcrnrlat = lats.max()
)
map.drawcoastlines()
map.drawstates()
map.drawcountries()
cs = map.pcolormesh(rlons, rlats, rdata, latlon=True, vmin=0, vmax=20, cmap='BuPu')
</code></pre>
<p><img src="http://python-awips.readthedocs.org/en/latest/_images/Grid_Levels_and_Parameters_9_0.png" alt="png" /></p>
<h2>Plotting a Grid with Cartopy</h2>
<pre><code>python
import os
import matplotlib.pyplot as plt
import numpy as np
import iris
import cartopy.crs as ccrs
from cartopy import config
lon,lat = data.getLatLonCoords()
plt.figure(figsize=(12, 12), dpi=100)
ax = plt.axes(projection=ccrs.PlateCarree())
cs = plt.contourf(rlons, rlats, rdata, 60, transform=ccrs.PlateCarree(), vmin=0, vmax=20, cmap='BuPu')
ax.coastlines()
ax.gridlines()
# add colorbar
cbar = plt.colorbar(orientation='horizontal')
cbar.set_label("Wind Speed (Knots)")
plt.show()
</code></pre>
<p><img src="http://python-awips.readthedocs.org/en/latest/_images/Grid_Levels_and_Parameters_11_0.png" alt="png" /></p>
https://www.unidata.ucar.edu/blogs/developer/entry/mrms-in-awips-ii-14MRMS in AWIPS II 14.4.1$entry.creator.screenName2015-09-08T19:03:52-06:002024-03-05T10:00:34-07:00<p>If you direct your AWIPS II repo (<strong>/etc/yum.repos.d/awips2.repo</strong>) to point to <strong>https://www.unidata.ucar.edu/repos/yum/awips2-dev/</strong> (rather than https://www.unidata.ucar.edu/repos/yum/awips2/) you can install the latest development build of AWIPS II (currently 14.4.1-5n13), which has limited support for MRMS (Multi-Radar/Multi-Sensor) products available as grids.</p>
<p><img src="https://i.imgur.com/LD0ebkM.png ''" alt="" /></p>
https://www.unidata.ucar.edu/blogs/developer/entry/new_grids_added_for_awipsNew Grids Added for AWIPS II 14.4.1$entry.creator.screenName2015-05-01T09:58:43-06:002015-05-27T11:16:38-06:00<p>A quick look at some of the new models supported in Unidata AWIPS II 14.4.1, to be released Summer 2015.</p>A quick look at some of the new models supported in Unidata AWIPS II 14.4.1, to be released Summer 2015.
<br /><br />
GLERL - Great Lakes Coastal Forecasting System
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/GLERL.png' />
<br /><br />
NAVGEM Global 0.5 deg
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/NAVGEM.png' />
<br /><br />
Un-Restricted Mesoscale Analysis (URMA)
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/URMA.png' />
<br /><br />
Sea Ice Global 0.5 deg
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/SeaIce.png' />
<br /><br />
FNMOC WW3 Global 1.0 deg
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/FNMOC-WW3.png' />
<br /><br />
FNMOC Navy Coupled Ocean Data Assimilation (NCODA)
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/NCODA.png' />
<br /><br />
FNMOC Forecast of Aerosol Radiative Optical Properties (FAROP)
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/FAROP.png' />
<br /><br />
East-North Pacific Wave Model
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/ENPwave.png' />
<br /><br />
Pacific Hurricane Basin Wave Model
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/HurWave253-Pacific.png' />
<br /><br />
Atlantic Hurricane Basin Wave Model
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/HurWave238-Atlantic.png' />
<br /><br />
Global Wave Watch
<br /><br />
<img width='600' vspace='0' hspace='0' border='0' align='bottom' src='https://www.unidata.ucar.edu/software/awips2/images/GWW233.png' />