deploy: fac161c09e
Before Width: | Height: | Size: 84 KiB |
Before Width: | Height: | Size: 153 KiB |
BIN
_images/Regional_Surface_Obs_Plot_42_1.png
Normal file
After Width: | Height: | Size: 53 KiB |
BIN
_images/Regional_Surface_Obs_Plot_44_0.png
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
_images/Regional_Surface_Obs_Plot_46_0.png
Normal file
After Width: | Height: | Size: 73 KiB |
BIN
_images/Regional_Surface_Obs_Plot_48_0.png
Normal file
After Width: | Height: | Size: 158 KiB |
Before Width: | Height: | Size: 54 KiB |
Before Width: | Height: | Size: 135 KiB |
|
@ -2,11 +2,81 @@
|
||||||
Regional Surface Obs Plot
|
Regional Surface Obs Plot
|
||||||
=========================
|
=========================
|
||||||
`Notebook <http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Regional_Surface_Obs_Plot.ipynb>`_
|
`Notebook <http://nbviewer.ipython.org/github/Unidata/python-awips/blob/master/examples/notebooks/Regional_Surface_Obs_Plot.ipynb>`_
|
||||||
This exercise creates a surface observsation station plot for the state
|
Python-AWIPS Tutorial Notebook
|
||||||
of Florida, using both METAR (datatype *obs*) and Synoptic (datatype
|
|
||||||
*sfcobs*). Because we are using the AWIPS Map Database for state and
|
--------------
|
||||||
county boundaries, there is no use of Cartopy ``cfeature`` in this
|
|
||||||
exercise.
|
Objectives
|
||||||
|
==========
|
||||||
|
|
||||||
|
- Use python-awips to connect to an edex server
|
||||||
|
- Create a plot for a regional area of the United States (Florida)
|
||||||
|
- Define and filter data request for METAR and Synoptic surface obs
|
||||||
|
- Use the maps database to request and draw state boundaries (no use of
|
||||||
|
Cartopy.Feature in this example)
|
||||||
|
- Stylize and plot surface data using Metpy
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Table of Contents
|
||||||
|
-----------------
|
||||||
|
|
||||||
|
| `1
|
||||||
|
Imports <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#imports>`__\
|
||||||
|
| `2 Function:
|
||||||
|
get_cloud_cover() <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#function-get-cloud-cover>`__\
|
||||||
|
| `3 Function:
|
||||||
|
make_map() <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#function-make-map>`__\
|
||||||
|
| `4 Function:
|
||||||
|
extract_plotting_data() <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#function-extract-plotting-data>`__\
|
||||||
|
| `5 Function:
|
||||||
|
plot_data() <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#function-plot-data>`__\
|
||||||
|
| `6 Initial
|
||||||
|
Setup <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#initial-setup>`__\
|
||||||
|
| `6.1 Initial EDEX
|
||||||
|
Connection <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#initial-edex-connection>`__\
|
||||||
|
| `6.2 Maps Request and
|
||||||
|
Response <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#maps-request-and-response>`__\
|
||||||
|
| `6.3 Define Geographic
|
||||||
|
Filter <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-geographic-filter>`__\
|
||||||
|
| `6.4 Define Time
|
||||||
|
Filter <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-time-filter>`__\
|
||||||
|
| `6.5 Define Common Parameters for Data
|
||||||
|
Requests <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-common-parameters-for-data-requests>`__\
|
||||||
|
| `6.6 Define METAR
|
||||||
|
Request <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-metar-request>`__\
|
||||||
|
| `6.7 Define Synoptic
|
||||||
|
Request <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-synoptic-request>`__\
|
||||||
|
| `7 Get the
|
||||||
|
Data! <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#get-the-data>`__\
|
||||||
|
| `7.1 Get the EDEX
|
||||||
|
Responses <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#get-the-edex-responses>`__\
|
||||||
|
| `7.2 Extract Plotting
|
||||||
|
Data <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#extract-plotting-data>`__\
|
||||||
|
| `8 Plot the
|
||||||
|
Data <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#get-the-data>`__\
|
||||||
|
| `8.1 Draw the
|
||||||
|
Region <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#draw-the-region>`__\
|
||||||
|
| `8.2 Plot METAR
|
||||||
|
Data <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#plot-metar-data>`__\
|
||||||
|
| `8.3 Plot Synoptic
|
||||||
|
Data <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#plot-synoptic-data>`__\
|
||||||
|
| `8.4 Plot both METAR and Synoptic
|
||||||
|
Data <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#plot-both-metar-and-synopitc-data>`__\
|
||||||
|
| `9 See
|
||||||
|
Also <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#see-also>`__\
|
||||||
|
| `9.1 Related
|
||||||
|
Notebooks <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#related-notebooks>`__\
|
||||||
|
| `9.2 Additional
|
||||||
|
Documentation <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#additional-documentation>`__\
|
||||||
|
|
||||||
|
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
|
.. code:: ipython3
|
||||||
|
|
||||||
|
@ -21,78 +91,45 @@ exercise.
|
||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
from metpy.units import units
|
from metpy.units import units
|
||||||
from metpy.calc import wind_components
|
from metpy.calc import wind_components
|
||||||
from metpy.plots import simple_layout, StationPlot, StationPlotLayout
|
from metpy.plots import simple_layout, StationPlot, StationPlotLayout, sky_cover
|
||||||
import warnings
|
import warnings
|
||||||
%matplotlib inline
|
|
||||||
|
|
||||||
def get_cloud_cover(code):
|
`Top <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html>`__
|
||||||
if 'OVC' in code:
|
|
||||||
return 1.0
|
--------------
|
||||||
elif 'BKN' in code:
|
|
||||||
return 6.0/8.0
|
Function: get_cloud_cover()
|
||||||
elif 'SCT' in code:
|
---------------------------
|
||||||
return 4.0/8.0
|
|
||||||
elif 'FEW' in code:
|
Returns the cloud coverage values as integer codes (0 through 8).
|
||||||
return 2.0/8.0
|
|
||||||
else:
|
|
||||||
return 0
|
|
||||||
|
|
||||||
.. code:: ipython3
|
.. code:: ipython3
|
||||||
|
|
||||||
# EDEX request for a single state
|
def get_cloud_cover(code):
|
||||||
edexServer = "edex-cloud.unidata.ucar.edu"
|
if 'OVC' in code:
|
||||||
DataAccessLayer.changeEDEXHost(edexServer)
|
return 8
|
||||||
request = DataAccessLayer.newDataRequest('maps')
|
elif 'BKN' in code:
|
||||||
request.addIdentifier('table', 'mapdata.states')
|
return 6
|
||||||
request.addIdentifier('state', 'FL')
|
elif 'SCT' in code:
|
||||||
request.addIdentifier('geomField', 'the_geom')
|
return 4
|
||||||
request.setParameters('state','name','lat','lon')
|
elif 'FEW' in code:
|
||||||
response = DataAccessLayer.getGeometryData(request)
|
return 2
|
||||||
record = response[0]
|
else:
|
||||||
print("Found " + str(len(response)) + " MultiPolygon")
|
return 0
|
||||||
state={}
|
|
||||||
state['name'] = record.getString('name')
|
|
||||||
state['state'] = record.getString('state')
|
|
||||||
state['lat'] = record.getNumber('lat')
|
|
||||||
state['lon'] = record.getNumber('lon')
|
|
||||||
#state['geom'] = record.getGeometry()
|
|
||||||
state['bounds'] = record.getGeometry().bounds
|
|
||||||
print(state['name'], state['state'], state['lat'], state['lon'], state['bounds'])
|
|
||||||
print()
|
|
||||||
|
|
||||||
# EDEX request for multiple states
|
Top
|
||||||
request = DataAccessLayer.newDataRequest('maps')
|
|
||||||
request.addIdentifier('table', 'mapdata.states')
|
|
||||||
request.addIdentifier('geomField', 'the_geom')
|
|
||||||
request.addIdentifier('inLocation', 'true')
|
|
||||||
request.addIdentifier('locationField', 'state')
|
|
||||||
request.setParameters('state','name','lat','lon')
|
|
||||||
request.setLocationNames('FL','GA','MS','AL','SC','LA')
|
|
||||||
response = DataAccessLayer.getGeometryData(request)
|
|
||||||
print("Found " + str(len(response)) + " MultiPolygons")
|
|
||||||
|
|
||||||
# Append each geometry to a numpy array
|
--------------
|
||||||
states = np.array([])
|
|
||||||
for ob in response:
|
|
||||||
print(ob.getString('name'), ob.getString('state'), ob.getNumber('lat'), ob.getNumber('lon'))
|
|
||||||
states = np.append(states,ob.getGeometry())
|
|
||||||
|
|
||||||
|
Function: make_map()
|
||||||
|
--------------------
|
||||||
|
|
||||||
.. parsed-literal::
|
In order to plot more than one image, it’s easiest to define common
|
||||||
|
logic in a function. Here, a new function called **make_map** is
|
||||||
Found 1 MultiPolygon
|
defined. This function uses the `matplotlib.pyplot package
|
||||||
Florida FL 28.67402 -82.50934 (-87.63429260299995, 24.521051616000022, -80.03199876199994, 31.001012802000048)
|
(plt) <https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html>`__
|
||||||
|
to create a figure and axis. The geographic extent is set and lat/lon
|
||||||
Found 6 MultiPolygons
|
gridlines are added for context.
|
||||||
Florida FL 28.67402 -82.50934
|
|
||||||
Georgia GA 32.65155 -83.44848
|
|
||||||
Louisiana LA 31.0891 -92.02905
|
|
||||||
Alabama AL 32.79354 -86.82676
|
|
||||||
Mississippi MS 32.75201 -89.66553
|
|
||||||
South Carolina SC 33.93574 -80.89899
|
|
||||||
|
|
||||||
|
|
||||||
Now make sure we can plot the states with a lat/lon grid.
|
|
||||||
|
|
||||||
.. code:: ipython3
|
.. code:: ipython3
|
||||||
|
|
||||||
|
@ -105,11 +142,403 @@ Now make sure we can plot the states with a lat/lon grid.
|
||||||
gl.yformatter = LATITUDE_FORMATTER
|
gl.yformatter = LATITUDE_FORMATTER
|
||||||
return fig, ax
|
return fig, ax
|
||||||
|
|
||||||
|
`Top <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html>`__
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Function: extract_plotting_data()
|
||||||
|
---------------------------------
|
||||||
|
|
||||||
|
Grab the simple variables out of the response 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 coverage values to integer codes [0 - 8]
|
||||||
|
- Assign temperature, dewpoint, and sea level pressure the the correct
|
||||||
|
units
|
||||||
|
- Account for missing values (by using ``nan``)
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
def extract_plotting_data(arr, datatype):
|
||||||
|
"""
|
||||||
|
Extract all necessary data for plotting for either
|
||||||
|
datatype: 'obs' or 'sfcobs'
|
||||||
|
"""
|
||||||
|
|
||||||
|
data = dict()
|
||||||
|
data['latitude'] = np.array(arr['latitude'])
|
||||||
|
data['longitude'] = np.array(arr['longitude'])
|
||||||
|
tmp = np.array(arr['temperature'], dtype=float)
|
||||||
|
dpt = np.array(arr['dewpoint'], dtype=float)
|
||||||
|
direction = np.array(arr['windDir'])
|
||||||
|
|
||||||
|
# Suppress nan masking warnings
|
||||||
|
warnings.filterwarnings("ignore",category =RuntimeWarning)
|
||||||
|
|
||||||
|
# Account for missing values
|
||||||
|
tmp[tmp == -9999.0] = 'nan'
|
||||||
|
dpt[dpt == -9999.] = 'nan'
|
||||||
|
direction[direction == -9999.0] = 'nan'
|
||||||
|
|
||||||
|
data['air_pressure_at_sea_level'] = np.array(arr['seaLevelPress'])* units('mbar')
|
||||||
|
u, v = wind_components(np.array(arr['windSpeed']) * units('knots'),
|
||||||
|
direction * units.degree)
|
||||||
|
|
||||||
|
data['eastward_wind'], data['northward_wind'] = u, v
|
||||||
|
data['present_weather'] = arr['presWeather']
|
||||||
|
|
||||||
|
|
||||||
|
# metars uses 'stationName' for its identifier and temps are in deg C
|
||||||
|
# metars also has sky coverage
|
||||||
|
if datatype == "obs":
|
||||||
|
data['stid'] = np.array(arr['stationName'])
|
||||||
|
data['air_temperature'] = tmp * units.degC
|
||||||
|
data['dew_point_temperature'] = dpt * units.degC
|
||||||
|
data['cloud_coverage'] = [int(get_cloud_cover(x)) for x in arr['skyCover']]
|
||||||
|
|
||||||
|
# synoptic obs uses 'stationId', and temps are in Kelvin
|
||||||
|
elif datatype == "sfcobs":
|
||||||
|
data['stid'] = np.array(arr['stationId'])
|
||||||
|
data['air_temperature'] = tmp * units.kelvin
|
||||||
|
data['dew_point_temperature'] = dpt * units.kelvin
|
||||||
|
|
||||||
|
return data
|
||||||
|
|
||||||
|
`Top <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html>`__
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Function: plot_data()
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
This function makse use of Metpy.StationPlotLayout and Metpy.StationPlot
|
||||||
|
to add all surface observation data to our plot. The logic is very
|
||||||
|
similar for both METAR and Synoptic data, so a ``datatype`` argument is
|
||||||
|
used to distinguish between which data is being drawn, and then draws
|
||||||
|
the appropriate features.
|
||||||
|
|
||||||
|
This function plots: - Wind barbs - Air temperature - Dew point
|
||||||
|
temperature - Precipitation - Cloud coverage (for METARS)
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
def plot_data(data, title, axes, datatype):
|
||||||
|
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')
|
||||||
|
# metars has sky coverage
|
||||||
|
if datatype == 'obs':
|
||||||
|
custom_layout.add_symbol('C', 'cloud_coverage', sky_cover)
|
||||||
|
axes.set_title(title)
|
||||||
|
stationplot = StationPlot(axes, data['longitude'], data['latitude'], clip_on=True,
|
||||||
|
transform=ccrs.PlateCarree(), fontsize=10)
|
||||||
|
custom_layout.plot(stationplot, data)
|
||||||
|
|
||||||
|
`Top <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html>`__
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Initial Setup
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Connect to an EDEX server and define several `new data request
|
||||||
|
objects <http://unidata.github.io/python-awips/api/IDataRequest.html>`__.
|
||||||
|
|
||||||
|
In this example we’re using multiple different datatypes from EDEX, so
|
||||||
|
we’ll create a request object for each of the following: - `The states
|
||||||
|
outlines (datatype maps) <#Define-Maps-Request>`__ - `The METAR data
|
||||||
|
(datatype obs) <#Define-METAR-Request>`__ - `The Synoptic data (datatype
|
||||||
|
sfc) <#Define-Synoptic-Request>`__
|
||||||
|
|
||||||
|
Some of the request use filters, so we’ll also create several filters
|
||||||
|
than can be used for the various data requests as well.
|
||||||
|
|
||||||
|
Initial EDEX Connection
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
First we establish a connection to Unidata’s public EDEX server.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# EDEX connection
|
||||||
|
edexServer = "edex-cloud.unidata.ucar.edu"
|
||||||
|
DataAccessLayer.changeEDEXHost(edexServer)
|
||||||
|
|
||||||
|
Maps Request and Response
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The maps data request will give us data to draw our state outlines of
|
||||||
|
interest (Florida and its neighboring states). We will retrieve the data
|
||||||
|
response object here so we can create a geographic filter for the METAR
|
||||||
|
and Synoptic data requests.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# Define the maps request
|
||||||
|
maps_request = DataAccessLayer.newDataRequest('maps')
|
||||||
|
# filter for multiple states
|
||||||
|
maps_request = DataAccessLayer.newDataRequest('maps')
|
||||||
|
maps_request.addIdentifier('table', 'mapdata.states')
|
||||||
|
maps_request.addIdentifier('geomField', 'the_geom')
|
||||||
|
maps_request.addIdentifier('inLocation', 'true')
|
||||||
|
maps_request.addIdentifier('locationField', 'state')
|
||||||
|
maps_request.setParameters('state','name','lat','lon')
|
||||||
|
maps_request.setLocationNames('FL','GA','MS','AL','SC','LA')
|
||||||
|
maps_response = DataAccessLayer.getGeometryData(maps_request)
|
||||||
|
print("Found " + str(len(maps_response)) + " MultiPolygons")
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
Found 6 MultiPolygons
|
||||||
|
|
||||||
|
|
||||||
|
Define Geographic Filter
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
The previous EDEX request limited the data by using a **parameter** for
|
||||||
|
the maps database called **state**. We can take the results from that
|
||||||
|
filter and get a geographic **envelope** based on the Florida polygon
|
||||||
|
that was returned from the previous cell.
|
||||||
|
|
||||||
|
.. container:: alert-warning
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
<b>Note:</b> Without such a filter you may be requesting many tens of thousands of records.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# Append each geometry to a numpy array
|
||||||
|
states = np.array([])
|
||||||
|
for ob in maps_response:
|
||||||
|
print(ob.getString('name'), ob.getString('state'), ob.getNumber('lat'), ob.getNumber('lon'))
|
||||||
|
states = np.append(states,ob.getGeometry())
|
||||||
|
# if this is Florida grab geographic info
|
||||||
|
if ob.getString('name') == "Florida":
|
||||||
|
bounds = ob.getGeometry().bounds
|
||||||
|
fl_lat = ob.getNumber('lat')
|
||||||
|
fl_lon = ob.getNumber('lon')
|
||||||
|
|
||||||
|
if bounds is None:
|
||||||
|
print("Error, no record found for Florida!")
|
||||||
|
|
||||||
|
else:
|
||||||
# buffer our bounds by +/i degrees lat/lon
|
# buffer our bounds by +/i degrees lat/lon
|
||||||
bounds = state['bounds']
|
|
||||||
bbox=[bounds[0]-3,bounds[2]+3,bounds[1]-1.5,bounds[3]+1.5]
|
bbox=[bounds[0]-3,bounds[2]+3,bounds[1]-1.5,bounds[3]+1.5]
|
||||||
|
|
||||||
|
# Create envelope geometry
|
||||||
|
envelope = Polygon([(bbox[0],bbox[2]),(bbox[0],bbox[3]),
|
||||||
|
(bbox[1], bbox[3]),(bbox[1],bbox[2]),
|
||||||
|
(bbox[0],bbox[2])])
|
||||||
|
|
||||||
|
print(envelope)
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
Florida FL 28.67402 -82.50934
|
||||||
|
Georgia GA 32.65155 -83.44848
|
||||||
|
Louisiana LA 31.0891 -92.02905
|
||||||
|
Alabama AL 32.79354 -86.82676
|
||||||
|
Mississippi MS 32.75201 -89.66553
|
||||||
|
South Carolina SC 33.93574 -80.89899
|
||||||
|
POLYGON ((-90.63429260299995 23.02105161600002, -90.63429260299995 32.50101280200016, -77.03199876199994 32.50101280200016, -77.03199876199994 23.02105161600002, -90.63429260299995 23.02105161600002))
|
||||||
|
|
||||||
|
|
||||||
|
Define Time Filter
|
||||||
|
~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Both the METAR and Synoptic datasets should be filtered by time to avoid
|
||||||
|
requesting an unreasonable amount of data. By defining one filter now,
|
||||||
|
we can use it in both of their data requests to EDEX.
|
||||||
|
|
||||||
|
.. container:: alert-info
|
||||||
|
|
||||||
|
::
|
||||||
|
|
||||||
|
<b>Note:</b> Here we will use the most recent hour as our default filter. Try adjusting the timerange and see the difference in the final plots.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# Filter for the last hour
|
||||||
|
lastHourDateTime = datetime.utcnow() - timedelta(minutes = 60)
|
||||||
|
start = lastHourDateTime.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
end = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
|
||||||
|
|
||||||
|
beginRange = datetime.strptime( start , "%Y-%m-%d %H:%M:%S")
|
||||||
|
endRange = datetime.strptime( end , "%Y-%m-%d %H:%M:%S")
|
||||||
|
timerange = TimeRange(beginRange, endRange)
|
||||||
|
|
||||||
|
print(timerange)
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
(Nov 11 22 19:00:54 , Nov 11 22 20:00:54 )
|
||||||
|
|
||||||
|
|
||||||
|
Define Common Parameters for Data Requests
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
METAR obs and Synoptic obs share several of the same parameters. By
|
||||||
|
defining them here, they can be reused for both of the requests and this
|
||||||
|
makes our code more efficient.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
shared_params = ["timeObs", "longitude", "latitude", "temperature",
|
||||||
|
"dewpoint", "windDir", "windSpeed", "seaLevelPress",
|
||||||
|
"presWeather", "skyLayerBase"]
|
||||||
|
print(shared_params)
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
['timeObs', 'longitude', 'latitude', 'temperature', 'dewpoint', 'windDir', 'windSpeed', 'seaLevelPress', 'presWeather', 'skyLayerBase']
|
||||||
|
|
||||||
|
|
||||||
|
Define METAR Request
|
||||||
|
~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
To get METAR data we must use the **obs** datatype. To help limit the
|
||||||
|
amount of data returned, we will narrow the request by using a
|
||||||
|
geographic **envelope**, setting the request **parameters**, and using
|
||||||
|
**timerange** as a time filter.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# New metar request
|
||||||
|
metar_request = DataAccessLayer.newDataRequest("obs", envelope=envelope)
|
||||||
|
|
||||||
|
# metar specifc parameters
|
||||||
|
metar_params = ["stationName", "skyCover"]
|
||||||
|
# combine all parameters
|
||||||
|
all_metar_params = shared_params + metar_params
|
||||||
|
# set the parameters on the metar request
|
||||||
|
metar_request.setParameters(*(all_metar_params))
|
||||||
|
|
||||||
|
print(metar_request)
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
DefaultDataRequest(datatype=obs, identifiers={}, parameters=['timeObs', 'longitude', 'latitude', 'temperature', 'dewpoint', 'windDir', 'windSpeed', 'seaLevelPress', 'presWeather', 'skyLayerBase', 'stationName', 'skyCover'], levels=[], locationNames=[], envelope=<dynamicserialize.dstypes.com.vividsolutions.jts.geom.Envelope.Envelope object at 0x13abe40a0>)
|
||||||
|
|
||||||
|
|
||||||
|
Define Synoptic Request
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Similar to the request above, we will limit the amount of data returned
|
||||||
|
by using a geographic **envelope**, setting the request **parameters**,
|
||||||
|
and using **timerange** as a time filter.
|
||||||
|
|
||||||
|
However, in order to access synoptic observations we will use the
|
||||||
|
**sfcobs** datatype.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# New sfcobs/SYNOP request
|
||||||
|
syn_request = DataAccessLayer.newDataRequest("sfcobs", envelope=envelope)
|
||||||
|
|
||||||
|
# (sfcobs) uses stationId, while (obs) uses stationName
|
||||||
|
syn_params = ["stationId"]
|
||||||
|
# combine all parameters
|
||||||
|
all_syn_params = shared_params + syn_params
|
||||||
|
# set the parameters on the synoptic request
|
||||||
|
syn_request.setParameters(*(all_syn_params))
|
||||||
|
|
||||||
|
print(syn_request)
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
DefaultDataRequest(datatype=sfcobs, identifiers={}, parameters=['timeObs', 'longitude', 'latitude', 'temperature', 'dewpoint', 'windDir', 'windSpeed', 'seaLevelPress', 'presWeather', 'skyLayerBase', 'stationId'], levels=[], locationNames=[], envelope=<dynamicserialize.dstypes.com.vividsolutions.jts.geom.Envelope.Envelope object at 0x105048bb0>)
|
||||||
|
|
||||||
|
|
||||||
|
`Top <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html>`__
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Get the Data!
|
||||||
|
-------------
|
||||||
|
|
||||||
|
We have already obtained our maps data, but we still have to collect our
|
||||||
|
observation data.
|
||||||
|
|
||||||
|
Get the EDEX Responses
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# METARs data
|
||||||
|
metar_response = DataAccessLayer.getGeometryData(metar_request,timerange)
|
||||||
|
# function getMetarObs was added in python-awips 18.1.4
|
||||||
|
metars = DataAccessLayer.getMetarObs(metar_response)
|
||||||
|
print("Found " + str(len(metar_response)) + " METAR records")
|
||||||
|
print("\tUsing " + str(len(metars['temperature'])) + " temperature records")
|
||||||
|
|
||||||
|
# Synoptic data
|
||||||
|
syn_response = DataAccessLayer.getGeometryData(syn_request,timerange)
|
||||||
|
# function getSynopticObs was added in python-awips 18.1.4
|
||||||
|
synoptic = DataAccessLayer.getSynopticObs(syn_response)
|
||||||
|
print("Found " + str(len(syn_response)) + " Synoptic records")
|
||||||
|
print("\tUsing " + str(len(synoptic['temperature'])) + " temperature records")
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
Found 4116 METAR records
|
||||||
|
Using 179 temperature records
|
||||||
|
Found 259 Synoptic records
|
||||||
|
Using 63 temperature records
|
||||||
|
|
||||||
|
|
||||||
|
Extract Plotting Data
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# Pull all necessary plotting information for the metar data
|
||||||
|
metars_data = extract_plotting_data(metars, 'obs')
|
||||||
|
print(str(len(metars_data['stid'])) + " METARs stations")
|
||||||
|
|
||||||
|
# Pull all necessary plotting information for the synoptic data
|
||||||
|
synoptic_data = extract_plotting_data(synoptic, 'sfcobs')
|
||||||
|
print(str(len(synoptic_data['stid'])) + " Synoptic stations")
|
||||||
|
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
179 METARs stations
|
||||||
|
63 Synoptic stations
|
||||||
|
|
||||||
|
|
||||||
|
`Top <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html>`__
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
Plot the Data
|
||||||
|
-------------
|
||||||
|
|
||||||
|
Draw the Region
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Here we will draw our region by using the **states** polygons we
|
||||||
|
retreived from EDEX `earlier in this
|
||||||
|
example <#Maps-Request-and-Response>`__. To create this plot we use the
|
||||||
|
`make_map() <#Function:-make_map()>`__ function which also adds lines of
|
||||||
|
latitude and longitude for additional context.
|
||||||
|
|
||||||
|
.. code:: ipython3
|
||||||
|
|
||||||
|
# Create the figure and axes used for the plot
|
||||||
fig, ax = make_map(bbox=bbox)
|
fig, ax = make_map(bbox=bbox)
|
||||||
|
# Create a feature based off our states polygons
|
||||||
shape_feature = ShapelyFeature(states,ccrs.PlateCarree(),
|
shape_feature = ShapelyFeature(states,ccrs.PlateCarree(),
|
||||||
facecolor='none', linestyle="-",edgecolor='#000000',linewidth=2)
|
facecolor='none', linestyle="-",edgecolor='#000000',linewidth=2)
|
||||||
ax.add_feature(shape_feature)
|
ax.add_feature(shape_feature)
|
||||||
|
@ -119,226 +548,140 @@ Now make sure we can plot the states with a lat/lon grid.
|
||||||
|
|
||||||
.. parsed-literal::
|
.. parsed-literal::
|
||||||
|
|
||||||
<cartopy.mpl.feature_artist.FeatureArtist at 0x11dcfedd8>
|
<cartopy.mpl.feature_artist.FeatureArtist at 0x13b2ae5e0>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. image:: Regional_Surface_Obs_Plot_files/Regional_Surface_Obs_Plot_4_1.png
|
.. image:: Regional_Surface_Obs_Plot_files/Regional_Surface_Obs_Plot_42_1.png
|
||||||
|
|
||||||
|
|
||||||
--------------
|
Plot METAR Data
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Plot METAR (obs)
|
On the same axes (**ax**) and figure (**fig**) plot the METAR data.
|
||||||
----------------
|
|
||||||
|
|
||||||
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.
|
|
||||||
|
|
||||||
.. code:: ipython3
|
.. code:: ipython3
|
||||||
|
|
||||||
# Create envelope geometry
|
# Create a title for the plot
|
||||||
envelope = Polygon([(bbox[0],bbox[2]),(bbox[0],bbox[3]),
|
title = str(metar_response[-1].getDataTime()) + " | METAR Surface Obs | " + edexServer
|
||||||
(bbox[1], bbox[3]),(bbox[1],bbox[2]),
|
# Plot the station information for METARs data
|
||||||
(bbox[0],bbox[2])])
|
plot_data(metars_data, title, ax, 'obs')
|
||||||
|
# Display the figure
|
||||||
# New obs request
|
|
||||||
DataAccessLayer.changeEDEXHost(edexServer)
|
|
||||||
request = DataAccessLayer.newDataRequest("obs", envelope=envelope)
|
|
||||||
availableProducts = DataAccessLayer.getAvailableParameters(request)
|
|
||||||
single_value_params = ["timeObs", "stationName", "longitude", "latitude",
|
|
||||||
"temperature", "dewpoint", "windDir",
|
|
||||||
"windSpeed", "seaLevelPress"]
|
|
||||||
multi_value_params = ["presWeather", "skyCover", "skyLayerBase"]
|
|
||||||
params = single_value_params + multi_value_params
|
|
||||||
request.setParameters(*(params))
|
|
||||||
|
|
||||||
# Time range
|
|
||||||
lastHourDateTime = datetime.utcnow() - timedelta(minutes = 60)
|
|
||||||
start = lastHourDateTime.strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
end = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
|
|
||||||
beginRange = datetime.strptime( start , "%Y-%m-%d %H:%M:%S")
|
|
||||||
endRange = datetime.strptime( end , "%Y-%m-%d %H:%M:%S")
|
|
||||||
timerange = TimeRange(beginRange, endRange)
|
|
||||||
# Get response
|
|
||||||
response = DataAccessLayer.getGeometryData(request,timerange)
|
|
||||||
# function getMetarObs was added in python-awips 18.1.4
|
|
||||||
obs = DataAccessLayer.getMetarObs(response)
|
|
||||||
print("Found " + str(len(response)) + " records")
|
|
||||||
print("Using " + str(len(obs['temperature'])) + " temperature records")
|
|
||||||
|
|
||||||
|
|
||||||
.. parsed-literal::
|
|
||||||
|
|
||||||
Found 3468 records
|
|
||||||
Using 152 temperature records
|
|
||||||
|
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
.. code:: ipython3
|
|
||||||
|
|
||||||
data = dict()
|
|
||||||
data['stid'] = np.array(obs['stationName'])
|
|
||||||
data['latitude'] = np.array(obs['latitude'])
|
|
||||||
data['longitude'] = np.array(obs['longitude'])
|
|
||||||
tmp = np.array(obs['temperature'], dtype=float)
|
|
||||||
dpt = np.array(obs['dewpoint'], dtype=float)
|
|
||||||
|
|
||||||
# Suppress nan masking warnings
|
|
||||||
warnings.filterwarnings("ignore",category =RuntimeWarning)
|
|
||||||
|
|
||||||
tmp[tmp == -9999.0] = 'nan'
|
|
||||||
dpt[dpt == -9999.] = 'nan'
|
|
||||||
data['air_temperature'] = tmp * units.degC
|
|
||||||
data['dew_point_temperature'] = dpt * units.degC
|
|
||||||
data['air_pressure_at_sea_level'] = np.array(obs['seaLevelPress'])* units('mbar')
|
|
||||||
direction = np.array(obs['windDir'])
|
|
||||||
direction[direction == -9999.0] = 'nan'
|
|
||||||
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']
|
|
||||||
proj = ccrs.LambertConformal(central_longitude=state['lon'], central_latitude=state['lat'],
|
|
||||||
standard_parallels=[35])
|
|
||||||
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')
|
|
||||||
ax.set_title(str(response[-1].getDataTime()) + " | METAR Surface Obs | " + edexServer)
|
|
||||||
stationplot = StationPlot(ax, data['longitude'], data['latitude'], clip_on=True,
|
|
||||||
transform=ccrs.PlateCarree(), fontsize=10)
|
|
||||||
custom_layout.plot(stationplot, data)
|
|
||||||
fig
|
fig
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. image:: Regional_Surface_Obs_Plot_files/Regional_Surface_Obs_Plot_8_0.png
|
.. image:: Regional_Surface_Obs_Plot_files/Regional_Surface_Obs_Plot_44_0.png
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
--------------
|
|
||||||
|
|
||||||
Plot Synoptic (sfcobs)
|
Plot Synoptic (sfcobs)
|
||||||
----------------------
|
~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
On a new axes and figure (**ax_syn**, **fig_syn**) plot the map and
|
||||||
|
synoptic data.
|
||||||
|
|
||||||
.. code:: ipython3
|
.. code:: ipython3
|
||||||
|
|
||||||
# New sfcobs/SYNOP request
|
# Create a new figure and axes for the synoptic data
|
||||||
DataAccessLayer.changeEDEXHost(edexServer)
|
fig_syn, ax_syn = make_map(bbox=bbox)
|
||||||
request = DataAccessLayer.newDataRequest("sfcobs", envelope=envelope)
|
# Create the states feature from the polygons
|
||||||
availableProducts = DataAccessLayer.getAvailableParameters(request)
|
|
||||||
# (sfcobs) uses stationId, while (obs) uses stationName,
|
|
||||||
# the rest of these parameters are the same.
|
|
||||||
single_value_params = ["timeObs", "stationId", "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
|
|
||||||
request.setParameters(*(params))
|
|
||||||
|
|
||||||
# Time range
|
|
||||||
lastHourDateTime = datetime.utcnow() - timedelta(minutes = 60)
|
|
||||||
start = lastHourDateTime.strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
end = datetime.utcnow().strftime('%Y-%m-%d %H:%M:%S')
|
|
||||||
|
|
||||||
beginRange = datetime.strptime( start , "%Y-%m-%d %H:%M:%S")
|
|
||||||
endRange = datetime.strptime( end , "%Y-%m-%d %H:%M:%S")
|
|
||||||
timerange = TimeRange(beginRange, endRange)
|
|
||||||
|
|
||||||
# Get response
|
|
||||||
response = DataAccessLayer.getGeometryData(request,timerange)
|
|
||||||
# function getSynopticObs was added in python-awips 18.1.4
|
|
||||||
sfcobs = DataAccessLayer.getSynopticObs(response)
|
|
||||||
print("Found " + str(len(response)) + " records")
|
|
||||||
print("Using " + str(len(sfcobs['temperature'])) + " temperature records")
|
|
||||||
|
|
||||||
|
|
||||||
.. parsed-literal::
|
|
||||||
|
|
||||||
Found 260 records
|
|
||||||
Using 78 temperature records
|
|
||||||
|
|
||||||
|
|
||||||
.. code:: ipython3
|
|
||||||
|
|
||||||
data = dict()
|
|
||||||
data['stid'] = np.array(sfcobs['stationId'])
|
|
||||||
data['lat'] = np.array(sfcobs['latitude'])
|
|
||||||
data['lon'] = np.array(sfcobs['longitude'])
|
|
||||||
|
|
||||||
# Synop/sfcobs temps are stored in kelvin (degC for METAR/obs)
|
|
||||||
tmp = np.array(sfcobs['temperature'], dtype=float)
|
|
||||||
dpt = np.array(sfcobs['dewpoint'], dtype=float)
|
|
||||||
direction = np.array(sfcobs['windDir'])
|
|
||||||
# Account for missing values
|
|
||||||
tmp[tmp == -9999.0] = 'nan'
|
|
||||||
dpt[dpt == -9999.] = 'nan'
|
|
||||||
direction[direction == -9999.0] = 'nan'
|
|
||||||
|
|
||||||
data['air_temperature'] = tmp * units.kelvin
|
|
||||||
data['dew_point_temperature'] = dpt * units.kelvin
|
|
||||||
data['air_pressure_at_sea_level'] = np.array(sfcobs['seaLevelPress'])* units('mbar')
|
|
||||||
try:
|
|
||||||
data['eastward_wind'], data['northward_wind'] = wind_components(
|
|
||||||
np.array(sfcobs['windSpeed']) * units('knots'),direction * units.degree)
|
|
||||||
data['present_weather'] = sfcobs['presWeather']
|
|
||||||
except ValueError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
fig_synop, ax_synop = make_map(bbox=bbox)
|
|
||||||
shape_feature = ShapelyFeature(states,ccrs.PlateCarree(),
|
shape_feature = ShapelyFeature(states,ccrs.PlateCarree(),
|
||||||
facecolor='none', linestyle="-",edgecolor='#000000',linewidth=2)
|
facecolor='none', linestyle="-",edgecolor='#000000',linewidth=2)
|
||||||
ax_synop.add_feature(shape_feature)
|
ax_syn.add_feature(shape_feature)
|
||||||
|
# Create a title for the figure
|
||||||
custom_layout = StationPlotLayout()
|
title = str(syn_response[-1].getDataTime()) + " | SYNOP Surface Obs | " + edexServer
|
||||||
custom_layout.add_barb('eastward_wind', 'northward_wind', units='knots')
|
# Draw the synoptic data
|
||||||
custom_layout.add_value('NW', 'air_temperature', fmt='.0f', units='degF', color='darkred')
|
plot_data(synoptic_data, title, ax_syn, 'sfcobs')
|
||||||
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')
|
|
||||||
ax_synop.set_title(str(response[-1].getDataTime()) + " | SYNOP Surface Obs | " + edexServer)
|
|
||||||
stationplot = StationPlot(ax_synop, data['lon'], data['lat'], clip_on=True,
|
|
||||||
transform=ccrs.PlateCarree(), fontsize=10)
|
|
||||||
custom_layout.plot(stationplot, data)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. image:: Regional_Surface_Obs_Plot_files/Regional_Surface_Obs_Plot_11_0.png
|
.. image:: Regional_Surface_Obs_Plot_files/Regional_Surface_Obs_Plot_46_0.png
|
||||||
|
|
||||||
|
|
||||||
--------------
|
Plot both METAR and Synoptic Data
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
Plot both METAR and SYNOP
|
Add the synoptic data to our first axes and figure (**ax**, **fig**)
|
||||||
-------------------------
|
that already contains our map and METARs data.
|
||||||
|
|
||||||
.. code:: ipython3
|
.. code:: ipython3
|
||||||
|
|
||||||
custom_layout = StationPlotLayout()
|
# Create a title for both the METAR and Synopotic data
|
||||||
custom_layout.add_barb('eastward_wind', 'northward_wind', units='knots')
|
title = str(syn_response[-1].getDataTime()) + " | METAR & Synoptic Surface Obs | " + edexServer
|
||||||
custom_layout.add_value('NW', 'air_temperature', fmt='.0f', units='degF', color='darkred')
|
# Draw the synoptic on the first axes that already has the metar data
|
||||||
custom_layout.add_value('SW', 'dew_point_temperature', fmt='.0f', units='degF', color='darkgreen')
|
plot_data(synoptic_data, title, ax, 'sfcobs')
|
||||||
custom_layout.add_value('E', 'precipitation', fmt='0.1f', units='inch', color='blue')
|
# Display the figure
|
||||||
ax.set_title(str(response[-1].getDataTime()) + " | METAR/SYNOP Surface Obs | " + edexServer)
|
|
||||||
stationplot = StationPlot(ax, data['lon'], data['lat'], clip_on=True,
|
|
||||||
transform=ccrs.PlateCarree(), fontsize=10)
|
|
||||||
custom_layout.plot(stationplot, data)
|
|
||||||
fig
|
fig
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.. image:: Regional_Surface_Obs_Plot_files/Regional_Surface_Obs_Plot_13_0.png
|
.. image:: Regional_Surface_Obs_Plot_files/Regional_Surface_Obs_Plot_48_0.png
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
`Top <https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html>`__
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
||||||
|
See Also
|
||||||
|
--------
|
||||||
|
|
||||||
|
- `Aviation Weather Center Static METAR Plots
|
||||||
|
Information <https://www.aviationweather.gov/metar/help?page=plot>`__
|
||||||
|
|
||||||
|
Related Notebooks
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
- `Metar Station Plot with
|
||||||
|
MetPy <http://unidata.github.io/python-awips/examples/generated/METAR_Station_Plot_with_MetPy.html>`__
|
||||||
|
- `Map Resources and
|
||||||
|
Topography <http://unidata.github.io/python-awips/examples/generated/Map_Resources_and_Topography.html>`__
|
||||||
|
|
||||||
|
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>`__
|
||||||
|
|
||||||
|
**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>`__
|
||||||
|
- `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/Regional_Surface_Obs_Plot.html.html>`__
|
||||||
|
|
||||||
|
--------------
|
||||||
|
|
|
@ -59,9 +59,19 @@
|
||||||
<li class="toctree-l2"><a class="reference internal" href="NEXRAD_Level3_Radar.html">NEXRAD Level3 Radar</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="NEXRAD_Level3_Radar.html">NEXRAD Level3 Radar</a></li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Precip_Accumulation-Region_Of_Interest.html">Precip Accumulation-Region Of Interest</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Precip_Accumulation-Region_Of_Interest.html">Precip Accumulation-Region Of Interest</a></li>
|
||||||
<li class="toctree-l2 current"><a class="current reference internal" href="#">Regional Surface Obs Plot</a><ul>
|
<li class="toctree-l2 current"><a class="current reference internal" href="#">Regional Surface Obs Plot</a><ul>
|
||||||
<li class="toctree-l3"><a class="reference internal" href="#plot-metar-obs">Plot METAR (obs)</a></li>
|
<li class="toctree-l3"><a class="reference internal" href="#objectives">Objectives</a><ul>
|
||||||
<li class="toctree-l3"><a class="reference internal" href="#plot-synoptic-sfcobs">Plot Synoptic (sfcobs)</a></li>
|
<li class="toctree-l4"><a class="reference internal" href="#table-of-contents">Table of Contents</a></li>
|
||||||
<li class="toctree-l3"><a class="reference internal" href="#plot-both-metar-and-synop">Plot both METAR and SYNOP</a></li>
|
<li class="toctree-l4"><a class="reference internal" href="#imports">Imports</a></li>
|
||||||
|
<li class="toctree-l4"><a class="reference internal" href="#function-get-cloud-cover">Function: get_cloud_cover()</a></li>
|
||||||
|
<li class="toctree-l4"><a class="reference internal" href="#function-make-map">Function: make_map()</a></li>
|
||||||
|
<li class="toctree-l4"><a class="reference internal" href="#function-extract-plotting-data">Function: extract_plotting_data()</a></li>
|
||||||
|
<li class="toctree-l4"><a class="reference internal" href="#function-plot-data">Function: plot_data()</a></li>
|
||||||
|
<li class="toctree-l4"><a class="reference internal" href="#initial-setup">Initial Setup</a></li>
|
||||||
|
<li class="toctree-l4"><a class="reference internal" href="#get-the-data">Get the Data!</a></li>
|
||||||
|
<li class="toctree-l4"><a class="reference internal" href="#plot-the-data">Plot the Data</a></li>
|
||||||
|
<li class="toctree-l4"><a class="reference internal" href="#see-also">See Also</a></li>
|
||||||
|
</ul>
|
||||||
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</li>
|
</li>
|
||||||
<li class="toctree-l2"><a class="reference internal" href="Satellite_Imagery.html">Satellite Imagery</a></li>
|
<li class="toctree-l2"><a class="reference internal" href="Satellite_Imagery.html">Satellite Imagery</a></li>
|
||||||
|
@ -102,11 +112,78 @@
|
||||||
<section id="regional-surface-obs-plot">
|
<section id="regional-surface-obs-plot">
|
||||||
<h1>Regional Surface Obs Plot<a class="headerlink" href="#regional-surface-obs-plot" title="Permalink to this heading"></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>
|
<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
|
Python-AWIPS Tutorial Notebook</p>
|
||||||
of Florida, using both METAR (datatype <em>obs</em>) and Synoptic (datatype
|
<hr class="docutils" />
|
||||||
<em>sfcobs</em>). Because we are using the AWIPS Map Database for state and
|
<section id="objectives">
|
||||||
county boundaries, there is no use of Cartopy <code class="docutils literal notranslate"><span class="pre">cfeature</span></code> in this
|
<h2>Objectives<a class="headerlink" href="#objectives" title="Permalink to this heading"></a></h2>
|
||||||
exercise.</p>
|
<ul class="simple">
|
||||||
|
<li><p>Use python-awips to connect to an edex server</p></li>
|
||||||
|
<li><p>Create a plot for a regional area of the United States (Florida)</p></li>
|
||||||
|
<li><p>Define and filter data request for METAR and Synoptic surface obs</p></li>
|
||||||
|
<li><p>Use the maps database to request and draw state boundaries (no use of
|
||||||
|
Cartopy.Feature in this example)</p></li>
|
||||||
|
<li><p>Stylize and plot surface data using Metpy</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 heading"></a></h3>
|
||||||
|
<div class="line-block">
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#imports">1
|
||||||
|
Imports</a></div>
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#function-get-cloud-cover">2 Function:
|
||||||
|
get_cloud_cover()</a></div>
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#function-make-map">3 Function:
|
||||||
|
make_map()</a></div>
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#function-extract-plotting-data">4 Function:
|
||||||
|
extract_plotting_data()</a></div>
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#function-plot-data">5 Function:
|
||||||
|
plot_data()</a></div>
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#initial-setup">6 Initial
|
||||||
|
Setup</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#initial-edex-connection">6.1 Initial EDEX
|
||||||
|
Connection</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#maps-request-and-response">6.2 Maps Request and
|
||||||
|
Response</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-geographic-filter">6.3 Define Geographic
|
||||||
|
Filter</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-time-filter">6.4 Define Time
|
||||||
|
Filter</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-common-parameters-for-data-requests">6.5 Define Common Parameters for Data
|
||||||
|
Requests</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-metar-request">6.6 Define METAR
|
||||||
|
Request</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#define-synoptic-request">6.7 Define Synoptic
|
||||||
|
Request</a></div>
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#get-the-data">7 Get the
|
||||||
|
Data!</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#get-the-edex-responses">7.1 Get the EDEX
|
||||||
|
Responses</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#extract-plotting-data">7.2 Extract Plotting
|
||||||
|
Data</a></div>
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#get-the-data">8 Plot the
|
||||||
|
Data</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#draw-the-region">8.1 Draw the
|
||||||
|
Region</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#plot-metar-data">8.2 Plot METAR
|
||||||
|
Data</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#plot-synoptic-data">8.3 Plot Synoptic
|
||||||
|
Data</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#plot-both-metar-and-synopitc-data">8.4 Plot both METAR and Synoptic
|
||||||
|
Data</a></div>
|
||||||
|
<div class="line"><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#see-also">9 See
|
||||||
|
Also</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#related-notebooks">9.1 Related
|
||||||
|
Notebooks</a></div>
|
||||||
|
<div class="line"> <a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html#additional-documentation">9.2 Additional
|
||||||
|
Documentation</a></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="imports">
|
||||||
|
<h3>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 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.</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>
|
<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">from</span> <span class="nn">dynamicserialize.dstypes.com.raytheon.uf.common.time</span> <span class="kn">import</span> <span class="n">TimeRange</span>
|
<span class="kn">from</span> <span class="nn">dynamicserialize.dstypes.com.raytheon.uf.common.time</span> <span class="kn">import</span> <span class="n">TimeRange</span>
|
||||||
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
|
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">datetime</span><span class="p">,</span> <span class="n">timedelta</span>
|
||||||
|
@ -118,75 +195,40 @@ exercise.</p>
|
||||||
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
|
<span class="kn">import</span> <span class="nn">matplotlib.pyplot</span> <span class="k">as</span> <span class="nn">plt</span>
|
||||||
<span class="kn">from</span> <span class="nn">metpy.units</span> <span class="kn">import</span> <span class="n">units</span>
|
<span class="kn">from</span> <span class="nn">metpy.units</span> <span class="kn">import</span> <span class="n">units</span>
|
||||||
<span class="kn">from</span> <span class="nn">metpy.calc</span> <span class="kn">import</span> <span class="n">wind_components</span>
|
<span class="kn">from</span> <span class="nn">metpy.calc</span> <span class="kn">import</span> <span class="n">wind_components</span>
|
||||||
<span class="kn">from</span> <span class="nn">metpy.plots</span> <span class="kn">import</span> <span class="n">simple_layout</span><span class="p">,</span> <span class="n">StationPlot</span><span class="p">,</span> <span class="n">StationPlotLayout</span>
|
<span class="kn">from</span> <span class="nn">metpy.plots</span> <span class="kn">import</span> <span class="n">simple_layout</span><span class="p">,</span> <span class="n">StationPlot</span><span class="p">,</span> <span class="n">StationPlotLayout</span><span class="p">,</span> <span class="n">sky_cover</span>
|
||||||
<span class="kn">import</span> <span class="nn">warnings</span>
|
<span class="kn">import</span> <span class="nn">warnings</span>
|
||||||
<span class="o">%</span><span class="k">matplotlib</span> inline
|
</pre></div>
|
||||||
|
</div>
|
||||||
<span class="k">def</span> <span class="nf">get_cloud_cover</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>
|
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html">Top</a></p>
|
||||||
|
</section>
|
||||||
|
<hr class="docutils" />
|
||||||
|
<section id="function-get-cloud-cover">
|
||||||
|
<h3>Function: get_cloud_cover()<a class="headerlink" href="#function-get-cloud-cover" title="Permalink to this heading"></a></h3>
|
||||||
|
<p>Returns the cloud coverage values as integer codes (0 through 8).</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">get_cloud_cover</span><span class="p">(</span><span class="n">code</span><span class="p">):</span>
|
||||||
<span class="k">if</span> <span class="s1">'OVC'</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
|
<span class="k">if</span> <span class="s1">'OVC'</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
|
||||||
<span class="k">return</span> <span class="mf">1.0</span>
|
<span class="k">return</span> <span class="mi">8</span>
|
||||||
<span class="k">elif</span> <span class="s1">'BKN'</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
|
<span class="k">elif</span> <span class="s1">'BKN'</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
|
||||||
<span class="k">return</span> <span class="mf">6.0</span><span class="o">/</span><span class="mf">8.0</span>
|
<span class="k">return</span> <span class="mi">6</span>
|
||||||
<span class="k">elif</span> <span class="s1">'SCT'</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
|
<span class="k">elif</span> <span class="s1">'SCT'</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
|
||||||
<span class="k">return</span> <span class="mf">4.0</span><span class="o">/</span><span class="mf">8.0</span>
|
<span class="k">return</span> <span class="mi">4</span>
|
||||||
<span class="k">elif</span> <span class="s1">'FEW'</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
|
<span class="k">elif</span> <span class="s1">'FEW'</span> <span class="ow">in</span> <span class="n">code</span><span class="p">:</span>
|
||||||
<span class="k">return</span> <span class="mf">2.0</span><span class="o">/</span><span class="mf">8.0</span>
|
<span class="k">return</span> <span class="mi">2</span>
|
||||||
<span class="k">else</span><span class="p">:</span>
|
<span class="k">else</span><span class="p">:</span>
|
||||||
<span class="k">return</span> <span class="mi">0</span>
|
<span class="k">return</span> <span class="mi">0</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># EDEX request for a single state</span>
|
<p>Top</p>
|
||||||
<span class="n">edexServer</span> <span class="o">=</span> <span class="s2">"edex-cloud.unidata.ucar.edu"</span>
|
</section>
|
||||||
<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>
|
<hr class="docutils" />
|
||||||
<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>
|
<section id="function-make-map">
|
||||||
<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.states'</span><span class="p">)</span>
|
<h3>Function: make_map()<a class="headerlink" href="#function-make-map" title="Permalink to this heading"></a></h3>
|
||||||
<span class="n">request</span><span class="o">.</span><span class="n">addIdentifier</span><span class="p">(</span><span class="s1">'state'</span><span class="p">,</span> <span class="s1">'FL'</span><span class="p">)</span>
|
<p>In order to plot more than one image, it’s easiest to define common
|
||||||
<span class="n">request</span><span class="o">.</span><span class="n">addIdentifier</span><span class="p">(</span><span class="s1">'geomField'</span><span class="p">,</span> <span class="s1">'the_geom'</span><span class="p">)</span>
|
logic in a function. Here, a new function called <strong>make_map</strong> is
|
||||||
<span class="n">request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="s1">'state'</span><span class="p">,</span><span class="s1">'name'</span><span class="p">,</span><span class="s1">'lat'</span><span class="p">,</span><span class="s1">'lon'</span><span class="p">)</span>
|
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
|
||||||
<span class="n">response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGeometryData</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
(plt)</a>
|
||||||
<span class="n">record</span> <span class="o">=</span> <span class="n">response</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
to create a figure and axis. The geographic extent is set and lat/lon
|
||||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">response</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" MultiPolygon"</span><span class="p">)</span>
|
gridlines are added for context.</p>
|
||||||
<span class="n">state</span><span class="o">=</span><span class="p">{}</span>
|
|
||||||
<span class="n">state</span><span class="p">[</span><span class="s1">'name'</span><span class="p">]</span> <span class="o">=</span> <span class="n">record</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s1">'name'</span><span class="p">)</span>
|
|
||||||
<span class="n">state</span><span class="p">[</span><span class="s1">'state'</span><span class="p">]</span> <span class="o">=</span> <span class="n">record</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s1">'state'</span><span class="p">)</span>
|
|
||||||
<span class="n">state</span><span class="p">[</span><span class="s1">'lat'</span><span class="p">]</span> <span class="o">=</span> <span class="n">record</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s1">'lat'</span><span class="p">)</span>
|
|
||||||
<span class="n">state</span><span class="p">[</span><span class="s1">'lon'</span><span class="p">]</span> <span class="o">=</span> <span class="n">record</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s1">'lon'</span><span class="p">)</span>
|
|
||||||
<span class="c1">#state['geom'] = record.getGeometry()</span>
|
|
||||||
<span class="n">state</span><span class="p">[</span><span class="s1">'bounds'</span><span class="p">]</span> <span class="o">=</span> <span class="n">record</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">()</span><span class="o">.</span><span class="n">bounds</span>
|
|
||||||
<span class="nb">print</span><span class="p">(</span><span class="n">state</span><span class="p">[</span><span class="s1">'name'</span><span class="p">],</span> <span class="n">state</span><span class="p">[</span><span class="s1">'state'</span><span class="p">],</span> <span class="n">state</span><span class="p">[</span><span class="s1">'lat'</span><span class="p">],</span> <span class="n">state</span><span class="p">[</span><span class="s1">'lon'</span><span class="p">],</span> <span class="n">state</span><span class="p">[</span><span class="s1">'bounds'</span><span class="p">])</span>
|
|
||||||
<span class="nb">print</span><span class="p">()</span>
|
|
||||||
|
|
||||||
<span class="c1"># EDEX request for multiple states</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">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.states'</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">'geomField'</span><span class="p">,</span> <span class="s1">'the_geom'</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">'inLocation'</span><span class="p">,</span> <span class="s1">'true'</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">'locationField'</span><span class="p">,</span> <span class="s1">'state'</span><span class="p">)</span>
|
|
||||||
<span class="n">request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="s1">'state'</span><span class="p">,</span><span class="s1">'name'</span><span class="p">,</span><span class="s1">'lat'</span><span class="p">,</span><span class="s1">'lon'</span><span class="p">)</span>
|
|
||||||
<span class="n">request</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="s1">'FL'</span><span class="p">,</span><span class="s1">'GA'</span><span class="p">,</span><span class="s1">'MS'</span><span class="p">,</span><span class="s1">'AL'</span><span class="p">,</span><span class="s1">'SC'</span><span class="p">,</span><span class="s1">'LA'</span><span class="p">)</span>
|
|
||||||
<span class="n">response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGeometryData</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
|
||||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">response</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" MultiPolygons"</span><span class="p">)</span>
|
|
||||||
|
|
||||||
<span class="c1"># Append each geometry to a numpy array</span>
|
|
||||||
<span class="n">states</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="k">for</span> <span class="n">ob</span> <span class="ow">in</span> <span class="n">response</span><span class="p">:</span>
|
|
||||||
<span class="nb">print</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s1">'name'</span><span class="p">),</span> <span class="n">ob</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s1">'state'</span><span class="p">),</span> <span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s1">'lat'</span><span class="p">),</span> <span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s1">'lon'</span><span class="p">))</span>
|
|
||||||
<span class="n">states</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">states</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">())</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Found</span> <span class="mi">1</span> <span class="n">MultiPolygon</span>
|
|
||||||
<span class="n">Florida</span> <span class="n">FL</span> <span class="mf">28.67402</span> <span class="o">-</span><span class="mf">82.50934</span> <span class="p">(</span><span class="o">-</span><span class="mf">87.63429260299995</span><span class="p">,</span> <span class="mf">24.521051616000022</span><span class="p">,</span> <span class="o">-</span><span class="mf">80.03199876199994</span><span class="p">,</span> <span class="mf">31.001012802000048</span><span class="p">)</span>
|
|
||||||
|
|
||||||
<span class="n">Found</span> <span class="mi">6</span> <span class="n">MultiPolygons</span>
|
|
||||||
<span class="n">Florida</span> <span class="n">FL</span> <span class="mf">28.67402</span> <span class="o">-</span><span class="mf">82.50934</span>
|
|
||||||
<span class="n">Georgia</span> <span class="n">GA</span> <span class="mf">32.65155</span> <span class="o">-</span><span class="mf">83.44848</span>
|
|
||||||
<span class="n">Louisiana</span> <span class="n">LA</span> <span class="mf">31.0891</span> <span class="o">-</span><span class="mf">92.02905</span>
|
|
||||||
<span class="n">Alabama</span> <span class="n">AL</span> <span class="mf">32.79354</span> <span class="o">-</span><span class="mf">86.82676</span>
|
|
||||||
<span class="n">Mississippi</span> <span class="n">MS</span> <span class="mf">32.75201</span> <span class="o">-</span><span class="mf">89.66553</span>
|
|
||||||
<span class="n">South</span> <span class="n">Carolina</span> <span class="n">SC</span> <span class="mf">33.93574</span> <span class="o">-</span><span class="mf">80.89899</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<p>Now make sure we can plot the states with a lat/lon grid.</p>
|
|
||||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="p">,</span> <span class="n">proj</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">()):</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="p">,</span> <span class="n">proj</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">()):</span>
|
||||||
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span><span class="mi">12</span><span class="p">),</span><span class="n">subplot_kw</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">projection</span><span class="o">=</span><span class="n">proj</span><span class="p">))</span>
|
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">plt</span><span class="o">.</span><span class="n">subplots</span><span class="p">(</span><span class="n">figsize</span><span class="o">=</span><span class="p">(</span><span class="mi">16</span><span class="p">,</span><span class="mi">12</span><span class="p">),</span><span class="n">subplot_kw</span><span class="o">=</span><span class="nb">dict</span><span class="p">(</span><span class="n">projection</span><span class="o">=</span><span class="n">proj</span><span class="p">))</span>
|
||||||
<span class="n">ax</span><span class="o">.</span><span class="n">set_extent</span><span class="p">(</span><span class="n">bbox</span><span class="p">)</span>
|
<span class="n">ax</span><span class="o">.</span><span class="n">set_extent</span><span class="p">(</span><span class="n">bbox</span><span class="p">)</span>
|
||||||
|
@ -195,205 +237,457 @@ exercise.</p>
|
||||||
<span class="n">gl</span><span class="o">.</span><span class="n">xformatter</span> <span class="o">=</span> <span class="n">LONGITUDE_FORMATTER</span>
|
<span class="n">gl</span><span class="o">.</span><span class="n">xformatter</span> <span class="o">=</span> <span class="n">LONGITUDE_FORMATTER</span>
|
||||||
<span class="n">gl</span><span class="o">.</span><span class="n">yformatter</span> <span class="o">=</span> <span class="n">LATITUDE_FORMATTER</span>
|
<span class="n">gl</span><span class="o">.</span><span class="n">yformatter</span> <span class="o">=</span> <span class="n">LATITUDE_FORMATTER</span>
|
||||||
<span class="k">return</span> <span class="n">fig</span><span class="p">,</span> <span class="n">ax</span>
|
<span class="k">return</span> <span class="n">fig</span><span class="p">,</span> <span class="n">ax</span>
|
||||||
|
|
||||||
<span class="c1"># buffer our bounds by +/i degrees lat/lon</span>
|
|
||||||
<span class="n">bounds</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="s1">'bounds'</span><span class="p">]</span>
|
|
||||||
<span class="n">bbox</span><span class="o">=</span><span class="p">[</span><span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span><span class="n">bounds</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="mi">3</span><span class="p">,</span><span class="n">bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="mf">1.5</span><span class="p">,</span><span class="n">bounds</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">+</span><span class="mf">1.5</span><span class="p">]</span>
|
|
||||||
|
|
||||||
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="o">=</span><span class="n">bbox</span><span class="p">)</span>
|
|
||||||
<span class="n">shape_feature</span> <span class="o">=</span> <span class="n">ShapelyFeature</span><span class="p">(</span><span class="n">states</span><span class="p">,</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">(),</span>
|
|
||||||
<span class="n">facecolor</span><span class="o">=</span><span class="s1">'none'</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s2">"-"</span><span class="p">,</span><span class="n">edgecolor</span><span class="o">=</span><span class="s1">'#000000'</span><span class="p">,</span><span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
|
||||||
<span class="n">ax</span><span class="o">.</span><span class="n">add_feature</span><span class="p">(</span><span class="n">shape_feature</span><span class="p">)</span>
|
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o"><</span><span class="n">cartopy</span><span class="o">.</span><span class="n">mpl</span><span class="o">.</span><span class="n">feature_artist</span><span class="o">.</span><span class="n">FeatureArtist</span> <span class="n">at</span> <span class="mh">0x11dcfedd8</span><span class="o">></span>
|
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html">Top</a></p>
|
||||||
</pre></div>
|
</section>
|
||||||
</div>
|
|
||||||
<img alt="../../_images/Regional_Surface_Obs_Plot_4_1.png" src="../../_images/Regional_Surface_Obs_Plot_4_1.png" />
|
|
||||||
<hr class="docutils" />
|
<hr class="docutils" />
|
||||||
<section id="plot-metar-obs">
|
<section id="function-extract-plotting-data">
|
||||||
<h2>Plot METAR (obs)<a class="headerlink" href="#plot-metar-obs" title="Permalink to this heading"></a></h2>
|
<h3>Function: extract_plotting_data()<a class="headerlink" href="#function-extract-plotting-data" title="Permalink to this heading"></a></h3>
|
||||||
<p>Here we use a spatial envelope to limit the request to the boundary or
|
<p>Grab the simple variables out of the response data we have (attaching
|
||||||
our plot. Without such a filter you may be requesting many tens of
|
|
||||||
thousands of records.</p>
|
|
||||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Create envelope geometry</span>
|
|
||||||
<span class="n">envelope</span> <span class="o">=</span> <span class="n">Polygon</span><span class="p">([(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">]),(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">3</span><span class="p">]),</span>
|
|
||||||
<span class="p">(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">bbox</span><span class="p">[</span><span class="mi">3</span><span class="p">]),(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span>
|
|
||||||
<span class="p">(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">])])</span>
|
|
||||||
|
|
||||||
<span class="c1"># New obs 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">"obs"</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">availableProducts</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableParameters</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
|
||||||
<span class="n">single_value_params</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"timeObs"</span><span class="p">,</span> <span class="s2">"stationName"</span><span class="p">,</span> <span class="s2">"longitude"</span><span class="p">,</span> <span class="s2">"latitude"</span><span class="p">,</span>
|
|
||||||
<span class="s2">"temperature"</span><span class="p">,</span> <span class="s2">"dewpoint"</span><span class="p">,</span> <span class="s2">"windDir"</span><span class="p">,</span>
|
|
||||||
<span class="s2">"windSpeed"</span><span class="p">,</span> <span class="s2">"seaLevelPress"</span><span class="p">]</span>
|
|
||||||
<span class="n">multi_value_params</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"presWeather"</span><span class="p">,</span> <span class="s2">"skyCover"</span><span class="p">,</span> <span class="s2">"skyLayerBase"</span><span class="p">]</span>
|
|
||||||
<span class="n">params</span> <span class="o">=</span> <span class="n">single_value_params</span> <span class="o">+</span> <span class="n">multi_value_params</span>
|
|
||||||
<span class="n">request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">params</span><span class="p">))</span>
|
|
||||||
|
|
||||||
<span class="c1"># Time range</span>
|
|
||||||
<span class="n">lastHourDateTime</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">minutes</span> <span class="o">=</span> <span class="mi">60</span><span class="p">)</span>
|
|
||||||
<span class="n">start</span> <span class="o">=</span> <span class="n">lastHourDateTime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span>
|
|
||||||
<span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span>
|
|
||||||
|
|
||||||
<span class="n">beginRange</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span> <span class="n">start</span> <span class="p">,</span> <span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">)</span>
|
|
||||||
<span class="n">endRange</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span> <span class="n">end</span> <span class="p">,</span> <span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">)</span>
|
|
||||||
<span class="n">timerange</span> <span class="o">=</span> <span class="n">TimeRange</span><span class="p">(</span><span class="n">beginRange</span><span class="p">,</span> <span class="n">endRange</span><span class="p">)</span>
|
|
||||||
<span class="c1"># Get response</span>
|
|
||||||
<span class="n">response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGeometryData</span><span class="p">(</span><span class="n">request</span><span class="p">,</span><span class="n">timerange</span><span class="p">)</span>
|
|
||||||
<span class="c1"># function getMetarObs was added in python-awips 18.1.4</span>
|
|
||||||
<span class="n">obs</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getMetarObs</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
|
|
||||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">response</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" records"</span><span class="p">)</span>
|
|
||||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Using "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">obs</span><span class="p">[</span><span class="s1">'temperature'</span><span class="p">]))</span> <span class="o">+</span> <span class="s2">" temperature records"</span><span class="p">)</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Found</span> <span class="mi">3468</span> <span class="n">records</span>
|
|
||||||
<span class="n">Using</span> <span class="mi">152</span> <span class="n">temperature</span> <span class="n">records</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<p>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
|
correct units), and put them into a dictionary that we will hand the
|
||||||
plotting function later:</p>
|
plotting function later:</p>
|
||||||
<ul class="simple">
|
<ul class="simple">
|
||||||
<li><p>Get wind components from speed and direction</p></li>
|
<li><p>Get wind components from speed and direction</p></li>
|
||||||
<li><p>Convert cloud fraction values to integer codes [0 - 8]</p></li>
|
<li><p>Convert cloud coverage values to integer codes [0 - 8]</p></li>
|
||||||
<li><p>Map METAR weather codes to WMO codes for weather symbols</p></li>
|
<li><p>Assign temperature, dewpoint, and sea level pressure the the correct
|
||||||
|
units</p></li>
|
||||||
|
<li><p>Account for missing values (by using <code class="docutils literal notranslate"><span class="pre">nan</span></code>)</p></li>
|
||||||
</ul>
|
</ul>
|
||||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">data</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">extract_plotting_data</span><span class="p">(</span><span class="n">arr</span><span class="p">,</span> <span class="n">datatype</span><span class="p">):</span>
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'stid'</span><span class="p">]</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">obs</span><span class="p">[</span><span class="s1">'stationName'</span><span class="p">])</span>
|
<span class="sd">"""</span>
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'latitude'</span><span class="p">]</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">obs</span><span class="p">[</span><span class="s1">'latitude'</span><span class="p">])</span>
|
<span class="sd"> Extract all necessary data for plotting for either</span>
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'longitude'</span><span class="p">]</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">obs</span><span class="p">[</span><span class="s1">'longitude'</span><span class="p">])</span>
|
<span class="sd"> datatype: 'obs' or 'sfcobs'</span>
|
||||||
<span class="n">tmp</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">obs</span><span class="p">[</span><span class="s1">'temperature'</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
|
<span class="sd"> """</span>
|
||||||
<span class="n">dpt</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">obs</span><span class="p">[</span><span class="s1">'dewpoint'</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
|
|
||||||
|
<span class="n">data</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'latitude'</span><span class="p">]</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">arr</span><span class="p">[</span><span class="s1">'latitude'</span><span class="p">])</span>
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'longitude'</span><span class="p">]</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">arr</span><span class="p">[</span><span class="s1">'longitude'</span><span class="p">])</span>
|
||||||
|
<span class="n">tmp</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">arr</span><span class="p">[</span><span class="s1">'temperature'</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
|
||||||
|
<span class="n">dpt</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">arr</span><span class="p">[</span><span class="s1">'dewpoint'</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
|
||||||
|
<span class="n">direction</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">arr</span><span class="p">[</span><span class="s1">'windDir'</span><span class="p">])</span>
|
||||||
|
|
||||||
<span class="c1"># Suppress nan masking warnings</span>
|
<span class="c1"># Suppress nan masking warnings</span>
|
||||||
<span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">"ignore"</span><span class="p">,</span><span class="n">category</span> <span class="o">=</span><span class="ne">RuntimeWarning</span><span class="p">)</span>
|
<span class="n">warnings</span><span class="o">.</span><span class="n">filterwarnings</span><span class="p">(</span><span class="s2">"ignore"</span><span class="p">,</span><span class="n">category</span> <span class="o">=</span><span class="ne">RuntimeWarning</span><span class="p">)</span>
|
||||||
|
|
||||||
<span class="n">tmp</span><span class="p">[</span><span class="n">tmp</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
|
||||||
<span class="n">dpt</span><span class="p">[</span><span class="n">dpt</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'air_temperature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'dew_point_temperature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">dpt</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'air_pressure_at_sea_level'</span><span class="p">]</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">obs</span><span class="p">[</span><span class="s1">'seaLevelPress'</span><span class="p">])</span><span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">'mbar'</span><span class="p">)</span>
|
|
||||||
<span class="n">direction</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">obs</span><span class="p">[</span><span class="s1">'windDir'</span><span class="p">])</span>
|
|
||||||
<span class="n">direction</span><span class="p">[</span><span class="n">direction</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
|
||||||
<span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">wind_components</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">obs</span><span class="p">[</span><span class="s1">'windSpeed'</span><span class="p">])</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">'knots'</span><span class="p">),</span>
|
|
||||||
<span class="n">direction</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degree</span><span class="p">)</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'eastward_wind'</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="s1">'northward_wind'</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'cloud_coverage'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">get_cloud_cover</span><span class="p">(</span><span class="n">x</span><span class="p">)</span><span class="o">*</span><span class="mi">8</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">obs</span><span class="p">[</span><span class="s1">'skyCover'</span><span class="p">]]</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'present_weather'</span><span class="p">]</span> <span class="o">=</span> <span class="n">obs</span><span class="p">[</span><span class="s1">'presWeather'</span><span class="p">]</span>
|
|
||||||
<span class="n">proj</span> <span class="o">=</span> <span class="n">ccrs</span><span class="o">.</span><span class="n">LambertConformal</span><span class="p">(</span><span class="n">central_longitude</span><span class="o">=</span><span class="n">state</span><span class="p">[</span><span class="s1">'lon'</span><span class="p">],</span> <span class="n">central_latitude</span><span class="o">=</span><span class="n">state</span><span class="p">[</span><span class="s1">'lat'</span><span class="p">],</span>
|
|
||||||
<span class="n">standard_parallels</span><span class="o">=</span><span class="p">[</span><span class="mi">35</span><span class="p">])</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>
|
|
||||||
<span class="n">custom_layout</span><span class="o">.</span><span class="n">add_value</span><span class="p">(</span><span class="s1">'SW'</span><span class="p">,</span> <span class="s1">'dew_point_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">'darkgreen'</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">'E'</span><span class="p">,</span> <span class="s1">'precipitation'</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">'0.1f'</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">'inch'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'blue'</span><span class="p">)</span>
|
|
||||||
<span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">())</span> <span class="o">+</span> <span class="s2">" | METAR Surface Obs | "</span> <span class="o">+</span> <span class="n">edexServer</span><span class="p">)</span>
|
|
||||||
<span class="n">stationplot</span> <span class="o">=</span> <span class="n">StationPlot</span><span class="p">(</span><span class="n">ax</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="s1">'longitude'</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="s1">'latitude'</span><span class="p">],</span> <span class="n">clip_on</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
|
||||||
<span class="n">transform</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">(),</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
|
|
||||||
<span class="n">custom_layout</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stationplot</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
|
|
||||||
<span class="n">fig</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<img alt="../../_images/Regional_Surface_Obs_Plot_8_0.png" src="../../_images/Regional_Surface_Obs_Plot_8_0.png" />
|
|
||||||
</section>
|
|
||||||
<hr class="docutils" />
|
|
||||||
<section id="plot-synoptic-sfcobs">
|
|
||||||
<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>
|
|
||||||
<span class="n">availableProducts</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getAvailableParameters</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
|
|
||||||
<span class="c1"># (sfcobs) uses stationId, while (obs) uses stationName,</span>
|
|
||||||
<span class="c1"># the rest of these parameters are the same.</span>
|
|
||||||
<span class="n">single_value_params</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"timeObs"</span><span class="p">,</span> <span class="s2">"stationId"</span><span class="p">,</span> <span class="s2">"longitude"</span><span class="p">,</span> <span class="s2">"latitude"</span><span class="p">,</span>
|
|
||||||
<span class="s2">"temperature"</span><span class="p">,</span> <span class="s2">"dewpoint"</span><span class="p">,</span> <span class="s2">"windDir"</span><span class="p">,</span>
|
|
||||||
<span class="s2">"windSpeed"</span><span class="p">,</span> <span class="s2">"seaLevelPress"</span><span class="p">]</span>
|
|
||||||
<span class="n">multi_value_params</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"presWeather"</span><span class="p">,</span> <span class="s2">"skyCover"</span><span class="p">,</span> <span class="s2">"skyLayerBase"</span><span class="p">]</span>
|
|
||||||
<span class="n">pres_weather</span><span class="p">,</span> <span class="n">sky_cov</span><span class="p">,</span> <span class="n">sky_layer_base</span> <span class="o">=</span> <span class="p">[],[],[]</span>
|
|
||||||
<span class="n">params</span> <span class="o">=</span> <span class="n">single_value_params</span> <span class="o">+</span> <span class="n">multi_value_params</span>
|
|
||||||
<span class="n">request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">params</span><span class="p">))</span>
|
|
||||||
|
|
||||||
<span class="c1"># Time range</span>
|
|
||||||
<span class="n">lastHourDateTime</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">minutes</span> <span class="o">=</span> <span class="mi">60</span><span class="p">)</span>
|
|
||||||
<span class="n">start</span> <span class="o">=</span> <span class="n">lastHourDateTime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span>
|
|
||||||
<span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span>
|
|
||||||
|
|
||||||
<span class="n">beginRange</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span> <span class="n">start</span> <span class="p">,</span> <span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">)</span>
|
|
||||||
<span class="n">endRange</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span> <span class="n">end</span> <span class="p">,</span> <span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">)</span>
|
|
||||||
<span class="n">timerange</span> <span class="o">=</span> <span class="n">TimeRange</span><span class="p">(</span><span class="n">beginRange</span><span class="p">,</span> <span class="n">endRange</span><span class="p">)</span>
|
|
||||||
|
|
||||||
<span class="c1"># Get response</span>
|
|
||||||
<span class="n">response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGeometryData</span><span class="p">(</span><span class="n">request</span><span class="p">,</span><span class="n">timerange</span><span class="p">)</span>
|
|
||||||
<span class="c1"># function getSynopticObs was added in python-awips 18.1.4</span>
|
|
||||||
<span class="n">sfcobs</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getSynopticObs</span><span class="p">(</span><span class="n">response</span><span class="p">)</span>
|
|
||||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">response</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" records"</span><span class="p">)</span>
|
|
||||||
<span class="nb">print</span><span class="p">(</span><span class="s2">"Using "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">sfcobs</span><span class="p">[</span><span class="s1">'temperature'</span><span class="p">]))</span> <span class="o">+</span> <span class="s2">" temperature records"</span><span class="p">)</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Found</span> <span class="mi">260</span> <span class="n">records</span>
|
|
||||||
<span class="n">Using</span> <span class="mi">78</span> <span class="n">temperature</span> <span class="n">records</span>
|
|
||||||
</pre></div>
|
|
||||||
</div>
|
|
||||||
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">data</span> <span class="o">=</span> <span class="nb">dict</span><span class="p">()</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'stid'</span><span class="p">]</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">sfcobs</span><span class="p">[</span><span class="s1">'stationId'</span><span class="p">])</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'lat'</span><span class="p">]</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">sfcobs</span><span class="p">[</span><span class="s1">'latitude'</span><span class="p">])</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'lon'</span><span class="p">]</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">sfcobs</span><span class="p">[</span><span class="s1">'longitude'</span><span class="p">])</span>
|
|
||||||
|
|
||||||
<span class="c1"># Synop/sfcobs temps are stored in kelvin (degC for METAR/obs)</span>
|
|
||||||
<span class="n">tmp</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">sfcobs</span><span class="p">[</span><span class="s1">'temperature'</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
|
|
||||||
<span class="n">dpt</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">sfcobs</span><span class="p">[</span><span class="s1">'dewpoint'</span><span class="p">],</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
|
|
||||||
<span class="n">direction</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">sfcobs</span><span class="p">[</span><span class="s1">'windDir'</span><span class="p">])</span>
|
|
||||||
<span class="c1"># Account for missing values</span>
|
<span class="c1"># Account for missing values</span>
|
||||||
<span class="n">tmp</span><span class="p">[</span><span class="n">tmp</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
<span class="n">tmp</span><span class="p">[</span><span class="n">tmp</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
||||||
<span class="n">dpt</span><span class="p">[</span><span class="n">dpt</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
<span class="n">dpt</span><span class="p">[</span><span class="n">dpt</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
||||||
<span class="n">direction</span><span class="p">[</span><span class="n">direction</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
<span class="n">direction</span><span class="p">[</span><span class="n">direction</span> <span class="o">==</span> <span class="o">-</span><span class="mf">9999.0</span><span class="p">]</span> <span class="o">=</span> <span class="s1">'nan'</span>
|
||||||
|
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'air_pressure_at_sea_level'</span><span class="p">]</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">arr</span><span class="p">[</span><span class="s1">'seaLevelPress'</span><span class="p">])</span><span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">'mbar'</span><span class="p">)</span>
|
||||||
|
<span class="n">u</span><span class="p">,</span> <span class="n">v</span> <span class="o">=</span> <span class="n">wind_components</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">arr</span><span class="p">[</span><span class="s1">'windSpeed'</span><span class="p">])</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">'knots'</span><span class="p">),</span>
|
||||||
|
<span class="n">direction</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degree</span><span class="p">)</span>
|
||||||
|
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'eastward_wind'</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="s1">'northward_wind'</span><span class="p">]</span> <span class="o">=</span> <span class="n">u</span><span class="p">,</span> <span class="n">v</span>
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'present_weather'</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">[</span><span class="s1">'presWeather'</span><span class="p">]</span>
|
||||||
|
|
||||||
|
|
||||||
|
<span class="c1"># metars uses 'stationName' for its identifier and temps are in deg C</span>
|
||||||
|
<span class="c1"># metars also has sky coverage</span>
|
||||||
|
<span class="k">if</span> <span class="n">datatype</span> <span class="o">==</span> <span class="s2">"obs"</span><span class="p">:</span>
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'stid'</span><span class="p">]</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">arr</span><span class="p">[</span><span class="s1">'stationName'</span><span class="p">])</span>
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'air_temperature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'dew_point_temperature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">dpt</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degC</span>
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'cloud_coverage'</span><span class="p">]</span> <span class="o">=</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">get_cloud_cover</span><span class="p">(</span><span class="n">x</span><span class="p">))</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">arr</span><span class="p">[</span><span class="s1">'skyCover'</span><span class="p">]]</span>
|
||||||
|
|
||||||
|
<span class="c1"># synoptic obs uses 'stationId', and temps are in Kelvin</span>
|
||||||
|
<span class="k">elif</span> <span class="n">datatype</span> <span class="o">==</span> <span class="s2">"sfcobs"</span><span class="p">:</span>
|
||||||
|
<span class="n">data</span><span class="p">[</span><span class="s1">'stid'</span><span class="p">]</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">arr</span><span class="p">[</span><span class="s1">'stationId'</span><span class="p">])</span>
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'air_temperature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">kelvin</span>
|
<span class="n">data</span><span class="p">[</span><span class="s1">'air_temperature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">kelvin</span>
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'dew_point_temperature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">dpt</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">kelvin</span>
|
<span class="n">data</span><span class="p">[</span><span class="s1">'dew_point_temperature'</span><span class="p">]</span> <span class="o">=</span> <span class="n">dpt</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">kelvin</span>
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'air_pressure_at_sea_level'</span><span class="p">]</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">sfcobs</span><span class="p">[</span><span class="s1">'seaLevelPress'</span><span class="p">])</span><span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">'mbar'</span><span class="p">)</span>
|
|
||||||
<span class="k">try</span><span class="p">:</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'eastward_wind'</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="s1">'northward_wind'</span><span class="p">]</span> <span class="o">=</span> <span class="n">wind_components</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">sfcobs</span><span class="p">[</span><span class="s1">'windSpeed'</span><span class="p">])</span> <span class="o">*</span> <span class="n">units</span><span class="p">(</span><span class="s1">'knots'</span><span class="p">),</span><span class="n">direction</span> <span class="o">*</span> <span class="n">units</span><span class="o">.</span><span class="n">degree</span><span class="p">)</span>
|
|
||||||
<span class="n">data</span><span class="p">[</span><span class="s1">'present_weather'</span><span class="p">]</span> <span class="o">=</span> <span class="n">sfcobs</span><span class="p">[</span><span class="s1">'presWeather'</span><span class="p">]</span>
|
|
||||||
<span class="k">except</span> <span class="ne">ValueError</span><span class="p">:</span>
|
|
||||||
<span class="k">pass</span>
|
|
||||||
|
|
||||||
<span class="n">fig_synop</span><span class="p">,</span> <span class="n">ax_synop</span> <span class="o">=</span> <span class="n">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="o">=</span><span class="n">bbox</span><span class="p">)</span>
|
|
||||||
<span class="n">shape_feature</span> <span class="o">=</span> <span class="n">ShapelyFeature</span><span class="p">(</span><span class="n">states</span><span class="p">,</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">(),</span>
|
|
||||||
<span class="n">facecolor</span><span class="o">=</span><span class="s1">'none'</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s2">"-"</span><span class="p">,</span><span class="n">edgecolor</span><span class="o">=</span><span class="s1">'#000000'</span><span class="p">,</span><span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
|
||||||
<span class="n">ax_synop</span><span class="o">.</span><span class="n">add_feature</span><span class="p">(</span><span class="n">shape_feature</span><span class="p">)</span>
|
|
||||||
|
|
||||||
|
<span class="k">return</span> <span class="n">data</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html">Top</a></p>
|
||||||
|
</section>
|
||||||
|
<hr class="docutils" />
|
||||||
|
<section id="function-plot-data">
|
||||||
|
<h3>Function: plot_data()<a class="headerlink" href="#function-plot-data" title="Permalink to this heading"></a></h3>
|
||||||
|
<p>This function makse use of Metpy.StationPlotLayout and Metpy.StationPlot
|
||||||
|
to add all surface observation data to our plot. The logic is very
|
||||||
|
similar for both METAR and Synoptic data, so a <code class="docutils literal notranslate"><span class="pre">datatype</span></code> argument is
|
||||||
|
used to distinguish between which data is being drawn, and then draws
|
||||||
|
the appropriate features.</p>
|
||||||
|
<p>This function plots: - Wind barbs - Air temperature - Dew point
|
||||||
|
temperature - Precipitation - Cloud coverage (for METARS)</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="k">def</span> <span class="nf">plot_data</span><span class="p">(</span><span class="n">data</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">axes</span><span class="p">,</span> <span class="n">datatype</span><span class="p">):</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">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_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>
|
<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>
|
||||||
<span class="n">custom_layout</span><span class="o">.</span><span class="n">add_value</span><span class="p">(</span><span class="s1">'SW'</span><span class="p">,</span> <span class="s1">'dew_point_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">'darkgreen'</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">'SW'</span><span class="p">,</span> <span class="s1">'dew_point_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">'darkgreen'</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">'E'</span><span class="p">,</span> <span class="s1">'precipitation'</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">'0.1f'</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">'inch'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'blue'</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">'E'</span><span class="p">,</span> <span class="s1">'precipitation'</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">'0.1f'</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">'inch'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'blue'</span><span class="p">)</span>
|
||||||
<span class="n">ax_synop</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">())</span> <span class="o">+</span> <span class="s2">" | SYNOP Surface Obs | "</span> <span class="o">+</span> <span class="n">edexServer</span><span class="p">)</span>
|
<span class="c1"># metars has sky coverage</span>
|
||||||
<span class="n">stationplot</span> <span class="o">=</span> <span class="n">StationPlot</span><span class="p">(</span><span class="n">ax_synop</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="s1">'lon'</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="s1">'lat'</span><span class="p">],</span> <span class="n">clip_on</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
<span class="k">if</span> <span class="n">datatype</span> <span class="o">==</span> <span class="s1">'obs'</span><span class="p">:</span>
|
||||||
|
<span class="n">custom_layout</span><span class="o">.</span><span class="n">add_symbol</span><span class="p">(</span><span class="s1">'C'</span><span class="p">,</span> <span class="s1">'cloud_coverage'</span><span class="p">,</span> <span class="n">sky_cover</span><span class="p">)</span>
|
||||||
|
<span class="n">axes</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="n">title</span><span class="p">)</span>
|
||||||
|
<span class="n">stationplot</span> <span class="o">=</span> <span class="n">StationPlot</span><span class="p">(</span><span class="n">axes</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="s1">'longitude'</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="s1">'latitude'</span><span class="p">],</span> <span class="n">clip_on</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
||||||
<span class="n">transform</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">(),</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
|
<span class="n">transform</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">(),</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
|
||||||
<span class="n">custom_layout</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stationplot</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
|
<span class="n">custom_layout</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stationplot</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="../../_images/Regional_Surface_Obs_Plot_11_0.png" src="../../_images/Regional_Surface_Obs_Plot_11_0.png" />
|
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html">Top</a></p>
|
||||||
</section>
|
</section>
|
||||||
<hr class="docutils" />
|
<hr class="docutils" />
|
||||||
<section id="plot-both-metar-and-synop">
|
<section id="initial-setup">
|
||||||
<h2>Plot both METAR and SYNOP<a class="headerlink" href="#plot-both-metar-and-synop" title="Permalink to this heading"></a></h2>
|
<h3>Initial Setup<a class="headerlink" href="#initial-setup" title="Permalink to this heading"></a></h3>
|
||||||
<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>
|
<p>Connect to an EDEX server and define several <a class="reference external" href="http://unidata.github.io/python-awips/api/IDataRequest.html">new data request
|
||||||
<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>
|
objects</a>.</p>
|
||||||
<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>
|
<p>In this example we’re using multiple different datatypes from EDEX, so
|
||||||
<span class="n">custom_layout</span><span class="o">.</span><span class="n">add_value</span><span class="p">(</span><span class="s1">'SW'</span><span class="p">,</span> <span class="s1">'dew_point_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">'darkgreen'</span><span class="p">)</span>
|
we’ll create a request object for each of the following: - <a class="reference external" href="#Define-Maps-Request">The states
|
||||||
<span class="n">custom_layout</span><span class="o">.</span><span class="n">add_value</span><span class="p">(</span><span class="s1">'E'</span><span class="p">,</span> <span class="s1">'precipitation'</span><span class="p">,</span> <span class="n">fmt</span><span class="o">=</span><span class="s1">'0.1f'</span><span class="p">,</span> <span class="n">units</span><span class="o">=</span><span class="s1">'inch'</span><span class="p">,</span> <span class="n">color</span><span class="o">=</span><span class="s1">'blue'</span><span class="p">)</span>
|
outlines (datatype maps)</a> - <a class="reference external" href="#Define-METAR-Request">The METAR data
|
||||||
<span class="n">ax</span><span class="o">.</span><span class="n">set_title</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">response</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">())</span> <span class="o">+</span> <span class="s2">" | METAR/SYNOP Surface Obs | "</span> <span class="o">+</span> <span class="n">edexServer</span><span class="p">)</span>
|
(datatype obs)</a> - <a class="reference external" href="#Define-Synoptic-Request">The Synoptic data (datatype
|
||||||
<span class="n">stationplot</span> <span class="o">=</span> <span class="n">StationPlot</span><span class="p">(</span><span class="n">ax</span><span class="p">,</span> <span class="n">data</span><span class="p">[</span><span class="s1">'lon'</span><span class="p">],</span> <span class="n">data</span><span class="p">[</span><span class="s1">'lat'</span><span class="p">],</span> <span class="n">clip_on</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
sfc)</a></p>
|
||||||
<span class="n">transform</span><span class="o">=</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">(),</span> <span class="n">fontsize</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
|
<p>Some of the request use filters, so we’ll also create several filters
|
||||||
<span class="n">custom_layout</span><span class="o">.</span><span class="n">plot</span><span class="p">(</span><span class="n">stationplot</span><span class="p">,</span> <span class="n">data</span><span class="p">)</span>
|
than can be used for the various data requests as well.</p>
|
||||||
|
<section id="initial-edex-connection">
|
||||||
|
<h4>Initial EDEX Connection<a class="headerlink" href="#initial-edex-connection" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>First we establish a connection to Unidata’s public EDEX server.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># EDEX connection</span>
|
||||||
|
<span class="n">edexServer</span> <span class="o">=</span> <span class="s2">"edex-cloud.unidata.ucar.edu"</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>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="maps-request-and-response">
|
||||||
|
<h4>Maps Request and Response<a class="headerlink" href="#maps-request-and-response" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>The maps data request will give us data to draw our state outlines of
|
||||||
|
interest (Florida and its neighboring states). We will retrieve the data
|
||||||
|
response object here so we can create a geographic filter for the METAR
|
||||||
|
and Synoptic data requests.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Define the maps request</span>
|
||||||
|
<span class="n">maps_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="c1"># filter for multiple states</span>
|
||||||
|
<span class="n">maps_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">maps_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.states'</span><span class="p">)</span>
|
||||||
|
<span class="n">maps_request</span><span class="o">.</span><span class="n">addIdentifier</span><span class="p">(</span><span class="s1">'geomField'</span><span class="p">,</span> <span class="s1">'the_geom'</span><span class="p">)</span>
|
||||||
|
<span class="n">maps_request</span><span class="o">.</span><span class="n">addIdentifier</span><span class="p">(</span><span class="s1">'inLocation'</span><span class="p">,</span> <span class="s1">'true'</span><span class="p">)</span>
|
||||||
|
<span class="n">maps_request</span><span class="o">.</span><span class="n">addIdentifier</span><span class="p">(</span><span class="s1">'locationField'</span><span class="p">,</span> <span class="s1">'state'</span><span class="p">)</span>
|
||||||
|
<span class="n">maps_request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="s1">'state'</span><span class="p">,</span><span class="s1">'name'</span><span class="p">,</span><span class="s1">'lat'</span><span class="p">,</span><span class="s1">'lon'</span><span class="p">)</span>
|
||||||
|
<span class="n">maps_request</span><span class="o">.</span><span class="n">setLocationNames</span><span class="p">(</span><span class="s1">'FL'</span><span class="p">,</span><span class="s1">'GA'</span><span class="p">,</span><span class="s1">'MS'</span><span class="p">,</span><span class="s1">'AL'</span><span class="p">,</span><span class="s1">'SC'</span><span class="p">,</span><span class="s1">'LA'</span><span class="p">)</span>
|
||||||
|
<span class="n">maps_response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGeometryData</span><span class="p">(</span><span class="n">maps_request</span><span class="p">)</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">maps_response</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" MultiPolygons"</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Found</span> <span class="mi">6</span> <span class="n">MultiPolygons</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="define-geographic-filter">
|
||||||
|
<h4>Define Geographic Filter<a class="headerlink" href="#define-geographic-filter" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>The previous EDEX request limited the data by using a <strong>parameter</strong> for
|
||||||
|
the maps database called <strong>state</strong>. We can take the results from that
|
||||||
|
filter and get a geographic <strong>envelope</strong> based on the Florida polygon
|
||||||
|
that was returned from the previous cell.</p>
|
||||||
|
<div class="alert-warning docutils container">
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o"><</span><span class="n">b</span><span class="o">></span><span class="n">Note</span><span class="p">:</span><span class="o"></</span><span class="n">b</span><span class="o">></span> <span class="n">Without</span> <span class="n">such</span> <span class="n">a</span> <span class="nb">filter</span> <span class="n">you</span> <span class="n">may</span> <span class="n">be</span> <span class="n">requesting</span> <span class="n">many</span> <span class="n">tens</span> <span class="n">of</span> <span class="n">thousands</span> <span class="n">of</span> <span class="n">records</span><span class="o">.</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Append each geometry to a numpy array</span>
|
||||||
|
<span class="n">states</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="k">for</span> <span class="n">ob</span> <span class="ow">in</span> <span class="n">maps_response</span><span class="p">:</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="n">ob</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s1">'name'</span><span class="p">),</span> <span class="n">ob</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s1">'state'</span><span class="p">),</span> <span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s1">'lat'</span><span class="p">),</span> <span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s1">'lon'</span><span class="p">))</span>
|
||||||
|
<span class="n">states</span> <span class="o">=</span> <span class="n">np</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">states</span><span class="p">,</span><span class="n">ob</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">())</span>
|
||||||
|
<span class="c1"># if this is Florida grab geographic info</span>
|
||||||
|
<span class="k">if</span> <span class="n">ob</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s1">'name'</span><span class="p">)</span> <span class="o">==</span> <span class="s2">"Florida"</span><span class="p">:</span>
|
||||||
|
<span class="n">bounds</span> <span class="o">=</span> <span class="n">ob</span><span class="o">.</span><span class="n">getGeometry</span><span class="p">()</span><span class="o">.</span><span class="n">bounds</span>
|
||||||
|
<span class="n">fl_lat</span> <span class="o">=</span> <span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s1">'lat'</span><span class="p">)</span>
|
||||||
|
<span class="n">fl_lon</span> <span class="o">=</span> <span class="n">ob</span><span class="o">.</span><span class="n">getNumber</span><span class="p">(</span><span class="s1">'lon'</span><span class="p">)</span>
|
||||||
|
|
||||||
|
<span class="k">if</span> <span class="n">bounds</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Error, no record found for Florida!"</span><span class="p">)</span>
|
||||||
|
|
||||||
|
<span class="k">else</span><span class="p">:</span>
|
||||||
|
<span class="c1"># buffer our bounds by +/i degrees lat/lon</span>
|
||||||
|
<span class="n">bbox</span><span class="o">=</span><span class="p">[</span><span class="n">bounds</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="mi">3</span><span class="p">,</span><span class="n">bounds</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span><span class="o">+</span><span class="mi">3</span><span class="p">,</span><span class="n">bounds</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="mf">1.5</span><span class="p">,</span><span class="n">bounds</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">+</span><span class="mf">1.5</span><span class="p">]</span>
|
||||||
|
|
||||||
|
<span class="c1"># Create envelope geometry</span>
|
||||||
|
<span class="n">envelope</span> <span class="o">=</span> <span class="n">Polygon</span><span class="p">([(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">]),(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">3</span><span class="p">]),</span>
|
||||||
|
<span class="p">(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">bbox</span><span class="p">[</span><span class="mi">3</span><span class="p">]),(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">]),</span>
|
||||||
|
<span class="p">(</span><span class="n">bbox</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">bbox</span><span class="p">[</span><span class="mi">2</span><span class="p">])])</span>
|
||||||
|
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="n">envelope</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Florida</span> <span class="n">FL</span> <span class="mf">28.67402</span> <span class="o">-</span><span class="mf">82.50934</span>
|
||||||
|
<span class="n">Georgia</span> <span class="n">GA</span> <span class="mf">32.65155</span> <span class="o">-</span><span class="mf">83.44848</span>
|
||||||
|
<span class="n">Louisiana</span> <span class="n">LA</span> <span class="mf">31.0891</span> <span class="o">-</span><span class="mf">92.02905</span>
|
||||||
|
<span class="n">Alabama</span> <span class="n">AL</span> <span class="mf">32.79354</span> <span class="o">-</span><span class="mf">86.82676</span>
|
||||||
|
<span class="n">Mississippi</span> <span class="n">MS</span> <span class="mf">32.75201</span> <span class="o">-</span><span class="mf">89.66553</span>
|
||||||
|
<span class="n">South</span> <span class="n">Carolina</span> <span class="n">SC</span> <span class="mf">33.93574</span> <span class="o">-</span><span class="mf">80.89899</span>
|
||||||
|
<span class="n">POLYGON</span> <span class="p">((</span><span class="o">-</span><span class="mf">90.63429260299995</span> <span class="mf">23.02105161600002</span><span class="p">,</span> <span class="o">-</span><span class="mf">90.63429260299995</span> <span class="mf">32.50101280200016</span><span class="p">,</span> <span class="o">-</span><span class="mf">77.03199876199994</span> <span class="mf">32.50101280200016</span><span class="p">,</span> <span class="o">-</span><span class="mf">77.03199876199994</span> <span class="mf">23.02105161600002</span><span class="p">,</span> <span class="o">-</span><span class="mf">90.63429260299995</span> <span class="mf">23.02105161600002</span><span class="p">))</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="define-time-filter">
|
||||||
|
<h4>Define Time Filter<a class="headerlink" href="#define-time-filter" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>Both the METAR and Synoptic datasets should be filtered by time to avoid
|
||||||
|
requesting an unreasonable amount of data. By defining one filter now,
|
||||||
|
we can use it in both of their data requests to EDEX.</p>
|
||||||
|
<div class="alert-info docutils container">
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o"><</span><span class="n">b</span><span class="o">></span><span class="n">Note</span><span class="p">:</span><span class="o"></</span><span class="n">b</span><span class="o">></span> <span class="n">Here</span> <span class="n">we</span> <span class="n">will</span> <span class="n">use</span> <span class="n">the</span> <span class="n">most</span> <span class="n">recent</span> <span class="n">hour</span> <span class="k">as</span> <span class="n">our</span> <span class="n">default</span> <span class="nb">filter</span><span class="o">.</span> <span class="n">Try</span> <span class="n">adjusting</span> <span class="n">the</span> <span class="n">timerange</span> <span class="ow">and</span> <span class="n">see</span> <span class="n">the</span> <span class="n">difference</span> <span class="ow">in</span> <span class="n">the</span> <span class="n">final</span> <span class="n">plots</span><span class="o">.</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Filter for the last hour</span>
|
||||||
|
<span class="n">lastHourDateTime</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span> <span class="o">-</span> <span class="n">timedelta</span><span class="p">(</span><span class="n">minutes</span> <span class="o">=</span> <span class="mi">60</span><span class="p">)</span>
|
||||||
|
<span class="n">start</span> <span class="o">=</span> <span class="n">lastHourDateTime</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span>
|
||||||
|
<span class="n">end</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">utcnow</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y-%m-</span><span class="si">%d</span><span class="s1"> %H:%M:%S'</span><span class="p">)</span>
|
||||||
|
|
||||||
|
<span class="n">beginRange</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span> <span class="n">start</span> <span class="p">,</span> <span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">)</span>
|
||||||
|
<span class="n">endRange</span> <span class="o">=</span> <span class="n">datetime</span><span class="o">.</span><span class="n">strptime</span><span class="p">(</span> <span class="n">end</span> <span class="p">,</span> <span class="s2">"%Y-%m-</span><span class="si">%d</span><span class="s2"> %H:%M:%S"</span><span class="p">)</span>
|
||||||
|
<span class="n">timerange</span> <span class="o">=</span> <span class="n">TimeRange</span><span class="p">(</span><span class="n">beginRange</span><span class="p">,</span> <span class="n">endRange</span><span class="p">)</span>
|
||||||
|
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="n">timerange</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">(</span><span class="n">Nov</span> <span class="mi">11</span> <span class="mi">22</span> <span class="mi">19</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">54</span> <span class="p">,</span> <span class="n">Nov</span> <span class="mi">11</span> <span class="mi">22</span> <span class="mi">20</span><span class="p">:</span><span class="mi">00</span><span class="p">:</span><span class="mi">54</span> <span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="define-common-parameters-for-data-requests">
|
||||||
|
<h4>Define Common Parameters for Data Requests<a class="headerlink" href="#define-common-parameters-for-data-requests" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>METAR obs and Synoptic obs share several of the same parameters. By
|
||||||
|
defining them here, they can be reused for both of the requests and this
|
||||||
|
makes our code more efficient.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="n">shared_params</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"timeObs"</span><span class="p">,</span> <span class="s2">"longitude"</span><span class="p">,</span> <span class="s2">"latitude"</span><span class="p">,</span> <span class="s2">"temperature"</span><span class="p">,</span>
|
||||||
|
<span class="s2">"dewpoint"</span><span class="p">,</span> <span class="s2">"windDir"</span><span class="p">,</span> <span class="s2">"windSpeed"</span><span class="p">,</span> <span class="s2">"seaLevelPress"</span><span class="p">,</span>
|
||||||
|
<span class="s2">"presWeather"</span><span class="p">,</span> <span class="s2">"skyLayerBase"</span><span class="p">]</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="n">shared_params</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="p">[</span><span class="s1">'timeObs'</span><span class="p">,</span> <span class="s1">'longitude'</span><span class="p">,</span> <span class="s1">'latitude'</span><span class="p">,</span> <span class="s1">'temperature'</span><span class="p">,</span> <span class="s1">'dewpoint'</span><span class="p">,</span> <span class="s1">'windDir'</span><span class="p">,</span> <span class="s1">'windSpeed'</span><span class="p">,</span> <span class="s1">'seaLevelPress'</span><span class="p">,</span> <span class="s1">'presWeather'</span><span class="p">,</span> <span class="s1">'skyLayerBase'</span><span class="p">]</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="define-metar-request">
|
||||||
|
<h4>Define METAR Request<a class="headerlink" href="#define-metar-request" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>To get METAR data we must use the <strong>obs</strong> datatype. To help limit the
|
||||||
|
amount of data returned, we will narrow the request by using a
|
||||||
|
geographic <strong>envelope</strong>, setting the request <strong>parameters</strong>, and using
|
||||||
|
<strong>timerange</strong> as a time filter.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># New metar request</span>
|
||||||
|
<span class="n">metar_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">"obs"</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="c1"># metar specifc parameters</span>
|
||||||
|
<span class="n">metar_params</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"stationName"</span><span class="p">,</span> <span class="s2">"skyCover"</span><span class="p">]</span>
|
||||||
|
<span class="c1"># combine all parameters</span>
|
||||||
|
<span class="n">all_metar_params</span> <span class="o">=</span> <span class="n">shared_params</span> <span class="o">+</span> <span class="n">metar_params</span>
|
||||||
|
<span class="c1"># set the parameters on the metar request</span>
|
||||||
|
<span class="n">metar_request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">all_metar_params</span><span class="p">))</span>
|
||||||
|
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="n">metar_request</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">DefaultDataRequest</span><span class="p">(</span><span class="n">datatype</span><span class="o">=</span><span class="n">obs</span><span class="p">,</span> <span class="n">identifiers</span><span class="o">=</span><span class="p">{},</span> <span class="n">parameters</span><span class="o">=</span><span class="p">[</span><span class="s1">'timeObs'</span><span class="p">,</span> <span class="s1">'longitude'</span><span class="p">,</span> <span class="s1">'latitude'</span><span class="p">,</span> <span class="s1">'temperature'</span><span class="p">,</span> <span class="s1">'dewpoint'</span><span class="p">,</span> <span class="s1">'windDir'</span><span class="p">,</span> <span class="s1">'windSpeed'</span><span class="p">,</span> <span class="s1">'seaLevelPress'</span><span class="p">,</span> <span class="s1">'presWeather'</span><span class="p">,</span> <span class="s1">'skyLayerBase'</span><span class="p">,</span> <span class="s1">'stationName'</span><span class="p">,</span> <span class="s1">'skyCover'</span><span class="p">],</span> <span class="n">levels</span><span class="o">=</span><span class="p">[],</span> <span class="n">locationNames</span><span class="o">=</span><span class="p">[],</span> <span class="n">envelope</span><span class="o">=<</span><span class="n">dynamicserialize</span><span class="o">.</span><span class="n">dstypes</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">vividsolutions</span><span class="o">.</span><span class="n">jts</span><span class="o">.</span><span class="n">geom</span><span class="o">.</span><span class="n">Envelope</span><span class="o">.</span><span class="n">Envelope</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x13abe40a0</span><span class="o">></span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="define-synoptic-request">
|
||||||
|
<h4>Define Synoptic Request<a class="headerlink" href="#define-synoptic-request" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>Similar to the request above, we will limit the amount of data returned
|
||||||
|
by using a geographic <strong>envelope</strong>, setting the request <strong>parameters</strong>,
|
||||||
|
and using <strong>timerange</strong> as a time filter.</p>
|
||||||
|
<p>However, in order to access synoptic observations we will use the
|
||||||
|
<strong>sfcobs</strong> datatype.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># New sfcobs/SYNOP request</span>
|
||||||
|
<span class="n">syn_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>
|
||||||
|
|
||||||
|
<span class="c1"># (sfcobs) uses stationId, while (obs) uses stationName</span>
|
||||||
|
<span class="n">syn_params</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"stationId"</span><span class="p">]</span>
|
||||||
|
<span class="c1"># combine all parameters</span>
|
||||||
|
<span class="n">all_syn_params</span> <span class="o">=</span> <span class="n">shared_params</span> <span class="o">+</span> <span class="n">syn_params</span>
|
||||||
|
<span class="c1"># set the parameters on the synoptic request</span>
|
||||||
|
<span class="n">syn_request</span><span class="o">.</span><span class="n">setParameters</span><span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">all_syn_params</span><span class="p">))</span>
|
||||||
|
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="n">syn_request</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">DefaultDataRequest</span><span class="p">(</span><span class="n">datatype</span><span class="o">=</span><span class="n">sfcobs</span><span class="p">,</span> <span class="n">identifiers</span><span class="o">=</span><span class="p">{},</span> <span class="n">parameters</span><span class="o">=</span><span class="p">[</span><span class="s1">'timeObs'</span><span class="p">,</span> <span class="s1">'longitude'</span><span class="p">,</span> <span class="s1">'latitude'</span><span class="p">,</span> <span class="s1">'temperature'</span><span class="p">,</span> <span class="s1">'dewpoint'</span><span class="p">,</span> <span class="s1">'windDir'</span><span class="p">,</span> <span class="s1">'windSpeed'</span><span class="p">,</span> <span class="s1">'seaLevelPress'</span><span class="p">,</span> <span class="s1">'presWeather'</span><span class="p">,</span> <span class="s1">'skyLayerBase'</span><span class="p">,</span> <span class="s1">'stationId'</span><span class="p">],</span> <span class="n">levels</span><span class="o">=</span><span class="p">[],</span> <span class="n">locationNames</span><span class="o">=</span><span class="p">[],</span> <span class="n">envelope</span><span class="o">=<</span><span class="n">dynamicserialize</span><span class="o">.</span><span class="n">dstypes</span><span class="o">.</span><span class="n">com</span><span class="o">.</span><span class="n">vividsolutions</span><span class="o">.</span><span class="n">jts</span><span class="o">.</span><span class="n">geom</span><span class="o">.</span><span class="n">Envelope</span><span class="o">.</span><span class="n">Envelope</span> <span class="nb">object</span> <span class="n">at</span> <span class="mh">0x105048bb0</span><span class="o">></span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html">Top</a></p>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<hr class="docutils" />
|
||||||
|
<section id="get-the-data">
|
||||||
|
<h3>Get the Data!<a class="headerlink" href="#get-the-data" title="Permalink to this heading"></a></h3>
|
||||||
|
<p>We have already obtained our maps data, but we still have to collect our
|
||||||
|
observation data.</p>
|
||||||
|
<section id="get-the-edex-responses">
|
||||||
|
<h4>Get the EDEX Responses<a class="headerlink" href="#get-the-edex-responses" title="Permalink to this heading"></a></h4>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># METARs data</span>
|
||||||
|
<span class="n">metar_response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGeometryData</span><span class="p">(</span><span class="n">metar_request</span><span class="p">,</span><span class="n">timerange</span><span class="p">)</span>
|
||||||
|
<span class="c1"># function getMetarObs was added in python-awips 18.1.4</span>
|
||||||
|
<span class="n">metars</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getMetarObs</span><span class="p">(</span><span class="n">metar_response</span><span class="p">)</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">metar_response</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" METAR records"</span><span class="p">)</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">Using "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">metars</span><span class="p">[</span><span class="s1">'temperature'</span><span class="p">]))</span> <span class="o">+</span> <span class="s2">" temperature records"</span><span class="p">)</span>
|
||||||
|
|
||||||
|
<span class="c1"># Synoptic data</span>
|
||||||
|
<span class="n">syn_response</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getGeometryData</span><span class="p">(</span><span class="n">syn_request</span><span class="p">,</span><span class="n">timerange</span><span class="p">)</span>
|
||||||
|
<span class="c1"># function getSynopticObs was added in python-awips 18.1.4</span>
|
||||||
|
<span class="n">synoptic</span> <span class="o">=</span> <span class="n">DataAccessLayer</span><span class="o">.</span><span class="n">getSynopticObs</span><span class="p">(</span><span class="n">syn_response</span><span class="p">)</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"Found "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">syn_response</span><span class="p">))</span> <span class="o">+</span> <span class="s2">" Synoptic records"</span><span class="p">)</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="s2">"</span><span class="se">\t</span><span class="s2">Using "</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">synoptic</span><span class="p">[</span><span class="s1">'temperature'</span><span class="p">]))</span> <span class="o">+</span> <span class="s2">" temperature records"</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="n">Found</span> <span class="mi">4116</span> <span class="n">METAR</span> <span class="n">records</span>
|
||||||
|
<span class="n">Using</span> <span class="mi">179</span> <span class="n">temperature</span> <span class="n">records</span>
|
||||||
|
<span class="n">Found</span> <span class="mi">259</span> <span class="n">Synoptic</span> <span class="n">records</span>
|
||||||
|
<span class="n">Using</span> <span class="mi">63</span> <span class="n">temperature</span> <span class="n">records</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
</section>
|
||||||
|
<section id="extract-plotting-data">
|
||||||
|
<h4>Extract Plotting Data<a class="headerlink" href="#extract-plotting-data" title="Permalink to this heading"></a></h4>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Pull all necessary plotting information for the metar data</span>
|
||||||
|
<span class="n">metars_data</span> <span class="o">=</span> <span class="n">extract_plotting_data</span><span class="p">(</span><span class="n">metars</span><span class="p">,</span> <span class="s1">'obs'</span><span class="p">)</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">metars_data</span><span class="p">[</span><span class="s1">'stid'</span><span class="p">]))</span> <span class="o">+</span> <span class="s2">" METARs stations"</span><span class="p">)</span>
|
||||||
|
|
||||||
|
<span class="c1"># Pull all necessary plotting information for the synoptic data</span>
|
||||||
|
<span class="n">synoptic_data</span> <span class="o">=</span> <span class="n">extract_plotting_data</span><span class="p">(</span><span class="n">synoptic</span><span class="p">,</span> <span class="s1">'sfcobs'</span><span class="p">)</span>
|
||||||
|
<span class="nb">print</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">synoptic_data</span><span class="p">[</span><span class="s1">'stid'</span><span class="p">]))</span> <span class="o">+</span> <span class="s2">" Synoptic stations"</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="mi">179</span> <span class="n">METARs</span> <span class="n">stations</span>
|
||||||
|
<span class="mi">63</span> <span class="n">Synoptic</span> <span class="n">stations</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html">Top</a></p>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<hr class="docutils" />
|
||||||
|
<section id="plot-the-data">
|
||||||
|
<h3>Plot the Data<a class="headerlink" href="#plot-the-data" title="Permalink to this heading"></a></h3>
|
||||||
|
<section id="draw-the-region">
|
||||||
|
<h4>Draw the Region<a class="headerlink" href="#draw-the-region" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>Here we will draw our region by using the <strong>states</strong> polygons we
|
||||||
|
retreived from EDEX <a class="reference external" href="#Maps-Request-and-Response">earlier in this
|
||||||
|
example</a>. To create this plot we use the
|
||||||
|
<a class="reference external" href="#Function:-make_map()">make_map()</a> function which also adds lines of
|
||||||
|
latitude and longitude for additional context.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Create the figure and axes used for the plot</span>
|
||||||
|
<span class="n">fig</span><span class="p">,</span> <span class="n">ax</span> <span class="o">=</span> <span class="n">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="o">=</span><span class="n">bbox</span><span class="p">)</span>
|
||||||
|
<span class="c1"># Create a feature based off our states polygons</span>
|
||||||
|
<span class="n">shape_feature</span> <span class="o">=</span> <span class="n">ShapelyFeature</span><span class="p">(</span><span class="n">states</span><span class="p">,</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">(),</span>
|
||||||
|
<span class="n">facecolor</span><span class="o">=</span><span class="s1">'none'</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s2">"-"</span><span class="p">,</span><span class="n">edgecolor</span><span class="o">=</span><span class="s1">'#000000'</span><span class="p">,</span><span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||||||
|
<span class="n">ax</span><span class="o">.</span><span class="n">add_feature</span><span class="p">(</span><span class="n">shape_feature</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<div class="highlight-default notranslate"><div class="highlight"><pre><span></span><span class="o"><</span><span class="n">cartopy</span><span class="o">.</span><span class="n">mpl</span><span class="o">.</span><span class="n">feature_artist</span><span class="o">.</span><span class="n">FeatureArtist</span> <span class="n">at</span> <span class="mh">0x13b2ae5e0</span><span class="o">></span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<img alt="../../_images/Regional_Surface_Obs_Plot_42_1.png" src="../../_images/Regional_Surface_Obs_Plot_42_1.png" />
|
||||||
|
</section>
|
||||||
|
<section id="plot-metar-data">
|
||||||
|
<h4>Plot METAR Data<a class="headerlink" href="#plot-metar-data" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>On the same axes (<strong>ax</strong>) and figure (<strong>fig</strong>) plot the METAR data.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Create a title for the plot</span>
|
||||||
|
<span class="n">title</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">metar_response</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">())</span> <span class="o">+</span> <span class="s2">" | METAR Surface Obs | "</span> <span class="o">+</span> <span class="n">edexServer</span>
|
||||||
|
<span class="c1"># Plot the station information for METARs data</span>
|
||||||
|
<span class="n">plot_data</span><span class="p">(</span><span class="n">metars_data</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">ax</span><span class="p">,</span> <span class="s1">'obs'</span><span class="p">)</span>
|
||||||
|
<span class="c1"># Display the figure</span>
|
||||||
<span class="n">fig</span>
|
<span class="n">fig</span>
|
||||||
</pre></div>
|
</pre></div>
|
||||||
</div>
|
</div>
|
||||||
<img alt="../../_images/Regional_Surface_Obs_Plot_13_0.png" src="../../_images/Regional_Surface_Obs_Plot_13_0.png" />
|
<img alt="../../_images/Regional_Surface_Obs_Plot_44_0.png" src="../../_images/Regional_Surface_Obs_Plot_44_0.png" />
|
||||||
|
</section>
|
||||||
|
<section id="plot-synoptic-sfcobs">
|
||||||
|
<h4>Plot Synoptic (sfcobs)<a class="headerlink" href="#plot-synoptic-sfcobs" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>On a new axes and figure (<strong>ax_syn</strong>, <strong>fig_syn</strong>) plot the map and
|
||||||
|
synoptic data.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Create a new figure and axes for the synoptic data</span>
|
||||||
|
<span class="n">fig_syn</span><span class="p">,</span> <span class="n">ax_syn</span> <span class="o">=</span> <span class="n">make_map</span><span class="p">(</span><span class="n">bbox</span><span class="o">=</span><span class="n">bbox</span><span class="p">)</span>
|
||||||
|
<span class="c1"># Create the states feature from the polygons</span>
|
||||||
|
<span class="n">shape_feature</span> <span class="o">=</span> <span class="n">ShapelyFeature</span><span class="p">(</span><span class="n">states</span><span class="p">,</span><span class="n">ccrs</span><span class="o">.</span><span class="n">PlateCarree</span><span class="p">(),</span>
|
||||||
|
<span class="n">facecolor</span><span class="o">=</span><span class="s1">'none'</span><span class="p">,</span> <span class="n">linestyle</span><span class="o">=</span><span class="s2">"-"</span><span class="p">,</span><span class="n">edgecolor</span><span class="o">=</span><span class="s1">'#000000'</span><span class="p">,</span><span class="n">linewidth</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
||||||
|
<span class="n">ax_syn</span><span class="o">.</span><span class="n">add_feature</span><span class="p">(</span><span class="n">shape_feature</span><span class="p">)</span>
|
||||||
|
<span class="c1"># Create a title for the figure</span>
|
||||||
|
<span class="n">title</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">syn_response</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">())</span> <span class="o">+</span> <span class="s2">" | SYNOP Surface Obs | "</span> <span class="o">+</span> <span class="n">edexServer</span>
|
||||||
|
<span class="c1"># Draw the synoptic data</span>
|
||||||
|
<span class="n">plot_data</span><span class="p">(</span><span class="n">synoptic_data</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">ax_syn</span><span class="p">,</span> <span class="s1">'sfcobs'</span><span class="p">)</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<img alt="../../_images/Regional_Surface_Obs_Plot_46_0.png" src="../../_images/Regional_Surface_Obs_Plot_46_0.png" />
|
||||||
|
</section>
|
||||||
|
<section id="plot-both-metar-and-synoptic-data">
|
||||||
|
<h4>Plot both METAR and Synoptic Data<a class="headerlink" href="#plot-both-metar-and-synoptic-data" title="Permalink to this heading"></a></h4>
|
||||||
|
<p>Add the synoptic data to our first axes and figure (<strong>ax</strong>, <strong>fig</strong>)
|
||||||
|
that already contains our map and METARs data.</p>
|
||||||
|
<div class="highlight-ipython3 notranslate"><div class="highlight"><pre><span></span><span class="c1"># Create a title for both the METAR and Synopotic data</span>
|
||||||
|
<span class="n">title</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">syn_response</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">getDataTime</span><span class="p">())</span> <span class="o">+</span> <span class="s2">" | METAR & Synoptic Surface Obs | "</span> <span class="o">+</span> <span class="n">edexServer</span>
|
||||||
|
<span class="c1"># Draw the synoptic on the first axes that already has the metar data</span>
|
||||||
|
<span class="n">plot_data</span><span class="p">(</span><span class="n">synoptic_data</span><span class="p">,</span> <span class="n">title</span><span class="p">,</span> <span class="n">ax</span><span class="p">,</span> <span class="s1">'sfcobs'</span><span class="p">)</span>
|
||||||
|
<span class="c1"># Display the figure</span>
|
||||||
|
<span class="n">fig</span>
|
||||||
|
</pre></div>
|
||||||
|
</div>
|
||||||
|
<img alt="../../_images/Regional_Surface_Obs_Plot_48_0.png" src="../../_images/Regional_Surface_Obs_Plot_48_0.png" />
|
||||||
|
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html">Top</a></p>
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
|
<hr class="docutils" />
|
||||||
|
<section id="see-also">
|
||||||
|
<h3>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.aviationweather.gov/metar/help?page=plot">Aviation Weather Center Static METAR Plots
|
||||||
|
Information</a></p></li>
|
||||||
|
</ul>
|
||||||
|
<section id="related-notebooks">
|
||||||
|
<h4>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/METAR_Station_Plot_with_MetPy.html">Metar Station Plot with
|
||||||
|
MetPy</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/examples/generated/Map_Resources_and_Topography.html">Map Resources and
|
||||||
|
Topography</a></p></li>
|
||||||
|
</ul>
|
||||||
|
</section>
|
||||||
|
<section id="additional-documentation">
|
||||||
|
<h4>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>
|
||||||
|
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/api/DataAccessLayer.html#awips.dataaccess.DataAccessLayer.newDataRequest">DataAccessLayer.newDataRequest()</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/api/IDataRequest.html">IDataRequest</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="http://unidata.github.io/python-awips/api/PyGeometryData.html">DataAccessLayer.getGeometryData</a></p></li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>datetime:</strong></p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#datetime-objects">datetime.datetime</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html?#datetime.datetime.utcnow">datetime.utcnow()</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#timedelta-objects">datetime.timedelta</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://docs.python.org/3/library/datetime.html#strftime-and-strptime-behavior">datetime.strftime() and
|
||||||
|
datetime.strptime()</a></p></li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>numpy:</strong></p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li><p><a class="reference external" href="https://numpy.org/doc/stable/reference/generated/numpy.array.html">np.array</a></p></li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>cartopy:</strong></p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li><p><a class="reference external" href="https://scitools.org.uk/cartopy/docs/v0.14/crs/projections.html?#cartopy-projection-list">cartopy projection
|
||||||
|
list</a></p></li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>matplotlib:</strong></p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li><p><a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.html">matplotlib.pyplot()</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.figure.html">matplotlib.pyplot.figure()</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://matplotlib.org/stable/api/image_api.html?highlight=set_extent#matplotlib.image.AxesImage.set_extent">ax.set_extent</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.set_title.html">ax.set_title</a></p></li>
|
||||||
|
</ul>
|
||||||
|
<p><strong>metpy:</strong></p>
|
||||||
|
<ul class="simple">
|
||||||
|
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_components.html">metpy.calc.wind_components</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlot.html">metpy.plots.StationPlot()</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.StationPlotLayout.html">metpy.plots.StationPlotLayout()</a></p></li>
|
||||||
|
<li><p><a class="reference external" href="https://unidata.github.io/MetPy/latest/api/generated/metpy.units.html">metpy.units</a></p></li>
|
||||||
|
</ul>
|
||||||
|
<p><a class="reference external" href="https://unidata.github.io/python-awips/examples/generated/Regional_Surface_Obs_Plot.html.html">Top</a></p>
|
||||||
|
<hr class="docutils" />
|
||||||
|
</section>
|
||||||
|
</section>
|
||||||
</section>
|
</section>
|
||||||
</section>
|
</section>
|
||||||
|
|
||||||
|
|