mirror of
https://github.com/Unidata/python-awips.git
synced 2025-02-24 06:57:56 -05:00
1600 lines
197 KiB
Text
1600 lines
197 KiB
Text
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Python-AWIPS Tutorial Notebook"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"---\n",
|
||
|
"\n",
|
||
|
"\n",
|
||
|
"# Objectives\n",
|
||
|
"\n",
|
||
|
"* Use python-awips to connect to an edex server\n",
|
||
|
"* Define and filter data request for model sounding data\n",
|
||
|
"* Create vertical profiles from GFS BUFR products\n",
|
||
|
"* Use MetPy to create [SkewT](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html) and [Hodograph](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html) plots\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## Table of Contents\n",
|
||
|
"\n",
|
||
|
"[1 Imports](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#imports)<br> \n",
|
||
|
"[2 EDEX Connection](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#edex-connection)<br> \n",
|
||
|
"[3 Setting Location](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#setting-location)<br> \n",
|
||
|
" [3.1 Available Location Names](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#available-location-names)<br> \n",
|
||
|
" [3.2 Setting the Location Name](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#setting-the-location-name)<br> \n",
|
||
|
"[4 Filtering by Time](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#filtering-by-time)<br> \n",
|
||
|
"[5 Get the Data!](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#get-the-data)<br> \n",
|
||
|
"[6 Use the Data!](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#use-the-data)<br> \n",
|
||
|
" [6.1 Prepare Data Objects](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#prepare-data-objects)<br> \n",
|
||
|
" [6.2 Calculate Dewpoint from Specific Humidity](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#calculate-dewpoint-from-specific-humidity)<br> \n",
|
||
|
" [6.2.1 Method 1](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-1)<br> \n",
|
||
|
" [6.2.2 Method 2](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-2)<br> \n",
|
||
|
" [6.2.3 Method 3](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#method-3)<br> \n",
|
||
|
"[7 Plot the Data!](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#plot-the-data)<br> \n",
|
||
|
"[8 See Also](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#see-also)<br> \n",
|
||
|
" [8.1 Related Notebooks](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#related-notebooks)<br> \n",
|
||
|
" [8.2 Additional Documentation](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html#additional-documentation)<br> "
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## 1 Imports\n",
|
||
|
"\n",
|
||
|
"The imports below are used throughout the notebook. Note the first import is coming directly from python-awips and allows us to connect to an EDEX server. The subsequent imports are for data manipulation and visualization. "
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 1,
|
||
|
"metadata": {
|
||
|
"scrolled": true
|
||
|
},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"from awips.dataaccess import DataAccessLayer\n",
|
||
|
"import matplotlib.pyplot as plt\n",
|
||
|
"from mpl_toolkits.axes_grid1.inset_locator import inset_axes\n",
|
||
|
"from math import exp, log\n",
|
||
|
"import numpy as np\n",
|
||
|
"from metpy.calc import dewpoint, vapor_pressure, wind_speed, wind_direction\n",
|
||
|
"from metpy.plots import SkewT, Hodograph\n",
|
||
|
"from metpy.units import units"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"[Top](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## 2 EDEX Connection\n",
|
||
|
"\n",
|
||
|
"First we establish a connection to Unidata's public EDEX server. With that connection made, we can create a [new data request object](http://unidata.github.io/python-awips/api/IDataRequest.html) and set the data type to ***modelsounding***, and define additional parameters and an identifier on the request."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 2,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"DataAccessLayer.changeEDEXHost(\"edex-beta.unidata.ucar.edu\")\n",
|
||
|
"request = DataAccessLayer.newDataRequest(\"modelsounding\")\n",
|
||
|
"forecastModel = \"GFS\"\n",
|
||
|
"request.addIdentifier(\"reportType\", forecastModel)\n",
|
||
|
"request.setParameters(\"pressure\",\"temperature\",\"specHum\",\"uComp\",\"vComp\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"[Top](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## 3 Setting Location"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 3.1 Available Location Names\n",
|
||
|
"When working with a new data type, it is often useful to investigate all available options for a particular setting. Shown below is how to see all available location names for a data request with type `modelsounding` and `reportType` identifier of `GFS`. This step is not necessary if you already know exactly what the location name(s) you're interested in is."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 3,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"text/plain": [
|
||
|
"['',\n",
|
||
|
" '1V4',\n",
|
||
|
" '3J2',\n",
|
||
|
" '4BL',\n",
|
||
|
" '4BQ',\n",
|
||
|
" '4HV',\n",
|
||
|
" '4OM',\n",
|
||
|
" '5AF',\n",
|
||
|
" '5AG',\n",
|
||
|
" '5SZ',\n",
|
||
|
" '6RO',\n",
|
||
|
" '8V7',\n",
|
||
|
" '9B6',\n",
|
||
|
" 'A#2',\n",
|
||
|
" 'A#3',\n",
|
||
|
" 'A#4',\n",
|
||
|
" 'A#5',\n",
|
||
|
" 'A#6',\n",
|
||
|
" 'A#7',\n",
|
||
|
" 'A#8',\n",
|
||
|
" 'A#9',\n",
|
||
|
" 'A#A',\n",
|
||
|
" 'A#B',\n",
|
||
|
" 'ABL',\n",
|
||
|
" 'ADM',\n",
|
||
|
" 'AFA',\n",
|
||
|
" 'AGR',\n",
|
||
|
" 'AHN',\n",
|
||
|
" 'AIA',\n",
|
||
|
" 'AIH',\n",
|
||
|
" 'AJO',\n",
|
||
|
" 'ANJ',\n",
|
||
|
" 'APX',\n",
|
||
|
" 'AQQ',\n",
|
||
|
" 'ATH',\n",
|
||
|
" 'ATL1',\n",
|
||
|
" 'ATL2',\n",
|
||
|
" 'ATL3',\n",
|
||
|
" 'ATL4',\n",
|
||
|
" 'ATLH',\n",
|
||
|
" 'AWH',\n",
|
||
|
" 'AWR',\n",
|
||
|
" 'B#1',\n",
|
||
|
" 'B#2',\n",
|
||
|
" 'B#3',\n",
|
||
|
" 'B#4',\n",
|
||
|
" 'B#5',\n",
|
||
|
" 'B#6',\n",
|
||
|
" 'B#7',\n",
|
||
|
" 'B#8',\n",
|
||
|
" 'B#9',\n",
|
||
|
" 'B#A',\n",
|
||
|
" 'B#B',\n",
|
||
|
" 'B#C',\n",
|
||
|
" 'B#D',\n",
|
||
|
" 'B#E',\n",
|
||
|
" 'B#F',\n",
|
||
|
" 'B#G',\n",
|
||
|
" 'B#H',\n",
|
||
|
" 'B#J',\n",
|
||
|
" 'B#K',\n",
|
||
|
" 'B#L',\n",
|
||
|
" 'B#M',\n",
|
||
|
" 'B#N',\n",
|
||
|
" 'B#O',\n",
|
||
|
" 'B#P',\n",
|
||
|
" 'B#Q',\n",
|
||
|
" 'B#S',\n",
|
||
|
" 'BAB',\n",
|
||
|
" 'BDG',\n",
|
||
|
" 'BDP',\n",
|
||
|
" 'BFL',\n",
|
||
|
" 'BGTL',\n",
|
||
|
" 'BH1',\n",
|
||
|
" 'BH2',\n",
|
||
|
" 'BH3',\n",
|
||
|
" 'BH4',\n",
|
||
|
" 'BH5',\n",
|
||
|
" 'BHK',\n",
|
||
|
" 'BID',\n",
|
||
|
" 'BIR',\n",
|
||
|
" 'BLS',\n",
|
||
|
" 'BLU',\n",
|
||
|
" 'BMX',\n",
|
||
|
" 'BNA',\n",
|
||
|
" 'BOD',\n",
|
||
|
" 'BRA',\n",
|
||
|
" 'BTL',\n",
|
||
|
" 'BVR',\n",
|
||
|
" 'C01',\n",
|
||
|
" 'C02',\n",
|
||
|
" 'C03',\n",
|
||
|
" 'C04',\n",
|
||
|
" 'C06',\n",
|
||
|
" 'C07',\n",
|
||
|
" 'C08',\n",
|
||
|
" 'C09',\n",
|
||
|
" 'C10',\n",
|
||
|
" 'C11',\n",
|
||
|
" 'C12',\n",
|
||
|
" 'C13',\n",
|
||
|
" 'C14',\n",
|
||
|
" 'C17',\n",
|
||
|
" 'C18',\n",
|
||
|
" 'C19',\n",
|
||
|
" 'C20',\n",
|
||
|
" 'C21',\n",
|
||
|
" 'C22',\n",
|
||
|
" 'C23',\n",
|
||
|
" 'C24',\n",
|
||
|
" 'C25',\n",
|
||
|
" 'C27',\n",
|
||
|
" 'C28',\n",
|
||
|
" 'C30',\n",
|
||
|
" 'C31',\n",
|
||
|
" 'C32',\n",
|
||
|
" 'C33',\n",
|
||
|
" 'C34',\n",
|
||
|
" 'C35',\n",
|
||
|
" 'C36',\n",
|
||
|
" 'C7H',\n",
|
||
|
" 'CAI',\n",
|
||
|
" 'CAN',\n",
|
||
|
" 'CBE',\n",
|
||
|
" 'CBN',\n",
|
||
|
" 'CHE',\n",
|
||
|
" 'CKN',\n",
|
||
|
" 'CLD',\n",
|
||
|
" 'CLE',\n",
|
||
|
" 'CLN',\n",
|
||
|
" 'COL1',\n",
|
||
|
" 'COL2',\n",
|
||
|
" 'COL3',\n",
|
||
|
" 'COL4',\n",
|
||
|
" 'COT',\n",
|
||
|
" 'CQV',\n",
|
||
|
" 'CRL',\n",
|
||
|
" 'CRR',\n",
|
||
|
" 'CTY',\n",
|
||
|
" 'CVM',\n",
|
||
|
" 'CVS',\n",
|
||
|
" 'CWEU',\n",
|
||
|
" 'CWFN',\n",
|
||
|
" 'CWKX',\n",
|
||
|
" 'CWLB',\n",
|
||
|
" 'CWLO',\n",
|
||
|
" 'CWLT',\n",
|
||
|
" 'CWLW',\n",
|
||
|
" 'CWMW',\n",
|
||
|
" 'CWOS',\n",
|
||
|
" 'CWPH',\n",
|
||
|
" 'CWQG',\n",
|
||
|
" 'CWSA',\n",
|
||
|
" 'CWSE',\n",
|
||
|
" 'CWZB',\n",
|
||
|
" 'CWZC',\n",
|
||
|
" 'CWZV',\n",
|
||
|
" 'CYAH',\n",
|
||
|
" 'CYAW',\n",
|
||
|
" 'CYBK',\n",
|
||
|
" 'CYBU',\n",
|
||
|
" 'CYCB',\n",
|
||
|
" 'CYCG',\n",
|
||
|
" 'CYCX',\n",
|
||
|
" 'CYDA',\n",
|
||
|
" 'CYEG',\n",
|
||
|
" 'CYEV',\n",
|
||
|
" 'CYFB',\n",
|
||
|
" 'CYFO',\n",
|
||
|
" 'CYFS',\n",
|
||
|
" 'CYGQ',\n",
|
||
|
" 'CYHM',\n",
|
||
|
" 'CYHZ',\n",
|
||
|
" 'CYJT',\n",
|
||
|
" 'CYLH',\n",
|
||
|
" 'CYLJ',\n",
|
||
|
" 'CYMD',\n",
|
||
|
" 'CYMO',\n",
|
||
|
" 'CYMT',\n",
|
||
|
" 'CYMX',\n",
|
||
|
" 'CYOC',\n",
|
||
|
" 'CYOW',\n",
|
||
|
" 'CYPA',\n",
|
||
|
" 'CYPE',\n",
|
||
|
" 'CYPL',\n",
|
||
|
" 'CYPQ',\n",
|
||
|
" 'CYQA',\n",
|
||
|
" 'CYQD',\n",
|
||
|
" 'CYQG',\n",
|
||
|
" 'CYQH',\n",
|
||
|
" 'CYQI',\n",
|
||
|
" 'CYQK',\n",
|
||
|
" 'CYQQ',\n",
|
||
|
" 'CYQR',\n",
|
||
|
" 'CYQT',\n",
|
||
|
" 'CYQX',\n",
|
||
|
" 'CYQY',\n",
|
||
|
" 'CYRB',\n",
|
||
|
" 'CYSM',\n",
|
||
|
" 'CYSY',\n",
|
||
|
" 'CYTH',\n",
|
||
|
" 'CYTL',\n",
|
||
|
" 'CYTS',\n",
|
||
|
" 'CYUL',\n",
|
||
|
" 'CYUX',\n",
|
||
|
" 'CYVO',\n",
|
||
|
" 'CYVP',\n",
|
||
|
" 'CYVQ',\n",
|
||
|
" 'CYVR',\n",
|
||
|
" 'CYVV',\n",
|
||
|
" 'CYWA',\n",
|
||
|
" 'CYWG',\n",
|
||
|
" 'CYWO',\n",
|
||
|
" 'CYXC',\n",
|
||
|
" 'CYXE',\n",
|
||
|
" 'CYXH',\n",
|
||
|
" 'CYXS',\n",
|
||
|
" 'CYXU',\n",
|
||
|
" 'CYXX',\n",
|
||
|
" 'CYXY',\n",
|
||
|
" 'CYXZ',\n",
|
||
|
" 'CYYB',\n",
|
||
|
" 'CYYC',\n",
|
||
|
" 'CYYE',\n",
|
||
|
" 'CYYJ',\n",
|
||
|
" 'CYYQ',\n",
|
||
|
" 'CYYR',\n",
|
||
|
" 'CYYT',\n",
|
||
|
" 'CYYZ',\n",
|
||
|
" 'CYZF',\n",
|
||
|
" 'CYZS',\n",
|
||
|
" 'CYZT',\n",
|
||
|
" 'CYZV',\n",
|
||
|
" 'DEN',\n",
|
||
|
" 'DOV',\n",
|
||
|
" 'DPG',\n",
|
||
|
" 'DSC',\n",
|
||
|
" 'DSD',\n",
|
||
|
" 'DTX',\n",
|
||
|
" 'DVN',\n",
|
||
|
" 'DYS',\n",
|
||
|
" 'E28',\n",
|
||
|
" 'E74',\n",
|
||
|
" 'EAT',\n",
|
||
|
" 'EAX',\n",
|
||
|
" 'EDW',\n",
|
||
|
" 'EFL',\n",
|
||
|
" 'EMP',\n",
|
||
|
" 'END',\n",
|
||
|
" 'ENL',\n",
|
||
|
" 'ESTC',\n",
|
||
|
" 'FCS',\n",
|
||
|
" 'FDR',\n",
|
||
|
" 'FFC',\n",
|
||
|
" 'FHU',\n",
|
||
|
" 'FLG',\n",
|
||
|
" 'FLP',\n",
|
||
|
" 'FPK',\n",
|
||
|
" 'FRI',\n",
|
||
|
" 'FSI',\n",
|
||
|
" 'FTR',\n",
|
||
|
" 'FWD',\n",
|
||
|
" 'G#1',\n",
|
||
|
" 'G#2',\n",
|
||
|
" 'G#3',\n",
|
||
|
" 'G#4',\n",
|
||
|
" 'G#5',\n",
|
||
|
" 'G#6',\n",
|
||
|
" 'G#7',\n",
|
||
|
" 'G#8',\n",
|
||
|
" 'G#9',\n",
|
||
|
" 'G#A',\n",
|
||
|
" 'G#B',\n",
|
||
|
" 'G#C',\n",
|
||
|
" 'G#D',\n",
|
||
|
" 'G#E',\n",
|
||
|
" 'G#F',\n",
|
||
|
" 'G#G',\n",
|
||
|
" 'G001',\n",
|
||
|
" 'G003',\n",
|
||
|
" 'G004',\n",
|
||
|
" 'G005',\n",
|
||
|
" 'G007',\n",
|
||
|
" 'G009',\n",
|
||
|
" 'GDP',\n",
|
||
|
" 'GDV',\n",
|
||
|
" 'GLRY',\n",
|
||
|
" 'GMX1',\n",
|
||
|
" 'GNB',\n",
|
||
|
" 'GNC',\n",
|
||
|
" 'GRF',\n",
|
||
|
" 'GTB',\n",
|
||
|
" 'GTP',\n",
|
||
|
" 'GVL',\n",
|
||
|
" 'GVS',\n",
|
||
|
" 'GYX',\n",
|
||
|
" 'H02',\n",
|
||
|
" 'HAY',\n",
|
||
|
" 'HGR',\n",
|
||
|
" 'HMN',\n",
|
||
|
" 'HOM',\n",
|
||
|
" 'HOO',\n",
|
||
|
" 'HSI',\n",
|
||
|
" 'HYR',\n",
|
||
|
" 'HYS',\n",
|
||
|
" 'ICC',\n",
|
||
|
" 'IGM',\n",
|
||
|
" 'ILN',\n",
|
||
|
" 'ILS',\n",
|
||
|
" 'ILX',\n",
|
||
|
" 'IMT',\n",
|
||
|
" 'INK',\n",
|
||
|
" 'IPX',\n",
|
||
|
" 'JACK',\n",
|
||
|
" 'JDN',\n",
|
||
|
" 'K40B',\n",
|
||
|
" 'K9V9',\n",
|
||
|
" 'KABE',\n",
|
||
|
" 'KABI',\n",
|
||
|
" 'KABQ',\n",
|
||
|
" 'KABR',\n",
|
||
|
" 'KABY',\n",
|
||
|
" 'KACK',\n",
|
||
|
" 'KACT',\n",
|
||
|
" 'KACV',\n",
|
||
|
" 'KACY',\n",
|
||
|
" 'KAGC',\n",
|
||
|
" 'KAGS',\n",
|
||
|
" 'KAHN',\n",
|
||
|
" 'KAK',\n",
|
||
|
" 'KALB',\n",
|
||
|
" 'KALI',\n",
|
||
|
" 'KALO',\n",
|
||
|
" 'KALS',\n",
|
||
|
" 'KALW',\n",
|
||
|
" 'KAMA',\n",
|
||
|
" 'KAN',\n",
|
||
|
" 'KANB',\n",
|
||
|
" 'KAND',\n",
|
||
|
" 'KAOO',\n",
|
||
|
" 'KAPA',\n",
|
||
|
" 'KAPN',\n",
|
||
|
" 'KART',\n",
|
||
|
" 'KASE',\n",
|
||
|
" 'KAST',\n",
|
||
|
" 'KATL',\n",
|
||
|
" 'KATY',\n",
|
||
|
" 'KAUG',\n",
|
||
|
" 'KAUS',\n",
|
||
|
" 'KAUW',\n",
|
||
|
" 'KAVL',\n",
|
||
|
" 'KAVP',\n",
|
||
|
" 'KAXN',\n",
|
||
|
" 'KAYS',\n",
|
||
|
" 'KAZO',\n",
|
||
|
" 'KBAF',\n",
|
||
|
" 'KBCE',\n",
|
||
|
" 'KBDE',\n",
|
||
|
" 'KBDL',\n",
|
||
|
" 'KBDR',\n",
|
||
|
" 'KBED',\n",
|
||
|
" 'KBFD',\n",
|
||
|
" 'KBFF',\n",
|
||
|
" 'KBFI',\n",
|
||
|
" 'KBFL',\n",
|
||
|
" 'KBGM',\n",
|
||
|
" 'KBGR',\n",
|
||
|
" 'KBHB',\n",
|
||
|
" 'KBHM',\n",
|
||
|
" 'KBIH',\n",
|
||
|
" 'KBIL',\n",
|
||
|
" 'KBIS',\n",
|
||
|
" 'KBJC',\n",
|
||
|
" 'KBJI',\n",
|
||
|
" 'KBKE',\n",
|
||
|
" 'KBKW',\n",
|
||
|
" 'KBLF',\n",
|
||
|
" 'KBLH',\n",
|
||
|
" 'KBLI',\n",
|
||
|
" 'KBML',\n",
|
||
|
" 'KBNA',\n",
|
||
|
" 'KBNO',\n",
|
||
|
" 'KBNV',\n",
|
||
|
" 'KBOI',\n",
|
||
|
" 'KBOS',\n",
|
||
|
" 'KBPT',\n",
|
||
|
" 'KBQK',\n",
|
||
|
" 'KBRD',\n",
|
||
|
" 'KBRL',\n",
|
||
|
" 'KBRO',\n",
|
||
|
" 'KBTL',\n",
|
||
|
" 'KBTM',\n",
|
||
|
" 'KBTR',\n",
|
||
|
" 'KBTV',\n",
|
||
|
" 'KBUF',\n",
|
||
|
" 'KBUR',\n",
|
||
|
" 'KBVI',\n",
|
||
|
" 'KBVX',\n",
|
||
|
" 'KBVY',\n",
|
||
|
" 'KBWG',\n",
|
||
|
" 'KBWI',\n",
|
||
|
" 'KBYI',\n",
|
||
|
" 'KBZN',\n",
|
||
|
" 'KCAE',\n",
|
||
|
" 'KCAK',\n",
|
||
|
" 'KCAR',\n",
|
||
|
" 'KCDC',\n",
|
||
|
" 'KCDR',\n",
|
||
|
" 'KCDS',\n",
|
||
|
" 'KCEC',\n",
|
||
|
" 'KCEF',\n",
|
||
|
" 'KCGI',\n",
|
||
|
" 'KCGX',\n",
|
||
|
" 'KCHA',\n",
|
||
|
" 'KCHH',\n",
|
||
|
" 'KCHO',\n",
|
||
|
" 'KCHS',\n",
|
||
|
" 'KCID',\n",
|
||
|
" 'KCIU',\n",
|
||
|
" 'KCKB',\n",
|
||
|
" 'KCKL',\n",
|
||
|
" 'KCLE',\n",
|
||
|
" 'KCLL',\n",
|
||
|
" 'KCLM',\n",
|
||
|
" 'KCLT',\n",
|
||
|
" 'KCMH',\n",
|
||
|
" 'KCMI',\n",
|
||
|
" 'KCMX',\n",
|
||
|
" 'KCNM',\n",
|
||
|
" 'KCNU',\n",
|
||
|
" 'KCOD',\n",
|
||
|
" 'KCOE',\n",
|
||
|
" 'KCON',\n",
|
||
|
" 'KCOS',\n",
|
||
|
" 'KCOU',\n",
|
||
|
" 'KCPR',\n",
|
||
|
" 'KCRE',\n",
|
||
|
" 'KCRP',\n",
|
||
|
" 'KCRQ',\n",
|
||
|
" 'KCRW',\n",
|
||
|
" 'KCSG',\n",
|
||
|
" 'KCSV',\n",
|
||
|
" 'KCTB',\n",
|
||
|
" 'KCVG',\n",
|
||
|
" 'KCWA',\n",
|
||
|
" 'KCYS',\n",
|
||
|
" 'KDAB',\n",
|
||
|
" 'KDAG',\n",
|
||
|
" 'KDAL',\n",
|
||
|
" 'KDAN',\n",
|
||
|
" 'KDAY',\n",
|
||
|
" 'KDBQ',\n",
|
||
|
" 'KDCA',\n",
|
||
|
" 'KDDC',\n",
|
||
|
" 'KDEC',\n",
|
||
|
" 'KDEN',\n",
|
||
|
" 'KDET',\n",
|
||
|
" 'KDFW',\n",
|
||
|
" 'KDHN',\n",
|
||
|
" 'KDHT',\n",
|
||
|
" 'KDIK',\n",
|
||
|
" 'KDLH',\n",
|
||
|
" 'KDLS',\n",
|
||
|
" 'KDMN',\n",
|
||
|
" 'KDPA',\n",
|
||
|
" 'KDRA',\n",
|
||
|
" 'KDRO',\n",
|
||
|
" 'KDRT',\n",
|
||
|
" 'KDSM',\n",
|
||
|
" 'KDTW',\n",
|
||
|
" 'KDUG',\n",
|
||
|
" 'KDUJ',\n",
|
||
|
" 'KEAT',\n",
|
||
|
" 'KEAU',\n",
|
||
|
" 'KECG',\n",
|
||
|
" 'KEED',\n",
|
||
|
" 'KEGE',\n",
|
||
|
" 'KEKN',\n",
|
||
|
" 'KEKO',\n",
|
||
|
" 'KEL',\n",
|
||
|
" 'KELD',\n",
|
||
|
" 'KELM',\n",
|
||
|
" 'KELO',\n",
|
||
|
" 'KELP',\n",
|
||
|
" 'KELY',\n",
|
||
|
" 'KENV',\n",
|
||
|
" 'KEPH',\n",
|
||
|
" 'KEPO',\n",
|
||
|
" 'KEPZ',\n",
|
||
|
" 'KERI',\n",
|
||
|
" 'KESF',\n",
|
||
|
" 'KEUG',\n",
|
||
|
" 'KEVV',\n",
|
||
|
" 'KEWB',\n",
|
||
|
" 'KEWN',\n",
|
||
|
" 'KEWR',\n",
|
||
|
" 'KEYW',\n",
|
||
|
" 'KFAM',\n",
|
||
|
" 'KFAR',\n",
|
||
|
" 'KFAT',\n",
|
||
|
" 'KFAY',\n",
|
||
|
" 'KFCA',\n",
|
||
|
" 'KFDY',\n",
|
||
|
" 'KFKL',\n",
|
||
|
" 'KFLG',\n",
|
||
|
" 'KFLL',\n",
|
||
|
" 'KFLO',\n",
|
||
|
" 'KFMN',\n",
|
||
|
" 'KFMY',\n",
|
||
|
" 'KFNT',\n",
|
||
|
" 'KFOE',\n",
|
||
|
" 'KFPR',\n",
|
||
|
" 'KFRM',\n",
|
||
|
" 'KFSD',\n",
|
||
|
" 'KFSM',\n",
|
||
|
" 'KFTW',\n",
|
||
|
" 'KFTY',\n",
|
||
|
" 'KFVE',\n",
|
||
|
" 'KFVX',\n",
|
||
|
" 'KFWA',\n",
|
||
|
" 'KFXE',\n",
|
||
|
" 'KFYV',\n",
|
||
|
" 'KGAG',\n",
|
||
|
" 'KGCC',\n",
|
||
|
" 'KGCK',\n",
|
||
|
" 'KGCN',\n",
|
||
|
" 'KGEG',\n",
|
||
|
" 'KGFK',\n",
|
||
|
" 'KGFL',\n",
|
||
|
" 'KGGG',\n",
|
||
|
" 'KGGW',\n",
|
||
|
" 'KGJT',\n",
|
||
|
" 'KGLD',\n",
|
||
|
" 'KGLH',\n",
|
||
|
" 'KGLS',\n",
|
||
|
" 'KGMU',\n",
|
||
|
" 'KGNR',\n",
|
||
|
" 'KGNV',\n",
|
||
|
" 'KGON',\n",
|
||
|
" 'KGPT',\n",
|
||
|
" 'KGRB',\n",
|
||
|
" 'KGRI',\n",
|
||
|
" 'KGRR',\n",
|
||
|
" 'KGSO',\n",
|
||
|
" 'KGSP',\n",
|
||
|
" 'KGTF',\n",
|
||
|
" 'KGUC',\n",
|
||
|
" 'KGUP',\n",
|
||
|
" 'KGWO',\n",
|
||
|
" 'KGYY',\n",
|
||
|
" 'KGZH',\n",
|
||
|
" 'KHAT',\n",
|
||
|
" 'KHBR',\n",
|
||
|
" 'KHDN',\n",
|
||
|
" 'KHIB',\n",
|
||
|
" 'KHIO',\n",
|
||
|
" 'KHKY',\n",
|
||
|
" 'KHLG',\n",
|
||
|
" 'KHLN',\n",
|
||
|
" 'KHOB',\n",
|
||
|
" 'KHON',\n",
|
||
|
" 'KHOT',\n",
|
||
|
" 'KHOU',\n",
|
||
|
" 'KHPN',\n",
|
||
|
" 'KHQM',\n",
|
||
|
" 'KHRL',\n",
|
||
|
" 'KHRO',\n",
|
||
|
" 'KHSV',\n",
|
||
|
" 'KHTH',\n",
|
||
|
" 'KHTS',\n",
|
||
|
" 'KHUF',\n",
|
||
|
" 'KHUL',\n",
|
||
|
" 'KHUT',\n",
|
||
|
" 'KHVN',\n",
|
||
|
" 'KHVR',\n",
|
||
|
" 'KHYA',\n",
|
||
|
" 'KIAD',\n",
|
||
|
" 'KIAG',\n",
|
||
|
" 'KIAH',\n",
|
||
|
" 'KICT',\n",
|
||
|
" 'KIDA',\n",
|
||
|
" 'KIL',\n",
|
||
|
" 'KILG',\n",
|
||
|
" 'KILM',\n",
|
||
|
" 'KIND',\n",
|
||
|
" 'KINK',\n",
|
||
|
" 'KINL',\n",
|
||
|
" 'KINT',\n",
|
||
|
" 'KINW',\n",
|
||
|
" 'KIPL',\n",
|
||
|
" 'KIPT',\n",
|
||
|
" 'KISN',\n",
|
||
|
" 'KISP',\n",
|
||
|
" 'KITH',\n",
|
||
|
" 'KIWD',\n",
|
||
|
" 'KJAC',\n",
|
||
|
" 'KJAN',\n",
|
||
|
" 'KJAX',\n",
|
||
|
" 'KJBR',\n",
|
||
|
" 'KJFK',\n",
|
||
|
" 'KJHW',\n",
|
||
|
" 'KJKL',\n",
|
||
|
" 'KJLN',\n",
|
||
|
" 'KJMS',\n",
|
||
|
" 'KJST',\n",
|
||
|
" 'KJXN',\n",
|
||
|
" 'KKL',\n",
|
||
|
" 'KLAF',\n",
|
||
|
" 'KLAN',\n",
|
||
|
" 'KLAR',\n",
|
||
|
" 'KLAS',\n",
|
||
|
" 'KLAX',\n",
|
||
|
" 'KLBB',\n",
|
||
|
" 'KLBE',\n",
|
||
|
" 'KLBF',\n",
|
||
|
" 'KLCB',\n",
|
||
|
" 'KLCH',\n",
|
||
|
" 'KLEB',\n",
|
||
|
" 'KLEX',\n",
|
||
|
" 'KLFK',\n",
|
||
|
" 'KLFT',\n",
|
||
|
" 'KLGA',\n",
|
||
|
" 'KLGB',\n",
|
||
|
" 'KLGU',\n",
|
||
|
" 'KLIT',\n",
|
||
|
" 'KLMT',\n",
|
||
|
" 'KLND',\n",
|
||
|
" 'KLNK',\n",
|
||
|
" 'KLOL',\n",
|
||
|
" 'KLOZ',\n",
|
||
|
" 'KLRD',\n",
|
||
|
" 'KLSE',\n",
|
||
|
" 'KLUK',\n",
|
||
|
" 'KLVS',\n",
|
||
|
" 'KLWB',\n",
|
||
|
" 'KLWM',\n",
|
||
|
" 'KLWS',\n",
|
||
|
" 'KLWT',\n",
|
||
|
" 'KLYH',\n",
|
||
|
" 'KLZK',\n",
|
||
|
" 'KMAF',\n",
|
||
|
" 'KMBS',\n",
|
||
|
" 'KMCB',\n",
|
||
|
" 'KMCE',\n",
|
||
|
" 'KMCI',\n",
|
||
|
" 'KMCN',\n",
|
||
|
" 'KMCO',\n",
|
||
|
" 'KMCW',\n",
|
||
|
" 'KMDN',\n",
|
||
|
" 'KMDT',\n",
|
||
|
" 'KMDW',\n",
|
||
|
" 'KMEI',\n",
|
||
|
" 'KMEM',\n",
|
||
|
" 'KMFD',\n",
|
||
|
" 'KMFE',\n",
|
||
|
" 'KMFR',\n",
|
||
|
" 'KMGM',\n",
|
||
|
" 'KMGW',\n",
|
||
|
" 'KMHE',\n",
|
||
|
" 'KMHK',\n",
|
||
|
" 'KMHT',\n",
|
||
|
" 'KMHX',\n",
|
||
|
" 'KMIA',\n",
|
||
|
" 'KMIV',\n",
|
||
|
" 'KMKC',\n",
|
||
|
" 'KMKE',\n",
|
||
|
" 'KMKG',\n",
|
||
|
" 'KMKL',\n",
|
||
|
" 'KMLB',\n",
|
||
|
" 'KMLC',\n",
|
||
|
" 'KMLI',\n",
|
||
|
" 'KMLS',\n",
|
||
|
" 'KMLT',\n",
|
||
|
" 'KMLU',\n",
|
||
|
" 'KMMU',\n",
|
||
|
" 'KMOB',\n",
|
||
|
" 'KMOT',\n",
|
||
|
" 'KMPV',\n",
|
||
|
" 'KMQT',\n",
|
||
|
" 'KMRB',\n",
|
||
|
" 'KMRY',\n",
|
||
|
" 'KMSL',\n",
|
||
|
" 'KMSN',\n",
|
||
|
" 'KMSO',\n",
|
||
|
" 'KMSP',\n",
|
||
|
" 'KMSS',\n",
|
||
|
" 'KMSY',\n",
|
||
|
" 'KMTJ',\n",
|
||
|
" 'KMTN',\n",
|
||
|
" 'KMWH',\n",
|
||
|
" 'KMYR',\n",
|
||
|
" 'KNA',\n",
|
||
|
" 'KNEW',\n",
|
||
|
" 'KNL',\n",
|
||
|
" 'KNSI',\n",
|
||
|
" 'KOAK',\n",
|
||
|
" 'KOFK',\n",
|
||
|
" 'KOGD',\n",
|
||
|
" 'KOKC',\n",
|
||
|
" 'KOLM',\n",
|
||
|
" 'KOMA',\n",
|
||
|
" 'KONT',\n",
|
||
|
" 'KOPF',\n",
|
||
|
" 'KOQU',\n",
|
||
|
" 'KORD',\n",
|
||
|
" 'KORF',\n",
|
||
|
" 'KORH',\n",
|
||
|
" 'KOSH',\n",
|
||
|
" 'KOTH',\n",
|
||
|
" 'KOTM',\n",
|
||
|
" 'KP11',\n",
|
||
|
" 'KP38',\n",
|
||
|
" 'KPAE',\n",
|
||
|
" 'KPAH',\n",
|
||
|
" 'KPBF',\n",
|
||
|
" 'KPBI',\n",
|
||
|
" 'KPDK',\n",
|
||
|
" 'KPDT',\n",
|
||
|
" 'KPDX',\n",
|
||
|
" 'KPFN',\n",
|
||
|
" 'KPGA',\n",
|
||
|
" 'KPHF',\n",
|
||
|
" 'KPHL',\n",
|
||
|
" 'KPHN',\n",
|
||
|
" 'KPHX',\n",
|
||
|
" 'KPIA',\n",
|
||
|
" 'KPIB',\n",
|
||
|
" 'KPIE',\n",
|
||
|
" 'KPIH',\n",
|
||
|
" 'KPIR',\n",
|
||
|
" 'KPIT',\n",
|
||
|
" 'KPKB',\n",
|
||
|
" 'KPLN',\n",
|
||
|
" 'KPMD',\n",
|
||
|
" 'KPNC',\n",
|
||
|
" 'KPNE',\n",
|
||
|
" 'KPNS',\n",
|
||
|
" 'KPOU',\n",
|
||
|
" 'KPQI',\n",
|
||
|
" 'KPRB',\n",
|
||
|
" 'KPRC',\n",
|
||
|
" 'KPSC',\n",
|
||
|
" 'KPSM',\n",
|
||
|
" 'KPSP',\n",
|
||
|
" 'KPTK',\n",
|
||
|
" 'KPUB',\n",
|
||
|
" 'KPVD',\n",
|
||
|
" 'KPVU',\n",
|
||
|
" 'KPWM',\n",
|
||
|
" 'KRAD',\n",
|
||
|
" 'KRAP',\n",
|
||
|
" 'KRBL',\n",
|
||
|
" 'KRDD',\n",
|
||
|
" 'KRDG',\n",
|
||
|
" 'KRDM',\n",
|
||
|
" 'KRDU',\n",
|
||
|
" 'KRFD',\n",
|
||
|
" 'KRIC',\n",
|
||
|
" 'KRIW',\n",
|
||
|
" 'KRKD',\n",
|
||
|
" 'KRKS',\n",
|
||
|
" 'KRNO',\n",
|
||
|
" 'KRNT',\n",
|
||
|
" 'KROA',\n",
|
||
|
" 'KROC',\n",
|
||
|
" 'KROW',\n",
|
||
|
" 'KRSL',\n",
|
||
|
" 'KRST',\n",
|
||
|
" 'KRSW',\n",
|
||
|
" 'KRUM',\n",
|
||
|
" 'KRWF',\n",
|
||
|
" 'KRWI',\n",
|
||
|
" 'KRWL',\n",
|
||
|
" 'KSAC',\n",
|
||
|
" 'KSAF',\n",
|
||
|
" 'KSAN',\n",
|
||
|
" 'KSAT',\n",
|
||
|
" 'KSAV',\n",
|
||
|
" 'KSBA',\n",
|
||
|
" 'KSBN',\n",
|
||
|
" 'KSBP',\n",
|
||
|
" 'KSBY',\n",
|
||
|
" 'KSCH',\n",
|
||
|
" 'KSCK',\n",
|
||
|
" 'KSDF',\n",
|
||
|
" 'KSDM',\n",
|
||
|
" 'KSDY',\n",
|
||
|
" 'KSEA',\n",
|
||
|
" 'KSEP',\n",
|
||
|
" 'KSFF',\n",
|
||
|
" 'KSFO',\n",
|
||
|
" 'KSGF',\n",
|
||
|
" 'KSGU',\n",
|
||
|
" 'KSHR',\n",
|
||
|
" 'KSHV',\n",
|
||
|
" 'KSJC',\n",
|
||
|
" 'KSJT',\n",
|
||
|
" 'KSLC',\n",
|
||
|
" 'KSLE',\n",
|
||
|
" 'KSLK',\n",
|
||
|
" 'KSLN',\n",
|
||
|
" 'KSMF',\n",
|
||
|
" 'KSMX',\n",
|
||
|
" 'KSNA',\n",
|
||
|
" 'KSNS',\n",
|
||
|
" 'KSPI',\n",
|
||
|
" 'KSPS',\n",
|
||
|
" 'KSRQ',\n",
|
||
|
" 'KSSI',\n",
|
||
|
" 'KSTJ',\n",
|
||
|
" 'KSTL',\n",
|
||
|
" 'KSTP',\n",
|
||
|
" 'KSTS',\n",
|
||
|
" 'KSUN',\n",
|
||
|
" 'KSUS',\n",
|
||
|
" 'KSUX',\n",
|
||
|
" 'KSVE',\n",
|
||
|
" 'KSWF',\n",
|
||
|
" 'KSYR',\n",
|
||
|
" 'KTCC',\n",
|
||
|
" 'KTCL',\n",
|
||
|
" 'KTCS',\n",
|
||
|
" 'KTEB',\n",
|
||
|
" 'KTIW',\n",
|
||
|
" 'KTLH',\n",
|
||
|
" 'KTMB',\n",
|
||
|
" 'KTOL',\n",
|
||
|
" 'KTOP',\n",
|
||
|
" 'KTPA',\n",
|
||
|
" 'KTPH',\n",
|
||
|
" 'KTRI',\n",
|
||
|
" 'KTRK',\n",
|
||
|
" 'KTRM',\n",
|
||
|
" 'KTTD',\n",
|
||
|
" 'KTTN',\n",
|
||
|
" 'KTUL',\n",
|
||
|
" 'KTUP',\n",
|
||
|
" 'KTUS',\n",
|
||
|
" 'KTVC',\n",
|
||
|
" 'KTVL',\n",
|
||
|
" 'KTWF',\n",
|
||
|
" 'KTXK',\n",
|
||
|
" 'KTYR',\n",
|
||
|
" 'KTYS',\n",
|
||
|
" 'KUCA',\n",
|
||
|
" 'KUIN',\n",
|
||
|
" 'KUKI',\n",
|
||
|
" 'KUNV',\n",
|
||
|
" 'KVCT',\n",
|
||
|
" 'KVEL',\n",
|
||
|
" 'KVLD',\n",
|
||
|
" 'KVNY',\n",
|
||
|
" 'KVRB',\n",
|
||
|
" 'KWJF',\n",
|
||
|
" 'KWMC',\n",
|
||
|
" 'KWRL',\n",
|
||
|
" 'KWYS',\n",
|
||
|
" 'KY22',\n",
|
||
|
" 'KY26',\n",
|
||
|
" 'KYKM',\n",
|
||
|
" 'KYKN',\n",
|
||
|
" 'KYNG',\n",
|
||
|
" 'KYUM',\n",
|
||
|
" 'KZZV',\n",
|
||
|
" 'LAA',\n",
|
||
|
" 'LAP',\n",
|
||
|
" 'LBY',\n",
|
||
|
" 'LDL',\n",
|
||
|
" 'LHX',\n",
|
||
|
" 'LIC',\n",
|
||
|
" 'LOR',\n",
|
||
|
" 'LRR',\n",
|
||
|
" 'LSF',\n",
|
||
|
" 'LUS',\n",
|
||
|
" 'LVM',\n",
|
||
|
" 'LW1',\n",
|
||
|
" 'MAC',\n",
|
||
|
" 'MAX',\n",
|
||
|
" 'MAZ',\n",
|
||
|
" 'MDPC',\n",
|
||
|
" 'MDPP',\n",
|
||
|
" 'MDSD',\n",
|
||
|
" 'MDST',\n",
|
||
|
" 'MGFL',\n",
|
||
|
" 'MGGT',\n",
|
||
|
" 'MGHT',\n",
|
||
|
" 'MGPB',\n",
|
||
|
" 'MGSJ',\n",
|
||
|
" 'MHAM',\n",
|
||
|
" 'MHCA',\n",
|
||
|
" 'MHCH',\n",
|
||
|
" 'MHLC',\n",
|
||
|
" 'MHLE',\n",
|
||
|
" 'MHLM',\n",
|
||
|
" 'MHNJ',\n",
|
||
|
" 'MHPL',\n",
|
||
|
" 'MHRO',\n",
|
||
|
" 'MHSR',\n",
|
||
|
" 'MHTE',\n",
|
||
|
" 'MHTG',\n",
|
||
|
" 'MHYR',\n",
|
||
|
" 'MIB',\n",
|
||
|
" 'MIE',\n",
|
||
|
" 'MKJP',\n",
|
||
|
" 'MKJS',\n",
|
||
|
" 'MLD',\n",
|
||
|
" 'MMAA',\n",
|
||
|
" 'MMAS',\n",
|
||
|
" 'MMBT',\n",
|
||
|
" 'MMCE',\n",
|
||
|
" 'MMCL',\n",
|
||
|
" 'MMCN',\n",
|
||
|
" 'MMCS',\n",
|
||
|
" 'MMCU',\n",
|
||
|
" 'MMCV',\n",
|
||
|
" 'MMCZ',\n",
|
||
|
" 'MMDO',\n",
|
||
|
" 'MMGL',\n",
|
||
|
" 'MMGM',\n",
|
||
|
" 'MMHO',\n",
|
||
|
" 'MMLP',\n",
|
||
|
" 'MMMA',\n",
|
||
|
" 'MMMD',\n",
|
||
|
" 'MMML',\n",
|
||
|
" 'MMMM',\n",
|
||
|
" 'MMMT',\n",
|
||
|
" 'MMMX',\n",
|
||
|
" 'MMMY',\n",
|
||
|
" 'MMMZ',\n",
|
||
|
" 'MMNL',\n",
|
||
|
" 'MMPR',\n",
|
||
|
" 'MMRX',\n",
|
||
|
" 'MMSD',\n",
|
||
|
" 'MMSP',\n",
|
||
|
" 'MMTC',\n",
|
||
|
" 'MMTJ',\n",
|
||
|
" 'MMTM',\n",
|
||
|
" 'MMTO',\n",
|
||
|
" 'MMTP',\n",
|
||
|
" 'MMUN',\n",
|
||
|
" 'MMVR',\n",
|
||
|
" 'MMZC',\n",
|
||
|
" 'MMZH',\n",
|
||
|
" 'MMZO',\n",
|
||
|
" 'MNMG',\n",
|
||
|
" 'MNPC',\n",
|
||
|
" 'MOR',\n",
|
||
|
" 'MPBO',\n",
|
||
|
" 'MPCH',\n",
|
||
|
" 'MPDA',\n",
|
||
|
" 'MPMG',\n",
|
||
|
" 'MPSA',\n",
|
||
|
" 'MPTO',\n",
|
||
|
" 'MPX',\n",
|
||
|
" 'MRCH',\n",
|
||
|
" 'MRF',\n",
|
||
|
" 'MRLB',\n",
|
||
|
" 'MRLM',\n",
|
||
|
" 'MROC',\n",
|
||
|
" 'MRPV',\n",
|
||
|
" 'MRS',\n",
|
||
|
" 'MSAC',\n",
|
||
|
" 'MSLP',\n",
|
||
|
" 'MSSS',\n",
|
||
|
" 'MTCH',\n",
|
||
|
" 'MTL',\n",
|
||
|
" 'MTPP',\n",
|
||
|
" 'MTV',\n",
|
||
|
" 'MTY',\n",
|
||
|
" 'MUBA',\n",
|
||
|
" 'MUBY',\n",
|
||
|
" 'MUCA',\n",
|
||
|
" 'MUCL',\n",
|
||
|
" 'MUCM',\n",
|
||
|
" 'MUCU',\n",
|
||
|
" 'MUGM',\n",
|
||
|
" 'MUGT',\n",
|
||
|
" 'MUHA',\n",
|
||
|
" 'MUMO',\n",
|
||
|
" 'MUMZ',\n",
|
||
|
" 'MUNG',\n",
|
||
|
" 'MUVR',\n",
|
||
|
" 'MUVT',\n",
|
||
|
" 'MWCR',\n",
|
||
|
" 'MYBS',\n",
|
||
|
" 'MYEG',\n",
|
||
|
" 'MYGF',\n",
|
||
|
" 'MYGW',\n",
|
||
|
" 'MYL',\n",
|
||
|
" 'MYNN',\n",
|
||
|
" 'MZBZ',\n",
|
||
|
" 'MZT',\n",
|
||
|
" 'NCK',\n",
|
||
|
" 'NGX',\n",
|
||
|
" 'NHK',\n",
|
||
|
" 'NID',\n",
|
||
|
" 'NKX',\n",
|
||
|
" 'NOA',\n",
|
||
|
" 'NRU',\n",
|
||
|
" 'NTD',\n",
|
||
|
" ...]"
|
||
|
]
|
||
|
},
|
||
|
"execution_count": 3,
|
||
|
"metadata": {},
|
||
|
"output_type": "execute_result"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"locations = DataAccessLayer.getAvailableLocationNames(request)\n",
|
||
|
"locations.sort()\n",
|
||
|
"list(locations)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 3.2 Setting the Location Name\n",
|
||
|
"\n",
|
||
|
"In this case we're setting the location name to `KFRM` which is the Municipal Airport in Fairmont, Minnesota."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 4,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"request.setLocationNames(\"KFRM\")"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"[Top](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## 4 Filtering by Time\n",
|
||
|
"\n",
|
||
|
"Models produce many different time variants during their runs, so let's limit the data to the most recent time and forecast run."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 5,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"cycles = DataAccessLayer.getAvailableTimes(request, True)\n",
|
||
|
"times = DataAccessLayer.getAvailableTimes(request)\n",
|
||
|
"\n",
|
||
|
"try:\n",
|
||
|
" fcstRun = DataAccessLayer.getForecastRun(cycles[-1], times)\n",
|
||
|
" list(fcstRun)\n",
|
||
|
" response = DataAccessLayer.getGeometryData(request,[fcstRun[0]])\n",
|
||
|
"except:\n",
|
||
|
" print('No times available')\n",
|
||
|
" exit"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"[Top](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## 5 Get the Data!\n",
|
||
|
"\n",
|
||
|
"Here we can now request our data response from the EDEX server with our defined time filter.\n",
|
||
|
"Printing out some data about the response verifies we received the data we were interested in."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 6,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"name": "stdout",
|
||
|
"output_type": "stream",
|
||
|
"text": [
|
||
|
"parms = ['temperature', 'pressure', 'vComp', 'uComp', 'specHum']\n",
|
||
|
"site = KFRM\n",
|
||
|
"geom = POINT (-94.41999816894531 43.65000152587891)\n",
|
||
|
"datetime = 2022-08-19 12:00:00\n",
|
||
|
"reftime = Aug 19 22 12:00:00 GMT\n",
|
||
|
"fcstHour = 0\n",
|
||
|
"period = (Aug 19 22 12:00:00 , Aug 19 22 12:00:00 )\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"obj = response[0]\n",
|
||
|
"\n",
|
||
|
"print(\"parms = \" + str(obj.getParameters()))\n",
|
||
|
"print(\"site = \" + str(obj.getLocationName()))\n",
|
||
|
"print(\"geom = \" + str(obj.getGeometry()))\n",
|
||
|
"print(\"datetime = \" + str(obj.getDataTime()))\n",
|
||
|
"print(\"reftime = \" + str(obj.getDataTime().getRefTime()))\n",
|
||
|
"print(\"fcstHour = \" + str(obj.getDataTime().getFcstTime()))\n",
|
||
|
"print(\"period = \" + str(obj.getDataTime().getValidPeriod()))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"[Top](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## 6 Use the Data!\n",
|
||
|
"\n",
|
||
|
"Since we filtered on time, and requested the data in the previous cell, we now have a `response` object we can work with."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 6.1 Prepare Data Objects\n",
|
||
|
"\n",
|
||
|
"Here we construct arrays for each parameter to plot (temperature, pressure, moisture (spec. humidity), wind components, and cloud cover). We have two sets of arrays for temperature and pressure, where the second set only has values as long as the specific humidity is not zero. That is because we are going to do some calculations with specific humidity, temperature, and pressure and we need all those arrays to be the same length, and for the specific humidty to not equal zero."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 7,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# Create new arrays to populate from our response objects\n",
|
||
|
"tmp,prs,sh,prs2,tmp2 = np.array([]),np.array([]),np.array([]),np.array([]),np.array([])\n",
|
||
|
"uc,vc = np.array([]),np.array([])\n",
|
||
|
"\n",
|
||
|
"# Cycle through all response objects to populate new arrays\n",
|
||
|
"for ob in response:\n",
|
||
|
" tmp = np.append(tmp,ob.getNumber(\"temperature\"))\n",
|
||
|
" prs = np.append(prs,ob.getNumber(\"pressure\"))\n",
|
||
|
" uc = np.append(uc,ob.getNumber(\"uComp\"))\n",
|
||
|
" vc = np.append(vc,ob.getNumber(\"vComp\"))\n",
|
||
|
" # don't include data with 0 specific humidity\n",
|
||
|
" if(ob.getNumber(\"specHum\")==0):\n",
|
||
|
" continue\n",
|
||
|
" sh = np.append(sh,ob.getNumber(\"specHum\"))\n",
|
||
|
" prs2 = np.append(prs2,ob.getNumber(\"pressure\"))\n",
|
||
|
" tmp2 = np.append(tmp2,ob.getNumber(\"temperature\"))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"### 6.2 Calculate Dewpoint from Specific Humidity\n",
|
||
|
"\n",
|
||
|
"Because the modelsounding plugin does not return dewpoint values, we must calculate the profile ourselves. Here are three examples of dewpoint calculated from specific humidity, including a manual calculation following NCEP AWIPS/NSHARP. \n",
|
||
|
"\n",
|
||
|
"First, we'll set up variables that are used in all three methods (and later in the notebook)."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 8,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"tfull = (tmp-273.15) * units.degC\n",
|
||
|
"t = (tmp2-273.15) * units.degC\n",
|
||
|
"\n",
|
||
|
"pfull = prs/100 * units.mbar\n",
|
||
|
"p = prs2/100 * units.mbar\n",
|
||
|
"\n",
|
||
|
"u,v = uc*1.94384,vc*1.94384 # m/s to knots\n",
|
||
|
"spd = wind_speed(u*units.knots, v*units.knots)\n",
|
||
|
"dir = wind_direction(u*units.knots, v*units.knots) * units.deg"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"#### 6.2.1 Method 1\n",
|
||
|
"\n",
|
||
|
"Here we'll calculate the dewpoint using MetPy calculated mixing ratio and the vapor pressure."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 9,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"rmix = (sh/(1-sh)) *1000 * units('g/kg')\n",
|
||
|
"e = vapor_pressure(p, rmix)\n",
|
||
|
"td = dewpoint(e)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"#### 6.2.2 Method 2\n",
|
||
|
"\n",
|
||
|
"Here we'll calculate dewpoint using MetPy while assuming the mixing ratio is equal to the specific humidity."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 10,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"td2 = dewpoint(vapor_pressure(p, sh))"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"#### 6.2.3 Method 3\n",
|
||
|
"\n",
|
||
|
"Here we use logic from the NCEP AWIPS soundingrequest plugin. This logic was based on [GEMPAK and NSHARP calculations](https://github.com/Unidata/awips2-ncep/blob/unidata_16.2.2/edex/gov.noaa.nws.ncep.edex.plugin.soundingrequest/src/gov/noaa/nws/ncep/edex/plugin/soundingrequest/handler/MergeSounding.java#L1783)."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 11,
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"source": [
|
||
|
"# new arrays\n",
|
||
|
"ntmp = tmp2\n",
|
||
|
"\n",
|
||
|
"# where p=pressure(pa), T=temp(C), T0=reference temp(273.16)\n",
|
||
|
"rh = 0.263*prs2*sh / (np.exp(17.67*ntmp/(ntmp+273.15-29.65)))\n",
|
||
|
"vaps = 6.112 * np.exp((17.67 * ntmp) / (ntmp + 243.5))\n",
|
||
|
"vapr = rh * vaps / 100\n",
|
||
|
"dwpc = np.array(243.5 * (np.log(6.112) - np.log(vapr)) / (np.log(vapr) - np.log(6.112) - 17.67)) * units.degC"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"[Top](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## 7 Plot the Data!\n",
|
||
|
"\n",
|
||
|
"Create and display SkewT and Hodograph plots using MetPy.\n",
|
||
|
"\n",
|
||
|
"Since we're displaying all three dewpoint plots, we also create a \"zoomed in\" view to highlight the slight differences between the three calculations."
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"execution_count": 12,
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"data": {
|
||
|
"image/png": "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
|
||
|
"text/plain": [
|
||
|
"<Figure size 864x1008 with 3 Axes>"
|
||
|
]
|
||
|
},
|
||
|
"metadata": {
|
||
|
"needs_background": "light"
|
||
|
},
|
||
|
"output_type": "display_data"
|
||
|
}
|
||
|
],
|
||
|
"source": [
|
||
|
"# Create a new figure and define the size\n",
|
||
|
"fig = plt.figure(figsize=(12, 14))\n",
|
||
|
"\n",
|
||
|
"# Create a skewT plot\n",
|
||
|
"skew = SkewT(fig)\n",
|
||
|
"\n",
|
||
|
"# Plot the data\n",
|
||
|
"skew.plot(pfull, tfull, 'r', linewidth=2)\n",
|
||
|
"skew.plot(p, td, 'b', linewidth=2)\n",
|
||
|
"skew.plot(p, td2, 'y', linewidth=2)\n",
|
||
|
"skew.plot(p, dwpc, 'g', linewidth=2)\n",
|
||
|
"skew.plot_barbs(pfull, u, v)\n",
|
||
|
"# set the domain and range (these may need to be adjusted\n",
|
||
|
"# depending on the exact data for best viewing purposes)\n",
|
||
|
"skew.ax.set_ylim(1000, 100)\n",
|
||
|
"skew.ax.set_xlim(-70, 40)\n",
|
||
|
"\n",
|
||
|
"# Add title to the plot\n",
|
||
|
"# format: \"2022-08-18 18Z FH 0 | GFS KFRM (43.65,-94.42)\"\n",
|
||
|
"datetime = str(ob.getDataTime())[0:-6]+\"Z\"\n",
|
||
|
"forecastHr = str(ob.getDataTime().getFcstTime())\n",
|
||
|
"site = ob.getLocationName()\n",
|
||
|
"lat = \"{:.2f}\".format(ob.getGeometry().y)\n",
|
||
|
"lon = \"{:.2f}\".format(ob.getGeometry().x)\n",
|
||
|
"coords = \"(\" + lat + \", \" + lon +\")\"\n",
|
||
|
"\n",
|
||
|
"title = datetime + \" FH \" + forecastHr + \" | \" + forecastModel + \" \" + site + \" \" + coords\n",
|
||
|
"plt.title(title)\n",
|
||
|
"\n",
|
||
|
"# Create a secondary axes for the \"zoomed in\" view\n",
|
||
|
"zoom_ax = inset_axes(skew.ax, '35%', '35%', loc=3,\n",
|
||
|
" bbox_to_anchor=(.05, .05, 1, 1),\n",
|
||
|
" bbox_transform=skew.ax.transAxes)\n",
|
||
|
"# create a secondary plot for zoomed in section\n",
|
||
|
"fig2 = plt.figure()\n",
|
||
|
"skew2 = SkewT(fig2)\n",
|
||
|
"skew2.ax = zoom_ax\n",
|
||
|
"skew2.plot(p, td, 'b', linewidth=2, label='MetPy calculated mixing ratio')\n",
|
||
|
"skew2.plot(p, td2, 'y', linewidth=2, label='MetPy spec. hum = mixing ratio')\n",
|
||
|
"skew2.plot(p, dwpc, 'g', linewidth=2, label='GEMPAK legacy caluclation')\n",
|
||
|
"# create a legend to explain the three lines\n",
|
||
|
"skew2.ax.legend(loc=1)\n",
|
||
|
"# remove the axis title on the zoomed plot since they\n",
|
||
|
"# are redundant and just clutter the plot\n",
|
||
|
"skew2.ax.set_xlabel(\"\")\n",
|
||
|
"skew2.ax.set_ylabel(\"\")\n",
|
||
|
"# these exact bounds may need to change depending on\n",
|
||
|
"# the most recent data\n",
|
||
|
"skew2.ax.set_ylim(970, 900)\n",
|
||
|
"skew2.ax.set_xlim(11, 14)\n",
|
||
|
"\n",
|
||
|
"# draw an indicator in the main plot of the \"zoomed in\" region\n",
|
||
|
"skew.ax.indicate_inset_zoom(zoom_ax, edgecolor=\"black\")\n",
|
||
|
"\n",
|
||
|
"# dispose of the second figure, since creating a new\n",
|
||
|
"# skewt in metpy automatically creates a new figure\n",
|
||
|
"# which is unnecessary in this case\n",
|
||
|
"plt.close(fig2)\n",
|
||
|
"\n",
|
||
|
"# An example of a slanted line at constant T -- in this case the 0 isotherm\n",
|
||
|
"l = skew.ax.axvline(0, color='c', linestyle='--', linewidth=2)\n",
|
||
|
"\n",
|
||
|
"# Draw hodograph\n",
|
||
|
"ax_hod = inset_axes(skew.ax, '40%', '40%', loc=1)\n",
|
||
|
"h = Hodograph(ax_hod, component_range=spd.max()/units.knots)\n",
|
||
|
"h.add_grid(increment=20)\n",
|
||
|
"h.plot_colormapped(u, v, spd)\n",
|
||
|
"\n",
|
||
|
"# Show the plot\n",
|
||
|
"plt.show()"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"[Top](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## 8 See Also\n",
|
||
|
"\n",
|
||
|
"### 8.1 Related Notebooks\n",
|
||
|
"\n",
|
||
|
"* [Grid Levels and Parameters](https://unidata.github.io/python-awips/examples/generated/Grid_Levels_and_Parameters.html)\n",
|
||
|
"* [Upper Air BUFR Soundings](http://unidata.github.io/python-awips/examples/generated/Upper_Air_BUFR_Soundings.html)\n",
|
||
|
"* [Forecast Model Vertical Sounding](http://unidata.github.io/python-awips/examples/generated/Forecast_Model_Vertical_Sounding.html)\n",
|
||
|
"\n",
|
||
|
"### 8.2 Additional Documentation\n",
|
||
|
"\n",
|
||
|
"**python-awips:**\n",
|
||
|
"\n",
|
||
|
"* [awips.DataAccessLayer](http://unidata.github.io/python-awips/api/DataAccessLayer.html)\n",
|
||
|
"* [awips.PyGeometryData](http://unidata.github.io/python-awips/api/PyGeometryData.html)\n",
|
||
|
"\n",
|
||
|
"**matplotlib:**\n",
|
||
|
"\n",
|
||
|
"* [matplotlib.pyplot](https://matplotlib.org/3.3.3/api/_as_gen/matplotlib.pyplot.html)\n",
|
||
|
"\n",
|
||
|
"**MetPy**\n",
|
||
|
"\n",
|
||
|
"* [metpy.wind_speed](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_speed.html)\n",
|
||
|
"* [metpy.wind_direction](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.wind_direction.html)\n",
|
||
|
"* [metpy.vapor_pressure](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.vapor_pressure.html)\n",
|
||
|
"* [metpy.dewpoint](https://unidata.github.io/MetPy/latest/api/generated/metpy.calc.dewpoint.html)\n",
|
||
|
"* [metpy.skewt](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.SkewT.html)\n",
|
||
|
"* [metpy.hodograph](https://unidata.github.io/MetPy/latest/api/generated/metpy.plots.Hodograph.html)"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"[Top](https://unidata.github.io/python-awips/examples/generated/Model_Sounding_Data.html)\n",
|
||
|
"\n",
|
||
|
"---"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"metadata": {
|
||
|
"kernelspec": {
|
||
|
"display_name": "Python 3 (ipykernel)",
|
||
|
"language": "python",
|
||
|
"name": "python3"
|
||
|
},
|
||
|
"language_info": {
|
||
|
"codemirror_mode": {
|
||
|
"name": "ipython",
|
||
|
"version": 3
|
||
|
},
|
||
|
"file_extension": ".py",
|
||
|
"mimetype": "text/x-python",
|
||
|
"name": "python",
|
||
|
"nbconvert_exporter": "python",
|
||
|
"pygments_lexer": "ipython3",
|
||
|
"version": "3.13.1"
|
||
|
},
|
||
|
"toc": {
|
||
|
"base_numbering": 1,
|
||
|
"nav_menu": {},
|
||
|
"number_sections": false,
|
||
|
"sideBar": false,
|
||
|
"skip_h1_title": false,
|
||
|
"title_cell": "Table of Contents",
|
||
|
"title_sidebar": "Contents",
|
||
|
"toc_cell": false,
|
||
|
"toc_position": {},
|
||
|
"toc_section_display": false,
|
||
|
"toc_window_display": false
|
||
|
}
|
||
|
},
|
||
|
"nbformat": 4,
|
||
|
"nbformat_minor": 4
|
||
|
}
|