mirror of
https://github.com/Unidata/python-awips.git
synced 2025-02-23 14:57:56 -05:00
deploy: 602744070e
This commit is contained in:
parent
b6a8c6ccd4
commit
29efc6045f
64 changed files with 1651 additions and 1214 deletions
Binary file not shown.
Before Width: | Height: | Size: 212 KiB |
BIN
_images/METAR_Station_Plot_with_MetPy_26_0.png
Normal file
BIN
_images/METAR_Station_Plot_with_MetPy_26_0.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 254 KiB |
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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" />
|
||||
|
|
|
@ -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 Unidata’s 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 we’re going to uses MetPy’s
|
||||
`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 we’ll
|
||||
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, we’re 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 we’ll 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 we’ll 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 `MetPy’s
|
||||
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>`__
|
||||
|
||||
--------------
|
||||
|
|
134
_static/_sphinx_javascript_frameworks_compat.js
Normal file
134
_static/_sphinx_javascript_frameworks_compat.js
Normal 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;
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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() {};
|
||||
}
|
||||
*/
|
||||
|
||||
/**
|
||||
* 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
|
||||
const _ready = (callback) => {
|
||||
if (document.readyState !== "loading") {
|
||||
callback();
|
||||
} else {
|
||||
document.addEventListener("DOMContentLoaded", callback);
|
||||
}
|
||||
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");
|
||||
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(
|
||||
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.classList.add(className);
|
||||
}
|
||||
|
||||
span.appendChild(document.createTextNode(val.substr(pos, text.length)));
|
||||
parent.insertBefore(
|
||||
span,
|
||||
parent.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});
|
||||
}
|
||||
node.nextSibling
|
||||
)
|
||||
);
|
||||
node.nodeValue = val.substr(0, pos);
|
||||
|
||||
if (isInSVG) {
|
||||
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: parent, target: rect });
|
||||
}
|
||||
}
|
||||
else if (!jQuery(node).is("button, select, textarea")) {
|
||||
jQuery.each(node.childNodes, function() {
|
||||
highlight(this, addItems);
|
||||
});
|
||||
}
|
||||
} else if (node.matches && !node.matches("button, select, textarea")) {
|
||||
node.childNodes.forEach((el) => _highlight(el, addItems, text, className));
|
||||
}
|
||||
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;
|
||||
}
|
||||
const _highlightText = (thisNode, text, className) => {
|
||||
let addItems = [];
|
||||
_highlight(thisNode, addItems, text, className);
|
||||
addItems.forEach((obj) =>
|
||||
obj.parent.insertAdjacentElement("beforebegin", obj.target)
|
||||
);
|
||||
};
|
||||
|
||||
/**
|
||||
* 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',
|
||||
TRANSLATIONS: {},
|
||||
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)
|
||||
return;
|
||||
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;
|
||||
}
|
||||
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;
|
||||
}
|
||||
break;
|
||||
case 'Escape':
|
||||
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS)
|
||||
break;
|
||||
Documentation.hideSearchWords();
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// some keyboard layouts may need Shift to get /
|
||||
if (!event.shiftKey) {
|
||||
switch (event.key) {
|
||||
case '/':
|
||||
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS)
|
||||
break;
|
||||
Documentation.focusSearchBar();
|
||||
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;
|
||||
|
||||
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;
|
||||
Documentation.hideSearchWords();
|
||||
event.preventDefault();
|
||||
}
|
||||
}
|
||||
|
||||
// some keyboard layouts may need Shift to get /
|
||||
switch (event.key) {
|
||||
case "/":
|
||||
if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break;
|
||||
Documentation.focusSearchBar();
|
||||
event.preventDefault();
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
};
|
||||
|
||||
// quick alias for translations
|
||||
_ = Documentation.gettext;
|
||||
const _ = Documentation.gettext;
|
||||
|
||||
$(document).ready(function() {
|
||||
Documentation.init();
|
||||
});
|
||||
_ready(Documentation.init);
|
||||
|
|
|
@ -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,
|
||||
};
|
227
_static/jquery-3.5.1.js → _static/jquery-3.6.0.js
vendored
227
_static/jquery-3.5.1.js → _static/jquery-3.6.0.js
vendored
|
@ -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 ) {
|
||||
|
||||
|
@ -76,12 +76,16 @@ var support = {};
|
|||
|
||||
var isFunction = function isFunction( obj ) {
|
||||
|
||||
// Support: Chrome <=57, Firefox <=52
|
||||
// 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: Chrome <=57, Firefox <=52
|
||||
// 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.
|
||||
// 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";
|
||||
};
|
||||
|
||||
|
||||
var isWindow = function isWindow( obj ) {
|
||||
|
@ -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 ) {
|
||||
|
@ -401,7 +405,7 @@ jQuery.extend( {
|
|||
if ( isArrayLike( Object( arr ) ) ) {
|
||||
jQuery.merge( ret,
|
||||
typeof arr === "string" ?
|
||||
[ arr ] : arr
|
||||
[ arr ] : arr
|
||||
);
|
||||
} else {
|
||||
push.call( ret, arr );
|
||||
|
@ -496,9 +500,9 @@ if ( typeof Symbol === "function" ) {
|
|||
|
||||
// Populate the class2type map
|
||||
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
|
||||
function( _i, name ) {
|
||||
class2type[ "[object " + name + "]" ] = name.toLowerCase();
|
||||
} );
|
||||
function( _i, name ) {
|
||||
class2type[ "[object " + name + "]" ] = name.toLowerCase();
|
||||
} );
|
||||
|
||||
function isArrayLike( obj ) {
|
||||
|
||||
|
@ -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
|
||||
|
@ -3024,9 +3028,9 @@ var rneedsContext = jQuery.expr.match.needsContext;
|
|||
|
||||
function nodeName( elem, name ) {
|
||||
|
||||
return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
|
||||
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();
|
||||
}
|
||||
} );
|
||||
|
||||
|
@ -4180,8 +4184,8 @@ var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
|
|||
for ( ; i < len; i++ ) {
|
||||
fn(
|
||||
elems[ i ], key, raw ?
|
||||
value :
|
||||
value.call( elems[ i ], i, fn( elems[ i ], key ) )
|
||||
value :
|
||||
value.call( elems[ i ], i, fn( elems[ i ], key ) )
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -5387,8 +5388,8 @@ jQuery.event = {
|
|||
event = jQuery.event.fix( nativeEvent ),
|
||||
|
||||
handlers = (
|
||||
dataPriv.get( this, "events" ) || Object.create( null )
|
||||
)[ event.type ] || [],
|
||||
dataPriv.get( this, "events" ) || Object.create( null )
|
||||
)[ event.type ] || [],
|
||||
special = jQuery.event.special[ event.type ] || {};
|
||||
|
||||
// Use the fix-ed jQuery.Event rather than the (read-only) native event
|
||||
|
@ -5512,12 +5513,12 @@ jQuery.event = {
|
|||
get: isFunction( hook ) ?
|
||||
function() {
|
||||
if ( this.originalEvent ) {
|
||||
return hook( this.originalEvent );
|
||||
return hook( this.originalEvent );
|
||||
}
|
||||
} :
|
||||
function() {
|
||||
if ( this.originalEvent ) {
|
||||
return this.originalEvent[ name ];
|
||||
return this.originalEvent[ name ];
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -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 );
|
||||
}
|
||||
|
@ -7022,10 +7027,10 @@ jQuery.each( [ "height", "width" ], function( _i, dimension ) {
|
|||
// Running getBoundingClientRect on a disconnected node
|
||||
// in IE throws an error.
|
||||
( !elem.getClientRects().length || !elem.getBoundingClientRect().width ) ?
|
||||
swap( elem, cssShow, function() {
|
||||
return getWidthOrHeight( elem, dimension, extra );
|
||||
} ) :
|
||||
getWidthOrHeight( elem, dimension, extra );
|
||||
swap( elem, cssShow, function() {
|
||||
return getWidthOrHeight( elem, dimension, extra );
|
||||
} ) :
|
||||
getWidthOrHeight( elem, dimension, extra );
|
||||
}
|
||||
},
|
||||
|
||||
|
@ -7084,7 +7089,7 @@ jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
|
|||
swap( elem, { marginLeft: 0 }, function() {
|
||||
return elem.getBoundingClientRect().left;
|
||||
} )
|
||||
) + "px";
|
||||
) + "px";
|
||||
}
|
||||
}
|
||||
);
|
||||
|
@ -7223,7 +7228,7 @@ Tween.propHooks = {
|
|||
if ( jQuery.fx.step[ tween.prop ] ) {
|
||||
jQuery.fx.step[ tween.prop ]( tween );
|
||||
} else if ( tween.elem.nodeType === 1 && (
|
||||
jQuery.cssHooks[ tween.prop ] ||
|
||||
jQuery.cssHooks[ tween.prop ] ||
|
||||
tween.elem.style[ finalPropName( tween.prop ) ] != null ) ) {
|
||||
jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
|
||||
} else {
|
||||
|
@ -7468,7 +7473,7 @@ function defaultPrefilter( elem, props, opts ) {
|
|||
|
||||
anim.done( function() {
|
||||
|
||||
/* eslint-enable no-loop-func */
|
||||
/* eslint-enable no-loop-func */
|
||||
|
||||
// The final step of a "hide" animation is actually hiding the element
|
||||
if ( !hidden ) {
|
||||
|
@ -7588,7 +7593,7 @@ function Animation( elem, properties, options ) {
|
|||
tweens: [],
|
||||
createTween: function( prop, end ) {
|
||||
var tween = jQuery.Tween( elem, animation.opts, prop, end,
|
||||
animation.opts.specialEasing[ prop ] || animation.opts.easing );
|
||||
animation.opts.specialEasing[ prop ] || animation.opts.easing );
|
||||
animation.tweens.push( tween );
|
||||
return tween;
|
||||
},
|
||||
|
@ -7761,7 +7766,8 @@ jQuery.fn.extend( {
|
|||
anim.stop( true );
|
||||
}
|
||||
};
|
||||
doAnimation.finish = doAnimation;
|
||||
|
||||
doAnimation.finish = doAnimation;
|
||||
|
||||
return empty || optall.queue === false ?
|
||||
this.each( doAnimation ) :
|
||||
|
@ -8401,8 +8407,8 @@ jQuery.fn.extend( {
|
|||
if ( this.setAttribute ) {
|
||||
this.setAttribute( "class",
|
||||
className || value === false ?
|
||||
"" :
|
||||
dataPriv.get( this, "__className__" ) || ""
|
||||
"" :
|
||||
dataPriv.get( this, "__className__" ) || ""
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -8417,7 +8423,7 @@ jQuery.fn.extend( {
|
|||
while ( ( elem = this[ i++ ] ) ) {
|
||||
if ( elem.nodeType === 1 &&
|
||||
( " " + stripAndCollapse( getClass( elem ) ) + " " ).indexOf( className ) > -1 ) {
|
||||
return true;
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,7 +9040,8 @@ var
|
|||
|
||||
// Anchor tag for parsing the document origin
|
||||
originAnchor = document.createElement( "a" );
|
||||
originAnchor.href = location.href;
|
||||
|
||||
originAnchor.href = location.href;
|
||||
|
||||
// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
|
||||
function addToPrefiltersOrTransports( structure ) {
|
||||
|
@ -9414,8 +9422,8 @@ jQuery.extend( {
|
|||
// Context for global events is callbackContext if it is a DOM node or jQuery collection
|
||||
globalEventContext = s.context &&
|
||||
( callbackContext.nodeType || callbackContext.jquery ) ?
|
||||
jQuery( callbackContext ) :
|
||||
jQuery.event,
|
||||
jQuery( callbackContext ) :
|
||||
jQuery.event,
|
||||
|
||||
// Deferreds
|
||||
deferred = jQuery.Deferred(),
|
||||
|
@ -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
4
_static/jquery.js
vendored
File diff suppressed because one or more lines are too long
|
@ -10,7 +10,7 @@
|
|||
*
|
||||
*/
|
||||
|
||||
var stopwords = ["a","and","are","as","at","be","but","by","for","if","in","into","is","it","near","no","not","of","on","or","such","that","the","their","then","there","these","they","this","to","was","will","with"];
|
||||
var stopwords = ["a", "and", "are", "as", "at", "be", "but", "by", "for", "if", "in", "into", "is", "it", "near", "no", "not", "of", "on", "or", "such", "that", "the", "their", "then", "there", "these", "they", "this", "to", "was", "will", "with"];
|
||||
|
||||
|
||||
/* Non-minified version is copied as a separate JS file, is available */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -8,18 +8,20 @@
|
|||
* :license: BSD, see LICENSE for details.
|
||||
*
|
||||
*/
|
||||
"use strict";
|
||||
|
||||
if (!Scorer) {
|
||||
/**
|
||||
* Simple result scoring code.
|
||||
*/
|
||||
/**
|
||||
* 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
|
||||
1: 5, // used to be objectResults
|
||||
2: -5}, // used to be unimportantResults
|
||||
objPrio: {
|
||||
0: 15, // used to be importantResults
|
||||
1: 5, // used to be objectResults
|
||||
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,
|
||||
|
||||
_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.");
|
||||
return "";
|
||||
}
|
||||
return docContent.textContent || docContent.innerText;
|
||||
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 "";
|
||||
},
|
||||
|
||||
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 : 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;
|
||||
}
|
||||
}});
|
||||
},
|
||||
loadIndex: (url) =>
|
||||
(document.body.appendChild(document.createElement("script")).src = url),
|
||||
|
||||
setIndex : function(index) {
|
||||
var q;
|
||||
this._index = index;
|
||||
if ((q = this._queued_query) !== null) {
|
||||
this._queued_query = null;
|
||||
Search.query(q);
|
||||
setIndex: (index) => {
|
||||
Search._index = index;
|
||||
if (Search._queued_query !== null) {
|
||||
const query = Search._queued_query;
|
||||
Search._queued_query = null;
|
||||
Search.query(query);
|
||||
}
|
||||
},
|
||||
|
||||
hasIndex : function() {
|
||||
return this._index !== null;
|
||||
},
|
||||
hasIndex: () => Search._index !== null,
|
||||
|
||||
deferQuery : function(query) {
|
||||
this._queued_query = query;
|
||||
},
|
||||
deferQuery: (query) => (Search._queued_query = query),
|
||||
|
||||
stopPulse : function() {
|
||||
this._pulse_status = 0;
|
||||
},
|
||||
stopPulse: () => (Search._pulse_status = -1),
|
||||
|
||||
startPulse : function() {
|
||||
if (this._pulse_status >= 0)
|
||||
return;
|
||||
function pulse() {
|
||||
var i;
|
||||
startPulse: () => {
|
||||
if (Search._pulse_status >= 0) return;
|
||||
|
||||
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"> </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
|
||||
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();
|
||||
|
||||
// stem the searchterms 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());
|
||||
}
|
||||
// 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 = [];
|
||||
|
||||
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) {
|
||||
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]];
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
if (!allfound) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
var descr = objname + _(', in ') + title;
|
||||
const objectSearchCallback = (prefix, match) => {
|
||||
const name = match[4]
|
||||
const fullname = (prefix ? prefix + "." : "") + name;
|
||||
const fullnameLower = fullname.toLowerCase();
|
||||
if (fullnameLower.indexOf(object) < 0) return;
|
||||
|
||||
var anchor = match[3];
|
||||
if (anchor === '')
|
||||
anchor = fullname;
|
||||
else if (anchor == '-')
|
||||
anchor = objnames[match[1]][1] + '-' + fullname;
|
||||
// add custom score for some objects according to scorer
|
||||
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]]]);
|
||||
}
|
||||
let score = 0;
|
||||
const 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.slice(-1)[0] === object)
|
||||
score += Scorer.objNameMatch;
|
||||
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
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
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]))
|
||||
score += Scorer.objPrio[match[2]];
|
||||
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 = [
|
||||
{files: terms[word], score: Scorer.term},
|
||||
{files: titleterms[word], score: Scorer.title}
|
||||
searchTerms.forEach((word) => {
|
||||
const files = [];
|
||||
const arr = [
|
||||
{ files: terms[word], score: Scorer.term },
|
||||
{ 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;
|
||||
break;
|
||||
}
|
||||
}
|
||||
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]]);
|
||||
}
|
||||
// select one (max) score for the 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);
|
||||
|
|
25
about.html
25
about.html
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
25
dev.html
25
dev.html
|
@ -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"><</span><span class="n">bean</span> <span class="nb">id</span><span class="o">=</span><span class="s2">"radarGridFactory"</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
|
||||
|
|
|
@ -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), we’re 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 Unidata’s 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, we’ll 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>
|
||||
|
|
|
@ -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 let’s
|
||||
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, it’s 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 we’ll 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>
|
||||
|
|
|
@ -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">'figure.figsize'</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">"CMC"</span><span class="p">,</span> <span class="s2">"GFS20"</span><span class="p">,</span> <span class="s2">"NAM40"</span><span class="p">]</span>
|
||||
<span class="n">parms</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'T'</span><span class="p">,</span><span class="s1">'DpT'</span><span class="p">,</span><span class="s1">'uW'</span><span class="p">,</span><span class="s1">'vW'</span><span class="p">]</span>
|
||||
|
||||
|
|
|
@ -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 Unidata’s 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 we’re 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, we’re 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 we’re wanting to print out. We’re 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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'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>We’re 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 you’re
|
||||
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,
|
||||
it’s time to request the data array from EDEX. Depending on what kind of
|
||||
data we’re working with, we’ll 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
|
@ -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 Unidata’s 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, we’ll 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">'maps'</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">'table'</span><span class="p">,</span> <span class="s1">'mapdata.majorrivers'</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>
|
||||
|
|
|
@ -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">'figure.figsize'</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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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">"sfcobs"</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">'eastward_wind'</span><span class="p">,</span> <span class="s1">'northward_wind'</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">'knots'</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">'NW'</span><span class="p">,</span> <span class="s1">'air_temperature'</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">'.0f'</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">'degF'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'darkred'</span><span class="p">)</span>
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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, it’s 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 we’ll 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 Unidata’s 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 we’re 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 we’ll
|
||||
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, it’s 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 we’ll 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 we’ll 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>
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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" />
|
||||
|
|
15
index.html
15
index.html
|
@ -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. UCAR’s <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 you’ll 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@unidata.ucar.edu</strong></p>
|
||||
<div class="toctree-wrapper compound">
|
||||
</div>
|
||||
|
|
BIN
objects.inv
BIN
objects.inv
Binary file not shown.
|
@ -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" />
|
||||
|
|
|
@ -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
Loading…
Add table
Reference in a new issue