This commit is contained in:
srcarter3 2022-06-03 19:57:40 +00:00
parent b6a8c6ccd4
commit 29efc6045f
64 changed files with 1651 additions and 1214 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 212 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 254 KiB

View file

@ -13,6 +13,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../../../" id="documentation_options" src="../../../_static/documentation_options.js"></script>
<script src="../../../_static/jquery.js"></script>
<script src="../../../_static/underscore.js"></script>
<script src="../../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../../_static/doctools.js"></script>
<script src="../../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../../about.html" />

View file

@ -13,6 +13,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />

View file

@ -2,8 +2,60 @@
METAR Station Plot with MetPy
=============================
`Notebook <http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/METAR_Station_Plot_with_MetPy.ipynb>`_
This exercise creates a METAR plot for North America using AWIPS METAR
observations (datatype *obs*) and MetPy.
Python-AWIPS Tutorial Notebook
--------------
Objectives
==========
- Use python-awips to connect to an edex server
- Define and filter data request for METAR surface obs
- Extract necessary data and reformat it for plotting
- Stylize and plot METAR station data using Cartopy, Matplotlib, and
MetPy
--------------
Table of Contents
-----------------
| `1
Imports <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#imports>`__\
| `2 Function:
get_cloud_cover() <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#function-get-cloud-cover>`__\
| `3 Initial
Setup <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#initial-setup>`__\
|     `3.1 Initial EDEX
Connection <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#initial-edex-connection>`__\
|     `3.2 Setting Connection Location
Names <https://unidata.github.io/python-awips/examples/generated/WMETAR_Station_Plot_with_MetPy.html#setting-connection-location-names>`__\
| `4 Filter by
Time <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#filter-by-time>`__\
| `5 Use the
Data! <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#use-the-data>`__\
|     `5.1 Get the
Data! <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#get-the-data>`__\
|     `5.2 Extract all
Parameters <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#extract-all-parameters>`__\
|     `5.3 Populate the Data
Dictionary <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#populate-the-data-dictionary>`__\
| `6 Plot the
Data! <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#plot-the-data>`__\
| `7 See
Also <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#see-also>`__\
|     `7.1 Related
Notebooks <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#related-notebooks>`__\
|     `7.2 Additional
Documentation <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html#additional-documentation>`__\
1 Imports
---------
The imports below are used throughout the notebook. Note the first two
imports are coming directly from python-awips and allow us to connect to
an EDEX server, and define a timrange used for filtering the data. The
subsequent imports are for data manipulation and visualization.
.. code:: ipython3
@ -15,36 +67,53 @@ observations (datatype *obs*) and MetPy.
import cartopy.feature as cfeature
import matplotlib.pyplot as plt
from metpy.calc import wind_components
from metpy.plots import StationPlot, StationPlotLayout
from metpy.plots import StationPlot, StationPlotLayout, sky_cover
from metpy.units import units
import warnings
%matplotlib inline
warnings.filterwarnings("ignore",category =RuntimeWarning)
`Top <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html>`__
--------------
2 Function: get_cloud_cover()
-----------------------------
Returns the cloud fraction values as integer codes (0 through 8).
.. code:: ipython3
def get_cloud_cover(code):
if 'OVC' in code:
return 1.0
return 8
elif 'BKN' in code:
return 6.0/8.0
return 6
elif 'SCT' in code:
return 4.0/8.0
return 4
elif 'FEW' in code:
return 2.0/8.0
return 2
else:
return 0
# Pull out these specific stations (prepend K for AWIPS identifiers)
selected = ['PDX', 'OKC', 'ICT', 'GLD', 'MEM', 'BOS', 'MIA', 'MOB', 'ABQ', 'PHX', 'TTF',
'ORD', 'BIL', 'BIS', 'CPR', 'LAX', 'ATL', 'MSP', 'SLC', 'DFW', 'NYC', 'PHL',
'PIT', 'IND', 'OLY', 'SYR', 'LEX', 'CHS', 'TLH', 'HOU', 'GJT', 'LBB', 'LSV',
'GRB', 'CLT', 'LNK', 'DSM', 'BOI', 'FSD', 'RAP', 'RIC', 'JAN', 'HSV', 'CRW',
'SAT', 'BUY', '0CO', 'ZPC', 'VIH', 'BDG', 'MLF', 'ELY', 'WMC', 'OTH', 'CAR',
'LMT', 'RDM', 'PDT', 'SEA', 'UIL', 'EPH', 'PUW', 'COE', 'MLP', 'PIH', 'IDA',
'MSO', 'ACV', 'HLN', 'BIL', 'OLF', 'RUT', 'PSM', 'JAX', 'TPA', 'SHV', 'MSY',
'ELP', 'RNO', 'FAT', 'SFO', 'NYL', 'BRO', 'MRF', 'DRT', 'FAR', 'BDE', 'DLH',
'HOT', 'LBF', 'FLG', 'CLE', 'UNV']
selected = ['K{0}'.format(id) for id in selected]
data_arr = []
`Top <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html>`__
--------------
3 Initial Setup
---------------
3.1 Initial EDEX Connection
~~~~~~~~~~~~~~~~~~~~~~~~~~~
First we establish a connection to Unidatas public EDEX server. With
that connection made, we can create a `new data request
object <http://unidata.github.io/python-awips/api/IDataRequest.html>`__
and set the data type to **obs**.
Then, because were going to uses MetPys
`StationPlot <https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlot.html>`__
and
`StationPlotLayout <https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlotLayout.html>`__
we need to define several parameters, and then set them on the data
request object.
.. code:: ipython3
@ -52,21 +121,52 @@ observations (datatype *obs*) and MetPy.
edexServer = "edex-cloud.unidata.ucar.edu"
DataAccessLayer.changeEDEXHost(edexServer)
request = DataAccessLayer.newDataRequest("obs")
availableProducts = DataAccessLayer.getAvailableParameters(request)
# define desired parameters
single_value_params = ["timeObs", "stationName", "longitude", "latitude",
"temperature", "dewpoint", "windDir",
"windSpeed", "seaLevelPress"]
multi_value_params = ["presWeather", "skyCover", "skyLayerBase"]
pres_weather, sky_cov, sky_layer_base = [],[],[]
params = single_value_params + multi_value_params
obs = dict({params: [] for params in params})
"windSpeed"]
multi_value_params = ["skyCover"]
params = single_value_params + multi_value_params
# set all parameters on the request
request.setParameters(*(params))
3.2 Setting Connection Location Names
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
We are also going to define specific station IDs so that our plot is not
too cluttered.
.. code:: ipython3
# Define a list of station IDs to plot
selected = ['KPDX', 'KOKC', 'KICT', 'KGLD', 'KMEM', 'KBOS', 'KMIA', 'KMOB', 'KABQ', 'KPHX', 'KTTF',
'KORD', 'KBIL', 'KBIS', 'KCPR', 'KLAX', 'KATL', 'KMSP', 'KSLC', 'KDFW', 'KNYC', 'KPHL',
'KPIT', 'KIND', 'KOLY', 'KSYR', 'KLEX', 'KCHS', 'KTLH', 'KHOU', 'KGJT', 'KLBB', 'KLSV',
'KGRB', 'KCLT', 'KLNK', 'KDSM', 'KBOI', 'KFSD', 'KRAP', 'KRIC', 'KJAN', 'KHSV', 'KCRW',
'KSAT', 'KBUY', 'K0CO', 'KZPC', 'KVIH', 'KBDG', 'KMLF', 'KELY', 'KWMC', 'KOTH', 'KCAR',
'KLMT', 'KRDM', 'KPDT', 'KSEA', 'KUIL', 'KEPH', 'KPUW', 'KCOE', 'KMLP', 'KPIH', 'KIDA',
'KMSO', 'KACV', 'KHLN', 'KBIL', 'KOLF', 'KRUT', 'KPSM', 'KJAX', 'KTPA', 'KSHV', 'KMSY',
'KELP', 'KRNO', 'KFAT', 'KSFO', 'KNYL', 'KBRO', 'KMRF', 'KDRT', 'KFAR', 'KBDE', 'KDLH',
'KHOT', 'KLBF', 'KFLG', 'KCLE', 'KUNV']
# set the location names to the desired station IDs
request.setLocationNames(*(selected))
Here we use the Python-AWIPS class **TimeRange** to prepare a beginning
and end time span for requesting observations (the last hour):
`Top <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html>`__
--------------
4 Filter by Time
----------------
Here we decide how much data we want to pull from EDEX. By default well
request 1 hour, but that value can easily be modified by `adjusting the
``timedelta(hours = 1)`` <https://docs.python.org/3/library/datetime.html#timedelta-objects>`__
in line ``2``. The more data we request, the longer this section will
take to run.
.. code:: ipython3
@ -77,19 +177,64 @@ and end time span for requesting observations (the last hour):
endRange = datetime.strptime( start + ":59:59", "%Y-%m-%d %H:%M:%S")
timerange = TimeRange(beginRange, endRange)
response = DataAccessLayer.getGeometryData(request,timerange)
`Top <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html>`__
--------------
5 Use the Data!
---------------
5.1 Get the Data!
~~~~~~~~~~~~~~~~~
Now that we have our ``request`` and TimeRange ``timerange`` objects
ready, were ready to get the data array from EDEX.
.. code:: ipython3
# Get response
response = DataAccessLayer.getGeometryData(request,timerange)
5.2 Extract all Parameters
~~~~~~~~~~~~~~~~~~~~~~~~~~
In this section we start gathering all the information well need to
properly display our data. First we create an empty dictionary and array
to keep track of all data and unique station IDs. We also create a
boolean to help us only grab the first entry for ``skyCover`` related to
a station id.
.. container:: alert-info
::
<b>Note:</b> The way the data responses are returned, we recieve many <code>skyCover</code> entries for each station ID, but we only want to keep track of the most recent one (first one returned).
After defining these variables, we are ready to start looping through
our response data. If the response is an entry of ``skyCover``, and this
is a new station id, then set the skyCover value in the obs dictionary.
If this is not a skyCover entry, then explicitly set the ``timeObs``
variable (because we have to manipulate it slightly), and dynamically
set all the remaining parameters.
.. code:: ipython3
# define a dictionary and array that will be populated from our for loop below
obs = dict({params: [] for params in params})
station_names = []
# only grab the first skyCover record related to a station
new_station_id = True
# cycle through all the data in the response
for ob in response:
avail_params = ob.getParameters()
if "presWeather" in avail_params:
pres_weather.append(ob.getString("presWeather"))
elif "skyCover" in avail_params and "skyLayerBase" in avail_params:
sky_cov.append(ob.getString("skyCover"))
sky_layer_base.append(ob.getNumber("skyLayerBase"))
else:
# if it has cloud information and is the first entry for this station id
if "skyCover" in avail_params and new_station_id:
# store the associated cloud cover int for the skyCover string
obs['skyCover'].append(get_cloud_cover(ob.getString("skyCover")))
new_station_id = False
elif "stationName" in avail_params:
new_station_id=True
# If we already have a record for this stationName, skip
if ob.getString('stationName') not in station_names:
station_names.append(ob.getString('stationName'))
@ -105,20 +250,13 @@ and end time span for requesting observations (the last hour):
else:
obs[param].append(None)
obs['presWeather'].append(pres_weather);
obs['skyCover'].append(sky_cov);
obs['skyLayerBase'].append(sky_layer_base);
pres_weather = []
sky_cov = []
sky_layer_base = []
5.3 Populate the Data Dictionary
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Next grab the simple variables out of the data we have (attaching
correct units), and put them into a dictionary that we will hand the
plotting function later:
- Get wind components from speed and direction
- Convert cloud fraction values to integer codes [0 - 8]
- Map METAR weather codes to WMO codes for weather symbols
Next grab the variables out of the obs dictionary we just populated,
attach correct units, (calculate their components, in the instance of
wind) and put them into a new dictionary that we will hand the plotting
function later.
.. code:: ipython3
@ -128,7 +266,6 @@ plotting function later:
data['longitude'] = np.array(obs['longitude'])
data['air_temperature'] = np.array(obs['temperature'], dtype=float)* units.degC
data['dew_point_temperature'] = np.array(obs['dewpoint'], dtype=float)* units.degC
data['air_pressure_at_sea_level'] = np.array(obs['seaLevelPress'])* units('mbar')
direction = np.array(obs['windDir'])
direction[direction == -9999.0] = 'nan'
@ -136,37 +273,35 @@ plotting function later:
u, v = wind_components(np.array(obs['windSpeed']) * units('knots'),
direction * units.degree)
data['eastward_wind'], data['northward_wind'] = u, v
data['cloud_coverage'] = [int(get_cloud_cover(x)*8) for x in obs['skyCover']]
data['present_weather'] = obs['presWeather']
data['cloud_coverage'] = np.array(obs['skyCover'])
.. code:: ipython3
`Top <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html>`__
print(obs['stationName'])
--------------
6 Plot the Data!
----------------
.. parsed-literal::
Now we have all the data we need to create our plot! First well assign
a projection and create our figure and axes.
['K0CO', 'KHOT', 'KSHV', 'KIND', 'KBDE', 'KPSM', 'KORD', 'KDFW', 'KPHL', 'KTTF', 'KBDG', 'KOLY', 'KNYC', 'KABQ', 'KLEX', 'KDRT', 'KELP', 'KRUT', 'KRIC', 'KPIT', 'KMSP', 'KHSV', 'KUNV', 'KSAT', 'KCLE', 'KPHX', 'KMIA', 'KBOI', 'KBRO', 'KLAX', 'KLBB', 'KMSO', 'KPDX', 'KTLH', 'KUIL', 'KTPA', 'KVIH', 'KBIL', 'KMLF', 'KCPR', 'KATL', 'KBIS', 'KCLT', 'KOKC', 'KRAP', 'KACV', 'KEPH', 'KELY', 'KFAR', 'KFAT', 'KMSY', 'KOLF', 'KPDT', 'KLMT', 'KHLN', 'KHOU', 'KICT', 'KIDA', 'KPIH', 'KPUW', 'KGJT', 'KGLD', 'KGRB', 'KLBF', 'KMLP', 'KBOS', 'KSYR', 'KDLH', 'KCOE', 'KOTH', 'KCRW', 'KSEA', 'KCAR', 'KDSM', 'KJAN', 'KSLC', 'KBUY', 'KLNK', 'KMEM', 'KNYL', 'KRDM', 'KCHS', 'KFSD', 'KJAX', 'KMOB', 'KRNO', 'KSFO', 'KWMC', 'KFLG', 'KLSV']
Next, we use Cartopy to add common features (land, ocean, lakes,
borders, etc) to help give us a more contextual map of the United States
to plot the METAR stations on. We create and add a title for our figure
as well.
Additionally, we use `MetPys
StationPlotLayout <https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlotLayout.html>`__
to instantiate a custom layout and define all the attributes we want
displayed. We need to then set the data dictionary (containing all of
our data values) on the custom layout so it knows what to draw.
MetPy Surface Obs Plot
----------------------
Finally, we display the plot!
.. code:: ipython3
proj = ccrs.LambertConformal(central_longitude=-95, central_latitude=35,
standard_parallels=[35])
# Change the DPI of the figure
plt.rcParams['savefig.dpi'] = 255
# Winds, temps, dewpoint, station id
custom_layout = StationPlotLayout()
custom_layout.add_barb('eastward_wind', 'northward_wind', units='knots')
custom_layout.add_value('NW', 'air_temperature', fmt='.0f', units='degF', color='darkred')
custom_layout.add_value('SW', 'dew_point_temperature', fmt='.0f', units='degF', color='darkgreen')
custom_layout.add_value('E', 'precipitation', fmt='0.1f', units='inch', color='blue')
# Create the figure
fig = plt.figure(figsize=(20, 10))
ax = fig.add_subplot(1, 1, 1, projection=proj)
@ -183,13 +318,87 @@ MetPy Surface Obs Plot
ax.set_extent((-118, -73, 23, 50))
ax.set_title(str(ob.getDataTime()) + " | METAR | " + edexServer)
# Winds, temps, dewpoint, station id
custom_layout = StationPlotLayout()
custom_layout.add_barb('eastward_wind', 'northward_wind', units='knots')
custom_layout.add_value('NW', 'air_temperature', fmt='.0f', units='degF', color='darkred')
custom_layout.add_value('SW', 'dew_point_temperature', fmt='.0f', units='degF', color='darkgreen')
custom_layout.add_symbol('C', 'cloud_coverage', sky_cover)
stationplot = StationPlot(ax, data['longitude'], data['latitude'], clip_on=True,
transform=ccrs.PlateCarree(), fontsize=10)
stationplot.plot_text((2, 0), data['stid'])
custom_layout.plot(stationplot, data)
plt.show()
.. image:: METAR_Station_Plot_with_MetPy_files/METAR_Station_Plot_with_MetPy_10_0.png
.. image:: METAR_Station_Plot_with_MetPy_files/METAR_Station_Plot_with_MetPy_26_0.png
`Top <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html>`__
--------------
7 See Also
----------
- `Aviation Weather Center Static METAR Plots
Information <https://www.aviationweather.gov/metar/help?page=plot>`__
7.1 Related Notebooks
~~~~~~~~~~~~~~~~~~~~~
- `Grid Levels and
Parameters <http://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html>`__
- `Colored Surface Temperature
Plot <http://unidata.github.io/python-awips/examples/generated/Colored_Surface_Temperature_Plot.html>`__
7.2 Additional Documentation
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
**python-awips:**
- `DataAccessLayer.changeEDEXHost() <http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.changeEDEXHost>`__
- `DataAccessLayer.newDataRequest() <http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.newDataRequest>`__
- `IDataRequest <http://unidata.github.io/python-awips/api/IDataRequest.html>`__
- `DataAccessLayer.getGeometryData <http://unidata.github.io/python-awips/api/PyGeometryData.html>`__
**datetime:**
- `datetime.datetime <https://docs.python.org/3/library/datetime.html#datetime-objects>`__
- `datetime.utcnow() <https://docs.python.org/3/library/datetime.html?#datetime.datetime.utcnow>`__
- `datetime.timedelta <https://docs.python.org/3/library/datetime.html#timedelta-objects>`__
- `datetime.strftime() and
datetime.strptime() <https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior>`__
**numpy:**
- `np.array <https://numpy.org/doc/stable/reference/generated/numpy.array.html>`__
**cartopy:**
- `cartopy projection
list <https://scitools.org.uk/cartopy/docs/v0.14/crs/projections.html?#cartopy-projection-list>`__
- `cartopy feature
interface <https://scitools.org.uk/cartopy/docs/v0.14/matplotlib/feature_interface.html>`__
**matplotlib:**
- `matplotlib.pyplot() <https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html>`__
- `matplotlib.pyplot.figure() <https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.figure.html>`__
- `matplotlib.pyplot.figure.add_subplot <https://matplotlib.org/stable/api/figure_api.html#matplotlib.figure.Figure.add_subplot>`__
- `ax.set_extent <https://matplotlib.org/stable/api/image_api.html?highlight=set_extent#matplotlib.image.AxesImage.set_extent>`__
- `ax.set_title <https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html>`__
**metpy:**
- `metpy.calc.wind_components <https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_components.html>`__
- `metpy.plots.StationPlot() <https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlot.html>`__
- `metpy.plots.StationPlotLayout() <https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlotLayout.html>`__
- `metpy.units <https://unidata.github.io/MetPy/latest/api/generated/metpy.units.html>`__
`Top <https://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html>`__
--------------

View file

@ -0,0 +1,134 @@
/*
* _sphinx_javascript_frameworks_compat.js
* ~~~~~~~~~~
*
* Compatability shim for jQuery and underscores.js.
*
* WILL BE REMOVED IN Sphinx 6.0
* xref RemovedInSphinx60Warning
*
*/
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
}
}
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}

View file

