awips2/docs/python/python-awips-data-access.md

758 lines
13 KiB
Markdown
Raw Normal View History

The [python-awips](https://python-awips.readthedocs.io/en/latest/) package provides a data access framework for requesting grid and geometry datasets from an EDEX server.
!!! info "For a more detailed look at the python-awips package, refer to the [full documentation site](https://python-awips.readthedocs.io) which includes a number of [plotting examples for different data types](https://python-awips.readthedocs.io/en/latest/examples/index.html)."
---
## Install
pip install python-awips
---
## Requirements
* Python 2.7+
* Numpy 1.7+
* Shapely 1.4+
* MetPy and enum34 to run Jupyter Notebook examples
---
## Example
This examples covers the callable methods of the Python AWIPS DAF when working with gridded data. We start with a connection to an EDEX server, then query data types, then grid names, parameters, levels, and other information. Finally the gridded data is plotted for its domain using Matplotlib and Cartopy.
### DataAccessLayer.changeEDEXHost()
After DataAccessLayer is imported from the package `awips.dataaccess`, the first step is to define the EDEX data server hostname (`edex-cloud.unidata.ucar.edu` for these examples)
```python
from awips.dataaccess import DataAccessLayer
DataAccessLayer.changeEDEXHost("edex-cloud.unidata.ucar.edu")
```
### DataAccessLayer.getSupportedDatatypes()
getSupportedDatatypes() returns a list of available data types offered by the EDEX server defined above.
```python
dataTypes = DataAccessLayer.getSupportedDatatypes()
list(dataTypes)
```
['acars',
'airep',
'binlightning',
'bufrmosavn',
'bufrmoseta',
'bufrmosgfs',
'bufrmoshpc',
'bufrmoslamp',
'bufrmosmrf',
'bufrua',
'climate',
'common_obs_spatial',
'ffmp',
'gfe',
'grid',
'hydro',
'maps',
'modelsounding',
'obs',
'pirep',
'practicewarning',
'profiler',
'radar',
'radar_spatial',
'satellite',
'sfcobs',
'topo',
'warning']
### DataAccessLayer.newDataRequest()
Now create a new data request, and set the data type to **grid** and "locationName" to **RAP40** with **setDataType()** and **setLocationNames()**
```python
request = DataAccessLayer.newDataRequest()
request.setDatatype("grid")
```
### DataAccessLayer.getAvailableLocationNames()
With datatype set to "grid", we can query all available grid names with **getAvailableLocationNames()**
```python
available_grids = DataAccessLayer.getAvailableLocationNames(request)
available_grids.sort()
list(available_grids)
```
['CMC',
'EKDMOS',
'EKDMOS-AK',
'ESTOFS',
'ETSS',
'FFG-ALR',
'FFG-FWR',
'FFG-KRF',
'FFG-MSR',
'FFG-ORN',
'FFG-PTR',
'FFG-RHA',
'FFG-RSA',
'FFG-STR',
'FFG-TAR',
'FFG-TIR',
'FFG-TUA',
'FNMOC-FAROP',
'FNMOC-NCODA',
'FNMOC-WW3',
'FNMOC-WW3-Europe',
'GFS',
'GFS20',
'GFSLAMP5',
'GribModel:9:151:172',
'HFR-EAST_6KM',
'HFR-EAST_PR_6KM',
'HFR-US_EAST_DELAWARE_1KM',
'HFR-US_EAST_FLORIDA_2KM',
'HFR-US_EAST_NORTH_2KM',
'HFR-US_EAST_SOUTH_2KM',
'HFR-US_EAST_VIRGINIA_1KM',
'HFR-US_HAWAII_1KM',
'HFR-US_HAWAII_2KM',
'HFR-US_HAWAII_6KM',
'HFR-US_WEST_500M',
'HFR-US_WEST_CENCAL_2KM',
'HFR-US_WEST_LOSANGELES_1KM',
'HFR-US_WEST_LOSOSOS_1KM',
'HFR-US_WEST_NORTH_2KM',
'HFR-US_WEST_SANFRAN_1KM',
'HFR-US_WEST_SOCAL_2KM',
'HFR-US_WEST_WASHINGTON_1KM',
'HFR-WEST_6KM',
'HPCGuide',
'HPCqpf',
'HPCqpfNDFD',
'HRRR',
'LAMP2p5',
'MOSGuide',
'MPE-Local-ALR',
'MPE-Local-FWR',
'MPE-Local-MSR',
'MPE-Local-ORN',
'MPE-Local-RHA',
'MPE-Local-SJU',
'MPE-Local-STR',
'MPE-Local-TAR',
'MPE-Local-TIR',
'MPE-Mosaic-ALR',
'MPE-Mosaic-FWR',
'MPE-Mosaic-MSR',
'MPE-Mosaic-ORN',
'MPE-Mosaic-RHA',
'MPE-Mosaic-SJU',
'MPE-Mosaic-TAR',
'MPE-Mosaic-TIR',
'NAM12',
'NAM40',
'NAVGEM',
'NCWF',
'NDFD',
'NOHRSC-SNOW',
'NamDNG',
'PROB3HR',
'QPE-ALR',
'QPE-Auto-TUA',
'QPE-FWR',
'QPE-KRF',
'QPE-MSR',
'QPE-Manual-KRF',
'QPE-ORN',
'QPE-RFC-PTR',
'QPE-RFC-RSA',
'QPE-RFC-STR',
'QPE-TIR',
'QPE-TUA',
'QPE-XNAV-ALR',
'QPE-XNAV-FWR',
'QPE-XNAV-KRF',
'QPE-XNAV-MSR',
'QPE-XNAV-ORN',
'QPE-XNAV-SJU',
'QPE-XNAV-TAR',
'QPE-XNAV-TIR',
'QPE-XNAV-TUA',
'RAP13',
'RAP20',
'RAP40',
'RFCqpf',
'RTMA',
'RTOFS-Now-WestAtl',
'RTOFS-Now-WestConus',
'RTOFS-WestAtl',
'RTOFS-WestConus',
'SeaIce',
'TPCWindProb',
'UKMET-MODEL1',
'URMA25',
'WaveWatch']
### Set grid name with `setLocationNames()`
```python
request.setLocationNames("RAP13")
```
# List Available Parameters for a Grid
### DataAccessLayer.getAvailableParameters()
After datatype and model name (locationName) are set, you can query all available parameters with **getAvailableParameters()**
```python
availableParms = DataAccessLayer.getAvailableParameters(request)
availableParms.sort()
list(availableParms)
```
['0to5',
'2xTP6hr',
'AV',
'Along',
'AppT',
'BLI',
'BlkMag',
'BlkShr',
'CAPE',
'CFRZR',
'CICEP',
'CIn',
'CP',
'CP1hr',
'CPr',
'CPrD',
'CRAIN',
'CSNOW',
'CURU',
'CXR',
'CapeStk',
'Corf',
'CorfF',
'CorfFM',
'CorfM',
'CritT1',
'DIABi',
'DivF',
'DivFn',
'DivFs',
'DpD',
'DpDt',
'DpT',
'Dpress',
'DthDt',
'EHI',
'EHI01',
'EHIi',
'EPT',
'EPTA',
'EPTC',
'EPTGrd',
'EPTGrdM',
'EPTs',
'EPVg',
'EPVs',
'EPVt1',
'EPVt2',
'FVecs',
'FeatMot',
'FnVecs',
'FsVecs',
'Fzra1',
'Fzra2',
'GH',
'GHxSM',
'GHxSM2',
'Gust',
'HI',
'HI1',
'HI3',
'HI4',
'HIdx',
'HPBL',
'Heli',
'Into',
'KI',
'L-I',
'LIsfc2x',
'LgSP1hr',
'MAdv',
'MCon',
'MCon2',
'MMSP',
'MSFDi',
'MSFi',
'MSFmi',
'MSG',
'MTV',
'Mix1',
'Mix2',
'Mmag',
'MnT',
'MpV',
'MxT',
'NBE',
'NetIO',
'OmDiff',
'P',
'PAdv',
'PBE',
'PFrnt',
'PGrd',
'PGrd1',
'PGrdM',
'PIVA',
'PR',
'PTvA',
'PTyp',
'PVV',
'PW',
'PW2',
'PoT',
'PoTA',
'QPV1',
'QPV2',
'QPV3',
'QPV4',
'REFC',
'RH',
'RH_001_bin',
'RH_002_bin',
'RM5',
'RMGH2',
'RRtype',
'RV',
'Rain1',
'Rain2',
'Rain3',
'Ro',
'SH',
'SHx',
'SLI',
'SNW',
'SNWA',
'SRMm',
'SRMmM',
'SSi',
'Shear',
'ShrMag',
'SnD',
'Snow1',
'Snow2',
'Snow3',
'SnowT',
'St-Pr',
'St-Pr1hr',
'StrTP',
'StrmMot',
'T',
'TAdv',
'TGrd',
'TGrdM',
'TP',
'TP12hr',
'TP168hr',
'TP1hr',
'TP24hr',
'TP36hr',
'TP3hr',
'TP48hr',
'TP6hr',
'TP72hr',
'TPrun',
'TPx12x6',
'TPx1x3',
'TQIND',
'TV',
'TW',
'T_001_bin',
'Tdef',
'Tdend',
'ThGrd',
'TmDpD',
'Tmax',
'Tmin',
'TotQi',
'Tstk',
'TwMax',
'TwMin',
'Twstk',
'TxSM',
'USTM',
'VAdv',
'VAdvAdvection',
'VSTM',
'Vis',
'WD',
'WEASD',
'WEASD1hr',
'WGS',
'Wind',
'WndChl',
'ageoVC',
'ageoW',
'ageoWM',
'cCape',
'cCin',
'cTOT',
'capeToLvl',
'dCape',
'dGH12',
'dP',
'dP1hr',
'dP3hr',
'dP6hr',
'dPW1hr',
'dPW3hr',
'dPW6hr',
'dT',
'dVAdv',
'dZ',
'defV',
'del2gH',
'df',
'fGen',
'fnD',
'fsD',
'gamma',
'gammaE',
'geoVort',
'geoW',
'geoWM',
'mixRat',
'msl-P',
'muCape',
'pV',
'pVeq',
'qDiv',
'qVec',
'qnVec',
'qsVec',
'shWlt',
'snoRatCrocus',
'snoRatEMCSREF',
'snoRatSPC',
'snoRatSPCdeep',
'snoRatSPCsurface',
'swtIdx',
'tTOT',
'tWind',
'tWindU',
'tWindV',
'uFX',
'uW',
'vSmthW',
'vTOT',
'vW',
'vertCirc',
'wDiv',
'wSp',
'wSp_001_bin',
'wSp_002_bin',
'wSp_003_bin',
'wSp_004_bin',
'zAGL']
### setParameters()
set the request parameter
```python
request.setParameters("T")
```
## List Available Levels for Parameter
Using **DataAccessLayer.getAvailableLevels()**
```python
availableLevels = DataAccessLayer.getAvailableLevels(request)
for level in availableLevels:
print(level)
```
0.0SFC
350.0MB
475.0MB
225.0MB
120.0_150.0BL
900.0MB
125.0MB
450.0MB
575.0MB
325.0MB
100.0MB
1000.0MB
60.0_90.0BL
275.0MB
1.0PV
950.0MB
150.0MB
1.5PV
700.0MB
825.0MB
150.0_180.0BL
250.0MB
375.0MB
1000.0_500.0MB
800.0MB
925.0MB
2.0PV
0.5PV
0.0TROP
750.0MB
500.0MB
625.0MB
400.0MB
0.0FHAG
2.0FHAG
875.0MB
175.0MB
850.0MB
600.0MB
725.0MB
975.0MB
550.0MB
675.0MB
425.0MB
200.0MB
0.0_30.0BL
30.0_60.0BL
650.0MB
525.0MB
300.0MB
90.0_120.0BL
775.0MB
0.0TILT
0.5TILT
340.0_350.0K
290.0_300.0K
700.0_600.0MB
700.0_300.0MB
320.0Ke
800.0_750.0MB
60.0TILT
5.3TILT
1000.0_900.0MB
340.0K
255.0K
255.0_265.0K
25.0TILT
1000.0_850.0MB
850.0_250.0MB
280.0_290.0Ke
320.0_330.0K
310.0_320.0Ke
310.0Ke
330.0K
900.0_800.0MB
550.0_500.0MB
2.4TILT
50.0TILT
35.0TILT
12.0TILT
300.0_310.0K
0.9TILT
320.0K
400.0_350.0MB
750.0_700.0MB
345.0K
250.0_260.0K
300.0Ke
290.0Ke
950.0_900.0MB
275.0_285.0Ke
335.0Ke
295.0_305.0Ke
275.0_285.0K
600.0_550.0MB
310.0K
335.0K
700.0_500.0MB
325.0_335.0K
300.0K
0.0MAXOMEGA
315.0_325.0K
325.0K
340.0Ke
300.0_250.0MB
1.5TILT
335.0_345.0K
315.0K
3.4TILT
330.0Ke
500.0_400.0MB
305.0K
285.0_295.0Ke
14.0TILT
325.0_335.0Ke
850.0_800.0MB
295.0Ke
305.0Ke
265.0_275.0K
700.0_650.0MB
450.0_400.0MB
1.8TILT
330.0_340.0K
800.0_700.0MB
850.0_300.0MB
6.0TILT
900.0_850.0MB
320.0_330.0Ke
8.7TILT
650.0_600.0MB
600.0_400.0MB
55.0TILT
270.0_280.0Ke
30.0TILT
310.0_320.0K
1000.0_950.0MB
250.0_200.0MB
400.0_300.0MB
500.0_100.0MB
285.0Ke
290.0K
305.0_315.0K
285.0_295.0K
925.0_850.0MB
275.0Ke
300.0_200.0MB
260.0_270.0K
315.0_325.0Ke
600.0_500.0MB
16.7TILT
280.0K
500.0_250.0MB
40.0TILT
400.0_200.0MB
300.0_310.0Ke
270.0_280.0K
1000.0_700.0MB
45.0TILT
850.0_500.0MB
295.0K
4.3TILT
295.0_305.0K
330.0_340.0Ke
270.0K
280.0_290.0K
925.0_700.0MB
260.0K
10.0TILT
325.0Ke
285.0K
290.0_300.0Ke
7.5TILT
280.0Ke
500.0_450.0MB
305.0_315.0Ke
250.0K
250.0_350.0K
270.0Ke
275.0K
315.0Ke
500.0_300.0MB
350.0_300.0MB
19.5TILT
850.0_700.0MB
350.0K
265.0K
0.0_0.0SFC
* **0.0SFC** is the Surface level
* **FHAG** stands for Fixed Height Above Ground (in meters)
* **NTAT** stands for Nominal Top of the ATmosphere
* **BL** stands for Boundary Layer, where **0.0_30.0BL** reads as *0-30 mb above ground level*
* **TROP** is the Tropopause level
### request.setLevels()
For this example we will use Surface Temperature
```python
request.setLevels("2.0FHAG")
```
### DataAccessLayer.getAvailableTimes()
* **getAvailableTimes(request, True)** will return an object of *run times* - formatted as `YYYY-MM-DD HH:MM:SS`
* **getAvailableTimes(request)** will return an object of all times - formatted as `YYYY-MM-DD HH:MM:SS (F:ff)`
* **getForecastRun(cycle, times)** will return a DataTime array for a single forecast cycle.
# Request a Grid
### DataAccessLayer.getGridData()
Now that we have our `request` and DataTime `fcstRun` arrays ready, it's time to request the data array from EDEX.
```python
cycles = DataAccessLayer.getAvailableTimes(request, True)
times = DataAccessLayer.getAvailableTimes(request)
fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)
response = DataAccessLayer.getGridData(request, [fcstRun[-1]])
```
```python
for grid in response:
data = grid.getRawData()
lons, lats = grid.getLatLonCoords()
print('Time :', str(grid.getDataTime()))
print('Model:', str(grid.getLocationName()))
print('Parm :', str(grid.getParameter()))
print('Unit :', str(grid.getUnit()))
print(data.shape)
print(data.min(), data.max())
```
('Time :', '2017-08-14 14:00:00 (21)')
('Model:', 'RAP13')
('Parm :', 'T')
('Unit :', 'K')
(337, 451)
(271.21939, 306.71939)