@ -222,7 +222,7 @@ table.modindextable td {
/* -- general body styles --------------------------------------------------- */
div.body {
min-width: 450px;
min-width: 360px;
max-width: 800px;
}
@ -335,13 +335,13 @@ p.sidebar-title {
font-weight: bold;
}
div.admonition, div.topic, blockquote {
div.admonition, div.topic, aside.topic, blockquote {
clear: left;
}
/* -- topics ---------------------------------------------------------------- */
div.topic {
div.topic, aside.topic {
border: 1px solid #ccc;
padding: 7px;
margin: 10px 0 10px 0;
@ -380,6 +380,7 @@ div.body p.centered {
div.sidebar > :last-child,
aside.sidebar > :last-child,
div.topic > :last-child,
aside.topic > :last-child,
div.admonition > :last-child {
margin-bottom: 0;
}
@ -387,6 +388,7 @@ div.admonition > :last-child {
div.sidebar::after,
aside.sidebar::after,
div.topic::after,
aside.topic::after,
div.admonition::after,
blockquote::after {
display: block;
@ -428,10 +430,6 @@ table.docutils td, table.docutils th {
border-bottom: 1px solid #aaa;
}
table.footnote td, table.footnote th {
border: 0 !important;
}
th {
text-align: left;
padding-right: 5px;
@ -615,6 +613,7 @@ ul.simple p {
margin-bottom: 0;
}
/* Docutils 0.17 and older (footnotes & citations) */
dl.footnote > dt,
dl.citation > dt {
float: left;
@ -632,6 +631,33 @@ dl.citation > dd:after {
clear: both;
}
/* Docutils 0.18+ (footnotes & citations) */
aside.footnote > span,
div.citation > span {
float: left;
}
aside.footnote > span:last-of-type,
div.citation > span:last-of-type {
padding-right: 0.5em;
}
aside.footnote > p {
margin-left: 2em;
}
div.citation > p {
margin-left: 4em;
}
aside.footnote > p:last-of-type,
div.citation > p:last-of-type {
margin-bottom: 0em;
}
aside.footnote > p:last-of-type:after,
div.citation > p:last-of-type:after {
content: "";
clear: both;
}
/* Footnotes & citations ends */
dl.field-list {
display: grid;
grid-template-columns: fit-content(30%) auto;

View file

@ -2,357 +2,263 @@
* doctools.js
* ~~~~~~~~~~~
*
* Sphinx JavaScript utilities for all documentation.
* Base JavaScript utilities for all Sphinx HTML documentation.
*
* :copyright: Copyright 2007-2022 by the Sphinx team, see AUTHORS.
* :license: BSD, see LICENSE for details.
*
*/
"use strict";
/**
* select a different prefix for underscore
*/
$u = _.noConflict();
/**
* make the code below compatible with browsers without
* an installed firebug like debugger
if (!window.console || !console.firebug) {
var names = ["log", "debug", "info", "warn", "error", "assert", "dir",
"dirxml", "group", "groupEnd", "time", "timeEnd", "count", "trace",
"profile", "profileEnd"];
window.console = {};
for (var i = 0; i < names.length; ++i)
window.console[names[i]] = function() {};
const _ready = (callback) => {
if (document.readyState !== "loading") {
callback();
} else {
document.addEventListener("DOMContentLoaded", callback);
}
*/
/**
* small helper function to urldecode strings
*
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL
*/
jQuery.urldecode = function(x) {
if (!x) {
return x
}
return decodeURIComponent(x.replace(/\+/g, ' '));
};
/**
* small helper function to urlencode strings
*/
jQuery.urlencode = encodeURIComponent;
/**
* This function returns the parsed url parameters of the
* current request. Multiple values per key are supported,
* it will always return arrays of strings for the value parts.
*/
jQuery.getQueryParameters = function(s) {
if (typeof s === 'undefined')
s = document.location.search;
var parts = s.substr(s.indexOf('?') + 1).split('&');
var result = {};
for (var i = 0; i < parts.length; i++) {
var tmp = parts[i].split('=', 2);
var key = jQuery.urldecode(tmp[0]);
var value = jQuery.urldecode(tmp[1]);
if (key in result)
result[key].push(value);
else
result[key] = [value];
}
return result;
};
/**
* highlight a given string on a jquery object by wrapping it in
* highlight a given string on a node by wrapping it in
* span elements with the given class name.
*/
jQuery.fn.highlightText = function(text, className) {
function highlight(node, addItems) {
if (node.nodeType === 3) {
var val = node.nodeValue;
var pos = val.toLowerCase().indexOf(text);
if (pos >= 0 &&
!jQuery(node.parentNode).hasClass(className) &&
!jQuery(node.parentNode).hasClass("nohighlight")) {
var span;
var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg");
const _highlight = (node, addItems, text, className) => {
if (node.nodeType === Node.TEXT_NODE) {
const val = node.nodeValue;
const parent = node.parentNode;
const pos = val.toLowerCase().indexOf(text);
if (
pos >= 0 &&
!parent.classList.contains(className) &&
!parent.classList.contains("nohighlight")
) {
let span;
const closestNode = parent.closest("body, svg, foreignObject");
const isInSVG = closestNode && closestNode.matches("svg");
if (isInSVG) {
span = document.createElementNS("http://www.w3.org/2000/svg", "tspan");
} else {
span = document.createElement("span");
span.className = className;
span.classList.add(className);
}
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
node.parentNode.insertBefore(span, node.parentNode.insertBefore(
parent.insertBefore(
span,
parent.insertBefore(
document.createTextNode(val.substr(pos + text.length)),
node.nextSibling));
node.nextSibling
)
);
node.nodeValue = val.substr(0, pos);
if (isInSVG) {
var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect");
var bbox = node.parentElement.getBBox();
const rect = document.createElementNS(
"http://www.w3.org/2000/svg",
"rect"
);
const bbox = parent.getBBox();
rect.x.baseVal.value = bbox.x;
rect.y.baseVal.value = bbox.y;
rect.width.baseVal.value = bbox.width;
rect.height.baseVal.value = bbox.height;
rect.setAttribute('class', className);
addItems.push({
"parent": node.parentNode,
"target": rect});
rect.setAttribute("class", className);
addItems.push({ parent: parent, target: rect });
}
}
} else if (node.matches && !node.matches("button, select, textarea")) {
node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
}
else if (!jQuery(node).is("button, select, textarea")) {
jQuery.each(node.childNodes, function() {
highlight(this, addItems);
});
}
}
var addItems = [];
var result = this.each(function() {
highlight(this, addItems);
});
for (var i = 0; i < addItems.length; ++i) {
jQuery(addItems[i].parent).before(addItems[i].target);
}
return result;
};
/*
* backward compatibility for jQuery.browser
* This will be supported until firefox bug is fixed.
*/
if (!jQuery.browser) {
jQuery.uaMatch = function(ua) {
ua = ua.toLowerCase();
var match = /(chrome)[ \/]([\w.]+)/.exec(ua) ||
/(webkit)[ \/]([\w.]+)/.exec(ua) ||
/(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) ||
/(msie) ([\w.]+)/.exec(ua) ||
ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) ||
[];
return {
browser: match[ 1 ] || "",
version: match[ 2 ] || "0"
const _highlightText = (thisNode, text, className) => {
let addItems = [];
_highlight(thisNode, addItems, text, className);
addItems.forEach((obj) =>
obj.parent.insertAdjacentElement("beforebegin", obj.target)
);
};
};
jQuery.browser = {};
jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true;
}
/**
* Small JavaScript module for the documentation.
*/
var Documentation = {
init : function() {
this.fixFirefoxAnchorBug();
this.highlightSearchWords();
this.initIndexTable();
this.initOnKeyListeners();
const Documentation = {
init: () => {
Documentation.highlightSearchWords();
Documentation.initDomainIndexTable();
Documentation.initOnKeyListeners();
},
/**
* i18n support
*/
TRANSLATIONS: {},
PLURAL_EXPR : function(n) { return n === 1 ? 0 : 1; },
LOCALE : 'unknown',
PLURAL_EXPR: (n) => (n === 1 ? 0 : 1),
LOCALE: "unknown",
// gettext and ngettext don't access this so that the functions
// can safely bound to a different name (_ = Documentation.gettext)
gettext : function(string) {
var translated = Documentation.TRANSLATIONS[string];
if (typeof translated === 'undefined')
return string;
return (typeof translated === 'string') ? translated : translated[0];
gettext: (string) => {
const translated = Documentation.TRANSLATIONS[string];
switch (typeof translated) {
case "undefined":
return string; // no translation
case "string":
return translated; // translation exists
default:
return translated[0]; // (singular, plural) translation tuple exists
}
},
ngettext : function(singular, plural, n) {
var translated = Documentation.TRANSLATIONS[singular];
if (typeof translated === 'undefined')
return (n == 1) ? singular : plural;
return translated[Documentation.PLURALEXPR(n)];
ngettext: (singular, plural, n) => {
const translated = Documentation.TRANSLATIONS[singular];
if (typeof translated !== "undefined")
return translated[Documentation.PLURAL_EXPR(n)];
return n === 1 ? singular : plural;
},
addTranslations : function(catalog) {
for (var key in catalog.messages)
this.TRANSLATIONS[key] = catalog.messages[key];
this.PLURAL_EXPR = new Function('n', 'return +(' + catalog.plural_expr + ')');
this.LOCALE = catalog.locale;
},
/**
* add context elements like header anchor links
*/
addContextElements : function() {
$('div[id] > :header:first').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this headline')).
appendTo(this);
});
$('dt[id]').each(function() {
$('<a class="headerlink">\u00B6</a>').
attr('href', '#' + this.id).
attr('title', _('Permalink to this definition')).
appendTo(this);
});
},
/**
* workaround a firefox stupidity
* see: https://bugzilla.mozilla.org/show_bug.cgi?id=645075
*/
fixFirefoxAnchorBug : function() {
if (document.location.hash && $.browser.mozilla)
window.setTimeout(function() {
document.location.href += '';
}, 10);
addTranslations: (catalog) => {
Object.assign(Documentation.TRANSLATIONS, catalog.messages);
Documentation.PLURAL_EXPR = new Function(
"n",
`return (${catalog.plural_expr})`
);
Documentation.LOCALE = catalog.locale;
},
/**
* highlight the search words provided in the url in the text
*/
highlightSearchWords : function() {
var params = $.getQueryParameters();
var terms = (params.highlight) ? params.highlight[0].split(/\s+/) : [];
if (terms.length) {
var body = $('div.body');
if (!body.length) {
body = $('body');
}
window.setTimeout(function() {
$.each(terms, function() {
body.highlightText(this.toLowerCase(), 'highlighted');
});
}, 10);
$('<p class="highlight-link"><a href="javascript:Documentation.' +
'hideSearchWords()">' + _('Hide Search Matches') + '</a></p>')
.appendTo($('#searchbox'));
}
},
highlightSearchWords: () => {
const highlight =
new URLSearchParams(window.location.search).get("highlight") || "";
const terms = highlight.toLowerCase().split(/\s+/).filter(x => x);
if (terms.length === 0) return; // nothing to do
/**
* init the domain index toggle buttons
*/
initIndexTable : function() {
var togglers = $('img.toggler').click(function() {
var src = $(this).attr('src');
var idnum = $(this).attr('id').substr(7);
$('tr.cg-' + idnum).toggle();
if (src.substr(-9) === 'minus.png')
$(this).attr('src', src.substr(0, src.length-9) + 'plus.png');
else
$(this).attr('src', src.substr(0, src.length-8) + 'minus.png');
}).css('display', '');
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) {
togglers.click();
}
// There should never be more than one element matching "div.body"
const divBody = document.querySelectorAll("div.body");
const body = divBody.length ? divBody[0] : document.querySelector("body");
window.setTimeout(() => {
terms.forEach((term) => _highlightText(body, term, "highlighted"));
}, 10);
const searchBox = document.getElementById("searchbox");
if (searchBox === null) return;
searchBox.appendChild(
document
.createRange()
.createContextualFragment(
'<p class="highlight-link">' +
'<a href="javascript:Documentation.hideSearchWords()">' +
Documentation.gettext("Hide Search Matches") +
"</a></p>"
)
);
},
/**
* helper function to hide the search marks again
*/
hideSearchWords : function() {
$('#searchbox .highlight-link').fadeOut(300);
$('span.highlighted').removeClass('highlighted');
var url = new URL(window.location);
url.searchParams.delete('highlight');
window.history.replaceState({}, '', url);
hideSearchWords: () => {
document
.querySelectorAll("#searchbox .highlight-link")
.forEach((el) => el.remove());
document
.querySelectorAll("span.highlighted")
.forEach((el) => el.classList.remove("highlighted"));
const url = new URL(window.location);
url.searchParams.delete("highlight");
window.history.replaceState({}, "", url);
},
/**
* helper function to focus on search bar
*/
focusSearchBar : function() {
$('input[name=q]').first().focus();
focusSearchBar: () => {
document.querySelectorAll("input[name=q]")[0]?.focus();
},
/**
* make the url absolute
* Initialise the domain index toggle buttons
*/
makeURL : function(relativeURL) {
return DOCUMENTATION_OPTIONS.URL_ROOT + '/' + relativeURL;
initDomainIndexTable: () => {
const toggler = (el) => {
const idNumber = el.id.substr(7);
const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`);
if (el.src.substr(-9) === "minus.png") {
el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`;
toggledRows.forEach((el) => (el.style.display = "none"));
} else {
el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`;
toggledRows.forEach((el) => (el.style.display = ""));
}
};
const togglerElements = document.querySelectorAll("img.toggler");
togglerElements.forEach((el) =>
el.addEventListener("click", (event) => toggler(event.currentTarget))
);
togglerElements.forEach((el) => (el.style.display = ""));
if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler);
},
/**
* get the current relative url
*/
getCurrentURL : function() {
var path = document.location.pathname;
var parts = path.split(/\//);
$.each(DOCUMENTATION_OPTIONS.URL_ROOT.split(/\//), function() {
if (this === '..')
parts.pop();
});
var url = parts.join('/');
return path.substring(url.lastIndexOf('/') + 1, path.length - 1);
},
initOnKeyListeners: function() {
initOnKeyListeners: () => {
// only install a listener if it is really needed
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS)
if (
!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS &&
!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS
)
return;
$(document).keydown(function(event) {
var activeElementType = document.activeElement.tagName;
// don't navigate when in search box, textarea, dropdown or button
if (activeElementType !== 'TEXTAREA' && activeElementType !== 'INPUT' && activeElementType !== 'SELECT'
&& activeElementType !== 'BUTTON') {
if (event.altKey || event.ctrlKey || event.metaKey)
return;
const blacklistedElements = new Set([
"TEXTAREA",
"INPUT",
"SELECT",
"BUTTON",
]);
document.addEventListener("keydown", (event) => {
if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements
if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys
if (!event.shiftKey) {
switch (event.key) {
case 'ArrowLeft':
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS)
break;
var prevHref = $('link[rel="prev"]').prop('href');
if (prevHref) {
window.location.href = prevHref;
return false;
case "ArrowLeft":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const prevLink = document.querySelector('link[rel="prev"]');
if (prevLink && prevLink.href) {
window.location.href = prevLink.href;
event.preventDefault();
}
break;
case 'ArrowRight':
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS)
break;
var nextHref = $('link[rel="next"]').prop('href');
if (nextHref) {
window.location.href = nextHref;
return false;
case "ArrowRight":
if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break;
const nextLink = document.querySelector('link[rel="next"]');
if (nextLink && nextLink.href) {
window.location.href = nextLink.href;
event.preventDefault();
}
break;
case 'Escape':
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS)
break;
case "Escape":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.hideSearchWords();
return false;
event.preventDefault();
}
}
// some keyboard layouts may need Shift to get /
switch (event.key) {
case '/':
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS)
break;
case "/":
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
Documentation.focusSearchBar();
return false;
}
event.preventDefault();
}
});
}
},
};
// quick alias for translations
_ = Documentation.gettext;
const _ = Documentation.gettext;
$(document).ready(function() {
Documentation.init();
});
_ready(Documentation.init);

View file

@ -1,7 +1,7 @@
var DOCUMENTATION_OPTIONS = {
URL_ROOT: document.getElementById("documentation_options").getAttribute('data-url_root'),
VERSION: '',
LANGUAGE: 'None',
LANGUAGE: 'en',
COLLAPSE_INDEX: false,
BUILDER: 'html',
FILE_SUFFIX: '.html',
@ -10,5 +10,5 @@ var DOCUMENTATION_OPTIONS = {
SOURCELINK_SUFFIX: '.txt',
NAVIGATION_WITH_KEYS: false,
SHOW_SEARCH_SUMMARY: true,
ENABLE_SEARCH_SHORTCUTS: true,
ENABLE_SEARCH_SHORTCUTS: false,
};

View file

@ -1,15 +1,15 @@
/*!
* jQuery JavaScript Library v3.5.1
* jQuery JavaScript Library v3.6.0
* https://jquery.com/
*
* Includes Sizzle.js
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Copyright OpenJS Foundation and other contributors
* Released under the MIT license
* https://jquery.org/license
*
* Date: 2020-05-04T22:49Z
* Date: 2021-03-02T17:08Z
*/
( function( global, factory ) {
@ -80,7 +80,11 @@ var isFunction = function isFunction( obj ) {
// In some browsers, typeof returns "function" for HTML <object> elements
// (i.e., `typeof document.createElement( "object" ) === "function"`).
// We don't want to classify *any* DOM node as a function.
return typeof obj === "function" && typeof obj.nodeType !== "number";
// Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5
// Plus for old WebKit, typeof returns "function" for HTML collections
// (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756)
return typeof obj === "function" && typeof obj.nodeType !== "number" &&
typeof obj.item !== "function";
};
@ -147,7 +151,7 @@ function toType( obj ) {
var
version = "3.5.1",
version = "3.6.0",
// Define a local copy of jQuery
jQuery = function( selector, context ) {
@ -518,14 +522,14 @@ function isArrayLike( obj ) {
}
var Sizzle =
/*!
* Sizzle CSS Selector Engine v2.3.5
* Sizzle CSS Selector Engine v2.3.6
* https://sizzlejs.com/
*
* Copyright JS Foundation and other contributors
* Released under the MIT license
* https://js.foundation/
*
* Date: 2020-03-14
* Date: 2021-02-16
*/
( function( window ) {
var i,
@ -1108,8 +1112,8 @@ support = Sizzle.support = {};
* @returns {Boolean} True iff elem is a non-HTML XML node
*/
isXML = Sizzle.isXML = function( elem ) {
var namespace = elem.namespaceURI,
docElem = ( elem.ownerDocument || elem ).documentElement;
var namespace = elem && elem.namespaceURI,
docElem = elem && ( elem.ownerDocument || elem ).documentElement;
// Support: IE <=8
// Assume HTML when documentElement doesn't yet exist, such as inside loading iframes
@ -3026,7 +3030,7 @@ function nodeName( elem, name ) {
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
};
}
var rsingleTag = ( /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i );
@ -3997,8 +4001,8 @@ jQuery.extend( {
resolveContexts = Array( i ),
resolveValues = slice.call( arguments ),
// the master Deferred
master = jQuery.Deferred(),
// the primary Deferred
primary = jQuery.Deferred(),
// subordinate callback factory
updateFunc = function( i ) {
@ -4006,30 +4010,30 @@ jQuery.extend( {
resolveContexts[ i ] = this;
resolveValues[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
if ( !( --remaining ) ) {
master.resolveWith( resolveContexts, resolveValues );
primary.resolveWith( resolveContexts, resolveValues );
}
};
};
// Single- and empty arguments are adopted like Promise.resolve
if ( remaining <= 1 ) {
adoptValue( singleValue, master.done( updateFunc( i ) ).resolve, master.reject,
adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject,
!remaining );
// Use .then() to unwrap secondary thenables (cf. gh-3000)
if ( master.state() === "pending" ||
if ( primary.state() === "pending" ||
isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) {
return master.then();
return primary.then();
}
}
// Multiple arguments are aggregated like Promise.all array elements
while ( i-- ) {
adoptValue( resolveValues[ i ], updateFunc( i ), master.reject );
adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject );
}
return master.promise();
return primary.promise();
}
} );
@ -5089,10 +5093,7 @@ function buildFragment( elems, context, scripts, selection, ignored ) {
}
var
rkeyEvent = /^key/,
rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
var rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
function returnTrue() {
return true;
@ -5656,7 +5657,13 @@ function leverageNative( el, type, expectSync ) {
// Cancel the outer synthetic event
event.stopImmediatePropagation();
event.preventDefault();
return result.value;
// Support: Chrome 86+
// In Chrome, if an element having a focusout handler is blurred by
// clicking outside of it, it invokes the handler synchronously. If
// that handler calls `.remove()` on the element, the data is cleared,
// leaving `result` undefined. We need to guard against this.
return result && result.value;
}
// If this is an inner synthetic event for an event with a bubbling surrogate
@ -5821,34 +5828,7 @@ jQuery.each( {
targetTouches: true,
toElement: true,
touches: true,
which: function( event ) {
var button = event.button;
// Add which for key events
if ( event.which == null && rkeyEvent.test( event.type ) ) {
return event.charCode != null ? event.charCode : event.keyCode;
}
// Add which for click: 1 === left; 2 === middle; 3 === right
if ( !event.which && button !== undefined && rmouseEvent.test( event.type ) ) {
if ( button & 1 ) {
return 1;
}
if ( button & 2 ) {
return 3;
}
if ( button & 4 ) {
return 2;
}
return 0;
}
return event.which;
}
which: true
}, jQuery.event.addProp );
jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) {
@ -5874,6 +5854,12 @@ jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateTyp
return true;
},
// Suppress native focus or blur as it's already being fired
// in leverageNative.
_default: function() {
return true;
},
delegateType: delegateType
};
} );
@ -6541,6 +6527,10 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
// set in CSS while `offset*` properties report correct values.
// Behavior in IE 9 is more subtle than in newer versions & it passes
// some versions of this test; make sure not to make it pass there!
//
// Support: Firefox 70+
// Only Firefox includes border widths
// in computed dimensions. (gh-4529)
reliableTrDimensions: function() {
var table, tr, trChild, trStyle;
if ( reliableTrDimensionsVal == null ) {
@ -6548,17 +6538,32 @@ var rboxStyle = new RegExp( cssExpand.join( "|" ), "i" );
tr = document.createElement( "tr" );
trChild = document.createElement( "div" );
table.style.cssText = "position:absolute;left:-11111px";
table.style.cssText = "position:absolute;left:-11111px;border-collapse:separate";
tr.style.cssText = "border:1px solid";
// Support: Chrome 86+
// Height set through cssText does not get applied.
// Computed height then comes back as 0.
tr.style.height = "1px";
trChild.style.height = "9px";
// Support: Android 8 Chrome 86+
// In our bodyBackground.html iframe,
// display for all div elements is set to "inline",
// which causes a problem only in Android 8 Chrome 86.
// Ensuring the div is display: block
// gets around this issue.
trChild.style.display = "block";
documentElement
.appendChild( table )
.appendChild( tr )
.appendChild( trChild );
trStyle = window.getComputedStyle( tr );
reliableTrDimensionsVal = parseInt( trStyle.height ) > 3;
reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) +
parseInt( trStyle.borderTopWidth, 10 ) +
parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight;
documentElement.removeChild( table );
}
@ -7761,6 +7766,7 @@ jQuery.fn.extend( {
anim.stop( true );
}
};
doAnimation.finish = doAnimation;
return empty || optall.queue === false ?
@ -8707,9 +8713,7 @@ jQuery.extend( jQuery.event, {
special.bindType || type;
// jQuery handler
handle = (
dataPriv.get( cur, "events" ) || Object.create( null )
)[ event.type ] &&
handle = ( dataPriv.get( cur, "events" ) || Object.create( null ) )[ event.type ] &&
dataPriv.get( cur, "handle" );
if ( handle ) {
handle.apply( cur, data );
@ -8856,7 +8860,7 @@ var rquery = ( /\?/ );
// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
var xml;
var xml, parserErrorElem;
if ( !data || typeof data !== "string" ) {
return null;
}
@ -8865,12 +8869,17 @@ jQuery.parseXML = function( data ) {
// IE throws on parseFromString with invalid input.
try {
xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
} catch ( e ) {
xml = undefined;
}
} catch ( e ) {}
if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
jQuery.error( "Invalid XML: " + data );
parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ];
if ( !xml || parserErrorElem ) {
jQuery.error( "Invalid XML: " + (
parserErrorElem ?
jQuery.map( parserErrorElem.childNodes, function( el ) {
return el.textContent;
} ).join( "\n" ) :
data
) );
}
return xml;
};
@ -8971,16 +8980,14 @@ jQuery.fn.extend( {
// Can add propHook for "elements" to filter or add form elements
var elements = jQuery.prop( this, "elements" );
return elements ? jQuery.makeArray( elements ) : this;
} )
.filter( function() {
} ).filter( function() {
var type = this.type;
// Use .is( ":disabled" ) so that fieldset[disabled] works
return this.name && !jQuery( this ).is( ":disabled" ) &&
rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
( this.checked || !rcheckableType.test( type ) );
} )
.map( function( _i, elem ) {
} ).map( function( _i, elem ) {
var val = jQuery( this ).val();
if ( val == null ) {
@ -9033,6 +9040,7 @@ var
// Anchor tag for parsing the document origin
originAnchor = document.createElement( "a" );
originAnchor.href = location.href;
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
@ -9727,8 +9735,10 @@ jQuery.extend( {
response = ajaxHandleResponses( s, jqXHR, responses );
}
// Use a noop converter for missing script
if ( !isSuccess && jQuery.inArray( "script", s.dataTypes ) > -1 ) {
// Use a noop converter for missing script but not if jsonp
if ( !isSuccess &&
jQuery.inArray( "script", s.dataTypes ) > -1 &&
jQuery.inArray( "json", s.dataTypes ) < 0 ) {
s.converters[ "text script" ] = function() {};
}
@ -10466,12 +10476,6 @@ jQuery.offset = {
options.using.call( elem, props );
} else {
if ( typeof props.top === "number" ) {
props.top += "px";
}
if ( typeof props.left === "number" ) {
props.left += "px";
}
curElem.css( props );
}
}
@ -10640,8 +10644,11 @@ jQuery.each( [ "top", "left" ], function( _i, prop ) {
// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
function( defaultExtra, funcName ) {
jQuery.each( {
padding: "inner" + name,
content: type,
"": "outer" + name
}, function( defaultExtra, funcName ) {
// Margin is only for outerHeight, outerWidth
jQuery.fn[ funcName ] = function( margin, value ) {
@ -10726,7 +10733,8 @@ jQuery.fn.extend( {
}
} );
jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
jQuery.each(
( "blur focus focusin focusout resize scroll click dblclick " +
"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
"change select submit keydown keypress keyup contextmenu" ).split( " " ),
function( _i, name ) {
@ -10737,7 +10745,8 @@ jQuery.each( ( "blur focus focusin focusout resize scroll click dblclick " +
this.on( name, null, data, fn ) :
this.trigger( name );
};
} );
}
);

4
_static/jquery.js vendored

File diff suppressed because one or more lines are too long

View file

@ -197,101 +197,3 @@ var Stemmer = function() {
}
}
var splitChars = (function() {
var result = {};
var singles = [96, 180, 187, 191, 215, 247, 749, 885, 903, 907, 909, 930, 1014, 1648,
1748, 1809, 2416, 2473, 2481, 2526, 2601, 2609, 2612, 2615, 2653, 2702,
2706, 2729, 2737, 2740, 2857, 2865, 2868, 2910, 2928, 2948, 2961, 2971,
2973, 3085, 3089, 3113, 3124, 3213, 3217, 3241, 3252, 3295, 3341, 3345,
3369, 3506, 3516, 3633, 3715, 3721, 3736, 3744, 3748, 3750, 3756, 3761,
3781, 3912, 4239, 4347, 4681, 4695, 4697, 4745, 4785, 4799, 4801, 4823,
4881, 5760, 5901, 5997, 6313, 7405, 8024, 8026, 8028, 8030, 8117, 8125,
8133, 8181, 8468, 8485, 8487, 8489, 8494, 8527, 11311, 11359, 11687, 11695,
11703, 11711, 11719, 11727, 11735, 12448, 12539, 43010, 43014, 43019, 43587,
43696, 43713, 64286, 64297, 64311, 64317, 64319, 64322, 64325, 65141];
var i, j, start, end;
for (i = 0; i < singles.length; i++) {
result[singles[i]] = true;
}
var ranges = [[0, 47], [58, 64], [91, 94], [123, 169], [171, 177], [182, 184], [706, 709],
[722, 735], [741, 747], [751, 879], [888, 889], [894, 901], [1154, 1161],
[1318, 1328], [1367, 1368], [1370, 1376], [1416, 1487], [1515, 1519], [1523, 1568],
[1611, 1631], [1642, 1645], [1750, 1764], [1767, 1773], [1789, 1790], [1792, 1807],
[1840, 1868], [1958, 1968], [1970, 1983], [2027, 2035], [2038, 2041], [2043, 2047],
[2070, 2073], [2075, 2083], [2085, 2087], [2089, 2307], [2362, 2364], [2366, 2383],
[2385, 2391], [2402, 2405], [2419, 2424], [2432, 2436], [2445, 2446], [2449, 2450],
[2483, 2485], [2490, 2492], [2494, 2509], [2511, 2523], [2530, 2533], [2546, 2547],
[2554, 2564], [2571, 2574], [2577, 2578], [2618, 2648], [2655, 2661], [2672, 2673],
[2677, 2692], [2746, 2748], [2750, 2767], [2769, 2783], [2786, 2789], [2800, 2820],
[2829, 2830], [2833, 2834], [2874, 2876], [2878, 2907], [2914, 2917], [2930, 2946],
[2955, 2957], [2966, 2968], [2976, 2978], [2981, 2983], [2987, 2989], [3002, 3023],
[3025, 3045], [3059, 3076], [3130, 3132], [3134, 3159], [3162, 3167], [3170, 3173],
[3184, 3191], [3199, 3204], [3258, 3260], [3262, 3293], [3298, 3301], [3312, 3332],
[3386, 3388], [3390, 3423], [3426, 3429], [3446, 3449], [3456, 3460], [3479, 3481],
[3518, 3519], [3527, 3584], [3636, 3647], [3655, 3663], [3674, 3712], [3717, 3718],
[3723, 3724], [3726, 3731], [3752, 3753], [3764, 3772], [3774, 3775], [3783, 3791],
[3802, 3803], [3806, 3839], [3841, 3871], [3892, 3903], [3949, 3975], [3980, 4095],
[4139, 4158], [4170, 4175], [4182, 4185], [4190, 4192], [4194, 4196], [4199, 4205],
[4209, 4212], [4226, 4237], [4250, 4255], [4294, 4303], [4349, 4351], [4686, 4687],
[4702, 4703], [4750, 4751], [4790, 4791], [4806, 4807], [4886, 4887], [4955, 4968],
[4989, 4991], [5008, 5023], [5109, 5120], [5741, 5742], [5787, 5791], [5867, 5869],
[5873, 5887], [5906, 5919], [5938, 5951], [5970, 5983], [6001, 6015], [6068, 6102],
[6104, 6107], [6109, 6111], [6122, 6127], [6138, 6159], [6170, 6175], [6264, 6271],
[6315, 6319], [6390, 6399], [6429, 6469], [6510, 6511], [6517, 6527], [6572, 6592],
[6600, 6607], [6619, 6655], [6679, 6687], [6741, 6783], [6794, 6799], [6810, 6822],
[6824, 6916], [6964, 6980], [6988, 6991], [7002, 7042], [7073, 7085], [7098, 7167],
[7204, 7231], [7242, 7244], [7294, 7400], [7410, 7423], [7616, 7679], [7958, 7959],
[7966, 7967], [8006, 8007], [8014, 8015], [8062, 8063], [8127, 8129], [8141, 8143],
[8148, 8149], [8156, 8159], [8173, 8177], [8189, 8303], [8306, 8307], [8314, 8318],
[8330, 8335], [8341, 8449], [8451, 8454], [8456, 8457], [8470, 8472], [8478, 8483],
[8506, 8507], [8512, 8516], [8522, 8525], [8586, 9311], [9372, 9449], [9472, 10101],
[10132, 11263], [11493, 11498], [11503, 11516], [11518, 11519], [11558, 11567],
[11622, 11630], [11632, 11647], [11671, 11679], [11743, 11822], [11824, 12292],
[12296, 12320], [12330, 12336], [12342, 12343], [12349, 12352], [12439, 12444],
[12544, 12548], [12590, 12592], [12687, 12689], [12694, 12703], [12728, 12783],
[12800, 12831], [12842, 12880], [12896, 12927], [12938, 12976], [12992, 13311],
[19894, 19967], [40908, 40959], [42125, 42191], [42238, 42239], [42509, 42511],
[42540, 42559], [42592, 42593], [42607, 42622], [42648, 42655], [42736, 42774],
[42784, 42785], [42889, 42890], [42893, 43002], [43043, 43055], [43062, 43071],
[43124, 43137], [43188, 43215], [43226, 43249], [43256, 43258], [43260, 43263],
[43302, 43311], [43335, 43359], [43389, 43395], [43443, 43470], [43482, 43519],
[43561, 43583], [43596, 43599], [43610, 43615], [43639, 43641], [43643, 43647],
[43698, 43700], [43703, 43704], [43710, 43711], [43715, 43738], [43742, 43967],
[44003, 44015], [44026, 44031], [55204, 55215], [55239, 55242], [55292, 55295],
[57344, 63743], [64046, 64047], [64110, 64111], [64218, 64255], [64263, 64274],
[64280, 64284], [64434, 64466], [64830, 64847], [64912, 64913], [64968, 65007],
[65020, 65135], [65277, 65295], [65306, 65312], [65339, 65344], [65371, 65381],
[65471, 65473], [65480, 65481], [65488, 65489], [65496, 65497]];
for (i = 0; i < ranges.length; i++) {
start = ranges[i][0];
end = ranges[i][1];
for (j = start; j <= end; j++) {
result[j] = true;
}
}
return result;
})();
function splitQuery(query) {
var result = [];
var start = -1;
for (var i = 0; i < query.length; i++) {
if (splitChars[query.charCodeAt(i)]) {
if (start !== -1) {
result.push(query.slice(start, i));
start = -1;
}
} else if (start === -1) {
start = i;
}
}
if (start !== -1) {
result.push(query.slice(start));
}
return result;
}

View file

@ -8,18 +8,20 @@
* :license: BSD, see LICENSE for details.
*
*/
"use strict";
if (!Scorer) {
/**
* Simple result scoring code.
*/
if (typeof Scorer === "undefined") {
var Scorer = {
// Implement the following function to further tweak the score for each result
// The function takes a result array [filename, title, anchor, descr, score]
// The function takes a result array [docname, title, anchor, descr, score, filename]
// and returns the new score.
/*
score: function(result) {
return result[4];
score: result => {
const [docname, title, anchor, descr, score, filename] = result
return score
},
*/
@ -28,9 +30,11 @@ if (!Scorer) {
// or matches in the last dotted part of the object name
objPartialMatch: 6,
// Additive scores depending on the priority of the object
objPrio: {0: 15, // used to be importantResults
objPrio: {
0: 15, // used to be importantResults
1: 5, // used to be objectResults
2: -5}, // used to be unimportantResults
2: -5, // used to be unimportantResults
},
// Used when the priority is not in the mapping.
objPrioDefault: 0,
@ -39,452 +43,455 @@ if (!Scorer) {
partialTitle: 7,
// query found in terms
term: 5,
partialTerm: 2
partialTerm: 2,
};
}
if (!splitQuery) {
function splitQuery(query) {
return query.split(/\s+/);
const _removeChildren = (element) => {
while (element && element.lastChild) element.removeChild(element.lastChild);
};
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping
*/
const _escapeRegExp = (string) =>
string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string
const _displayItem = (item, highlightTerms, searchTerms) => {
const docBuilder = DOCUMENTATION_OPTIONS.BUILDER;
const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT;
const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX;
const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX;
const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY;
const [docName, title, anchor, descr] = item;
let listItem = document.createElement("li");
let requestUrl;
let linkUrl;
if (docBuilder === "dirhtml") {
// dirhtml builder
let dirname = docName + "/";
if (dirname.match(/\/index\/$/))
dirname = dirname.substring(0, dirname.length - 6);
else if (dirname === "index/") dirname = "";
requestUrl = docUrlRoot + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = docUrlRoot + docName + docFileSuffix;
linkUrl = docName + docLinkSuffix;
}
const params = new URLSearchParams();
params.set("highlight", [...highlightTerms].join(" "));
let linkEl = listItem.appendChild(document.createElement("a"));
linkEl.href = linkUrl + "?" + params.toString() + anchor;
linkEl.innerHTML = title;
if (descr)
listItem.appendChild(document.createElement("span")).innerText =
" (" + descr + ")";
else if (showSearchSummary)
fetch(requestUrl)
.then((responseData) => responseData.text())
.then((data) => {
if (data)
listItem.appendChild(
Search.makeSearchSummary(data, searchTerms, highlightTerms)
);
});
Search.output.appendChild(listItem);
};
const _finishSearch = (resultCount) => {
Search.stopPulse();
Search.title.innerText = _("Search Results");
if (!resultCount)
Search.status.innerText = Documentation.gettext(
"Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories."
);
else
Search.status.innerText = _(
`Search finished, found ${resultCount} page(s) matching the search query.`
);
};
const _displayNextItem = (
results,
resultCount,
highlightTerms,
searchTerms
) => {
// results left, load the summary and display it
// this is intended to be dynamic (don't sub resultsCount)
if (results.length) {
_displayItem(results.pop(), highlightTerms, searchTerms);
setTimeout(
() => _displayNextItem(results, resultCount, highlightTerms, searchTerms),
5
);
}
// search finished, update title and status message
else _finishSearch(resultCount);
};
/**
* Default splitQuery function. Can be overridden in ``sphinx.search`` with a
* custom function per language.
*
* The regular expression works by splitting the string on consecutive characters
* that are not Unicode letters, numbers, underscores, or emoji characters.
* This is the same as ``\W+`` in Python, preserving the surrogate pair area.
*/
if (typeof splitQuery === "undefined") {
var splitQuery = (query) => query
.split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu)
.filter(term => term) // remove remaining empty strings
}
/**
* Search Module
*/
var Search = {
const Search = {
_index: null,
_queued_query: null,
_pulse_status: -1,
htmlToText : function(htmlString) {
var virtualDocument = document.implementation.createHTMLDocument('virtual');
var htmlElement = $(htmlString, virtualDocument);
htmlElement.find('.headerlink').remove();
docContent = htmlElement.find('[role=main]')[0];
if(docContent === undefined) {
console.warn("Content block not found. Sphinx search tries to obtain it " +
"via '[role=main]'. Could you check your theme or template.");
htmlToText: (htmlString) => {
const htmlElement = document
.createRange()
.createContextualFragment(htmlString);
_removeChildren(htmlElement.querySelectorAll(".headerlink"));
const docContent = htmlElement.querySelector('[role="main"]');
if (docContent !== undefined) return docContent.textContent;
console.warn(
"Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template."
);
return "";
}
return docContent.textContent || docContent.innerText;
},
init : function() {
var params = $.getQueryParameters();
if (params.q) {
var query = params.q[0];
$('input[name="q"]')[0].value = query;
this.performSearch(query);
init: () => {
const query = new URLSearchParams(window.location.search).get("q");
document
.querySelectorAll('input[name="q"]')
.forEach((el) => (el.value = query));
if (query) Search.performSearch(query);
},
loadIndex: (url) =>
(document.body.appendChild(document.createElement("script")).src = url),
setIndex: (index) => {
Search._index = index;
if (Search._queued_query !== null) {
const query = Search._queued_query;
Search._queued_query = null;
Search.query(query);
}
},
loadIndex : function(url) {
$.ajax({type: "GET", url: url, data: null,
dataType: "script", cache: true,
complete: function(jqxhr, textstatus) {
if (textstatus != "success") {
document.getElementById("searchindexloader").src = url;
}
}});
},
hasIndex: () => Search._index !== null,
setIndex : function(index) {
var q;
this._index = index;
if ((q = this._queued_query) !== null) {
this._queued_query = null;
Search.query(q);
}
},
deferQuery: (query) => (Search._queued_query = query),
hasIndex : function() {
return this._index !== null;
},
stopPulse: () => (Search._pulse_status = -1),
deferQuery : function(query) {
this._queued_query = query;
},
startPulse: () => {
if (Search._pulse_status >= 0) return;
stopPulse : function() {
this._pulse_status = 0;
},
startPulse : function() {
if (this._pulse_status >= 0)
return;
function pulse() {
var i;
const pulse = () => {
Search._pulse_status = (Search._pulse_status + 1) % 4;
var dotString = '';
for (i = 0; i < Search._pulse_status; i++)
dotString += '.';
Search.dots.text(dotString);
if (Search._pulse_status > -1)
window.setTimeout(pulse, 500);
}
Search.dots.innerText = ".".repeat(Search._pulse_status);
if (Search._pulse_status >= 0) window.setTimeout(pulse, 500);
};
pulse();
},
/**
* perform a search for something (or wait until index is loaded)
*/
performSearch : function(query) {
performSearch: (query) => {
// create the required interface elements
this.out = $('#search-results');
this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out);
this.dots = $('<span></span>').appendTo(this.title);
this.status = $('<p class="search-summary">&nbsp;</p>').appendTo(this.out);
this.output = $('<ul class="search"/>').appendTo(this.out);
const searchText = document.createElement("h2");
searchText.textContent = _("Searching");
const searchSummary = document.createElement("p");
searchSummary.classList.add("search-summary");
searchSummary.innerText = "";
const searchList = document.createElement("ul");
searchList.classList.add("search");
$('#search-progress').text(_('Preparing search...'));
this.startPulse();
const out = document.getElementById("search-results");
Search.title = out.appendChild(searchText);
Search.dots = Search.title.appendChild(document.createElement("span"));
Search.status = out.appendChild(searchSummary);
Search.output = out.appendChild(searchList);
const searchProgress = document.getElementById("search-progress");
// Some themes don't use the search progress node
if (searchProgress) {
searchProgress.innerText = _("Preparing search...");
}
Search.startPulse();
// index already loaded, the browser was quick!
if (this.hasIndex())
this.query(query);
else
this.deferQuery(query);
if (Search.hasIndex()) Search.query(query);
else Search.deferQuery(query);
},
/**
* execute search (requires search index to be loaded)
*/
query : function(query) {
var i;
query: (query) => {
// stem the search terms and add them to the correct list
var stemmer = new Stemmer();
var searchterms = [];
var excluded = [];
var hlterms = [];
var tmp = splitQuery(query);
var objectterms = [];
for (i = 0; i < tmp.length; i++) {
if (tmp[i] !== "") {
objectterms.push(tmp[i].toLowerCase());
}
const stemmer = new Stemmer();
const searchTerms = new Set();
const excludedTerms = new Set();
const highlightTerms = new Set();
const objectTerms = new Set(splitQuery(query.toLowerCase().trim()));
splitQuery(query.trim()).forEach((queryTerm) => {
const queryTermLower = queryTerm.toLowerCase();
// maybe skip this "word"
// stopwords array is from language_data.js
if (
stopwords.indexOf(queryTermLower) !== -1 ||
queryTerm.match(/^\d+$/)
)
return;
if ($u.indexOf(stopwords, tmp[i].toLowerCase()) != -1 || tmp[i] === "") {
// skip this "word"
continue;
}
// stem the word
var word = stemmer.stemWord(tmp[i].toLowerCase());
var toAppend;
let word = stemmer.stemWord(queryTermLower);
// select the correct list
if (word[0] == '-') {
toAppend = excluded;
word = word.substr(1);
}
if (word[0] === "-") excludedTerms.add(word.substr(1));
else {
toAppend = searchterms;
hlterms.push(tmp[i].toLowerCase());
searchTerms.add(word);
highlightTerms.add(queryTermLower);
}
// only add if not already in the list
if (!$u.contains(toAppend, word))
toAppend.push(word);
}
var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" "));
});
// console.debug('SEARCH: searching for:');
// console.info('required: ', searchterms);
// console.info('excluded: ', excluded);
// console.debug("SEARCH: searching for:");
// console.info("required: ", [...searchTerms]);
// console.info("excluded: ", [...excludedTerms]);
// prepare search
var terms = this._index.terms;
var titleterms = this._index.titleterms;
// array of [filename, title, anchor, descr, score]
var results = [];
$('#search-progress').empty();
// array of [docname, title, anchor, descr, score, filename]
let results = [];
_removeChildren(document.getElementById("search-progress"));
// lookup as object
for (i = 0; i < objectterms.length; i++) {
var others = [].concat(objectterms.slice(0, i),
objectterms.slice(i+1, objectterms.length));
results = results.concat(this.performObjectSearch(objectterms[i], others));
}
objectTerms.forEach((term) =>
results.push(...Search.performObjectSearch(term, objectTerms))
);
// lookup as search terms in fulltext
results = results.concat(this.performTermsSearch(searchterms, excluded, terms, titleterms));
results.push(...Search.performTermsSearch(searchTerms, excludedTerms));
// let the scorer override scores with a custom scoring function
if (Scorer.score) {
for (i = 0; i < results.length; i++)
results[i][4] = Scorer.score(results[i]);
}
if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item)));
// now sort the results by score (in opposite order of appearance, since the
// display function below uses pop() to retrieve items) and then
// alphabetically
results.sort(function(a, b) {
var left = a[4];
var right = b[4];
if (left > right) {
return 1;
} else if (left < right) {
return -1;
} else {
results.sort((a, b) => {
const leftScore = a[4];
const rightScore = b[4];
if (leftScore === rightScore) {
// same score: sort alphabetically
left = a[1].toLowerCase();
right = b[1].toLowerCase();
return (left > right) ? -1 : ((left < right) ? 1 : 0);
const leftTitle = a[1].toLowerCase();
const rightTitle = b[1].toLowerCase();
if (leftTitle === rightTitle) return 0;
return leftTitle > rightTitle ? -1 : 1; // inverted is intentional
}
return leftScore > rightScore ? 1 : -1;
});
// remove duplicate search results
// note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept
let seen = new Set();
results = results.reverse().reduce((acc, result) => {
let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(',');
if (!seen.has(resultStr)) {
acc.push(result);
seen.add(resultStr);
}
return acc;
}, []);
results = results.reverse();
// for debugging
//Search.lastresults = results.slice(); // a copy
//console.info('search results:', Search.lastresults);
// console.info("search results:", Search.lastresults);
// print the results
var resultCount = results.length;
function displayNextItem() {
// results left, load the summary and display it
if (results.length) {
var item = results.pop();
var listItem = $('<li></li>');
var requestUrl = "";
var linkUrl = "";
if (DOCUMENTATION_OPTIONS.BUILDER === 'dirhtml') {
// dirhtml builder
var dirname = item[0] + '/';
if (dirname.match(/\/index\/$/)) {
dirname = dirname.substring(0, dirname.length-6);
} else if (dirname == 'index/') {
dirname = '';
}
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + dirname;
linkUrl = requestUrl;
} else {
// normal html builders
requestUrl = DOCUMENTATION_OPTIONS.URL_ROOT + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX;
linkUrl = item[0] + DOCUMENTATION_OPTIONS.LINK_SUFFIX;
}
listItem.append($('<a/>').attr('href',
linkUrl +
highlightstring + item[2]).html(item[1]));
if (item[3]) {
listItem.append($('<span> (' + item[3] + ')</span>'));
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
} else if (DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY) {
$.ajax({url: requestUrl,
dataType: "text",
complete: function(jqxhr, textstatus) {
var data = jqxhr.responseText;
if (data !== '' && data !== undefined) {
var summary = Search.makeSearchSummary(data, searchterms, hlterms);
if (summary) {
listItem.append(summary);
}
}
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
}});
} else {
// just display title
Search.output.append(listItem);
setTimeout(function() {
displayNextItem();
}, 5);
}
}
// search finished, update title and status message
else {
Search.stopPulse();
Search.title.text(_('Search Results'));
if (!resultCount)
Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.'));
else
Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount));
Search.status.fadeIn(500);
}
}
displayNextItem();
_displayNextItem(results, results.length, highlightTerms, searchTerms);
},
/**
* search for object names
*/
performObjectSearch : function(object, otherterms) {
var filenames = this._index.filenames;
var docnames = this._index.docnames;
var objects = this._index.objects;
var objnames = this._index.objnames;
var titles = this._index.titles;
performObjectSearch: (object, objectTerms) => {
const filenames = Search._index.filenames;
const docNames = Search._index.docnames;
const objects = Search._index.objects;
const objNames = Search._index.objnames;
const titles = Search._index.titles;
var i;
var results = [];
const results = [];
const objectSearchCallback = (prefix, match) => {
const name = match[4]
const fullname = (prefix ? prefix + "." : "") + name;
const fullnameLower = fullname.toLowerCase();
if (fullnameLower.indexOf(object) < 0) return;
let score = 0;
const parts = fullnameLower.split(".");
for (var prefix in objects) {
for (var iMatch = 0; iMatch != objects[prefix].length; ++iMatch) {
var match = objects[prefix][iMatch];
var name = match[4];
var fullname = (prefix ? prefix + '.' : '') + name;
var fullnameLower = fullname.toLowerCase()
if (fullnameLower.indexOf(object) > -1) {
var score = 0;
var parts = fullnameLower.split('.');
// check for different match types: exact matches of full name or
// "last name" (i.e. last dotted part)
if (fullnameLower == object || parts[parts.length - 1] == object) {
if (fullnameLower === object || parts.slice(-1)[0] === object)
score += Scorer.objNameMatch;
// matches in last name
} else if (parts[parts.length - 1].indexOf(object) > -1) {
score += Scorer.objPartialMatch;
}
var objname = objnames[match[1]][2];
var title = titles[match[0]];
else if (parts.slice(-1)[0].indexOf(object) > -1)
score += Scorer.objPartialMatch; // matches in last name
const objName = objNames[match[1]][2];
const title = titles[match[0]];
// If more than one term searched for, we require other words to be
// found in the name/title/description
if (otherterms.length > 0) {
var haystack = (prefix + ' ' + name + ' ' +
objname + ' ' + title).toLowerCase();
var allfound = true;
for (i = 0; i < otherterms.length; i++) {
if (haystack.indexOf(otherterms[i]) == -1) {
allfound = false;
break;
const otherTerms = new Set(objectTerms);
otherTerms.delete(object);
if (otherTerms.size > 0) {
const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase();
if (
[...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0)
)
return;
}
}
if (!allfound) {
continue;
}
}
var descr = objname + _(', in ') + title;
var anchor = match[3];
if (anchor === '')
anchor = fullname;
else if (anchor == '-')
anchor = objnames[match[1]][1] + '-' + fullname;
let anchor = match[3];
if (anchor === "") anchor = fullname;
else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname;
const descr = objName + _(", in ") + title;
// add custom score for some objects according to scorer
if (Scorer.objPrio.hasOwnProperty(match[2])) {
if (Scorer.objPrio.hasOwnProperty(match[2]))
score += Scorer.objPrio[match[2]];
} else {
score += Scorer.objPrioDefault;
}
results.push([docnames[match[0]], fullname, '#'+anchor, descr, score, filenames[match[0]]]);
}
}
}
else score += Scorer.objPrioDefault;
results.push([
docNames[match[0]],
fullname,
"#" + anchor,
descr,
score,
filenames[match[0]],
]);
};
Object.keys(objects).forEach((prefix) =>
objects[prefix].forEach((array) =>
objectSearchCallback(prefix, array)
)
);
return results;
},
/**
* See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions
*/
escapeRegExp : function(string) {
return string.replace(/[.*+\-?^${}()|[\]\\]/g, '\\$&'); // $& means the whole matched string
},
/**
* search for full-text terms in the index
*/
performTermsSearch : function(searchterms, excluded, terms, titleterms) {
var docnames = this._index.docnames;
var filenames = this._index.filenames;
var titles = this._index.titles;
performTermsSearch: (searchTerms, excludedTerms) => {
// prepare search
const terms = Search._index.terms;
const titleTerms = Search._index.titleterms;
const docNames = Search._index.docnames;
const filenames = Search._index.filenames;
const titles = Search._index.titles;
var i, j, file;
var fileMap = {};
var scoreMap = {};
var results = [];
const scoreMap = new Map();
const fileMap = new Map();
// perform the search on the required terms
for (i = 0; i < searchterms.length; i++) {
var word = searchterms[i];
var files = [];
var _o = [
searchTerms.forEach((word) => {
const files = [];
const arr = [
{ files: terms[word], score: Scorer.term },
{files: titleterms[word], score: Scorer.title}
{ files: titleTerms[word], score: Scorer.title },
];
// add support for partial matches
if (word.length > 2) {
var word_regex = this.escapeRegExp(word);
for (var w in terms) {
if (w.match(word_regex) && !terms[word]) {
_o.push({files: terms[w], score: Scorer.partialTerm})
}
}
for (var w in titleterms) {
if (w.match(word_regex) && !titleterms[word]) {
_o.push({files: titleterms[w], score: Scorer.partialTitle})
}
}
const escapedWord = _escapeRegExp(word);
Object.keys(terms).forEach((term) => {
if (term.match(escapedWord) && !terms[word])
arr.push({ files: terms[term], score: Scorer.partialTerm });
});
Object.keys(titleTerms).forEach((term) => {
if (term.match(escapedWord) && !titleTerms[word])
arr.push({ files: titleTerms[word], score: Scorer.partialTitle });
});
}
// no match but word was a required one
if ($u.every(_o, function(o){return o.files === undefined;})) {
break;
}
if (arr.every((record) => record.files === undefined)) return;
// found search word in contents
$u.each(_o, function(o) {
var _files = o.files;
if (_files === undefined)
return
arr.forEach((record) => {
if (record.files === undefined) return;
if (_files.length === undefined)
_files = [_files];
files = files.concat(_files);
let recordFiles = record.files;
if (recordFiles.length === undefined) recordFiles = [recordFiles];
files.push(...recordFiles);
// set score for the word in each file to Scorer.term
for (j = 0; j < _files.length; j++) {
file = _files[j];
if (!(file in scoreMap))
scoreMap[file] = {};
scoreMap[file][word] = o.score;
}
// set score for the word in each file
recordFiles.forEach((file) => {
if (!scoreMap.has(file)) scoreMap.set(file, {});
scoreMap.get(file)[word] = record.score;
});
});
// create the mapping
for (j = 0; j < files.length; j++) {
file = files[j];
if (file in fileMap && fileMap[file].indexOf(word) === -1)
fileMap[file].push(word);
else
fileMap[file] = [word];
}
}
files.forEach((file) => {
if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1)
fileMap.get(file).push(word);
else fileMap.set(file, [word]);
});
});
// now check if the files don't contain excluded terms
for (file in fileMap) {
var valid = true;
const results = [];
for (const [file, wordList] of fileMap) {
// check if all requirements are matched
var filteredTermCount = // as search terms with length < 3 are discarded: ignore
searchterms.filter(function(term){return term.length > 2}).length
// as search terms with length < 3 are discarded
const filteredTermCount = [...searchTerms].filter(
(term) => term.length > 2
).length;
if (
fileMap[file].length != searchterms.length &&
fileMap[file].length != filteredTermCount
) continue;
wordList.length !== searchTerms.size &&
wordList.length !== filteredTermCount
)
continue;
// ensure that none of the excluded terms is in the search result
for (i = 0; i < excluded.length; i++) {
if (terms[excluded[i]] == file ||
titleterms[excluded[i]] == file ||
$u.contains(terms[excluded[i]] || [], file) ||
$u.contains(titleterms[excluded[i]] || [], file)) {
valid = false;
if (
[...excludedTerms].some(
(term) =>
terms[term] === file ||
titleTerms[term] === file ||
(terms[term] || []).includes(file) ||
(titleTerms[term] || []).includes(file)
)
)
break;
}
}
// if we have still a valid result we can add it to the result list
if (valid) {
// select one (max) score for the file.
// for better ranking, we should calculate ranking by using words statistics like basic tf-idf...
var score = $u.max($u.map(fileMap[file], function(w){return scoreMap[file][w]}));
results.push([docnames[file], titles[file], '', null, score, filenames[file]]);
}
const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w]));
// add result to the result list
results.push([
docNames[file],
titles[file],
"",
null,
score,
filenames[file],
]);
}
return results;
},
@ -492,34 +499,33 @@ var Search = {
/**
* helper function to return a node containing the
* search summary for a given text. keywords is a list
* of stemmed words, hlwords is the list of normal, unstemmed
* of stemmed words, highlightWords is the list of normal, unstemmed
* words. the first one is used to find the occurrence, the
* latter for highlighting it.
*/
makeSearchSummary : function(htmlText, keywords, hlwords) {
var text = Search.htmlToText(htmlText);
if (text == "") {
return null;
}
var textLower = text.toLowerCase();
var start = 0;
$.each(keywords, function() {
var i = textLower.indexOf(this.toLowerCase());
if (i > -1)
start = i;
});
start = Math.max(start - 120, 0);
var excerpt = ((start > 0) ? '...' : '') +
$.trim(text.substr(start, 240)) +
((start + 240 - text.length) ? '...' : '');
var rv = $('<p class="context"></p>').text(excerpt);
$.each(hlwords, function() {
rv = rv.highlightText(this, 'highlighted');
});
return rv;
}
makeSearchSummary: (htmlText, keywords, highlightWords) => {
const text = Search.htmlToText(htmlText).toLowerCase();
if (text === "") return null;
const actualStartPosition = [...keywords]
.map((k) => text.indexOf(k.toLowerCase()))
.filter((i) => i > -1)
.slice(-1)[0];
const startWithContext = Math.max(actualStartPosition - 120, 0);
const top = startWithContext === 0 ? "" : "...";
const tail = startWithContext + 240 < text.length ? "..." : "";
let summary = document.createElement("div");
summary.classList.add("context");
summary.innerText = top + text.substr(startWithContext, 240).trim() + tail;
highlightWords.forEach((highlightWord) =>
_highlightText(summary, highlightWord, "highlighted")
);
return summary;
},
};
$(document).ready(function() {
Search.init();
});
_ready(Search.init);

View file

@ -14,6 +14,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="#" />
@ -87,7 +88,7 @@
<div itemprop="articleBody">
<section id="about-unidata-awips">
<h1>About Unidata AWIPS<a class="headerlink" href="#about-unidata-awips" title="Permalink to this headline"></a></h1>
<h1>About Unidata AWIPS<a class="headerlink" href="#about-unidata-awips" title="Permalink to this heading"></a></h1>
<p>AWIPS is a weather forecasting display and analysis package
developed by the National Weather Service and Raytheon. AWIPS is a
Java application consisting of a data-rendering client (CAVE, which runs
@ -110,7 +111,7 @@ inter-process communication.</p>
</figcaption>
</figure>
<section id="license">
<h2>License<a class="headerlink" href="#license" title="Permalink to this headline"></a></h2>
<h2>License<a class="headerlink" href="#license" title="Permalink to this heading"></a></h2>
<p>The AWIPS software package released by the Unidata Program Center is considered to
be in the public domain since it is released without proprietary code. As such, export
controls do not apply.  Any person is free to download, modify, distribute, or share
@ -120,7 +121,7 @@ to ensure that they remain compatible with the associated terms (see
FOSS_COTS_License.pdf at <a class="reference external" href="https://github.com/Unidata/awips2">https://github.com/Unidata/awips2</a>).</p>
</section>
<section id="about-awips">
<h2>About AWIPS<a class="headerlink" href="#about-awips" title="Permalink to this headline"></a></h2>
<h2>About AWIPS<a class="headerlink" href="#about-awips" title="Permalink to this heading"></a></h2>
<p>The primary AWIPS application for data ingest, processing, and
storage is the Environmental Data EXchange (<strong>EDEX</strong>) server; the
primary AWIPS application for visualization/data manipulation is the
@ -133,7 +134,7 @@ several commercial off-the-shelf (COTS) and Free or Open Source software
working together and communicating, compose the entire AWIPS system.</p>
</section>
<section id="edex">
<h2>EDEX<a class="headerlink" href="#edex" title="Permalink to this headline"></a></h2>
<h2>EDEX<a class="headerlink" href="#edex" title="Permalink to this heading"></a></h2>
<p>The main server for AWIPS. Qpid sends alerts to EDEX when data stored
by the LDM is ready for processing. These Qpid messages include file
header information which allows EDEX to determine the appropriate data
@ -147,7 +148,7 @@ ingest and request servers are started and stopped with the commands
<code class="docutils literal notranslate"><span class="pre">/etc/rc.d/init.d/edex_camel</span></code></p>
</section>
<section id="cave">
<h2>CAVE<a class="headerlink" href="#cave" title="Permalink to this headline"></a></h2>
<h2>CAVE<a class="headerlink" href="#cave" title="Permalink to this heading"></a></h2>
<p>Common AWIPS Visualization Environment. The data rendering and
visualization tool for AWIPS. CAVE contains of a number of different
data display configurations called perspectives. Perspectives used in
@ -163,7 +164,7 @@ Two-Dimensional), <strong>GFE</strong> (Graphical Forecast Editor), and <strong>
</figure>
</section>
<section id="alertviz">
<h2>Alertviz<a class="headerlink" href="#alertviz" title="Permalink to this headline"></a></h2>
<h2>Alertviz<a class="headerlink" href="#alertviz" title="Permalink to this heading"></a></h2>
<p><strong>Alertviz</strong> is a modernized version of an AWIPS I application, designed
to present various notifications, error messages, and alarms to the user
(forecaster). AlertViz can be executed either independently or from CAVE
@ -172,7 +173,7 @@ not required to be run separately. The toolbar is also <strong>hidden from
view</strong> and is accessed by right-click on the desktop taskbar icon.</p>
</section>
<section id="id1">
<h2>LDM<a class="headerlink" href="#id1" title="Permalink to this headline"></a></h2>
<h2>LDM<a class="headerlink" href="#id1" title="Permalink to this heading"></a></h2>
<p><a class="reference external" href="http://www.unidata.ucar.edu/software/ldm/">http://www.unidata.ucar.edu/software/ldm/</a></p>
<p>The <strong>LDM</strong> (Local Data Manager), developed and supported by Unidata, is
a suite of client and server programs designed for data distribution,
@ -186,14 +187,14 @@ processing. The LDM is started and stopped with the commands
<code class="docutils literal notranslate"><span class="pre">service</span> <span class="pre">edex_ldm</span> <span class="pre">start</span></code> and <code class="docutils literal notranslate"><span class="pre">service</span> <span class="pre">edex_ldm</span> <span class="pre">stop</span></code></p>
</section>
<section id="edexbridge">
<h2>edexBridge<a class="headerlink" href="#edexbridge" title="Permalink to this headline"></a></h2>
<h2>edexBridge<a class="headerlink" href="#edexbridge" title="Permalink to this heading"></a></h2>
<p>edexBridge, invoked in the LDM configuration file
<code class="docutils literal notranslate"><span class="pre">/awips2/ldm/etc/ldmd.conf</span></code>, is used by the LDM to post “data
available” messaged to Qpid, which alerts the EDEX Ingest server that a
file is ready for processing.</p>
</section>
<section id="id2">
<h2>Qpid<a class="headerlink" href="#id2" title="Permalink to this headline"></a></h2>
<h2>Qpid<a class="headerlink" href="#id2" title="Permalink to this heading"></a></h2>
<p><a class="reference external" href="http://qpid.apache.org">http://qpid.apache.org</a></p>
<p><strong>Apache Qpid</strong>, the Queue Processor Interface Daemon, is the messaging
system used by AWIPS to facilitate communication between services.
@ -205,7 +206,7 @@ and stopped by <code class="docutils literal notranslate"><span class="pre">edex
the system script <code class="docutils literal notranslate"><span class="pre">/etc/rc.d/init.d/qpidd</span></code></p>
</section>
<section id="postgresql">
<h2>PostgreSQL<a class="headerlink" href="#postgresql" title="Permalink to this headline"></a></h2>
<h2>PostgreSQL<a class="headerlink" href="#postgresql" title="Permalink to this heading"></a></h2>
<p><a class="reference external" href="http://www.postgresql.org">http://www.postgresql.org</a></p>
<p><strong>PostgreSQL</strong>, known simply as Postgres, is a relational database
management system (DBMS) which handles the storage and retrieval of
@ -217,7 +218,7 @@ called <strong>psql</strong>. Postgres is started and stopped by <code class="do
<code class="docutils literal notranslate"><span class="pre">/etc/rc.d/init.d/edex_postgres</span></code></p>
</section>
<section id="hdf5">
<h2>HDF5<a class="headerlink" href="#hdf5" title="Permalink to this headline"></a></h2>
<h2>HDF5<a class="headerlink" href="#hdf5" title="Permalink to this heading"></a></h2>
<p><a class="reference external" href="http://www.hdfgroup.org/HDF5/">http://www.hdfgroup.org/HDF5/</a></p>
<p><strong>Hierarchical Data Format (v.5)</strong> is
the primary data storage format used by AWIPS for processed grids,
@ -230,7 +231,7 @@ also contain data from multiple radars. HDF5 is stored in
<code class="docutils literal notranslate"><span class="pre">/awips2/edex/data/hdf5/</span></code></p>
</section>
<section id="pypies-httpd-pypies">
<h2>PyPIES (httpd-pypies)<a class="headerlink" href="#pypies-httpd-pypies" title="Permalink to this headline"></a></h2>
<h2>PyPIES (httpd-pypies)<a class="headerlink" href="#pypies-httpd-pypies" title="Permalink to this heading"></a></h2>
<p><strong>PyPIES</strong>, Python Process Isolated Enhanced Storage, was created for
AWIPS to isolate the management of HDF5 Processed Data Storage from
the EDEX processes. PyPIES manages access, i.e., reads and writes, of

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.dataaccess.CombinedTimeQuery">
<span id="combinedtimequery"></span><h1>CombinedTimeQuery<a class="headerlink" href="#module-awips.dataaccess.CombinedTimeQuery" title="Permalink to this headline"></a></h1>
<span id="combinedtimequery"></span><h1>CombinedTimeQuery<a class="headerlink" href="#module-awips.dataaccess.CombinedTimeQuery" title="Permalink to this heading"></a></h1>
<dl class="py function">
<dt class="sig sig-object py" id="awips.dataaccess.CombinedTimeQuery.getAvailableTimes">
<span class="sig-prename descclassname"><span class="pre">awips.dataaccess.CombinedTimeQuery.</span></span><span class="sig-name descname"><span class="pre">getAvailableTimes</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">request</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">refTimeOnly</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">False</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/dataaccess/CombinedTimeQuery.html#getAvailableTimes"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.dataaccess.CombinedTimeQuery.getAvailableTimes" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.dataaccess.DataAccessLayer">
<span id="dataaccesslayer"></span><h1>DataAccessLayer<a class="headerlink" href="#module-awips.dataaccess.DataAccessLayer" title="Permalink to this headline"></a></h1>
<span id="dataaccesslayer"></span><h1>DataAccessLayer<a class="headerlink" href="#module-awips.dataaccess.DataAccessLayer" title="Permalink to this heading"></a></h1>
<dl class="py function">
<dt class="sig sig-object py" id="awips.dataaccess.DataAccessLayer.changeEDEXHost">
<span class="sig-prename descclassname"><span class="pre">awips.dataaccess.DataAccessLayer.</span></span><span class="sig-name descname"><span class="pre">changeEDEXHost</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">newHostName</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/dataaccess/DataAccessLayer.html#changeEDEXHost"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.dataaccess.DataAccessLayer.changeEDEXHost" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.DateTimeConverter">
<span id="datetimeconverter"></span><h1>DateTimeConverter<a class="headerlink" href="#module-awips.DateTimeConverter" title="Permalink to this headline"></a></h1>
<span id="datetimeconverter"></span><h1>DateTimeConverter<a class="headerlink" href="#module-awips.DateTimeConverter" title="Permalink to this heading"></a></h1>
<dl class="py function">
<dt class="sig sig-object py" id="awips.DateTimeConverter.constructTimeRange">
<span class="sig-prename descclassname"><span class="pre">awips.DateTimeConverter.</span></span><span class="sig-name descname"><span class="pre">constructTimeRange</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="o"><span class="pre">*</span></span><span class="n"><span class="pre">args</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/DateTimeConverter.html#constructTimeRange"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.DateTimeConverter.constructTimeRange" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="idatarequest-newdatarequest">
<h1>IDataRequest (newDataRequest())<a class="headerlink" href="#idatarequest-newdatarequest" title="Permalink to this headline"></a></h1>
<h1>IDataRequest (newDataRequest())<a class="headerlink" href="#idatarequest-newdatarequest" title="Permalink to this heading"></a></h1>
<dl class="py class">
<dt class="sig sig-object py" id="awips.dataaccess.IDataRequest">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">awips.dataaccess.</span></span><span class="sig-name descname"><span class="pre">IDataRequest</span></span><a class="reference internal" href="../_modules/awips/dataaccess.html#IDataRequest"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.dataaccess.IDataRequest" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.gfe.IFPClient">
<span id="ifpclient"></span><h1>IFPClient<a class="headerlink" href="#module-awips.gfe.IFPClient" title="Permalink to this headline"></a></h1>
<span id="ifpclient"></span><h1>IFPClient<a class="headerlink" href="#module-awips.gfe.IFPClient" title="Permalink to this heading"></a></h1>
<dl class="py class">
<dt class="sig sig-object py" id="awips.gfe.IFPClient.IFPClient">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">awips.gfe.IFPClient.</span></span><span class="sig-name descname"><span class="pre">IFPClient</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">host</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">port</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">user</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">site</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">progName</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/gfe/IFPClient.html#IFPClient"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.gfe.IFPClient.IFPClient" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.dataaccess.ModelSounding">
<span id="modelsounding"></span><h1>ModelSounding<a class="headerlink" href="#module-awips.dataaccess.ModelSounding" title="Permalink to this headline"></a></h1>
<span id="modelsounding"></span><h1>ModelSounding<a class="headerlink" href="#module-awips.dataaccess.ModelSounding" title="Permalink to this heading"></a></h1>
<dl class="py function">
<dt class="sig sig-object py" id="awips.dataaccess.ModelSounding.changeEDEXHost">
<span class="sig-prename descclassname"><span class="pre">awips.dataaccess.ModelSounding.</span></span><span class="sig-name descname"><span class="pre">changeEDEXHost</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">host</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/dataaccess/ModelSounding.html#changeEDEXHost"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.dataaccess.ModelSounding.changeEDEXHost" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.dataaccess.PyData">
<span id="pydata"></span><h1>PyData<a class="headerlink" href="#module-awips.dataaccess.PyData" title="Permalink to this headline"></a></h1>
<span id="pydata"></span><h1>PyData<a class="headerlink" href="#module-awips.dataaccess.PyData" title="Permalink to this heading"></a></h1>
<dl class="py class">
<dt class="sig sig-object py" id="awips.dataaccess.PyData.PyData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">awips.dataaccess.PyData.</span></span><span class="sig-name descname"><span class="pre">PyData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">dataRecord</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/dataaccess/PyData.html#PyData"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.dataaccess.PyData.PyData" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.dataaccess.PyGeometryData">
<span id="pygeometrydata"></span><h1>PyGeometryData<a class="headerlink" href="#module-awips.dataaccess.PyGeometryData" title="Permalink to this headline"></a></h1>
<span id="pygeometrydata"></span><h1>PyGeometryData<a class="headerlink" href="#module-awips.dataaccess.PyGeometryData" title="Permalink to this heading"></a></h1>
<dl class="py class">
<dt class="sig sig-object py" id="awips.dataaccess.PyGeometryData.PyGeometryData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">awips.dataaccess.PyGeometryData.</span></span><span class="sig-name descname"><span class="pre">PyGeometryData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">geoDataRecord</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">geometry</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/dataaccess/PyGeometryData.html#PyGeometryData"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.dataaccess.PyGeometryData.PyGeometryData" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.dataaccess.PyGridData">
<span id="pygriddata"></span><h1>PyGridData<a class="headerlink" href="#module-awips.dataaccess.PyGridData" title="Permalink to this headline"></a></h1>
<span id="pygriddata"></span><h1>PyGridData<a class="headerlink" href="#module-awips.dataaccess.PyGridData" title="Permalink to this heading"></a></h1>
<dl class="py class">
<dt class="sig sig-object py" id="awips.dataaccess.PyGridData.PyGridData">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">awips.dataaccess.PyGridData.</span></span><span class="sig-name descname"><span class="pre">PyGridData</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">gridDataRecord</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nx</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ny</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">latLonGrid</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">latLonDelegate</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">None</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/dataaccess/PyGridData.html#PyGridData"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.dataaccess.PyGridData.PyGridData" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.RadarCommon">
<span id="radarcommon"></span><h1>RadarCommon<a class="headerlink" href="#module-awips.RadarCommon" title="Permalink to this headline"></a></h1>
<span id="radarcommon"></span><h1>RadarCommon<a class="headerlink" href="#module-awips.RadarCommon" title="Permalink to this heading"></a></h1>
<dl class="py function">
<dt class="sig sig-object py" id="awips.RadarCommon.encode_dep_vals">
<span class="sig-prename descclassname"><span class="pre">awips.RadarCommon.</span></span><span class="sig-name descname"><span class="pre">encode_dep_vals</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">depVals</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/RadarCommon.html#encode_dep_vals"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.RadarCommon.encode_dep_vals" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.ThriftClient">
<span id="thriftclient"></span><h1>ThriftClient<a class="headerlink" href="#module-awips.ThriftClient" title="Permalink to this headline"></a></h1>
<span id="thriftclient"></span><h1>ThriftClient<a class="headerlink" href="#module-awips.ThriftClient" title="Permalink to this heading"></a></h1>
<dl class="py class">
<dt class="sig sig-object py" id="awips.ThriftClient.ThriftClient">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">awips.ThriftClient.</span></span><span class="sig-name descname"><span class="pre">ThriftClient</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">host</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">port</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">9581</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">uri</span></span><span class="o"><span class="pre">=</span></span><span class="default_value"><span class="pre">'/services'</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/ThriftClient.html#ThriftClient"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.ThriftClient.ThriftClient" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.dataaccess.ThriftClientRouter">
<span id="thriftclientrouter"></span><h1>ThriftClientRouter<a class="headerlink" href="#module-awips.dataaccess.ThriftClientRouter" title="Permalink to this headline"></a></h1>
<span id="thriftclientrouter"></span><h1>ThriftClientRouter<a class="headerlink" href="#module-awips.dataaccess.ThriftClientRouter" title="Permalink to this heading"></a></h1>
<dl class="py class">
<dt class="sig sig-object py" id="awips.dataaccess.ThriftClientRouter.LazyGridLatLon">
<em class="property"><span class="pre">class</span><span class="w"> </span></em><span class="sig-prename descclassname"><span class="pre">awips.dataaccess.ThriftClientRouter.</span></span><span class="sig-name descname"><span class="pre">LazyGridLatLon</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">client</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">nx</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">ny</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">envelope</span></span></em>, <em class="sig-param"><span class="n"><span class="pre">crsWkt</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/dataaccess/ThriftClientRouter.html#LazyGridLatLon"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.dataaccess.ThriftClientRouter.LazyGridLatLon" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -91,7 +92,7 @@
<div itemprop="articleBody">
<section id="module-awips.TimeUtil">
<span id="timeutil"></span><h1>TimeUtil<a class="headerlink" href="#module-awips.TimeUtil" title="Permalink to this headline"></a></h1>
<span id="timeutil"></span><h1>TimeUtil<a class="headerlink" href="#module-awips.TimeUtil" title="Permalink to this heading"></a></h1>
<dl class="py function">
<dt class="sig sig-object py" id="awips.TimeUtil.determineDrtOffset">
<span class="sig-prename descclassname"><span class="pre">awips.TimeUtil.</span></span><span class="sig-name descname"><span class="pre">determineDrtOffset</span></span><span class="sig-paren">(</span><em class="sig-param"><span class="n"><span class="pre">timeStr</span></span></em><span class="sig-paren">)</span><a class="reference internal" href="../_modules/awips/TimeUtil.html#determineDrtOffset"><span class="viewcode-link"><span class="pre">[source]</span></span></a><a class="headerlink" href="#awips.TimeUtil.determineDrtOffset" title="Permalink to this definition"></a></dt>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -90,7 +91,7 @@
<div itemprop="articleBody">
<section id="api-documentation">
<h1>API Documentation<a class="headerlink" href="#api-documentation" title="Permalink to this headline"></a></h1>
<h1>API Documentation<a class="headerlink" href="#api-documentation" title="Permalink to this heading"></a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="DataAccessLayer.html">DataAccessLayer</a></li>

View file

@ -14,6 +14,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="about.html" />
@ -82,9 +83,9 @@
<div itemprop="articleBody">
<section id="available-data-types">
<h1>Available Data Types<a class="headerlink" href="#available-data-types" title="Permalink to this headline"></a></h1>
<h1>Available Data Types<a class="headerlink" href="#available-data-types" title="Permalink to this heading"></a></h1>
<section id="satellite">
<h2>satellite<a class="headerlink" href="#satellite" title="Permalink to this headline"></a></h2>
<h2>satellite<a class="headerlink" href="#satellite" title="Permalink to this heading"></a></h2>
<ul>
<li><p>2-D NumPy Array</p></li>
<li><p>returned by: <a class="reference external" href="api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.getGridData">awips.dataaccess.DataAccessLayer.getGridData(request, times=[])</a></p></li>
@ -113,7 +114,7 @@
<p></p>
</section>
<section id="binlightning">
<h2>binlightning<a class="headerlink" href="#binlightning" title="Permalink to this headline"></a></h2>
<h2>binlightning<a class="headerlink" href="#binlightning" title="Permalink to this heading"></a></h2>
<ul>
<li><p>Shapely Point:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">POINT</span> <span class="p">(</span><span class="o">-</span><span class="mf">65.65293884277344</span> <span class="o">-</span><span class="mf">16.94915580749512</span><span class="p">)</span>
@ -136,7 +137,7 @@
<p></p>
</section>
<section id="grid">
<h2>grid<a class="headerlink" href="#grid" title="Permalink to this headline"></a></h2>
<h2>grid<a class="headerlink" href="#grid" title="Permalink to this heading"></a></h2>
<ul>
<li><p>2-D NumPy Array</p></li>
<li><p>returned by: <a class="reference external" href="api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.getGridData">awips.dataaccess.DataAccessLayer.getGridData(request, times=[])</a></p></li>
@ -160,7 +161,7 @@
<p></p>
</section>
<section id="warning">
<h2>warning<a class="headerlink" href="#warning" title="Permalink to this headline"></a></h2>
<h2>warning<a class="headerlink" href="#warning" title="Permalink to this heading"></a></h2>
<ul>
<li><p>Shapely MultiPolygon, Polygon:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">MULTIPOLYGON</span> <span class="p">((</span><span class="o">-</span><span class="mf">92.092348410</span> <span class="mf">46.782322971</span><span class="p">,</span> <span class="o">...</span><span class="p">,</span> <span class="o">-</span><span class="mf">92.092348410</span> <span class="mf">46.782322971</span><span class="p">),</span>
@ -190,7 +191,7 @@
<p></p>
</section>
<section id="radar">
<h2>radar<a class="headerlink" href="#radar" title="Permalink to this headline"></a></h2>
<h2>radar<a class="headerlink" href="#radar" title="Permalink to this heading"></a></h2>
<ul>
<li><p>2-D NumPy Array</p></li>
<li><p>returned by: <a class="reference external" href="api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.getGridData">awips.dataaccess.DataAccessLayer.getGridData(request, times=[])</a></p></li>

View file

@ -14,6 +14,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="about.html" />
@ -90,14 +91,14 @@
<div itemprop="articleBody">
<section id="development-guide">
<h1>Development Guide<a class="headerlink" href="#development-guide" title="Permalink to this headline"></a></h1>
<h1>Development Guide<a class="headerlink" href="#development-guide" title="Permalink to this heading"></a></h1>
<p>The Data Access Framework allows developers to retrieve different types
of data without having dependencies on those types of data. It provides
a single, unified data type that can be customized by individual
implementing plug-ins to provide full functionality pertinent to each
data type.</p>
<section id="writing-a-new-factory">
<h2>Writing a New Factory<a class="headerlink" href="#writing-a-new-factory" title="Permalink to this headline"></a></h2>
<h2>Writing a New Factory<a class="headerlink" href="#writing-a-new-factory" title="Permalink to this heading"></a></h2>
<p>Factories will most often be written in a dataplugin, but should always
be written in a common plug-in. This will allow for clean dependencies
from both CAVE and EDEX.</p>
@ -168,7 +169,7 @@ should be thrown.</p></li>
</ul>
</section>
<section id="registering-the-factory-with-the-framework">
<h2>Registering the Factory with the Framework<a class="headerlink" href="#registering-the-factory-with-the-framework" title="Permalink to this headline"></a></h2>
<h2>Registering the Factory with the Framework<a class="headerlink" href="#registering-the-factory-with-the-framework" title="Permalink to this heading"></a></h2>
<p>The following needs to be added in a spring file in the plug-in that
contains the new factory:</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o">&lt;</span><span class="n">bean</span> <span class="nb">id</span><span class="o">=</span><span class="s2">&quot;radarGridFactory&quot;</span>
@ -184,7 +185,7 @@ allows it to be used any time the code makes a request for the data type
“radar.”</p>
</section>
<section id="retrieving-data-using-the-factory">
<h2>Retrieving Data Using the Factory<a class="headerlink" href="#retrieving-data-using-the-factory" title="Permalink to this headline"></a></h2>
<h2>Retrieving Data Using the Factory<a class="headerlink" href="#retrieving-data-using-the-factory" title="Permalink to this heading"></a></h2>
<p>For ease of use and more diverse use, there are multiple interfaces into
the Data Access Layer. Currently, there is a Python implementation and a
Java implementation, which have very similar method calls and work in a
@ -248,7 +249,7 @@ the best way to identify what parameters are to be used is to reference
the code.</p>
</section>
<section id="development-background">
<h2>Development Background<a class="headerlink" href="#development-background" title="Permalink to this headline"></a></h2>
<h2>Development Background<a class="headerlink" href="#development-background" title="Permalink to this heading"></a></h2>
<p>In support of Hazard Services Raytheon Technical Services is building a
generic data access framework that can be called via JAVA or Python. The
data access framework code can be found within the AWIPS Baseline in</p>
@ -289,7 +290,7 @@ classes</p>
attached and modified slightly.</p>
</section>
<section id="design-implementation">
<h2>Design/Implementation<a class="headerlink" href="#design-implementation" title="Permalink to this headline"></a></h2>
<h2>Design/Implementation<a class="headerlink" href="#design-implementation" title="Permalink to this heading"></a></h2>
<p>The Data Access Framework is designed to provide a consistent interface
for requesting and using geospatial data within CAVE or EDEX. Examples
of geospatial data are grids, satellite, radar, metars, maps, river gage
@ -349,7 +350,7 @@ the framework will make use of existing APIs such as <strong>IDataStore</strong>
</ul>
</section>
<section id="how-users-of-the-framework-retrieve-and-use-the-data">
<h2>How users of the framework retrieve and use the data<a class="headerlink" href="#how-users-of-the-framework-retrieve-and-use-the-data" title="Permalink to this headline"></a></h2>
<h2>How users of the framework retrieve and use the data<a class="headerlink" href="#how-users-of-the-framework-retrieve-and-use-the-data" title="Permalink to this heading"></a></h2>
<p>When a user of the framework wishes to request data, they must
instantiate a request object and set some of the values on that request.
Two request interfaces will be supported, for detailed methods see
@ -391,7 +392,7 @@ making the request and returned data objects pure python it will not be
a huge undertaking to add this support in the future.</p>
</section>
<section id="how-plugin-developers-contribute-support-for-new-datatypes">
<h2>How plugin developers contribute support for new datatypes<a class="headerlink" href="#how-plugin-developers-contribute-support-for-new-datatypes" title="Permalink to this headline"></a></h2>
<h2>How plugin developers contribute support for new datatypes<a class="headerlink" href="#how-plugin-developers-contribute-support-for-new-datatypes" title="Permalink to this heading"></a></h2>
<p>When a developer wishes to add support for another data type to the
framework, they must implement one or both of the factory interfaces
within a common plugin. Two factory interfaces will be supported, for
@ -455,7 +456,7 @@ both.</p>
</div>
</section>
<section id="how-the-framework-works-when-it-receives-a-request">
<h2>How the framework works when it receives a request<a class="headerlink" href="#how-the-framework-works-when-it-receives-a-request" title="Permalink to this headline"></a></h2>
<h2>How the framework works when it receives a request<a class="headerlink" href="#how-the-framework-works-when-it-receives-a-request" title="Permalink to this heading"></a></h2>
<p><strong>IDataRequest</strong> requires a datatype to be set on every request. The
framework will have a registry of existing factories for each data type
(grid and geometry). When the Data Access Layer methods are called, it
@ -485,7 +486,7 @@ be tasked to add the factories necessary to support the needed data
types.</p>
</section>
<section id="request-interfaces">
<h2>Request interfaces<a class="headerlink" href="#request-interfaces" title="Permalink to this headline"></a></h2>
<h2>Request interfaces<a class="headerlink" href="#request-interfaces" title="Permalink to this heading"></a></h2>
<p>Requests and returned data interfaces will exist in both Java and
Python. The Java interfaces are listed below and the Python interfaces
will match the Java interfaces except where noted. Factories will only
@ -531,7 +532,7 @@ requesting data by names such as ICAOs, airports, stationIDs, etc</p></li>
as rectangular polygons)</p></li>
</ul>
<section id="data-interfaces">
<h3>Data Interfaces<a class="headerlink" href="#data-interfaces" title="Permalink to this headline"></a></h3>
<h3>Data Interfaces<a class="headerlink" href="#data-interfaces" title="Permalink to this heading"></a></h3>
<p><strong>IData</strong></p>
<ul class="simple">
<li><p><strong>Object getAttribute(String key)</strong> - <strong>getAttribute</strong> provides a way
@ -604,7 +605,7 @@ cell</p></li>
</ul>
</section>
<section id="factory-interfaces-java-only">
<h3>Factory Interfaces (Java only)<a class="headerlink" href="#factory-interfaces-java-only" title="Permalink to this headline"></a></h3>
<h3>Factory Interfaces (Java only)<a class="headerlink" href="#factory-interfaces-java-only" title="Permalink to this heading"></a></h3>
<ul class="simple">
<li><p><strong>IDataFactory</strong></p></li>
<li><p><strong>DataTime[] getAvailableTimes(R request)</strong> - queries the

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -106,12 +107,12 @@
<div itemprop="articleBody">
<section id="colored-surface-temperature-plot">
<h1>Colored Surface Temperature Plot<a class="headerlink" href="#colored-surface-temperature-plot" title="Permalink to this headline"></a></h1>
<h1>Colored Surface Temperature Plot<a class="headerlink" href="#colored-surface-temperature-plot" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Colored_Surface_Temperature_Plot.ipynb">Notebook</a>
Python-AWIPS Tutorial Notebook</p>
<hr class="docutils" />
<section id="objectives">
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this headline"></a></h2>
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>Use python-awips to connect to an edex server</p></li>
<li><p>Define and filter data request for METAR surface obs</p></li>
@ -120,7 +121,7 @@ Python-AWIPS Tutorial Notebook</p>
</ul>
<hr class="docutils" />
<section id="table-of-contents">
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this headline"></a></h3>
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading"></a></h3>
<div class="line-block">
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Colored_Surface_Temperature_Plot.html#imports">1
Imports</a></div>
@ -146,7 +147,7 @@ Documentation</a></div>
</section>
<hr class="docutils" />
<section id="imports">
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this headline"></a></h3>
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this heading"></a></h3>
<p>The imports below are used throughout the notebook. Note the first
import is coming directly from python-awips and allows us to connect to
an EDEX server. The subsequent imports are for data manipulation and
@ -166,9 +167,9 @@ visualization.</p>
</section>
<hr class="docutils" />
<section id="initial-setup">
<h3>2 Initial Setup<a class="headerlink" href="#initial-setup" title="Permalink to this headline"></a></h3>
<h3>2 Initial Setup<a class="headerlink" href="#initial-setup" title="Permalink to this heading"></a></h3>
<section id="geographic-filter">
<h4>2.1 Geographic Filter<a class="headerlink" href="#geographic-filter" title="Permalink to this headline"></a></h4>
<h4>2.1 Geographic Filter<a class="headerlink" href="#geographic-filter" title="Permalink to this heading"></a></h4>
<p>By defining a bounding box for the Continental US (CONUS), were able to
optimize the data request sent to the EDEX server.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># CONUS bounding box and envelope geometry</span>
@ -180,7 +181,7 @@ optimize the data request sent to the EDEX server.</p>
</div>
</section>
<section id="edex-connection">
<h4>2.2 EDEX Connection<a class="headerlink" href="#edex-connection" title="Permalink to this headline"></a></h4>
<h4>2.2 EDEX Connection<a class="headerlink" href="#edex-connection" title="Permalink to this heading"></a></h4>
<p>First we establish a connection to Unidatas public EDEX server. With
that connection made, we can create a <a class="reference external" href="http://unidata.github.io/python-awips/api/IDataRequest.html">new data request
object</a>
@ -199,7 +200,7 @@ just created.</p>
</section>
<hr class="docutils" />
<section id="filter-by-time">
<h3>3 Filter by Time<a class="headerlink" href="#filter-by-time" title="Permalink to this headline"></a></h3>
<h3>3 Filter by Time<a class="headerlink" href="#filter-by-time" title="Permalink to this heading"></a></h3>
<p>We then want to limit our results based on time, so we create a time
range for the last 15 minutes, and then send the request to the EDEX
server to get our results, which are kept in the <strong>obs</strong> variable.</p>
@ -230,7 +231,7 @@ server to get our results, which are kept in the <strong>obs</strong> variable.<
</section>
<hr class="docutils" />
<section id="access-and-convert-temp-data">
<h3>4 Access and Convert Temp Data<a class="headerlink" href="#access-and-convert-temp-data" title="Permalink to this headline"></a></h3>
<h3>4 Access and Convert Temp Data<a class="headerlink" href="#access-and-convert-temp-data" title="Permalink to this heading"></a></h3>
<p>We access the <em>temperature</em> data from the <strong>obs</strong> variable which is
stored in degrees Celsius (°C). To make it more relatable, we then
convert the data to degrees Fahreheit (°F)</p>
@ -247,7 +248,7 @@ convert the data to degrees Fahreheit (°F)</p>
</section>
<hr class="docutils" />
<section id="define-temperature-thresholds">
<h3>5 Define Temperature Thresholds<a class="headerlink" href="#define-temperature-thresholds" title="Permalink to this headline"></a></h3>
<h3>5 Define Temperature Thresholds<a class="headerlink" href="#define-temperature-thresholds" title="Permalink to this heading"></a></h3>
<p>In order to distinguish the temperatures, well create a color map to
separate the values into different colors. This mapping will be used
when plotting the temperature values on the map of the United States.</p>
@ -271,7 +272,7 @@ affects the final plot.</p>
</section>
<hr class="docutils" />
<section id="plot-the-data">
<h3>6 Plot the Data!<a class="headerlink" href="#plot-the-data" title="Permalink to this headline"></a></h3>
<h3>6 Plot the Data!<a class="headerlink" href="#plot-the-data" title="Permalink to this heading"></a></h3>
<p>Here we create a plot and cycle through all the values from our color
mapping. For each segement of our color mapping, mask the temperature
values to only include the relevent temperatures and draw those on the
@ -306,9 +307,9 @@ final, colored figure.</p>
</section>
<hr class="docutils" />
<section id="see-also">
<h3>7 See Also<a class="headerlink" href="#see-also" title="Permalink to this headline"></a></h3>
<h3>7 See Also<a class="headerlink" href="#see-also" title="Permalink to this heading"></a></h3>
<section id="additional-documention">
<h4>7.1 Additional Documention<a class="headerlink" href="#additional-documention" title="Permalink to this headline"></a></h4>
<h4>7.1 Additional Documention<a class="headerlink" href="#additional-documention" title="Permalink to this heading"></a></h4>
<p><strong>python-awips</strong></p>
<ul class="simple">
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.changeEDEXHost">DataAccessLayer.changeEDEXHost()</a></p></li>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -105,12 +106,12 @@
<div itemprop="articleBody">
<section id="colorized-grid-data">
<h1>Colorized Grid Data<a class="headerlink" href="#colorized-grid-data" title="Permalink to this headline"></a></h1>
<h1>Colorized Grid Data<a class="headerlink" href="#colorized-grid-data" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Colorized_Grid_Data.ipynb">Notebook</a>
Python-AWIPS Tutorial Notebook</p>
<hr class="docutils" />
<section id="objectives">
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this headline"></a></h2>
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>Create a colorized plot for the continental US of model data (grib).</p></li>
<li><p>Access the model data from an EDEX server and limit the data returned
@ -120,7 +121,7 @@ compare the differences between the two.</p></li>
</ul>
<hr class="docutils" />
<section id="table-of-contents">
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this headline"></a></h3>
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading"></a></h3>
<div class="line-block">
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Colorized_Grid_Data.html#imports">1
Imports</a></div>
@ -146,7 +147,7 @@ Documentation</a></div>
</section>
<hr class="docutils" />
<section id="imports">
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this headline"></a></h3>
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this heading"></a></h3>
<p>Start by importing both the python-awips specific library, as well as
the libraries needed for plotting and manipulating the data</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">awips.dataaccess</span> <span class="kn">import</span> <span class="n">DataAccessLayer</span>
@ -160,7 +161,7 @@ the libraries needed for plotting and manipulating the data</p>
</section>
<hr class="docutils" />
<section id="define-data-request">
<h3>2 Define Data Request<a class="headerlink" href="#define-data-request" title="Permalink to this headline"></a></h3>
<h3>2 Define Data Request<a class="headerlink" href="#define-data-request" title="Permalink to this heading"></a></h3>
<p>If you read through the <a class="reference external" href="https://nbviewer.jupyter.org/github/Unidata/pyaos-ams-2021/blob/master/notebooks/dataAccess/python-awips-HowToAccessData.ipynb">python-awips: How to Access
Data</a>
training, you will know that we need to set an EDEX url to access our
@ -187,7 +188,7 @@ in meters), respectively.</p>
</section>
<hr class="docutils" />
<section id="limit-results-based-on-time">
<h3>3 Limit Results Based on Time<a class="headerlink" href="#limit-results-based-on-time" title="Permalink to this headline"></a></h3>
<h3>3 Limit Results Based on Time<a class="headerlink" href="#limit-results-based-on-time" title="Permalink to this heading"></a></h3>
<p>Models produce many different time variants during their runs, so lets
limit the data to the most recent time and forecast run.</p>
<blockquote>
@ -213,7 +214,7 @@ to see the differences.</p>
</section>
<hr class="docutils" />
<section id="function-make-map">
<h3>4 Function: make_map()<a class="headerlink" href="#function-make-map" title="Permalink to this headline"></a></h3>
<h3>4 Function: make_map()<a class="headerlink" href="#function-make-map" title="Permalink to this heading"></a></h3>
<p>In order to plot more than one image, its easiest to define common
logic in a function. Here, a new function called <strong>make_map</strong> is
defined. This function uses the <a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html">matplotlib.pyplot package
@ -236,7 +237,7 @@ added, along with lat/lon grids.</p>
</section>
<hr class="docutils" />
<section id="use-the-grid-data">
<h3>5 Use the Grid Data!<a class="headerlink" href="#use-the-grid-data" title="Permalink to this headline"></a></h3>
<h3>5 Use the Grid Data!<a class="headerlink" href="#use-the-grid-data" title="Permalink to this heading"></a></h3>
<p>Here we get our grid data object from our previous response, and then
get the raw data array off that object. We also get the latitude and
longitude arrays, and create a bounding box that well use when creating
@ -254,7 +255,7 @@ understandable.</p>
</pre></div>
</div>
<section id="plot-using-pcolormesh">
<h4>5.1 Plot Using pcolormesh<a class="headerlink" href="#plot-using-pcolormesh" title="Permalink to this headline"></a></h4>
<h4>5.1 Plot Using pcolormesh<a class="headerlink" href="#plot-using-pcolormesh" title="Permalink to this heading"></a></h4>
<p>This example shows how to use
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.pcolormesh.html">matplotlib.pyplot.pcolormesh</a>
to create a colorized plot. We use our <strong>make_map</strong> function to create a
@ -280,7 +281,7 @@ okay, and will go away with subsequent runs of the cell.</p>
<img alt="../../_images/Colorized_Grid_Data_21_1.png" src="../../_images/Colorized_Grid_Data_21_1.png" />
</section>
<section id="plot-using-contourf">
<h4>5.2 Plot Using contourf<a class="headerlink" href="#plot-using-contourf" title="Permalink to this headline"></a></h4>
<h4>5.2 Plot Using contourf<a class="headerlink" href="#plot-using-contourf" title="Permalink to this heading"></a></h4>
<p>This example shows how to use
<a class="reference external" href="https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.contourf.html">matplotlib.pyplot.contourf</a>
to create a colorized plot. We use our <strong>make_map</strong> function to create a
@ -301,16 +302,16 @@ a label for our plot.</p>
</section>
<hr class="docutils" />
<section id="see-also">
<h3>6 See Also<a class="headerlink" href="#see-also" title="Permalink to this headline"></a></h3>
<h3>6 See Also<a class="headerlink" href="#see-also" title="Permalink to this heading"></a></h3>
<section id="related-notebooks">
<h4>6.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this headline"></a></h4>
<h4>6.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this heading"></a></h4>
<ul class="simple">
<li><p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html">Grid Levels and
Parameters</a></p></li>
</ul>
</section>
<section id="additional-documentation">
<h4>6.2 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this headline"></a></h4>
<h4>6.2 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this heading"></a></h4>
<p><strong>python-awips:</strong></p>
<ul class="simple">
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html">awips.DataAccessLayer</a></p></li>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -97,7 +98,7 @@
<div itemprop="articleBody">
<section id="forecast-model-vertical-sounding">
<h1>Forecast Model Vertical Sounding<a class="headerlink" href="#forecast-model-vertical-sounding" title="Permalink to this headline"></a></h1>
<h1>Forecast Model Vertical Sounding<a class="headerlink" href="#forecast-model-vertical-sounding" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Forecast_Model_Vertical_Sounding.ipynb">Notebook</a>
The ModelSounding class allows us to create a vertical sounding through
any available AWIPS model with isobaric levels.</p>
@ -230,7 +231,7 @@ are returned as Kelvin and wind components as m/s.</p></li>
</div>
<hr class="docutils" />
<section id="skew-t-log-p">
<h2>Skew-T/Log-P<a class="headerlink" href="#skew-t-log-p" title="Permalink to this headline"></a></h2>
<h2>Skew-T/Log-P<a class="headerlink" href="#skew-t-log-p" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">&#39;figure.figsize&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">14</span><span class="p">)</span>
<span class="c1"># Skew-T</span>
@ -263,7 +264,7 @@ are returned as Kelvin and wind components as m/s.</p></li>
<img alt="../../_images/Forecast_Model_Vertical_Sounding_5_0.png" src="../../_images/Forecast_Model_Vertical_Sounding_5_0.png" />
</section>
<section id="model-sounding-comparison">
<h2>Model Sounding Comparison<a class="headerlink" href="#model-sounding-comparison" title="Permalink to this headline"></a></h2>
<h2>Model Sounding Comparison<a class="headerlink" href="#model-sounding-comparison" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">models</span> <span class="o">=</span> <span class="p">[</span><span class="s2">&quot;CMC&quot;</span><span class="p">,</span> <span class="s2">&quot;GFS20&quot;</span><span class="p">,</span> <span class="s2">&quot;NAM40&quot;</span><span class="p">]</span>
<span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">&#39;T&#39;</span><span class="p">,</span><span class="s1">&#39;DpT&#39;</span><span class="p">,</span><span class="s1">&#39;uW&#39;</span><span class="p">,</span><span class="s1">&#39;vW&#39;</span><span class="p">]</span>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -105,12 +106,12 @@
<div itemprop="articleBody">
<section id="goes-cira-product-writer">
<h1>GOES CIRA Product Writer<a class="headerlink" href="#goes-cira-product-writer" title="Permalink to this headline"></a></h1>
<h1>GOES CIRA Product Writer<a class="headerlink" href="#goes-cira-product-writer" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/GOES_CIRA_Product_Writer.ipynb">Notebook</a>
Python-AWIPS Tutorial Notebook</p>
<hr class="docutils" />
<section id="objectives">
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this headline"></a></h2>
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>Use python-awips to connect to an EDEX server</p></li>
<li><p>Define and filter the data request specifically for new <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/GOES_CIRA_Product_Writer.html#additional-documentation">CIRA GOES16
@ -122,7 +123,7 @@ products</a></p></li>
</ul>
<hr class="docutils" />
<section id="table-of-contents">
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this headline"></a></h3>
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading"></a></h3>
<div class="line-block">
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/GOES_CIRA_Product_Writer.html#imports">1
Imports</a></div>
@ -154,7 +155,7 @@ Documentation</a></div>
</section>
<hr class="docutils" />
<section id="imports">
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this headline"></a></h3>
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this heading"></a></h3>
<p>The imports below are used throughout the notebook. Note the first
import is coming directly from python-awips and allows us to connect to
an EDEX server. The subsequent imports are for data manipulation and
@ -172,9 +173,9 @@ visualization.</p>
</section>
<hr class="docutils" />
<section id="initial-setup">
<h3>2 Initial Setup<a class="headerlink" href="#initial-setup" title="Permalink to this headline"></a></h3>
<h3>2 Initial Setup<a class="headerlink" href="#initial-setup" title="Permalink to this heading"></a></h3>
<section id="edex-connection">
<h4>2.1 EDEX Connection<a class="headerlink" href="#edex-connection" title="Permalink to this headline"></a></h4>
<h4>2.1 EDEX Connection<a class="headerlink" href="#edex-connection" title="Permalink to this heading"></a></h4>
<p>First we establish a connection to Unidatas public EDEX server. With
that connection made, we can create a <a class="reference external" href="http://unidata.github.io/python-awips/api/IDataRequest.html">new data request
object</a>
@ -187,7 +188,7 @@ and set the data type to <strong>satellite</strong>.</p>
</div>
</section>
<section id="parameter-definition">
<h4>2.2 Parameter Definition<a class="headerlink" href="#parameter-definition" title="Permalink to this headline"></a></h4>
<h4>2.2 Parameter Definition<a class="headerlink" href="#parameter-definition" title="Permalink to this heading"></a></h4>
<p>After establishing the python-awips specific objects, we create a few
other parameters that will be used for the data query based off of known
values: projection, and extent.</p>
@ -207,7 +208,7 @@ values: projection, and extent.</p>
</section>
<hr class="docutils" />
<section id="function-set-size">
<h3>3 Function: set_size()<a class="headerlink" href="#function-set-size" title="Permalink to this headline"></a></h3>
<h3>3 Function: set_size()<a class="headerlink" href="#function-set-size" title="Permalink to this heading"></a></h3>
<p>Here were defining a function that will allow us to pass in the
dimensions of the output file we desire in pixels. Default Python
methods require the size to be set in inches, which is confusing in our
@ -247,7 +248,7 @@ pixels, with no padding or buffers.</p>
</section>
<hr class="docutils" />
<section id="function-write-img">
<h3>4 Function: write_img()<a class="headerlink" href="#function-write-img" title="Permalink to this headline"></a></h3>
<h3>4 Function: write_img()<a class="headerlink" href="#function-write-img" title="Permalink to this heading"></a></h3>
<p>Next, were defining another function which takes the image data, file
name, projection, extent, reference time, and whether or not to print
out a footnote.</p>
@ -292,9 +293,9 @@ modify these values if you wish to print out an image of another size
</section>
<hr class="docutils" />
<section id="get-the-data-and-write-it-out">
<h3>5 Get the Data and Write it Out!<a class="headerlink" href="#get-the-data-and-write-it-out" title="Permalink to this headline"></a></h3>
<h3>5 Get the Data and Write it Out!<a class="headerlink" href="#get-the-data-and-write-it-out" title="Permalink to this heading"></a></h3>
<section id="filter-the-data">
<h4>5.1 Filter the Data<a class="headerlink" href="#filter-the-data" title="Permalink to this headline"></a></h4>
<h4>5.1 Filter the Data<a class="headerlink" href="#filter-the-data" title="Permalink to this heading"></a></h4>
<p>Define exactly what data we want to be printing out. This notebook is
designed to loop through and print out multiple images, so here we can
pick which images were wanting to print out. Were specifying
@ -332,7 +333,7 @@ after the dataType has been set to satellite on the request object:</p>
</div>
</section>
<section id="define-output-location">
<h4>5.2 Define Output Location<a class="headerlink" href="#define-output-location" title="Permalink to this headline"></a></h4>
<h4>5.2 Define Output Location<a class="headerlink" href="#define-output-location" title="Permalink to this heading"></a></h4>
<p>Here we define a folder for where the satellite images will be written
to. The default directory is a new folder called output that lives
whereever this notebook lives.</p>
@ -361,7 +362,7 @@ depend on where this notebook is located. For example (for a Mac):</p>
</div>
</section>
<section id="write-out-goes-images">
<h4>5.3 Write Out GOES Images<a class="headerlink" href="#write-out-goes-images" title="Permalink to this headline"></a></h4>
<h4>5.3 Write Out GOES Images<a class="headerlink" href="#write-out-goes-images" title="Permalink to this heading"></a></h4>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># First loop through the sectors (location names)</span>
<span class="k">for</span> <span class="n">sector</span> <span class="ow">in</span> <span class="n">sectors</span><span class="p">:</span>
@ -471,16 +472,16 @@ Done!
</section>
<hr class="docutils" />
<section id="see-also">
<h3>6 See Also<a class="headerlink" href="#see-also" title="Permalink to this headline"></a></h3>
<h3>6 See Also<a class="headerlink" href="#see-also" title="Permalink to this heading"></a></h3>
<section id="related-notebooks">
<h4>6.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this headline"></a></h4>
<h4>6.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this heading"></a></h4>
<ul class="simple">
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/examples/generated/Satellite_Imagery.html">Satellite
Imagery</a></p></li>
</ul>
</section>
<section id="additional-documentation">
<h4>6.2 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this headline"></a></h4>
<h4>6.2 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this heading"></a></h4>
<p><strong>CIRA Quick Guides</strong></p>
<ul class="simple">
<li><p><a class="reference external" href="https://rammb.cira.colostate.edu/training/visit/quick_guides/QuickGuide_DEBRA-Dust_20210217.pdf">DEBRA-Dust</a></p></li>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -96,7 +97,7 @@
<div itemprop="articleBody">
<section id="goes-geostationary-lightning-mapper">
<h1>GOES Geostationary Lightning Mapper<a class="headerlink" href="#goes-geostationary-lightning-mapper" title="Permalink to this headline"></a></h1>
<h1>GOES Geostationary Lightning Mapper<a class="headerlink" href="#goes-geostationary-lightning-mapper" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/GOES_Geostationary_Lightning_Mapper.ipynb">Notebook</a>
The Geostationary Lightning Mapper, or GLM, on board GOES-R Series
spacecraft, is the first operational lightning mapper flown in
@ -124,7 +125,7 @@ tornadoes, hurricanes, flash floods, snowstorms and fires.</p>
<li><p>strikeType</p></li>
</ul>
<section id="glm-sources-and-parameters">
<h2>GLM Sources and Parameters<a class="headerlink" href="#glm-sources-and-parameters" title="Permalink to this headline"></a></h2>
<h2>GLM Sources and Parameters<a class="headerlink" href="#glm-sources-and-parameters" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">awips.dataaccess</span> <span class="kn">import</span> <span class="n">DataAccessLayer</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">import</span> <span class="nn">cartopy.feature</span> <span class="k">as</span> <span class="nn">cfeat</span>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -109,12 +110,12 @@
<div itemprop="articleBody">
<section id="grid-levels-and-parameters">
<h1>Grid Levels and Parameters<a class="headerlink" href="#grid-levels-and-parameters" title="Permalink to this headline"></a></h1>
<h1>Grid Levels and Parameters<a class="headerlink" href="#grid-levels-and-parameters" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Grid_Levels_and_Parameters.ipynb">Notebook</a>
Python-AWIPS Tutorial Notebook</p>
<hr class="docutils" />
<section id="objectives">
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this headline"></a></h2>
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>Cover the relevant methods for accessing EDEX and investigating what
data is available.</p></li>
@ -127,7 +128,7 @@ might be a helpful reference.</p></li>
</ul>
<hr class="docutils" />
<section id="table-of-contents">
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this headline"></a></h3>
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading"></a></h3>
<div class="line-block">
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html#imports">1
Imports</a></div>
@ -155,7 +156,7 @@ Notebooks</a></div>
</section>
<hr class="docutils" />
<section id="imports">
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this headline"></a></h3>
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this heading"></a></h3>
<p>Start by importing the DataAccessLayer package from python-awips:</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">awips.dataaccess</span> <span class="kn">import</span> <span class="n">DataAccessLayer</span>
</pre></div>
@ -164,7 +165,7 @@ Notebooks</a></div>
</section>
<hr class="docutils" />
<section id="connect-to-edex">
<h3>2 Connect to EDEX<a class="headerlink" href="#connect-to-edex" title="Permalink to this headline"></a></h3>
<h3>2 Connect to EDEX<a class="headerlink" href="#connect-to-edex" title="Permalink to this heading"></a></h3>
<p>Define a url for your EDEX connection, and then point python-awips at
that EDEX</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Unidata&#39;s cloud EDEX instance is used in this example</span>
@ -176,7 +177,7 @@ that EDEX</p>
</section>
<hr class="docutils" />
<section id="get-a-list-of-supported-data-types">
<h3>3 Get a List of Supported Data Types<a class="headerlink" href="#get-a-list-of-supported-data-types" title="Permalink to this headline"></a></h3>
<h3>3 Get a List of Supported Data Types<a class="headerlink" href="#get-a-list-of-supported-data-types" title="Permalink to this heading"></a></h3>
<p><a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.getSupportedDatatypes">DataAccessLayer.getSupportedDatatypes()</a>
returns a list of supported data types offered by the EDEX server
defined above. The code below shows how to populate, sort, and print out
@ -219,7 +220,7 @@ that list.</p>
</section>
<hr class="docutils" />
<section id="create-a-new-data-request-and-set-the-type">
<h3>4 Create a New Data Request and Set the Type<a class="headerlink" href="#create-a-new-data-request-and-set-the-type" title="Permalink to this headline"></a></h3>
<h3>4 Create a New Data Request and Set the Type<a class="headerlink" href="#create-a-new-data-request-and-set-the-type" title="Permalink to this heading"></a></h3>
<p>Now create a new data request using
<a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.newDataRequest">DataAccessLayer.newDataRequest()</a>,
and set the data type using
@ -238,7 +239,7 @@ is where the model data can be found, along with some other datasets
</section>
<hr class="docutils" />
<section id="get-available-locations">
<h3>5 Get Available Locations<a class="headerlink" href="#get-available-locations" title="Permalink to this headline"></a></h3>
<h3>5 Get Available Locations<a class="headerlink" href="#get-available-locations" title="Permalink to this heading"></a></h3>
<p>Use the
<a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.getAvailableLocationNames">DataAccessLayer.getAvailableLocationNames(request)</a>
method to find out what locations are available for the given dataset.
@ -316,7 +317,7 @@ outputted for the grid_request, for example.</p>
</section>
<hr class="docutils" />
<section id="get-available-parameters">
<h3>6 Get Available Parameters<a class="headerlink" href="#get-available-parameters" title="Permalink to this headline"></a></h3>
<h3>6 Get Available Parameters<a class="headerlink" href="#get-available-parameters" title="Permalink to this heading"></a></h3>
<p>Were setting the “location” (in this case, what model we are interested
in) to specify our request before we look at the available parameters.</p>
<p>Take a look at the available parameters for the data set by using
@ -608,7 +609,7 @@ in) to specify our request before we look at the available parameters.</p>
</section>
<hr class="docutils" />
<section id="get-available-levels">
<h3>7 Get Available Levels<a class="headerlink" href="#get-available-levels" title="Permalink to this headline"></a></h3>
<h3>7 Get Available Levels<a class="headerlink" href="#get-available-levels" title="Permalink to this heading"></a></h3>
<p>Setting the parameters is just an option, you do not need to filter the
data if you do not wish to. Also, although we are only setting one
parameter in this example, you can set multiple parameters by using an
@ -899,7 +900,7 @@ likely because levels are not supported for that data type.</p>
</section>
<hr class="docutils" />
<section id="get-available-times">
<h3>8 Get Available Times<a class="headerlink" href="#get-available-times" title="Permalink to this headline"></a></h3>
<h3>8 Get Available Times<a class="headerlink" href="#get-available-times" title="Permalink to this heading"></a></h3>
<p>Take a look at what time options are available for the data youre
looking at using the
<a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.getAvailableTimes">DataAccessLayer.getAvailableTimes()</a>
@ -986,7 +987,7 @@ single forecast cycle.</p></li>
</section>
<hr class="docutils" />
<section id="get-the-data">
<h3>9 Get the Data!<a class="headerlink" href="#get-the-data" title="Permalink to this headline"></a></h3>
<h3>9 Get the Data!<a class="headerlink" href="#get-the-data" title="Permalink to this heading"></a></h3>
<p>Now that we have our <code class="docutils literal notranslate"><span class="pre">request</span></code> and DataTime <code class="docutils literal notranslate"><span class="pre">fcstRun</span></code> arrays ready,
its time to request the data array from EDEX. Depending on what kind of
data were working with, well either use
@ -1022,13 +1023,13 @@ visualize the data once you have what you want.</p>
</section>
<hr class="docutils" />
<section id="see-also">
<h3>10 See Also<a class="headerlink" href="#see-also" title="Permalink to this headline"></a></h3>
<h3>10 See Also<a class="headerlink" href="#see-also" title="Permalink to this heading"></a></h3>
<p>Several functions are used throughout this notebook from the
DataAccessLayer class in python-awips, to see full documentation for
these functions vist
<a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html#">here</a>.</p>
<section id="related-notebooks">
<h4>10.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this headline"></a></h4>
<h4>10.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this heading"></a></h4>
<ul class="simple">
<li><p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Colored_Surface_Temperature_Plot.html">Colored Surface Temperature
Plot</a></p></li>

File diff suppressed because one or more lines are too long

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -110,12 +111,12 @@
<div itemprop="articleBody">
<section id="map-resources-and-topography">
<h1>Map Resources and Topography<a class="headerlink" href="#map-resources-and-topography" title="Permalink to this headline"></a></h1>
<h1>Map Resources and Topography<a class="headerlink" href="#map-resources-and-topography" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Map_Resources_and_Topography.ipynb">Notebook</a>
Python-AWIPS Tutorial Notebook</p>
<hr class="docutils" />
<section id="objectives">
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this headline"></a></h2>
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>Use python-awips to connect to an edex server</p></li>
<li><p>Define data request object specifically for the maps database</p></li>
@ -125,7 +126,7 @@ context</p></li>
</ul>
<hr class="docutils" />
<section id="table-of-contents">
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this headline"></a></h3>
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading"></a></h3>
<div class="line-block">
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Map_Resources_and_Topography.html#imports">1
Imports</a></div>
@ -154,7 +155,7 @@ Documentation</a></div>
</div>
</section>
<section id="imports">
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this headline"></a></h3>
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this heading"></a></h3>
<p>The imports below are used throughout the notebook. Note the first
import is coming directly from python-awips and allows us to connect to
an EDEX server. The subsequent imports are for data manipulation and
@ -172,7 +173,7 @@ visualization.</p>
</section>
<hr class="docutils" />
<section id="connect-to-edex">
<h3>2 Connect to EDEX<a class="headerlink" href="#connect-to-edex" title="Permalink to this headline"></a></h3>
<h3>2 Connect to EDEX<a class="headerlink" href="#connect-to-edex" title="Permalink to this heading"></a></h3>
<p>First we establish a connection to Unidatas public EDEX server. With
that connection made, we can create a <a class="reference external" href="http://unidata.github.io/python-awips/api/IDataRequest.html">new data request
object</a>
@ -186,7 +187,7 @@ and set the data type to <strong>maps</strong>.</p>
</section>
<hr class="docutils" />
<section id="function-make-map">
<h3>3 Function: make_map()<a class="headerlink" href="#function-make-map" title="Permalink to this headline"></a></h3>
<h3>3 Function: make_map()<a class="headerlink" href="#function-make-map" title="Permalink to this heading"></a></h3>
<p>In many of our notebooks we end up plotting map images, and this logic
below is the same from those other notebooks. Typically, functions are
defined when they are called multiple times throughout a notebook. In
@ -210,7 +211,7 @@ logic neatly defined for consistency.</p>
</section>
<hr class="docutils" />
<section id="create-initial-map-from-cwa">
<h3>4 Create Initial Map From CWA<a class="headerlink" href="#create-initial-map-from-cwa" title="Permalink to this headline"></a></h3>
<h3>4 Create Initial Map From CWA<a class="headerlink" href="#create-initial-map-from-cwa" title="Permalink to this heading"></a></h3>
<p>The python-awips package provides access to the entire AWIPS Maps
Database for use in Python GIS applications. Map objects are returned as
Shapely geometries and can be easily plotted by many Python packages.</p>
@ -292,7 +293,7 @@ to refine our query to EDEX.</p>
</section>
<hr class="docutils" />
<section id="draw-merged-cwa">
<h3>5 Draw Merged CWA<a class="headerlink" href="#draw-merged-cwa" title="Permalink to this headline"></a></h3>
<h3>5 Draw Merged CWA<a class="headerlink" href="#draw-merged-cwa" title="Permalink to this heading"></a></h3>
<p>In the previous section we created a merged polygon with the applicable
counties. Here, we draw this new shape on top of our existing map in a
burnt orange color.</p>
@ -309,7 +310,7 @@ burnt orange color.</p>
</section>
<hr class="docutils" />
<section id="draw-interstates-using-boundary-filter">
<h3>6 Draw Interstates using Boundary Filter<a class="headerlink" href="#draw-interstates-using-boundary-filter" title="Permalink to this headline"></a></h3>
<h3>6 Draw Interstates using Boundary Filter<a class="headerlink" href="#draw-interstates-using-boundary-filter" title="Permalink to this heading"></a></h3>
<p>Now, well use the previously-defined
<strong>envelope=merged_counties.buffer(2)</strong> in a <strong>newDataRequest()</strong> to
request interstate geometries which fall inside the buffered boundary.</p>
@ -336,7 +337,7 @@ request interstate geometries which fall inside the buffered boundary.</p>
</section>
<hr class="docutils" />
<section id="draw-nearby-cities">
<h3>7 Draw Nearby Cities<a class="headerlink" href="#draw-nearby-cities" title="Permalink to this headline"></a></h3>
<h3>7 Draw Nearby Cities<a class="headerlink" href="#draw-nearby-cities" title="Permalink to this heading"></a></h3>
<p>Request the city table based using the <strong>envelope</strong> attribute and filter
by population and progressive disclosure level.</p>
<blockquote>
@ -383,7 +384,7 @@ values appear to change significantly depending on WFO site.</p>
</section>
<hr class="docutils" />
<section id="draw-nearby-lakes">
<h3>8 Draw Nearby Lakes<a class="headerlink" href="#draw-nearby-lakes" title="Permalink to this headline"></a></h3>
<h3>8 Draw Nearby Lakes<a class="headerlink" href="#draw-nearby-lakes" title="Permalink to this heading"></a></h3>
<p>Again, use the <strong>envelope</strong> attribute to define a new data requst for
the nearby lakes.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Define request for lakes</span>
@ -410,7 +411,7 @@ the nearby lakes.</p>
</section>
<hr class="docutils" />
<section id="draw-major-rivers">
<h3>9 Draw Major Rivers<a class="headerlink" href="#draw-major-rivers" title="Permalink to this headline"></a></h3>
<h3>9 Draw Major Rivers<a class="headerlink" href="#draw-major-rivers" title="Permalink to this heading"></a></h3>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Define request for rivers</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="s1">&#39;maps&#39;</span><span class="p">,</span> <span class="n">envelope</span><span class="o">=</span><span class="n">envelope</span><span class="p">)</span>
<span class="n">request</span><span class="o">.</span><span class="n">addIdentifier</span><span class="p">(</span><span class="s1">&#39;table&#39;</span><span class="p">,</span> <span class="s1">&#39;mapdata.majorrivers&#39;</span><span class="p">)</span>
@ -433,7 +434,7 @@ the nearby lakes.</p>
</section>
<hr class="docutils" />
<section id="draw-topography">
<h3>10 Draw Topography<a class="headerlink" href="#draw-topography" title="Permalink to this headline"></a></h3>
<h3>10 Draw Topography<a class="headerlink" href="#draw-topography" title="Permalink to this heading"></a></h3>
<p>Spatial envelopes are required for topo requests, which can become slow
to download and render for large (CONUS) maps.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Define topography request</span>
@ -485,9 +486,9 @@ to download and render for large (CONUS) maps.</p>
</section>
<hr class="docutils" />
<section id="see-also">
<h3>11 See Also<a class="headerlink" href="#see-also" title="Permalink to this headline"></a></h3>
<h3>11 See Also<a class="headerlink" href="#see-also" title="Permalink to this heading"></a></h3>
<section id="additional-documentation">
<h4>11.1 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this headline"></a></h4>
<h4>11.1 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this heading"></a></h4>
<ul>
<li><p>This notebook requires: <strong>python-awips, numpy, matplotplib, cartopy,
shapely</strong></p></li>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -99,7 +100,7 @@
<div itemprop="articleBody">
<section id="model-sounding-data">
<h1>Model Sounding Data<a class="headerlink" href="#model-sounding-data" title="Permalink to this headline"></a></h1>
<h1>Model Sounding Data<a class="headerlink" href="#model-sounding-data" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Model_Sounding_Data.ipynb">Notebook</a>
The EDEX modelsounding plugin creates 64-level vertical profiles from
GFS and ETA (NAM) BUFR products distirubted over NOAAport. Paramters
@ -126,7 +127,7 @@ which are requestable are <strong>pressure</strong>, <strong>temperature</strong
</pre></div>
</div>
<section id="available-locations">
<h2>Available Locations<a class="headerlink" href="#available-locations" title="Permalink to this headline"></a></h2>
<h2>Available Locations<a class="headerlink" href="#available-locations" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">locations</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableLocationNames</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">locations</span><span class="o">.</span><span class="n">sort</span><span class="p">()</span>
<span class="nb">list</span><span class="p">(</span><span class="n">locations</span><span class="p">)</span>
@ -1150,7 +1151,7 @@ which are requestable are <strong>pressure</strong>, <strong>temperature</strong
</div>
</section>
<section id="model-sounding-parameters">
<h2>Model Sounding Parameters<a class="headerlink" href="#model-sounding-parameters" title="Permalink to this headline"></a></h2>
<h2>Model Sounding Parameters<a class="headerlink" href="#model-sounding-parameters" title="Permalink to this heading"></a></h2>
<p>Construct arrays for each parameter to plot (temperature, pressure,
moisutre (spec. humidity), wind components, and cloud cover)</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">tmp</span><span class="p">,</span><span class="n">prs</span><span class="p">,</span><span class="n">sh</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">np</span><span class="o">.</span><span class="n">array</span><span class="p">([]),</span><span class="n">np</span><span class="o">.</span><span class="n">array</span><span class="p">([])</span>
@ -1185,7 +1186,7 @@ moisutre (spec. humidity), wind components, and cloud cover)</p>
</div>
</section>
<section id="calculating-dewpoint-from-specific-humidity">
<h2>Calculating Dewpoint from Specific Humidity<a class="headerlink" href="#calculating-dewpoint-from-specific-humidity" title="Permalink to this headline"></a></h2>
<h2>Calculating Dewpoint from Specific Humidity<a class="headerlink" href="#calculating-dewpoint-from-specific-humidity" title="Permalink to this heading"></a></h2>
<p>Because the modelsounding plugin does not return dewpoint values, we
must calculate the profile ourselves. Here are three examples of
dewpoint calculated from specific humidity, including a manual
@ -1223,7 +1224,7 @@ calculation following NCEP AWIPS/NSHARP.</p>
</div>
</section>
<section id="metpy-skewt-and-hodograph">
<h2>MetPy SkewT and Hodograph<a class="headerlink" href="#metpy-skewt-and-hodograph" title="Permalink to this headline"></a></h2>
<h2>MetPy SkewT and Hodograph<a class="headerlink" href="#metpy-skewt-and-hodograph" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="k">matplotlib</span> inline
<span class="n">plt</span><span class="o">.</span><span class="n">rcParams</span><span class="p">[</span><span class="s1">&#39;figure.figsize&#39;</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="mi">12</span><span class="p">,</span> <span class="mi">14</span><span class="p">)</span>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -93,7 +94,7 @@
<div itemprop="articleBody">
<section id="nexrad-level3-radar">
<h1>NEXRAD Level3 Radar<a class="headerlink" href="#nexrad-level3-radar" title="Permalink to this headline"></a></h1>
<h1>NEXRAD Level3 Radar<a class="headerlink" href="#nexrad-level3-radar" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/NEXRAD_Level3_Radar.ipynb">Notebook</a>
.. code:: ipython3</p>
<blockquote>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -93,7 +94,7 @@
<div itemprop="articleBody">
<section id="precip-accumulation-region-of-interest">
<h1>Precip Accumulation-Region Of Interest<a class="headerlink" href="#precip-accumulation-region-of-interest" title="Permalink to this headline"></a></h1>
<h1>Precip Accumulation-Region Of Interest<a class="headerlink" href="#precip-accumulation-region-of-interest" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Precip_Accumulation-Region_Of_Interest.ipynb">Notebook</a>
A way to determine areas of greatest precipitation and generate imagery
for that sector.</p>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -98,7 +99,7 @@
<div itemprop="articleBody">
<section id="regional-surface-obs-plot">
<h1>Regional Surface Obs Plot<a class="headerlink" href="#regional-surface-obs-plot" title="Permalink to this headline"></a></h1>
<h1>Regional Surface Obs Plot<a class="headerlink" href="#regional-surface-obs-plot" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Regional_Surface_Obs_Plot.ipynb">Notebook</a>
This exercise creates a surface observsation station plot for the state
of Florida, using both METAR (datatype <em>obs</em>) and Synoptic (datatype
@ -210,7 +211,7 @@ exercise.</p>
<img alt="../../_images/Regional_Surface_Obs_Plot_4_1.png" src="../../_images/Regional_Surface_Obs_Plot_4_1.png" />
<hr class="docutils" />
<section id="plot-metar-obs">
<h2>Plot METAR (obs)<a class="headerlink" href="#plot-metar-obs" title="Permalink to this headline"></a></h2>
<h2>Plot METAR (obs)<a class="headerlink" href="#plot-metar-obs" title="Permalink to this heading"></a></h2>
<p>Here we use a spatial envelope to limit the request to the boundary or
our plot. Without such a filter you may be requesting many tens of
thousands of records.</p>
@ -298,7 +299,7 @@ plotting function later:</p>
</section>
<hr class="docutils" />
<section id="plot-synoptic-sfcobs">
<h2>Plot Synoptic (sfcobs)<a class="headerlink" href="#plot-synoptic-sfcobs" title="Permalink to this headline"></a></h2>
<h2>Plot Synoptic (sfcobs)<a class="headerlink" href="#plot-synoptic-sfcobs" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># New sfcobs/SYNOP request</span>
<span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">changeEDEXHost</span><span class="p">(</span><span class="n">edexServer</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="s2">&quot;sfcobs&quot;</span><span class="p">,</span> <span class="n">envelope</span><span class="o">=</span><span class="n">envelope</span><span class="p">)</span>
@ -378,7 +379,7 @@ plotting function later:</p>
</section>
<hr class="docutils" />
<section id="plot-both-metar-and-synop">
<h2>Plot both METAR and SYNOP<a class="headerlink" href="#plot-both-metar-and-synop" title="Permalink to this headline"></a></h2>
<h2>Plot both METAR and SYNOP<a class="headerlink" href="#plot-both-metar-and-synop" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">custom_layout</span> <span class="o">=</span> <span class="n">StationPlotLayout</span><span class="p">()</span>
<span class="n">custom_layout</span><span class="o">.</span><span class="n">add_barb</span><span class="p">(</span><span class="s1">&#39;eastward_wind&#39;</span><span class="p">,</span> <span class="s1">&#39;northward_wind&#39;</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">&#39;knots&#39;</span><span class="p">)</span>
<span class="n">custom_layout</span><span class="o">.</span><span class="n">add_value</span><span class="p">(</span><span class="s1">&#39;NW&#39;</span><span class="p">,</span> <span class="s1">&#39;air_temperature&#39;</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">&#39;.0f&#39;</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">&#39;degF&#39;</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">&#39;darkred&#39;</span><span class="p">)</span>

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -99,13 +100,13 @@
<div itemprop="articleBody">
<section id="satellite-imagery">
<h1>Satellite Imagery<a class="headerlink" href="#satellite-imagery" title="Permalink to this headline"></a></h1>
<h1>Satellite Imagery<a class="headerlink" href="#satellite-imagery" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Satellite_Imagery.ipynb">Notebook</a>
Satellite images are returned by Python AWIPS as grids, and can be
rendered with Cartopy pcolormesh the same as gridded forecast models in
other python-awips examples.</p>
<section id="available-sources-creating-entities-sectors-and-products">
<h2>Available Sources, Creating Entities, Sectors, and Products<a class="headerlink" href="#available-sources-creating-entities-sectors-and-products" title="Permalink to this headline"></a></h2>
<h2>Available Sources, Creating Entities, Sectors, and Products<a class="headerlink" href="#available-sources-creating-entities-sectors-and-products" title="Permalink to this heading"></a></h2>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="kn">from</span> <span class="nn">awips.dataaccess</span> <span class="kn">import</span> <span class="n">DataAccessLayer</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">import</span> <span class="nn">cartopy.feature</span> <span class="k">as</span> <span class="nn">cfeat</span>
@ -653,7 +654,7 @@ other python-awips examples.</p>
</pre></div>
</div>
<section id="goes-16-mesoscale-sectors">
<h3>GOES 16 Mesoscale Sectors<a class="headerlink" href="#goes-16-mesoscale-sectors" title="Permalink to this headline"></a></h3>
<h3>GOES 16 Mesoscale Sectors<a class="headerlink" href="#goes-16-mesoscale-sectors" title="Permalink to this heading"></a></h3>
<p>Define our imports, and define our map properties first.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="o">%</span><span class="k">matplotlib</span> inline

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -93,7 +94,7 @@
<div itemprop="articleBody">
<section id="upper-air-bufr-soundings">
<h1>Upper Air BUFR Soundings<a class="headerlink" href="#upper-air-bufr-soundings" title="Permalink to this headline"></a></h1>
<h1>Upper Air BUFR Soundings<a class="headerlink" href="#upper-air-bufr-soundings" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Upper_Air_BUFR_Soundings.ipynb">Notebook</a>
The following script takes you through the steps of retrieving an Upper
Air vertical profile from an AWIPS EDEX server and plotting a

View file

@ -14,6 +14,7 @@
<script data-url_root="../../" id="documentation_options" src="../../_static/documentation_options.js"></script>
<script src="../../_static/jquery.js"></script>
<script src="../../_static/underscore.js"></script>
<script src="../../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../../_static/doctools.js"></script>
<script src="../../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../../about.html" />
@ -108,12 +109,12 @@
<div itemprop="articleBody">
<section id="watch-warning-and-advisory-plotting">
<h1>Watch Warning and Advisory Plotting<a class="headerlink" href="#watch-warning-and-advisory-plotting" title="Permalink to this headline"></a></h1>
<h1>Watch Warning and Advisory Plotting<a class="headerlink" href="#watch-warning-and-advisory-plotting" title="Permalink to this heading"></a></h1>
<p><a class="reference external" href="http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Watch_Warning_and_Advisory_Plotting.ipynb">Notebook</a>
Python-AWIPS Tutorial Notebook</p>
<hr class="docutils" />
<section id="objectives">
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this headline"></a></h2>
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this heading"></a></h2>
<ul class="simple">
<li><p>Create a colorized plot with <a class="reference external" href="https://weather.cod.edu/notes/criteria/">Warnings, Watches, Advisories and
Statements (WWAs)</a></p></li>
@ -129,7 +130,7 @@ maps</p></li>
</ul>
<hr class="docutils" />
<section id="table-of-contents">
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this headline"></a></h3>
<h3>Table of Contents<a class="headerlink" href="#table-of-contents" title="Permalink to this heading"></a></h3>
<div class="line-block">
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Watch_Warning_and_Advisory_Plotting.html#imports">1
Imports</a></div>
@ -168,7 +169,7 @@ Documentation</a></div>
</div>
</section>
<section id="imports">
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this headline"></a></h3>
<h3>1 Imports<a class="headerlink" href="#imports" title="Permalink to this heading"></a></h3>
<p>The imports below are used throughout the notebook. The python-awips
imports allow us to connect to an EDEX server, use the warning lookup
dictionary, and define a TimeRange. The additional imports are for data
@ -193,7 +194,7 @@ manipulation and visualization.</p>
</section>
<hr class="docutils" />
<section id="function-make-map">
<h3>2 Function: make_map()<a class="headerlink" href="#function-make-map" title="Permalink to this headline"></a></h3>
<h3>2 Function: make_map()<a class="headerlink" href="#function-make-map" title="Permalink to this heading"></a></h3>
<p>In order to plot more than one image, its easiest to define common
logic in a function. However, for this notebook we only use it in one
place. It is a function you will find in most of our example notebooks.</p>
@ -216,7 +217,7 @@ to create a figure and axis. The lat/lon grids are added.</p>
</section>
<hr class="docutils" />
<section id="function-get-color">
<h3>3 Function: get_color()<a class="headerlink" href="#function-get-color" title="Permalink to this headline"></a></h3>
<h3>3 Function: get_color()<a class="headerlink" href="#function-get-color" title="Permalink to this heading"></a></h3>
<p>Since well be needing to access the color using the vtec lookup table
in several places, creating an easily recognizable function is useful.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">get_color</span><span class="p">(</span><span class="n">phensig</span><span class="p">):</span>
@ -227,7 +228,7 @@ in several places, creating an easily recognizable function is useful.</p>
</section>
<hr class="docutils" />
<section id="function-get-title">
<h3>4 Function get_title()<a class="headerlink" href="#function-get-title" title="Permalink to this headline"></a></h3>
<h3>4 Function get_title()<a class="headerlink" href="#function-get-title" title="Permalink to this heading"></a></h3>
<p>Similar to the color function just defined, accessing the full name for
the phensig will also be necessary, so this function will be helpful.</p>
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">get_title</span><span class="p">(</span><span class="n">phensig</span><span class="p">):</span>
@ -238,9 +239,9 @@ the phensig will also be necessary, so this function will be helpful.</p>
</section>
<hr class="docutils" />
<section id="initial-setup">
<h3>5 Initial Setup<a class="headerlink" href="#initial-setup" title="Permalink to this headline"></a></h3>
<h3>5 Initial Setup<a class="headerlink" href="#initial-setup" title="Permalink to this heading"></a></h3>
<section id="edex-connection">
<h4>5.1 EDEX Connection<a class="headerlink" href="#edex-connection" title="Permalink to this headline"></a></h4>
<h4>5.1 EDEX Connection<a class="headerlink" href="#edex-connection" title="Permalink to this heading"></a></h4>
<p>First we establish a connection to Unidatas public EDEX server. With
that connection made, we can create a <a class="reference external" href="http://unidata.github.io/python-awips/api/IDataRequest.html">new data request
object</a>
@ -260,7 +261,7 @@ Levels and Parameters Notebook.</p>
</div>
</section>
<section id="significance-sig-constants">
<h4>5.2 Significance (Sig) Constants<a class="headerlink" href="#significance-sig-constants" title="Permalink to this headline"></a></h4>
<h4>5.2 Significance (Sig) Constants<a class="headerlink" href="#significance-sig-constants" title="Permalink to this heading"></a></h4>
<p>The two parameters were requesting for our warning objects are
<strong>phensig</strong> and <strong>sig</strong> where phensig is styled “XX.Y” and sig is “Y”.
Phen stands for “Phenomena” and sig stands for “Significance”. <a class="reference external" href="https://www.weather.gov/media/vtec/VTEC_explanation4-20.pdf">A more
@ -280,7 +281,7 @@ message it is (what significance it is).</p>
</section>
<hr class="docutils" />
<section id="filter-by-time">
<h3>6 Filter by Time<a class="headerlink" href="#filter-by-time" title="Permalink to this headline"></a></h3>
<h3>6 Filter by Time<a class="headerlink" href="#filter-by-time" title="Permalink to this heading"></a></h3>
<p>Here we decide how much data we want to pull from EDEX. By default well
request 12 hours, but that value can easily be modified by <cite>adjusting
the
@ -301,9 +302,9 @@ will take to run.</p>
</section>
<hr class="docutils" />
<section id="use-the-data">
<h3>7 Use the Data!<a class="headerlink" href="#use-the-data" title="Permalink to this headline"></a></h3>
<h3>7 Use the Data!<a class="headerlink" href="#use-the-data" title="Permalink to this heading"></a></h3>
<section id="get-the-data">
<h4>7.1 Get the Data<a class="headerlink" href="#get-the-data" title="Permalink to this headline"></a></h4>
<h4>7.1 Get the Data<a class="headerlink" href="#get-the-data" title="Permalink to this heading"></a></h4>
<p>Now that we have our <code class="docutils literal notranslate"><span class="pre">request</span></code> and TimeRange <code class="docutils literal notranslate"><span class="pre">timerange</span></code> objects
ready, its time to request the data array from EDEX.</p>
<div class="alert-info docutils container">
@ -321,7 +322,7 @@ run.</p>
</div>
</section>
<section id="extract-phensigs-geometries-and-times">
<h4>7.2 Extract Phensigs, Geometries, and Times<a class="headerlink" href="#extract-phensigs-geometries-and-times" title="Permalink to this headline"></a></h4>
<h4>7.2 Extract Phensigs, Geometries, and Times<a class="headerlink" href="#extract-phensigs-geometries-and-times" title="Permalink to this heading"></a></h4>
<p>In this section we start gathering all the information well need to
properly display our data. First we create an array to keep track of
unique phensigs. This is useful summary information and will be used to
@ -446,9 +447,9 @@ phensig.</p>
</section>
<hr class="docutils" />
<section id="plot-the-data">
<h3>8 Plot the Data!<a class="headerlink" href="#plot-the-data" title="Permalink to this headline"></a></h3>
<h3>8 Plot the Data!<a class="headerlink" href="#plot-the-data" title="Permalink to this heading"></a></h3>
<section id="create-state-and-political-boundaries">
<h4>8.1 Create State and Political Boundaries<a class="headerlink" href="#create-state-and-political-boundaries" title="Permalink to this headline"></a></h4>
<h4>8.1 Create State and Political Boundaries<a class="headerlink" href="#create-state-and-political-boundaries" title="Permalink to this heading"></a></h4>
<p>Define the state and political boundaries that well use in our plot to
give more of a frame of reference. These objects are standard method
calls in the <a class="reference external" href="https://scitools.org.uk/cartopy/docs/v0.14/matplotlib/feature_interface.html#cartopy.feature.NaturalEarthFeature">Cartopy Feature package, using the NaturalEarthFeature
@ -466,7 +467,7 @@ function</a>.</p>
</div>
</section>
<section id="draw-the-plot-and-legend-for-wwas">
<h4>8.2 Draw the Plot and Legend for WWAs<a class="headerlink" href="#draw-the-plot-and-legend-for-wwas" title="Permalink to this headline"></a></h4>
<h4>8.2 Draw the Plot and Legend for WWAs<a class="headerlink" href="#draw-the-plot-and-legend-for-wwas" title="Permalink to this heading"></a></h4>
<p>Here is where we finally get ot draw something! The very first few lines
of this section are constants that we can manually “switch on and off”
for what records we want displayed. By default we have all significance
@ -570,7 +571,7 @@ all the features to the axes, and add the legend as well.</p>
</section>
<hr class="docutils" />
<section id="see-also">
<h3>9 See Also<a class="headerlink" href="#see-also" title="Permalink to this headline"></a></h3>
<h3>9 See Also<a class="headerlink" href="#see-also" title="Permalink to this heading"></a></h3>
<ul class="simple">
<li><p><a class="reference external" href="https://www.weather.gov/lwx/warningsdefined#:~:text=A%20Winter%20Storm%20Warning%20is%20issued%20when%20a,combination%20of%20snow%20and%2For%20ice%20accumulation%20with%20wind.">National Weather Service WWA Definitions (Baltimore
Office)</a></p></li>
@ -580,14 +581,14 @@ Definitions</a></p></li>
Explanation</a></p></li>
</ul>
<section id="related-notebooks">
<h4>9.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this headline"></a></h4>
<h4>9.1 Related Notebooks<a class="headerlink" href="#related-notebooks" title="Permalink to this heading"></a></h4>
<ul class="simple">
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html">Grid Levels and
Parameters</a></p></li>
</ul>
</section>
<section id="additional-documentation">
<h4>9.2 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this headline"></a></h4>
<h4>9.2 Additional Documentation<a class="headerlink" href="#additional-documentation" title="Permalink to this heading"></a></h4>
<p><strong>python-awips</strong></p>
<ul class="simple">
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.changeEDEXHost">DataAccessLayer.changeEDEXHost()</a></p></li>

View file

@ -14,6 +14,7 @@
<script data-url_root="../" id="documentation_options" src="../_static/documentation_options.js"></script>
<script src="../_static/jquery.js"></script>
<script src="../_static/underscore.js"></script>
<script src="../_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="../_static/doctools.js"></script>
<script src="../_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="../about.html" />
@ -92,7 +93,7 @@
<div itemprop="articleBody">
<section id="data-plotting-examples">
<span id="examples-index"></span><h1>Data Plotting Examples<a class="headerlink" href="#data-plotting-examples" title="Permalink to this headline"></a></h1>
<span id="examples-index"></span><h1>Data Plotting Examples<a class="headerlink" href="#data-plotting-examples" title="Permalink to this heading"></a></h1>
<div class="toctree-wrapper compound">
<ul>
<li class="toctree-l1"><a class="reference internal" href="generated/Colored_Surface_Temperature_Plot.html">Colored Surface Temperature Plot</a></li>

View file

@ -13,6 +13,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="about.html" />

View file

@ -14,6 +14,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="about.html" />
@ -74,11 +75,11 @@
<div itemprop="articleBody">
<section id="python-awips-data-access-framework">
<h1>Python AWIPS Data Access Framework<a class="headerlink" href="#python-awips-data-access-framework" title="Permalink to this headline"></a></h1>
<h1>Python AWIPS Data Access Framework<a class="headerlink" href="#python-awips-data-access-framework" title="Permalink to this heading"></a></h1>
<p>The python-awips package provides a data access framework for requesting meteorological and geographic datasets from an <a class="reference external" href="http://unidata.github.io/awips2/#edex">EDEX</a> server.</p>
<p><a class="reference external" href="http://unidata.github.io/awips2">AWIPS</a> is a weather display and analysis package developed by the National Weather Service for operational forecasting. UCARs <a class="reference external" href="http://www.unidata.ucar.edu/software/awips2/">Unidata Program Center</a> supports a non-operational open-source release of the AWIPS software (<a class="reference external" href="http://unidata.github.io/awips2/#edex">EDEX</a>, <a class="reference external" href="http://unidata.github.io/awips2/#cave">CAVE</a>, and <a class="reference external" href="https://github.com/Unidata/python-awips">python-awips</a>).</p>
<section id="pre-requisite-software">
<h2>Pre-requisite Software<a class="headerlink" href="#pre-requisite-software" title="Permalink to this headline"></a></h2>
<h2>Pre-requisite Software<a class="headerlink" href="#pre-requisite-software" title="Permalink to this heading"></a></h2>
<dl class="simple">
<dt>In order to effictively use python-awips youll need to have these installed already:</dt><dd><ul class="simple">
<li><p>python3</p></li>
@ -89,24 +90,24 @@
</dl>
</section>
<section id="package-only-install">
<h2>Package-Only Install<a class="headerlink" href="#package-only-install" title="Permalink to this headline"></a></h2>
<h2>Package-Only Install<a class="headerlink" href="#package-only-install" title="Permalink to this heading"></a></h2>
<p>If you already work with Python, you might just be interested in how to install the python-awips pacakge.
The package can be installed with either of the two well known package managers: <strong>pip</strong> and <strong>conda</strong>.</p>
<section id="pip-install">
<h3>Pip Install<a class="headerlink" href="#pip-install" title="Permalink to this headline"></a></h3>
<h3>Pip Install<a class="headerlink" href="#pip-install" title="Permalink to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">pip</span> <span class="n">install</span> <span class="n">python</span><span class="o">-</span><span class="n">awips</span>
</pre></div>
</div>
</section>
<section id="conda-install">
<h3>Conda Install<a class="headerlink" href="#conda-install" title="Permalink to this headline"></a></h3>
<h3>Conda Install<a class="headerlink" href="#conda-install" title="Permalink to this heading"></a></h3>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">conda</span> <span class="n">install</span> <span class="o">-</span><span class="n">c</span> <span class="n">conda</span><span class="o">-</span><span class="n">forge</span> <span class="n">python</span><span class="o">-</span><span class="n">awips</span>
</pre></div>
</div>
</section>
</section>
<section id="source-code-with-examples-install">
<h2>Source Code with Examples Install<a class="headerlink" href="#source-code-with-examples-install" title="Permalink to this headline"></a></h2>
<h2>Source Code with Examples Install<a class="headerlink" href="#source-code-with-examples-install" title="Permalink to this heading"></a></h2>
<p>Below are instructions on how to install the source code of python-awips, with all included example notebooks. This will create a new conda environment called <code class="docutils literal notranslate"><span class="pre">python3-awips</span></code> and start up a browser for the jupyter notebook examples.</p>
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">git</span> <span class="n">clone</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">github</span><span class="o">.</span><span class="n">com</span><span class="o">/</span><span class="n">Unidata</span><span class="o">/</span><span class="n">python</span><span class="o">-</span><span class="n">awips</span><span class="o">.</span><span class="n">git</span>
<span class="n">cd</span> <span class="n">python</span><span class="o">-</span><span class="n">awips</span>
@ -122,7 +123,7 @@ The package can be installed with either of the two well known package managers:
</div>
</section>
<section id="questions-contact-us">
<h2>Questions Contact Us!<a class="headerlink" href="#questions-contact-us" title="Permalink to this headline"></a></h2>
<h2>Questions Contact Us!<a class="headerlink" href="#questions-contact-us" title="Permalink to this heading"></a></h2>
<p>Please feel free to reach out to us at our support email at <strong>support-awips&#64;unidata.ucar.edu</strong></p>
<div class="toctree-wrapper compound">
</div>

Binary file not shown.

View file

@ -13,6 +13,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script>
<link rel="author" title="About these documents" href="about.html" />

View file

@ -14,6 +14,7 @@
<script data-url_root="./" id="documentation_options" src="_static/documentation_options.js"></script>
<script src="_static/jquery.js"></script>
<script src="_static/underscore.js"></script>
<script src="_static/_sphinx_javascript_frameworks_compat.js"></script>
<script src="_static/doctools.js"></script>
<script src="_static/js/theme.js"></script>
<script src="_static/searchtools.js"></script>

File diff suppressed because one or more lines are too long