├── Documentation ├── Landing_Page.md ├── NWS_Forecasts.md ├── RTMA.md ├── SPC_Outlook_Graphics.md ├── cross_sections.md ├── forecast_models.md ├── fuels_charts.md ├── miscellaneous.md ├── observations.md ├── sawti.md ├── solar_information.md └── soundings.md ├── FireWxPy_docs.md ├── LICENSE ├── RAWS SIGs ├── EACC_StationList.csv ├── GBCC_StationList.csv ├── NRCC_StationList.csv ├── NWCC_StationList.csv ├── ONCC_StationList.csv ├── OSCC_StationList.csv ├── RMCC_StationList.csv ├── SACC_StationList.csv └── SWCC_StationList.csv ├── README.md ├── firewxpy.egg-info ├── PKG-INFO ├── SOURCES.txt ├── dependency_links.txt ├── requires.txt └── top_level.txt ├── firewxpy ├── NWS_Forecasts.py ├── RTMA.py ├── SPC_Outlook_Graphics.py ├── __init__.py ├── __pycache__ │ ├── NWS_Forecast_Graphics.cpython-310.pyc │ ├── __init__.cpython-310.pyc │ ├── calc.cpython-310.pyc │ ├── colormaps.cpython-310.pyc │ ├── data_access.cpython-310.pyc │ ├── geometry.cpython-310.pyc │ ├── parsers.cpython-310.pyc │ ├── settings.cpython-310.pyc │ ├── standard.cpython-310.pyc │ └── utilities.cpython-310.pyc ├── calc.py ├── colormaps.py ├── cross_sections.py ├── data_access.py ├── dims.py ├── forecast_models.py ├── fuels_graphics.py ├── geometry.py ├── observations.py ├── parsers.py ├── raws_sigs.py ├── sawti.py ├── settings.py ├── solar_information.py ├── soundings.py ├── standard.py └── utilities.py ├── firewxpy_citation.bib ├── pyproject.toml ├── pyproject.yml ├── setup.py ├── shapefiles ├── GACC Boundaries Shapefiles │ ├── National_GACC_Boundaries.xml │ ├── National_GACC_Current.cpg │ ├── National_GACC_Current.dbf │ ├── National_GACC_Current.prj │ ├── National_GACC_Current.shp │ └── National_GACC_Current.shx ├── NWS_CWA_Boundaries │ ├── w_05mr24.dbf │ ├── w_05mr24.prj │ ├── w_05mr24.shx │ └── w_05mr24.zip ├── NWS_Fire_Weather_Zones │ ├── fz05mr24.dbf │ ├── fz05mr24.prj │ ├── fz05mr24.shx │ └── fz05mr24.zip ├── NWS_Public_Zones │ ├── z_05mr24.dbf │ ├── z_05mr24.prj │ ├── z_05mr24.shx │ └── z_05mr24.zip └── PSA Shapefiles │ ├── National_PSA_Current.cpg │ ├── National_PSA_Current.dbf │ ├── National_PSA_Current.prj │ ├── National_PSA_Current.shp │ ├── National_PSA_Current.shx │ └── National_PSA_Current.xml └── tutorials └── Examples_Guide.md /Documentation/Landing_Page.md: -------------------------------------------------------------------------------- 1 | # **Table Of Contents** 2 | 3 | This is the landing page for all of the firewxpy documentation. The links below will direct you to the documentation for each firewxpy module. 4 | 5 | To visit the firewxpy tutorials page where you can see examples in jupyter lab - [click here](https://github.com/edrewitz/FireWxPy-Jupyter-Labs/blob/main/Examples_Guide.md) 6 | 7 | For video tutorials/demostrations checkout the FireWxPy Tutorial Series on the South Ops YouTube Channel - [click here](https://www.youtube.com/playlist?list=PLLKWSry9WlbPfeTWEQjuKIdNhYuxd8r96) 8 | 9 | **FireWxPy Graphics Classes And Functions** 10 | 11 | 1) [rtma](https://github.com/edrewitz/firewxpy/blob/main/Documentation/RTMA.md) 12 | 2) [spc](https://github.com/edrewitz/firewxpy/blob/main/Documentation/SPC_Outlook_Graphics.md) 13 | 3) [nws_temperature_forecast](https://github.com/edrewitz/firewxpy/blob/main/Documentation/NWS_Forecasts.md#temperature-class) 14 | 4) [nws_relative_humidity_forecast](https://github.com/edrewitz/firewxpy/blob/main/Documentation/NWS_Forecasts.md#relative-humidity-class) 15 | 5) [nws_critical_firewx_forecast](https://github.com/edrewitz/firewxpy/blob/main/Documentation/NWS_Forecasts.md#critical-fire-weather-class) 16 | 6) [model_dynamics](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#dynamics-class) 17 | 7) [model_temperature](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#temperature-class) 18 | 8) [model_relative_humidity](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#relative-humidity-class) 19 | 9) [model_critical_firewx_conditions](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#critical-firewx-conditions-class) 20 | 10) [model_precipitation](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#precipitation-class) 21 | 11) [time_cross_sections](https://github.com/edrewitz/firewxpy/blob/main/Documentation/cross_sections.md#time-cross-sections) 22 | 12) [two_point_cross_sections](https://github.com/edrewitz/firewxpy/blob/main/Documentation/cross_sections.md#cross-sections-between-two-points) 23 | 13) [gridded_obs](https://github.com/edrewitz/firewxpy/blob/main/Documentation/observations.md#gridded-observations-class) 24 | 14) [scatter_obs](https://github.com/edrewitz/firewxpy/blob/main/Documentation/observations.md#scatter-plot-observations-class) 25 | 15) [metar_obs](https://github.com/edrewitz/firewxpy/blob/main/Documentation/observations.md#metar-observations-class) 26 | 16) [plot_observed_sounding](https://github.com/edrewitz/firewxpy/blob/main/Documentation/soundings.md#plot_observed_soundingstation_id) 27 | 17) [plot_observed_sounding_custom_date_time](https://github.com/edrewitz/firewxpy/blob/main/Documentation/soundings.md#plot_observed_sounding_custom_date_timestation_id-year-month-day-hour) 28 | 18) [plot_forecast_soundings](https://github.com/edrewitz/firewxpy/blob/main/Documentation/soundings.md#plot_forecast_soundingsmodel-station_id) 29 | 19) [sawti](https://github.com/edrewitz/firewxpy/blob/main/Documentation/sawti.md) 30 | 20) [plot_daily_solar_information](https://github.com/edrewitz/firewxpy/blob/main/Documentation/solar_information.md#plot_daily_solar_informationlatitude-longitude) 31 | 21) [fuels charts](https://github.com/edrewitz/firewxpy/blob/main/Documentation/fuels_charts.md) 32 | 22) [ensemble_8_day_mean_eofs](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#ensemble-8-day-mean-and-eofs) 33 | 34 | **Additional Resources For Users Who Download The Data Outside Of The Function And Pass It In** 35 | 36 | *This is recommended for users generating a lot of graphics with the same dataset (i.e. a lot of RTMA graphics etc.)* 37 | 38 | *This method reduces the amount of data requests on the servers hosting the data* 39 | 40 | 1) [RTMA (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#rtma) 41 | 2) [NDFD_GRIDS (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#ndfd_grids) 42 | 3) [obs (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#obs) 43 | 4) [model_data (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#model_data) 44 | 5) [FEMS (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#fems) 45 | 6) [plot_creation_time](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#plot_creation_time) 46 | 7) [get_metar_mask](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#get_metar_maskstate-gacc_region-rtma_wsfalse) 47 | -------------------------------------------------------------------------------- /Documentation/fuels_charts.md: -------------------------------------------------------------------------------- 1 | # Table of Contents 2 | [create_psa_100hr_fuels_charts()](https://github.com/edrewitz/firewxpy/new/main/Documentation#create_psa_100hr_fuels_charts) 3 | 4 | [create_psa_1000hr_fuels_charts()](https://github.com/edrewitz/firewxpy/new/main/Documentation#create_psa_1000hr_fuels_charts) 5 | 6 | [create_psa_erc_fuels_charts()](https://github.com/edrewitz/firewxpy/new/main/Documentation#create_psa_erc_fuels_charts) 7 | 8 | [create_psa_bi_fuels_charts()](https://github.com/edrewitz/firewxpy/new/main/Documentation#create_psa_bi_fuels_charts) 9 | 10 | [create_psa_sc_fuels_charts()](https://github.com/edrewitz/firewxpy/new/main/Documentation#create_psa_sc_fuels_charts) 11 | 12 | [create_psa_ic_fuels_charts()](https://github.com/edrewitz/firewxpy/new/main/Documentation#create_psa_ic_fuels_charts) 13 | 14 | ### create_psa_100hr_fuels_charts() 15 | 16 | This function plots the 100hr dead fuel moisture for each Predictive Services Area for a specific Geographic Area Coordination Center. 17 | 18 | Required Arguments: 19 | 20 | 1) gacc_region (String) - The 4-letter GACC abbreviation 21 | 22 | Optional Arguments: 23 | 24 | 1) number_of_years_for_averages (Integer) - Default = 15. The number of years for the average values to be calculated on. 25 | 26 | 3) fuel_model (String) - Default = 'Y'. The fuel model being used. 27 | Fuel Models List: 28 | 29 | Y - Timber 30 | X - Brush 31 | W - Grass/Shrub 32 | V - Grass 33 | Z - Slash 34 | 35 | 4) start_date (String) - Default = None. If the user wishes to use a selected start date as the starting point enter the start_date 36 | as a string in the following format: YYYY-mm-dd 37 | 38 | 5) data (Boolean) - Default = False. When set to False, the function will download the new data. 39 | 40 | When set to True the function will use the existing data and not download new data. 41 | 42 | When making multiple types of plots, I recommend setting every function to have data=True except for the first function called in the script. 43 | 44 | Returns 45 | 46 | A graphic showing the 100hr dead fuel moisture for each PSA for a specific GACC saved to: f:Fuels Maps/{gacc_region}/100hr Dead Fuel 47 | 48 | 49 | ### create_psa_1000hr_fuels_charts() 50 | 51 | This function plots the 1000hr dead fuel moisture for each Predictive Services Area for a specific Geographic Area Coordination Center. 52 | 53 | Required Arguments: 54 | 55 | 1) gacc_region (String) - The 4-letter GACC abbreviation 56 | 57 | Optional Arguments: 58 | 59 | 1) number_of_years_for_averages (Integer) - Default = 15. The number of years for the average values to be calculated on. 60 | 61 | 3) fuel_model (String) - Default = 'Y'. The fuel model being used. 62 | Fuel Models List: 63 | 64 | Y - Timber 65 | X - Brush 66 | W - Grass/Shrub 67 | V - Grass 68 | Z - Slash 69 | 70 | 4) start_date (String) - Default = None. If the user wishes to use a selected start date as the starting point enter the start_date 71 | as a string in the following format: YYYY-mm-dd 72 | 73 | 5) data (Boolean) - Default = False. When set to False, the function will download the new data. 74 | 75 | When set to True the function will use the existing data and not download new data. 76 | 77 | When making multiple types of plots, I recommend setting every function to have data=True except for the first function called in the script. 78 | 79 | Returns 80 | 81 | A graphic showing the 1000hr dead fuel moisture for each PSA for a specific GACC saved to: f:Fuels Maps/{gacc_region}/1000hr Dead Fuel 82 | 83 | 84 | ### create_psa_erc_fuels_charts() 85 | 86 | This function plots the Energy Release Component (ERC) Values for each Predictive Services Area for a specific Geographic Area Coordination Center. 87 | 88 | Required Arguments: 89 | 90 | 1) gacc_region (String) - The 4-letter GACC abbreviation 91 | 92 | Optional Arguments: 93 | 94 | 1) number_of_years_for_averages (Integer) - Default = 15. The number of years for the average values to be calculated on. 95 | 96 | 3) fuel_model (String) - Default = 'Y'. The fuel model being used. 97 | Fuel Models List: 98 | 99 | Y - Timber 100 | X - Brush 101 | W - Grass/Shrub 102 | V - Grass 103 | Z - Slash 104 | 105 | 4) start_date (String) - Default = None. If the user wishes to use a selected start date as the starting point enter the start_date 106 | as a string in the following format: YYYY-mm-dd 107 | 108 | 5) data (Boolean) - Default = False. When set to False, the function will download the new data. 109 | 110 | When set to True the function will use the existing data and not download new data. 111 | 112 | When making multiple types of plots, I recommend setting every function to have data=True except for the first function called in the script. 113 | 114 | Returns 115 | 116 | A graphic showing the ERCs for each PSA for a specific GACC saved to: f:Fuels Maps/{gacc_region}/ERC 117 | 118 | 119 | ### create_psa_bi_fuels_charts() 120 | 121 | This function plots the Burning Index (BI) for each Predictive Services Area for a specific Geographic Area Coordination Center. 122 | 123 | Required Arguments: 124 | 125 | 1) gacc_region (String) - The 4-letter GACC abbreviation 126 | 127 | Optional Arguments: 128 | 129 | 1) number_of_years_for_averages (Integer) - Default = 15. The number of years for the average values to be calculated on. 130 | 131 | 3) fuel_model (String) - Default = 'Y'. The fuel model being used. 132 | Fuel Models List: 133 | 134 | Y - Timber 135 | X - Brush 136 | W - Grass/Shrub 137 | V - Grass 138 | Z - Slash 139 | 140 | 4) start_date (String) - Default = None. If the user wishes to use a selected start date as the starting point enter the start_date 141 | as a string in the following format: YYYY-mm-dd 142 | 143 | 5) data (Boolean) - Default = False. When set to False, the function will download the new data. 144 | 145 | When set to True the function will use the existing data and not download new data. 146 | 147 | When making multiple types of plots, I recommend setting every function to have data=True except for the first function called in the script. 148 | 149 | Returns 150 | 151 | A graphic showing the BIs for each PSA for a specific GACC saved to: f:Fuels Maps/{gacc_region}/BI 152 | 153 | ### create_psa_sc_fuels_charts() 154 | 155 | This function plots the Spread Component (SC) for each Predictive Services Area for a specific Geographic Area Coordination Center. 156 | 157 | Required Arguments: 158 | 159 | 1) gacc_region (String) - The 4-letter GACC abbreviation 160 | 161 | Optional Arguments: 162 | 163 | 1) number_of_years_for_averages (Integer) - Default = 15. The number of years for the average values to be calculated on. 164 | 165 | 3) fuel_model (String) - Default = 'Y'. The fuel model being used. 166 | Fuel Models List: 167 | 168 | Y - Timber 169 | X - Brush 170 | W - Grass/Shrub 171 | V - Grass 172 | Z - Slash 173 | 174 | 4) start_date (String) - Default = None. If the user wishes to use a selected start date as the starting point enter the start_date 175 | as a string in the following format: YYYY-mm-dd 176 | 177 | 5) data (Boolean) - Default = False. When set to False, the function will download the new data. 178 | 179 | When set to True the function will use the existing data and not download new data. 180 | 181 | When making multiple types of plots, I recommend setting every function to have data=True except for the first function called in the script. 182 | 183 | Returns 184 | 185 | A graphic showing the SCs for each PSA for a specific GACC saved to: f:Fuels Maps/{gacc_region}/SC 186 | 187 | ### create_psa_ic_fuels_charts() 188 | 189 | This function plots the Ignition Component (IC) for each Predictive Services Area for a specific Geographic Area Coordination Center. 190 | 191 | Required Arguments: 192 | 193 | 1) gacc_region (String) - The 4-letter GACC abbreviation 194 | 195 | Optional Arguments: 196 | 197 | 1) number_of_years_for_averages (Integer) - Default = 15. The number of years for the average values to be calculated on. 198 | 199 | 3) fuel_model (String) - Default = 'Y'. The fuel model being used. 200 | Fuel Models List: 201 | 202 | Y - Timber 203 | X - Brush 204 | W - Grass/Shrub 205 | V - Grass 206 | Z - Slash 207 | 208 | 4) start_date (String) - Default = None. If the user wishes to use a selected start date as the starting point enter the start_date 209 | as a string in the following format: YYYY-mm-dd 210 | 211 | 5) data (Boolean) - Default = False. When set to False, the function will download the new data. 212 | 213 | When set to True the function will use the existing data and not download new data. 214 | 215 | When making multiple types of plots, I recommend setting every function to have data=True except for the first function called in the script. 216 | 217 | Returns 218 | 219 | A graphic showing the ICs for each PSA for a specific GACC saved to: f:Fuels Maps/{gacc_region}/IC 220 | 221 | 222 | 223 | 224 | 225 | 226 | 227 | 228 | 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | -------------------------------------------------------------------------------- /Documentation/miscellaneous.md: -------------------------------------------------------------------------------- 1 | # **Table of Contents** 2 | 1) [Data Access Module](#data-access-module) 3 | 2) [Standard Module](#standard-module) 4 | 3) [Dims Module](#dims-module) 5 | 6 | 7 | 8 | ## ***Data Access Module*** 9 | 10 | **Classes** 11 | 12 | 1) [model_data](#model_data) 13 | 2) [RTMA](#rtma) 14 | 3) [NDFD_GRIDS](#ndfd_grids) 15 | 4) [obs](#obs) 16 | 5) [FEMS](#fems) 17 | 18 | ### model_data 19 | 20 | This class hosts the functions that return forecast model data from various different sources. 21 | 22 | *Functions* 23 | 24 | 1) [get_nomads_opendap_data()](#get_nomads_opendap_data) 25 | 2) [get_hourly_rap_data_point_forecast()](#get_hourly_rap_data_point_forecast) 26 | 3) [get_hourly_rap_data_area_forecast()](#get_hourly_rap_data_area_forecast) 27 | 4) [get_nomads_opendap_data_point_forecast()](#get_nomads_opendap_data_point_forecast) 28 | 5) [get_nomads_model_data_via_https()](#get_nomads_model_data_via_https) 29 | 6) [msc_datamart_datasets()](#msc_datamart_datasets) 30 | 31 | #### get_nomads_opendap_data() 32 | 33 | This function retrieves the latest forecast model data from NCEP/NOMADS OPENDAP. 34 | 35 | Required Arguments: 36 | 37 | 1) model (String) - The forecast model that is being used. 38 | 39 | 2) region (String) - The abbreviation for the region used. 40 | 41 | 3) western_bound (Integer or Float) - Default = None. Western extent of the plot in decimal degrees. 42 | The default setting is None. If set to None, the user must select a state or gacc_region. 43 | This setting should be changed from None to an integer or float value if the user wishes to 44 | have a custom area selected. Negative values denote the western hemisphere and positive 45 | values denote the eastern hemisphere. 46 | 47 | 4) eastern_bound (Integer or Float) - Default = None. Eastern extent of the plot in decimal degrees. 48 | The default setting is None. If set to None, the user must select a state or gacc_region. 49 | This setting should be changed from None to an integer or float value if the user wishes to 50 | have a custom area selected. Negative values denote the western hemisphere and positive 51 | values denote the eastern hemisphere. 52 | 53 | 5) southern_bound (Integer or Float) - Default = None. Southern extent of the plot in decimal degrees. 54 | The default setting is None. If set to None, the user must select a state or gacc_region. 55 | This setting should be changed from None to an integer or float value if the user wishes to 56 | have a custom area selected. Positive values denote the northern hemisphere and negative 57 | values denote the southern hemisphere. 58 | 59 | 6) northern_bound (Integer or Float) - Default = None. Northern extent of the plot in decimal degrees. 60 | The default setting is None. If set to None, the user must select a state or gacc_region. 61 | This setting should be changed from None to an integer or float value if the user wishes to 62 | have a custom area selected. Positive values denote the northern hemisphere and negative 63 | values denote the southern hemisphere. 64 | 65 | Optional Arguments: None 66 | 67 | Returns: An xarray.data_array of the forecast model data. 68 | 69 | #### get_hourly_rap_data_point_forecast() 70 | 71 | This function downloads and retrieves the latest data for the Rapid Refresh Model from the 72 | NCEP/NOMADS OPENDAP server. 73 | 74 | Required Arguments: 75 | 76 | 1) model (String) - The forecast model that is being used. 77 | Choices 1) RAP 2) RAP 32 (32km Full North America) 78 | 79 | 2) station_id (String) - The ID for the ASOS station. If the user wishes to pick a custom point 80 | that is not an ASOS location, enter 'Custom' or 'custom' for the station_id. 81 | 82 | 3) longitude (Integer or Float) - If the user is entering a custom location that is not an ASOS station location, 83 | enter the longitude value in this place in decimal degrees. If using an ASOS station location, enter None in this 84 | place. 85 | 86 | 4) latitude (Integer or Float) - If the user is entering a custom location that is not an ASOS station location, 87 | enter the latitude value in this place in decimal degrees. If using an ASOS station location, enter None in this 88 | place. 89 | 90 | Optional Arguments: None 91 | 92 | Returns: An xarray.data_array of the Rapid Refresh Model for the closest grid point to the specified location. 93 | 94 | #### get_hourly_rap_data_area_forecast() 95 | 96 | This function retrieves the latest dataset for the hourly RAP model from the NOAA/NCEP/NOMADS server. 97 | 98 | 1) model (String) - The forecast model that is being used. 99 | Choices 1) RAP 2) RAP 32 (32km Full North America) 100 | 101 | 2) region (String) - The abbreviation for the region used. 102 | 103 | 3) western_bound (Integer or Float) - Default = None. Western extent of the plot in decimal degrees. 104 | The default setting is None. If set to None, the user must select a state or gacc_region. 105 | This setting should be changed from None to an integer or float value if the user wishes to 106 | have a custom area selected. Negative values denote the western hemisphere and positive 107 | values denote the eastern hemisphere. 108 | 109 | 4) eastern_bound (Integer or Float) - Default = None. Eastern extent of the plot in decimal degrees. 110 | The default setting is None. If set to None, the user must select a state or gacc_region. 111 | This setting should be changed from None to an integer or float value if the user wishes to 112 | have a custom area selected. Negative values denote the western hemisphere and positive 113 | values denote the eastern hemisphere. 114 | 115 | 5) southern_bound (Integer or Float) - Default = None. Southern extent of the plot in decimal degrees. 116 | The default setting is None. If set to None, the user must select a state or gacc_region. 117 | This setting should be changed from None to an integer or float value if the user wishes to 118 | have a custom area selected. Positive values denote the northern hemisphere and negative 119 | values denote the southern hemisphere. 120 | 121 | 6) northern_bound (Integer or Float) - Default = None. Northern extent of the plot in decimal degrees. 122 | The default setting is None. If set to None, the user must select a state or gacc_region. 123 | This setting should be changed from None to an integer or float value if the user wishes to 124 | have a custom area selected. Positive values denote the northern hemisphere and negative 125 | values denote the southern hemisphere. 126 | 127 | Optional Arguments: 128 | 129 | 1) two_point_cross_section (Boolean) - Default = False. When downloading the data and intending to make a cross-section 130 | between two points, set two_point_cross_section=True. 131 | 132 | Returns: An xarray.data_array of the forecast model data. 133 | 134 | #### get_nomads_opendap_data_point_forecast() 135 | 136 | This function downloads and retrieves the latest data for the forecast model data from the 137 | NCEP/NOMADS OPENDAP server. 138 | 139 | Required Arguments: 140 | 141 | 1) model (String) - The forecast model that is being used. 142 | 143 | 2) station_id (String) - The ID for the ASOS station. If the user wishes to pick a custom point 144 | that is not an ASOS location, enter 'Custom' or 'custom' for the station_id. 145 | 146 | 3) longitude (Integer or Float) - If the user is entering a custom location that is not an ASOS station location, 147 | enter the longitude value in this place in decimal degrees. If using an ASOS station location, enter None in this 148 | place. 149 | 150 | 4) latitude (Integer or Float) - If the user is entering a custom location that is not an ASOS station location, 151 | enter the latitude value in this place in decimal degrees. If using an ASOS station location, enter None in this 152 | place. 153 | 154 | Optional Arguments: None 155 | 156 | Returns: An xarray.data_array of the forecast model data for the closest grid point to the specified location. 157 | 158 | #### get_nomads_model_data_via_https() 159 | 160 | This function grabs the latest model data from the NOAA/NCEP/NOMADS HTTPS Server and returns it to the user. 161 | 162 | Required Arguments: 163 | 164 | 1) model (String) - This is the model the user must select. 165 | 166 | Here are the choices: 167 | 1) GEFS0p25 ENS MEAN - GEFS 0.25x0.25 degree ensemble mean 168 | 2) GEFS0p25 CHEM - GEFS 0.25x0.25 coarse and fine particulates 169 | 3) GEFS0p50 CHEM - GEFS 0.5x0.5 coarse and fine particulates 170 | 4) UKMET - UKMET model 171 | 172 | 2) region (String) - This is the region the user wishes to look at. There are a lot of preset regions. 173 | To look at any state use the 2-letter abbreviation for the state in either all capitals 174 | or all lowercase. For CONUS, use CONUS in all caps or lower case. For a broad view of the 175 | CONUS, Southern Canada and Northern Mexico use: 'CONUS & South Canada & North Mexico'. For 176 | North America use either: NA, na, North America or north america. If the user wishes to use custom 177 | boundaries, then enter 'Custom' or 'custom'. For Geographic Area Coordination Centers you can use 178 | the 4-letter abbreviation in all caps or lower case so for example you would use either 'OSCC' or 179 | 'oscc' for South Ops. 180 | 181 | 3) typeOfLevel (String) - This determines which parameters are available for the GEFS 0.25x0.25 Ensemble Mean. The choices are as 182 | follows: 183 | 184 | 1) surface 185 | 2) meanSea 186 | 3) depthBelowLandLayer 187 | 4) heightAboveGround 188 | 5) atmosphereSingleLayer 189 | 6) cloudCeiling 190 | 7) heightAboveGroundLayer 191 | 8) pressureFromGroundLayer 192 | 193 | For both the UKMET and GEFS CHEM you can enter a value of None here. 194 | 195 | 4) western_bound (Integer) - The western boundary of the plot. This is only required when the user wishes to make a plot with 196 | custom boundaries. This should be set to None if the user wishes to use a pre-defined region. 197 | 198 | 199 | 5) eastern_bound (Integer) - The eastern boundary of the plot. This is only required when the user wishes to make a plot with 200 | custom boundaries. This should be set to None if the user wishes to use a pre-defined region. 201 | 202 | 203 | 6) southern_bound (Integer) - The southern boundary of the plot. This is only required when the user wishes to make a plot with 204 | custom boundaries. This should be set to None if the user wishes to use a pre-defined region. 205 | 206 | 207 | 7) northern_bound (Integer) - The northern boundary of the plot. This is only required when the user wishes to make a plot with 208 | custom boundaries. This should be set to None if the user wishes to use a pre-defined region. 209 | 210 | Optional Arguments: 211 | 212 | 1) get_u_and_v_wind_components (Boolean) - Default = False. When having the typeOfLevel set to 'heightAboveGround' there is an issue 213 | with retrieving the u and v wind components. You will see an error message. Fortunately, 214 | in FireWxPy we fix that for you so you can disregard the errors. When setting this value to True 215 | you will also return lists of the u and v datasets. 216 | 217 | 2) add_wind_gusts (Boolean) - Default = True. When having get_u_and_v_wind_components=True, you can opt to add an additional list to be 218 | returned which will have the wind gust dataset. 219 | 220 | Returns: Depending on the values you enter above determines how many lists of datasets are returned. 221 | If the user does not use 'GEFS0p25 ENS MEAN' for the model of choice, a single list of the datasets are returned. 222 | If the user uses 'GEFS0p25 ENS MEAN' and does not have typeOfLevel set to 'heightAboveGround', a single list of the datasets are returned. 223 | If the user uses 'GEFS0p25 ENS MEAN' and does have typeOfLevel set to 'heightAboveGround' while get_u_and_v_wind_components=False, a single list of the datasets are returned. 224 | If the user uses 'GEFS0p25 ENS MEAN' and does have typeOfLevel set to 'heightAboveGround' while get_u_and_v_wind_components=True and get_u_and_v_wind_components=False, 225 | a list of the 'heightAboveGround' datasets, u-wind datasets and v-wind datasets will be returned. 226 | If the user uses 'GEFS0p25 ENS MEAN' and does have typeOfLevel set to 'heightAboveGround' while get_u_and_v_wind_components=True and get_u_and_v_wind_components=True, 227 | a list of the 'heightAboveGround' datasets, u-wind datasets, v-wind datasets and gust datasets will be returned. 228 | 229 | #### msc_datamart_datasets() 230 | 231 | This function retrieves the latest data from the Canadian RDPA 232 | 233 | Required Arguments: 234 | 235 | 1) product (String) - The type of product: 1) 'RDPA 6hr' 2) 'RDPA 24hr' 236 | 237 | Optional Arguments: None 238 | 239 | Returns: An xarray.data_array of the latest RDPA data. 240 | 241 | ### RTMA 242 | 243 | This class hosts the active functions that download the 2.5km x 2.5km Real Time Mesoscale Analysis (RTMA) Data. 244 | 245 | This class hosts the functions the users will import and call if the users wish to download the data outside of the 246 | plotting function and pass the data into the plotting function. 247 | 248 | This is the recommended method for users who wish to create a large amount of graphics at one time to limit the number of server requests. 249 | 250 | *Functions* 251 | 252 | 1) [get_rtma_datasets()](#get_rtma_datasets) 253 | 254 | #### get_rtma_datasets() 255 | 256 | This function retrieves the latest RTMA Dataset and the RTMA Dataset for 24-Hours prior to the current dataset for the user. 257 | 258 | Data Source: NOAA/NCEP/NOMADS (https://nomads.ncep.noaa.gov/) 259 | 260 | Required Arguments: 261 | 262 | 1) region (String) - The abbreviation for the region (state, GACC Region, CONUS, etc.) 263 | 264 | 2) Current Time in UTC 265 | 266 | Returns: 267 | 268 | 1) The latest 2.5km x 2.5km RTMA Dataset 269 | 270 | 2) 1) The 2.5km x 2.5km RTMA Dataset from 24-Hours prior to the current dataset 271 | 272 | 3) The time corresponding to the dataset 273 | 274 | 4) The time corresponding to the dataset from 24-Hours prior to the current dataset 275 | 276 | ### NDFD_GRIDS 277 | 278 | This class hosts the active function that downloads the NOAA/NWS/NDFD Gridded Data. 279 | 280 | This class hosts the function the users will import and call if the users wish to download the data outside of the 281 | plotting function and pass the data into the plotting function. 282 | 283 | This is the recommended method for users who wish to create a large amount of graphics at one time to limit the number of server requests. 284 | 285 | *Functions* 286 | 287 | 1) [get_ndfd_grids_xarray()](#get_ndfd_grids_xarray) 288 | 289 | #### get_ndfd_grids_xarray() 290 | 291 | This function retrieves the latest NWS Forecast (NDFD) files from the NWS FTP Server. 292 | 293 | Data Source: NOAA/NWS/NDFD (tgftp.nws.noaa.gov) 294 | 295 | Required Arguments: 296 | 297 | 1) directory_name (String) - The name of the directory (see FireWxPy documentation for directory paths) 298 | 299 | 2) parameter (String) - The parameter that the user wishes to download. (i.e. ds.maxt.bin for max temperature) 300 | 301 | 3) state (String) - The state or region being used. 302 | 303 | Returns: An xarray.data_array of the latest NWS/SPC Forecast data 304 | 305 | *Directory List* 306 | 307 | ALASKA: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.alaska/ 308 | 309 | CONUS: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.conus/ 310 | 311 | CENTRAL GREAT LAKES: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.crgrlake/ 312 | 313 | CENTRAL MISSISSIPPI VALLEY: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.crmissvy/ 314 | 315 | CENTRAL PLAINS: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.crplains/ 316 | 317 | CENTRAL ROCKIES: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.crrocks/ 318 | 319 | EASTERN GREAT LAKES: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.ergrlake/ 320 | 321 | GUAM: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.guam/ 322 | 323 | HAWAII: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.hawaii/ 324 | 325 | MID-ATLANTIC: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.midatlan/ 326 | 327 | NORTHEAST: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.neast/ 328 | 329 | NORTHERN HEMISPHERE: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.nhemi/ 330 | 331 | NORTH PACIFIC OCEAN: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.npacocn/ 332 | 333 | NORTHERN PLAINS: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.nplains/ 334 | 335 | NORTHERN ROCKIES: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.nrockies/ 336 | 337 | OCEANIC: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.oceanic/ 338 | 339 | PACIFIC NORTHWEST: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.pacnwest/ 340 | 341 | PACIFIC SOUTHWEST: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.pacswest/ 342 | 343 | PUERTO RICO: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.puertori/ 344 | 345 | SOUTHEAST: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.seast/ 346 | 347 | SOUTHERN MISSISSIPPI VALLEY: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.smissvly/ 348 | 349 | SOUTHERN PLAINS: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.splains/ 350 | 351 | SOUTHERN ROCKIES: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.srockies/ 352 | 353 | UPPER MISSISSIPPI VALLEY: /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.umissvly/ 354 | 355 | ### obs 356 | 357 | This class hosts functions to access observational data 358 | 359 | *Functions* 360 | 361 | 1) [previous_day_weather_summary()](#previous_day_weather_summary) 362 | 2) [get_metar_data()](#get_metar_data) 363 | 364 | #### previous_day_weather_summary() 365 | 366 | This function retrieves the 24 hour observations for the previous day and returns the extreme maximum and minimum values as well as the times associated with those values. 367 | 368 | Inputs: 369 | 1) station_id (String) - The 4 letter station identifier for the observational site. 370 | 371 | Returns: 372 | 1) Maximum Temperature (°F) 373 | 2) The time the maximum temperature occurred 374 | 3) Minimum Temperature (°F) 375 | 4) The time the minimum temperature occurred 376 | 5) Minimum Relative Humidity (%) 377 | 6) The time the minimum relative humidity occurred 378 | 7) Maximum Relative Humidity (%) 379 | 8) The time the maximum relative humidity occurred 380 | 9) Maximum Wind Speed (MPH) 381 | 10) The time the maximum wind speed occurred 382 | 11) Maximum Wind Gust (MPH) 383 | 12) The time the maximum wind gust occurred 384 | 385 | #### get_metar_data() 386 | 387 | This function downloads and returns the latest METAR data. 388 | 389 | Inputs: None 390 | 391 | Returns: 392 | 393 | 1) df (Pandas DataFrame) - DataFrame of the latest METAR data 394 | 395 | 2) time (datetime) - The time of the latest METAR dataset 396 | 397 | ### FEMS 398 | 399 | This class hosts functions to retrieve the latest fuels data from FEMS 400 | 401 | *Functions* 402 | 403 | 1) [get_single_station_data()](#get_single_station_data) 404 | 405 | #### get_single_station_data() 406 | 407 | This function retrieves the dataframe for a single RAWS station in FEMS 408 | 409 | Required Arguments: 410 | 411 | 1) station_id (Integer) - The WIMS or RAWS ID of the station. 412 | 413 | 2) number_of_days (Integer or String) - How many days the user wants the summary for (90 for 90 days). 414 | If the user wants to use a custom date range enter 'Custom' or 'custom' in this field. 415 | 416 | Optional Arguments: 417 | 418 | 1) start_date (String) - Default = None. The start date if the user wants to define a custom period. Enter as a string 419 | in the following format 'YYYY-mm-dd' 420 | 421 | 2) end_date (String) - Default = None. The end date if the user wants to define a custom period. Enter as a string 422 | in the following format 'YYYY-mm-dd' 423 | 424 | 3) fuel_model (String) - Default = 'Y'. The fuel model being used. 425 | Fuel Models List: 426 | 427 | Y - Timber 428 | X - Brush 429 | W - Grass/Shrub 430 | V - Grass 431 | Z - Slash 432 | 433 | 4) to_csv (Boolean) - Default = True. This will save the data into a CSV file and build a directory to hold the CSV files. 434 | 435 | Returns: A Pandas DataFrame of the NFDRS data from FEMS. 436 | 437 | 438 | ## ***Standard Module*** 439 | 440 | ***Functions*** 441 | 442 | 1) [plot_creation_time()](#plot_creation_time) 443 | 444 | #### plot_creation_time() 445 | 446 | This function uses the datetime module to find the time at which the script ran. 447 | 448 | This can be used in many ways: 449 | 450 | 1) Timestamp for graphic in both local time and UTC 451 | 2) When downloading data with functions in the data_access module, this function is called to find 452 | the time which is passed into the data downloading functions in order for the latest data to be 453 | downloaded. 454 | 455 | There are no variables to pass into this function. 456 | 457 | Returns: 458 | 459 | 1) Current Local Time 460 | 2) Current UTC Time 461 | 462 | ## ***Dims Module*** 463 | 464 | ***Functions*** 465 | 466 | 1) [get_metar_mask(state, gacc_region, rtma_ws=False)](#get_metar_maskstate-gacc_region-rtma_wsfalse) 467 | 468 | #### get_metar_mask(state, gacc_region, rtma_ws=False) 469 | 470 | This function returns the METAR mask for a given state or GACC region. 471 | 472 | Required Arguments: 473 | 474 | 1) state (String) - The two letter state abbreviation for the state the user wishes to make the graphic for. 475 | If the user wishes to make a graphic for the entire CONUS, there are 4 acceptable abbreviations: 'US' or 'us' 476 | or 'USA' or 'usa'. Example: If the user wishes to make a plot for the state of California both 'CA' or 'ca' are 477 | acceptable. Default setting is 'us'. If the user wishes to make a plot based on gacc_region, this value must be 478 | changed to None. 479 | 480 | 481 | 2) gacc_region (String) - The abbreviation for each of the 10 GACC regions. Default setting is None. 482 | If the user wishes to make a plot based on GACC Region than state, the state variable must be set to 483 | None and the gacc_region variable must be set to one of the acceptable abbreviations. 484 | 485 | Here is a list of acceptable gacc_region abbreviations: 486 | 487 | South Ops: 'OSCC' or 'oscc' or 'SOPS' or 'sops' 488 | 489 | North Ops: 'ONCC' or 'oncc' or 'NOPS' or 'nops' 490 | 491 | Great Basin: 'GBCC' or 'gbcc' or 'GB' or 'gb' 492 | 493 | Northern Rockies: 'NRCC' or 'nrcc' or 'NR' or 'nr' 494 | 495 | Rocky Mountain: 'RMCC' or 'rmcc' or 'RM' or 'rm' 496 | 497 | Southwest: 'SWCC' or 'swcc' or 'SW' or 'sw' 498 | 499 | Southern: 'SACC' or 'sacc' or 'SE' or 'se' 500 | 501 | Eastern: 'EACC' or 'eacc' or 'E' or 'e' 502 | 503 | Pacific Northwest: 'PNW' or 'pnw' or 'NWCC' or 'nwcc' or 'NW' or 'nw' 504 | 505 | Alaska: Setting state='AK' or state='ak' suffices here. Leave gacc_region=None and set the state variable as shown. 506 | 507 | Optional Arguments: 508 | 509 | 1) rtma_ws (Boolean) - Default = False. When set to False, the mask value returned is for when the user wants to create full station plots. 510 | When rtma_ws=True, the mask returned is for when the user is only plotting wind barbs of observed winds from the METAR observations rather than the full station plot. 511 | 512 | Returns: The value of the mask applied to the METAR observations. This way station plots aren't cluttered over each other. 513 | 514 | 515 | 516 | 517 | 518 | 519 | 520 | -------------------------------------------------------------------------------- /Documentation/sawti.md: -------------------------------------------------------------------------------- 1 | # **SANTA ANA WILDFIRE THREAT INDEX** 2 | 3 | ### sawti() 4 | 5 | This function calculates the The Santa Ana Wildfire Threat Index from Rolinski et al. 2016. The function downloads the .CSV files holding the data, performs the Large Fire Potential (LFP) calculation and makes a bar graph 6 | for each zone. 7 | 8 | Literature Citation: Rolinski, T., S. B. Capps, R. G. Fovell, Y. Cao, B. J. D’Agostino, and S. Vanderburg, 2016: The Santa Ana Wildfire Threat Index: Methodology and Operational Implementation. Wea. Forecasting, 31, 1881–1897, https://doi.org/10.1175/WAF-D-15-0141.1. 9 | 10 | Required Arguments: None 11 | 12 | Optional Arguments: 13 | 14 | 1) zone_1_threshold_1 (Integer) - Default = 10. This is the LFP threshold that seprates no rating (green zone) and a marginal risk (yellow zone) for zone 1. 15 | 2) zone_1_threshold_2 (Integer) - Default = 15. This is the LFP threshold that seprates a marginal risk (yellow zone) and a moderate risk (orange zone) for zone 1. 16 | 3) zone_1_threshold_3 (Integer) - Default = 21. This is the LFP threshold that seprates a moderate risk (orange zone) and a high risk (red zone) for zone 1. 17 | 4) zone_1_threshold_4 (Integer) - Default = 40. This is the LFP threshold that seprates a high risk (red zone) and an extreme risk (purple zone) for zone 1. 18 | 5) zone_2_threshold_1 (Integer) - Default = 9. This is the LFP threshold that seprates no rating (green zone) and a marginal risk (yellow zone) for zone 2. 19 | 6) zone_2_threshold_2 (Integer) - Default = 13. This is the LFP threshold that seprates a marginal risk (yellow zone) and a moderate risk (orange zone) for zone 2. 20 | 7) zone_2_threshold_3 (Integer) - Default = 20. This is the LFP threshold that seprates a moderate risk (orange zone) and a high risk (red zone) for zone 2. 21 | 8) zone_2_threshold_4 (Integer) - Default = 28. This is the LFP threshold that seprates a high risk (red zone) and an extreme risk (purple zone) for zone 2. 22 | 9) zone_3_threshold_1 (Integer) - Default = 10. This is the LFP threshold that seprates no rating (green zone) and a marginal risk (yellow zone) for zone 3. 23 | 10) zone_3_threshold_2 (Integer) - Default = 16. This is the LFP threshold that seprates a marginal risk (yellow zone) and a moderate risk (orange zone) for zone 3. 24 | 11) zone_3_threshold_3 (Integer) - Default = 24. This is the LFP threshold that seprates a moderate risk (orange zone) and a high risk (red zone) for zone 3. 25 | 12) zone_3_threshold_4 (Integer) - Default = 36. This is the LFP threshold that seprates a high risk (red zone) and an extreme risk (purple zone) for zone 3. 26 | 13) zone_4_threshold_1 (Integer) - Default = 9. This is the LFP threshold that seprates no rating (green zone) and a marginal risk (yellow zone) for zone 4. 27 | 14) zone_4_threshold_2 (Integer) - Default = 12. This is the LFP threshold that seprates a marginal risk (yellow zone) and a moderate risk (orange zone) for zone 4. 28 | 15) zone_4_threshold_3 (Integer) - Default = 15. This is the LFP threshold that seprates a moderate risk (orange zone) and a high risk (red zone) for zone 4. 29 | 16) zone_4_threshold_4 (Integer) - Default = 25. This is the LFP threshold that seprates a high risk (red zone) and an extreme risk (purple zone) for zone 4. 30 | 17) zone_1_W_weight (Float or Integer) - Default = 1. This is the weight to multiply the wind-squared value by for zone 1. 31 | 18) zone_1_DD_weight (Float or Integer) - Default = 1. This is the weight to multiply the dew point depression value by for zone 1. 32 | 19) zone_1_FMC_weight (Float or Integer) - Default = 1. This is the weight to multiply the fuel moisture component value by for zone 1. 33 | 20) zone_2_W_weight (Float or Integer) - Default = 1. This is the weight to multiply the wind-squared value by for zone 2. 34 | 21) zone_2_DD_weight (Float or Integer) - Default = 1. This is the weight to multiply the dew point depression value by for zone 2. 35 | 22) zone_2_FMC_weight (Float or Integer) - Default = 1. This is the weight to multiply the fuel moisture component value by for zone 2. 36 | 23) zone_3_W_weight (Float or Integer) - Default = 1. This is the weight to multiply the wind-squared value by for zone 3. 37 | 24) zone_3_DD_weight (Float or Integer) - Default = 1. This is the weight to multiply the dew point depression value by for zone 3. 38 | 25) zone_3_FMC_weight (Float or Integer) - Default = 1. This is the weight to multiply the fuel moisture component value by for zone 3. 39 | 26) zone_4_W_weight (Float or Integer) - Default = 1. This is the weight to multiply the wind-squared value by for zone 4. 40 | 27) zone_4_DD_weight (Float or Integer) - Default = 1. This is the weight to multiply the dew point depression value by for zone 4. 41 | 28) zone_4_FMC_weight (Float or Integer) - Default = 1. This is the weight to multiply the fuel moisture component value by for zone 4. 42 | 43 | Returns: A graphic showing the LFP forecast for each zone saved to f:Weather Data/SAWTI. 44 | -------------------------------------------------------------------------------- /Documentation/solar_information.md: -------------------------------------------------------------------------------- 1 | # **Solar Information** 2 | 3 | **Functions** 4 | [plot_daily_solar_information(latitude, longitude)](#plot_daily_solar_informationlatitude-longitude) 5 | 6 | ### plot_daily_solar_information(latitude, longitude) 7 | 8 | This function plots a daily solar graph and gives other types of solar information. 9 | 10 | Required Arguments: 11 | 12 | 1) latitude (Float) - The latitude coordinate in decimal degrees format. 13 | 2) longitude (Float) - The longitude coordinate in decimal degrees format. 14 | 15 | Optional Arguments: None 16 | 17 | Return: A graphic showing the following information saved to f:Weather Data/Solar Information: 18 | 19 | 1) Daily solar elevation graphic 20 | 2) A data table showing the following information: 21 | i) Maximum Daily Solar Elevation (solar-noon sun angle) 22 | ii) Minimum Daily Solar Elevation (solar-midnight sun angle) 23 | iii) Difference in daily solar elevation between current day, equinox, summer solstice and winter solstice 24 | iv) Total Daily Solar Radiation [W/m^2] 25 | -------------------------------------------------------------------------------- /Documentation/soundings.md: -------------------------------------------------------------------------------- 1 | # **Soundings** 2 | 3 | ### **Functions** 4 | 1) [plot_observed_sounding(station_id)](#plot_observed_soundingstation_id) 5 | 2) [plot_observed_sounding_custom_date_time(station_id, year, month, day, hour)](#plot_observed_sounding_custom_date_timestation_id-year-month-day-hour) 6 | 3) [plot_forecast_soundings(model, station_id)](#plot_forecast_soundingsmodel-station_id) 7 | 8 | ### plot_observed_sounding(station_id) 9 | 10 | This function downloads the latest avaliable sounding data from the University of Wyoming and plots the upper-air profiles. 11 | 12 | Required Arguments: 13 | 14 | 1) station_id (String) - The 3 or 4 letter station identifier for the upper-air site. 15 | 16 | Example: San Diego, CA will be entered as plot_observed_sounding('nkx') 17 | 18 | Optional Arguments: None 19 | 20 | Returns: Saves the upper-air profiles graphic to the Soundings folder. 21 | 22 | ### plot_observed_sounding_custom_date_time(station_id, year, month, day, hour) 23 | 24 | This function downloads the latest avaliable sounding data from the University of Wyoming and plots the upper-air profiles. 25 | 26 | Required Arguments: 27 | 28 | 1) station_id (String) - The 3 or 4 letter station identifier for the upper-air site. 29 | Example: San Diego, CA will be entered as plot_observed_sounding('nkx') 30 | 31 | 2) year (Integer) - The four digit year (i.e. 2024) 32 | 33 | 3) month (Integer) - The one or two digit month. 34 | 35 | 4) day (Integer) - The nth day of the month. 36 | 37 | 5) hour (Integer) - The hour of the sounding in UTC. 38 | 39 | Optional Arguments: None 40 | 41 | Returns: Saves the upper-air profiles graphic to the Soundings folder. 42 | 43 | ### plot_forecast_soundings(model, station_id) 44 | 45 | This function plots the vertical profile forecasts for a given point and shows the transport wind and precipitation forecast in the vicinity of the point. 46 | 47 | Required Arguments: 48 | 49 | 1) model (String) - This is the model the user must select. 50 | 51 | Here are the choices: 52 | 1) GFS0p25 - GFS 0.25x0.25 degree 53 | 2) GFS0p25_1h - GFS 0.25x0.25 degree with 1 hour intervals 54 | 3) GFS0p50 - GFS 0.5x0.5 degree 55 | 4) GFS1p00 - GFS 1.0x1.0 degree 56 | 5) NAM - North American Model 57 | 6) NAM 1hr - North American Model with 1 hour intervals 58 | 7) RAP - RAP for the CONUS 59 | 8) RAP 32 - 32km North American RAP 60 | 61 | 2) station_id (String) - The 4-letter airport station identifier. 62 | If the user wants to choose a custom point that is not an airport - enter: 'Custom' or 'custom'. 63 | 64 | Optional Arguments: 65 | 66 | 1) longitude (Float or Integer) - Default = None. The longitude of the point in decimal degrees. 67 | 68 | 2) latitude (Float or Integer) - Default = None. The latitude of the point in decimal degrees. 69 | 70 | 3) data (Boolean) - Default = False. This tells the function if the user is downloading the data outside of the function 71 | and passing the data in or if the function needs to download the data. A value of False means the data 72 | is downloaded inside of the function while a value of True means the user is downloading the data outside 73 | of the function and passing it in. For users who intend to make a lot of graphics for a lot of different 74 | things, it is recommended to set this value to True and download the data outside of the function and pass 75 | it in so that the amount of data requests on the host servers can be minimized. 76 | 77 | 78 | 4) ds (Array) - Default = None. This is the dataset the user passes in if the user downloads the data outside of the function and passes 79 | in the dataset. If the user wishes to download the data inside of the function, this value is None. When downloading data 80 | outside of the function and passing in the data, this is for any model that is NOT the 'GEFS0p25 ENS MEAN'. 81 | 82 | 5) reference_system (String) - Default = 'States Only'. The georgraphical reference system with respect to the borders on the map. If the user 83 | wishes to use a reference system not on this list, please see items 17-23. 84 | 85 | Reference Systems: 86 | 87 | 1) 'States & Counties' 88 | 2) 'States Only' 89 | 3) 'GACC Only' 90 | 4) 'GACC & PSA' 91 | 5) 'CWA Only' 92 | 6) 'NWS CWAs & NWS Public Zones' 93 | 7) 'NWS CWAs & NWS Fire Weather Zones' 94 | 8) 'NWS CWAs & Counties' 95 | 9) 'GACC & PSA & NWS Fire Weather Zones' 96 | 10) 'GACC & PSA & NWS Public Zones' 97 | 11) 'GACC & PSA & NWS CWA' 98 | 12) 'GACC & PSA & Counties' 99 | 13) 'GACC & Counties' 100 | 101 | 102 | 6) show_state_borders (Boolean) - If set to True, state borders will display. If set to False, state borders will not display. 103 | Default setting is False. Users should change this value to False if they wish to hide state borders. 104 | 105 | 7) show_county_borders (Boolean) - If set to True, county borders will display. If set to False, county borders will not display. 106 | Default setting is False. Users should change this value to False if they wish to hide county borders. 107 | 108 | 8) show_gacc_borders (Boolean) - If set to True, GACC (Geographic Area Coordination Center) borders will display. If set to False, GACC borders will not display. 109 | Default setting is False. Users should change this value to True if they wish to display GACC borders. 110 | 111 | 9) show_psa_borders (Boolean) - If set to True, PSA (Predictive Services Area) borders will display. If set to False, PSA borders will not display. 112 | Default setting is False. Users should change this value to True if they wish to display PSA borders. 113 | 114 | 10) show_cwa_borders (Boolean) - If set to True, CWA borders will display. If set to False, CWA borders will not display. 115 | Default setting is False. Users should change this value to True if they wish to display CWA borders. 116 | 117 | 11) show_nws_firewx_zones (Boolean) - If set to True, NWS FWZ borders will display. If set to False, NWS FWZ borders will not display. 118 | Default setting is False. Users should change this value to True if they wish to display NWS FWZ borders. 119 | 120 | 12) show_nws_public_zones (Boolean) - If set to True, NWS Public Zone borders will display. If set to False, NWS Public Zone borders will not display. 121 | Default setting is False. Users should change this value to True if they wish to display NWS Public Zone borders. 122 | 123 | 13) state_border_linewidth (Integer or Float) - Linewidth (thickness) of the state borders. Default setting is 1. 124 | 125 | 14) province_border_linewidth (Integer or Float) - Linewidth (thickness) of the Canadian province borders. Default setting is 1. 126 | 127 | 15) county_border_linewidth (Integer or Float) - Linewidth (thickness) of the county borders. Default setting is 0.25. 128 | 129 | 16) gacc_border_linewidth (Integer or Float) - Linewidth (thickness) of the GACC borders. Default setting is 1. 130 | 131 | 17) psa_border_linewidth (Integer or Float) - Linewidth (thickness) of the PSA borders. Default setting is 0.25. 132 | 133 | 18) cwa_border_linewidth (Integer or Float) - Linewidth (thickness) of the NWS CWA borders. Default setting is 1. 134 | 135 | 19) nws_firewx_zones_linewidth (Integer or Float) - Linewidth (thickness) of the NWS FWZ borders. Default setting is 0.25. 136 | 137 | 20) nws_public_zones_linewidth (Integer or Float) - Linewidth (thickness) of the NWS Public Zone borders. Default setting is 0.25. 138 | 139 | 21) state_border_linestyle (String) - Linestyle of the state borders. Default is a solid line. 140 | To change to a dashed line, users should set state_border_linestyle='--'. 141 | 142 | 22) county_border_linestyle (String) - Linestyle of the county borders. Default is a solid line. 143 | To change to a dashed line, users should set county_border_linestyle='--'. 144 | 145 | 23) gacc_border_linestyle (String) - Linestyle of the GACC borders. Default is a solid line. 146 | To change to a dashed line, users should set gacc_border_linestyle='--'. 147 | 148 | 24) psa_border_linestyle (String) - Linestyle of the PSA borders. Default is a solid line. 149 | To change to a dashed line, users should set psa_border_linestyle='--'. 150 | 151 | 25) cwa_border_linestyle (String) - Linestyle of the CWA borders. Default is a solid line. 152 | To change to a dashed line, users should set psa_border_linestyle='--'. 153 | 154 | 26) nws_firewx_zones_linestyle (String) - Linestyle of the NWS FWZ borders. Default is a solid line. 155 | To change to a dashed line, users should set psa_border_linestyle='--'. 156 | 157 | 27) nws_public_zones_linestyle (String) - Linestyle of the NWS Public Zone borders. Default is a solid line. 158 | To change to a dashed line, users should set psa_border_linestyle='--'. 159 | 160 | Returns: A set of forecast vertical profile graphics saved to f:Weather Data/Forecast Model Data/{model}/Soundings/{latitude}{lat_symbol}/{longitude}{lon_symbol}/{reference_system} 161 | -------------------------------------------------------------------------------- /FireWxPy_docs.md: -------------------------------------------------------------------------------- 1 | firewxpy logo 2 | 3 | 4 | # **Welcome To FireWxPy** 5 | 6 | Thank you for choosing to use FireWxPy in your weather operations and/or research. The purpose of this package is to help fellow meteorologists create realtime data visualizations of weather data with an emphasis on fire weather. The goal of this project is to make creating these graphics with the least amount of work required for the user. These graphics are designed to be part of a script that is being automatically run via either a Cron Job or via the Windows Task Scheduler. These plots display National Weather Service forecast data as well as 2.5km x 2.5km Real Time Mesoscale Analysis data from the UCAR THREDDS server: https://www.unidata.ucar.edu/software/tds/ 7 | 8 | # **The Role of the User** 9 | 10 | FireWxPy does at least 95% of the work for the user to create data visualizations of various types of weather analysis and forecast data. However, there is still plenty of customization for the users. 11 | 12 | Here is what the user will still be responsible for: 13 | 14 | 1. Importing the needed Python modules 15 | 2. Choosing the bounds for the plot in latitude/longitude coordinates. 16 | 3. There is a function where the user can customize the title, colorscale, colorbar, figure size and weather parameter of a plot. 17 | 4. There are also plenty of preset plots that the user will be able to call functions from the `FireWxPy_Plots` module. 18 | 19 | # **Table of Contents** 20 | 21 | **Data Access Module** 22 | 23 | [Retrieving the NWS Days 1-3 NDFD Gridded Data](#1-retrieving-the-nws-days-1-3-ndfd-gridded-data) 24 | 25 | [Retrieving the NWS Days 4-7 NDFD Gridded Data](#2-retrieving-the-nws-days-4-7-ndfd-gridded-data) 26 | 27 | 28 | # **Data Access Module** 29 | 30 | The `data_access` module hosts functions that retrieve data from the National Weather Service FTP Server and the UCAR THREDDS Server. 31 | 32 | **National Weather Service NDFD Data** 33 | There are two things the user needs to know when using `FireWxPy` to download gridded data from the NWS FTP Server: 1) File Path 34 | 2) Weather Element (i.e. Forecast Parameter) 35 | 36 | **File Path List** 37 | 38 | Here is the complete list of all the file paths for each region of the NWS NDFD gridded data: 39 | 40 | CONUS aka "Lower-48" 41 | ``` 42 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.conus/ 43 | ``` 44 | 45 | Alaska 46 | ``` 47 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.alaska/ 48 | ``` 49 | 50 | Central Great Lakes 51 | ``` 52 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.crgrlake/ 53 | ``` 54 | 55 | Central Mississippi Valley 56 | ``` 57 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.crmissvy/ 58 | ``` 59 | 60 | Central Plains 61 | ``` 62 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.crplains/ 63 | ``` 64 | 65 | Central Rockies 66 | ``` 67 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.crrocks/ 68 | ``` 69 | 70 | Eastern Great Lakes 71 | ``` 72 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.ergrlake/ 73 | ``` 74 | 75 | Guam 76 | ``` 77 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.guam/ 78 | ``` 79 | 80 | Hawaii 81 | ``` 82 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.hawaii/ 83 | ``` 84 | 85 | Mid-Atlantic 86 | ``` 87 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.midatlan/ 88 | ``` 89 | 90 | Northeast 91 | ``` 92 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.neast/ 93 | ``` 94 | 95 | Northern Hemisphere 96 | ``` 97 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.nhemi/ 98 | ``` 99 | 100 | North Pacific Ocean 101 | ``` 102 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.npacocn/ 103 | ``` 104 | 105 | Northern Plains 106 | ``` 107 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.nplains/ 108 | ``` 109 | 110 | Northern Rockies 111 | ``` 112 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.nrockies/ 113 | ``` 114 | 115 | Oceanic 116 | ``` 117 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.oceanic/ 118 | ``` 119 | 120 | Pacific Northwest 121 | ``` 122 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.pacnwest/ 123 | ``` 124 | 125 | Pacific Southwest 126 | ``` 127 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.pacswest/ 128 | ``` 129 | 130 | Puerto Rico 131 | ``` 132 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.puertori/ 133 | ``` 134 | 135 | Southeast 136 | ``` 137 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.seast/ 138 | ``` 139 | 140 | Southern Mississippi Valley 141 | ``` 142 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.smissvly/ 143 | ``` 144 | 145 | Southern Plains 146 | ``` 147 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.splains/ 148 | ``` 149 | 150 | Southern Rockies 151 | ``` 152 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.srockies/ 153 | ``` 154 | 155 | Upper Mississippi Valley 156 | ``` 157 | /SL.us008001/ST.opnl/DF.gr2/DC.ndfd/AR.umissvly/ 158 | ``` 159 | 160 | **Weather Element List** 161 | 162 | Here is a link to the document that has the proper syntax for each Weather Element of the NWS NDFD gridded data: https://view.officeapps.live.com/op/view.aspx?src=https%3A%2F%2Fwww.weather.gov%2Fmedia%2Fmdl%2Fndfd%2FNDFDelem_fullres.xls&wdOrigin=BROWSELINK 163 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Eric J. Drewitz 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /RAWS SIGs/EACC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID 2 | EA01,NW MN,210301 3 | EA01,NW MN,210405 4 | EA01,NW MN,210901 5 | EA01,NW MN,210801 6 | EA01,NW MN,211604 7 | EA01,NW MN,210203 8 | EA01,NW MN,211502 9 | EA01,NW MN,212601 10 | EA02,SW MN/Nrn IA,215601 11 | EA02,SW MN/Nrn IA,214001 12 | EA02,SW MN/Nrn IA,214201 13 | EA02,SW MN/Nrn IA,136101 14 | EA02,SW MN/Nrn IA,213501 15 | EA03,NE MN,210514 16 | EA03,NE MN,211702 17 | EA03,NE MN,210709 18 | EA03,NE MN,211803 19 | EA03,NE MN,210512 20 | EA03,NE MN,210503 21 | EA03,NE MN,210509 22 | EA04,N WI / Wrn UP Of MI,470202 23 | EA04,N WI / Wrn UP Of MI,470302 24 | EA04,N WI / Wrn UP Of MI,471002 25 | EA04,N WI / Wrn UP Of MI,470703 26 | EA04,N WI / Wrn UP Of MI,471601 27 | EA04,N WI / Wrn UP Of MI,471801 28 | EA04,N WI / Wrn UP Of MI,470804 29 | EA05,SE MN / Central WI,215601 30 | EA05,SE MN / Central WI,473901 31 | EA05,SE MN / Central WI,473501 32 | EA06,NE WI / Ern UP,200703 33 | EA06,NE WI / Ern UP,201002 34 | EA06,NE WI / Ern UP,471301 35 | EA06,NE WI / Ern UP,201504 36 | EA07,Nrn LP Of MI,203802 37 | EA07,Nrn LP Of MI,202902 38 | EA07,Nrn LP Of MI,202010 39 | EA08,NW IN / Srn LP Of MI,120201 40 | EA08,NW IN / Srn LP Of MI,112001 41 | EA08,NW IN / Srn LP Of MI,203802 42 | EA09,Srn IA / NW MO,232401 43 | EA09,Srn IA / NW MO,136101 44 | EA09,Srn IA / NW MO,231301 45 | EA09,Srn IA / NW MO,135501 46 | EA10,Nrn IL,112001 47 | EA10,Nrn IL,120201 48 | EA11,Nrn IN,120201 49 | EA11,Nrn IN,112001 50 | EA12,SW MO,238502 51 | EA12,SW MO,232401 52 | EA13,SE MO,239102 53 | EA13,SE MO,236403 54 | EA14,Srn IL / Srn IN,119501 55 | EA14,Srn IL / Srn IN,128905 56 | EA14,Srn IL / Srn IN,125701 57 | EA15,NW OH,337301 58 | EA15,NW OH,460101 59 | EA16,SE OH / SW PA / NW WV,338401 60 | EA16,SE OH / SW PA / NW WV,460901 61 | EA16,SE OH / SW PA / NW WV,460101 62 | EA16,SE OH / SW PA / NW WV,463001 63 | EA16,SE OH / SW PA / NW WV,463301 64 | EA16,SE OH / SW PA / NW WV,463802 65 | EA17,E WV,464901 66 | EA17,E WV,465401 67 | EA17,E WV,463501 68 | EA18,NW PA / Wrn NY,361231 69 | EA18,NW PA / Wrn NY,360331 70 | EA18,NW PA / Wrn NY,361171 71 | EA18,NW PA / Wrn NY,301101 72 | EA19,Central PA / Central NY,360131 73 | EA19,Central PA / Central NY,361171 74 | EA19,Central PA / Central NY,360271 75 | EA20,Upstate NY,300312 76 | EA20,Upstate NY,300191 77 | EA20,Upstate NY,300892 78 | EA20,Upstate NY,300311 79 | EA20,Upstate NY,300891 80 | EA21,VT / NH / Wrn ME,430501 81 | EA21,VT / NH / Wrn ME,430601 82 | EA21,VT / NH / Wrn ME,270301 83 | EA21,VT / NH / Wrn ME,430402 84 | EA22,ME / NH Coast,170850 85 | EA22,ME / NH Coast,171603 86 | EA22,ME / NH Coast,170791 87 | EA23,New England Metro,305103 88 | EA23,New England Metro,370450 89 | EA24,SE Mid Atlantic,182201 90 | EA24,SE Mid Atlantic,180701 91 | EA24,SE Mid Atlantic,180201 92 | EA24,SE Mid Atlantic,280291 93 | EA24,SE Mid Atlantic,280091 94 | EA24,SE Mid Atlantic,182002 95 | EA24,SE Mid Atlantic,281501 96 | EA24,SE Mid Atlantic,181510 97 | -------------------------------------------------------------------------------- /RAWS SIGs/GBCC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID 2 | GB01,Payette,101044 3 | GB01,Payette,101108 4 | GB01,Payette,101402 5 | GB01,Payette,101223 6 | GB01,Payette,101109 7 | GB01,Payette,101220 8 | GB02,Central Idaho,101312 9 | GB02,Central Idaho,101315 10 | GB02,Central Idaho,101311 11 | GB02,Central Idaho,101310 12 | GB02,Central Idaho,101303 13 | GB02,Central Idaho,101805 14 | GB02,Central Idaho,101314 15 | GB03,SW Idaho,103211 16 | GB03,SW Idaho,103210 17 | GB03,SW Idaho,103208 18 | GB03,SW Idaho,102709 19 | GB03,SW Idaho,103207 20 | GB04,Boise Mtns,101708 21 | GB04,Boise Mtns,101222 22 | GB04,Boise Mtns,102712 23 | GB05,Northern Sawtooth,102802 24 | GB05,Northern Sawtooth,101809 25 | GB05,Northern Sawtooth,102903 26 | GB05,Northern Sawtooth,101812 27 | GB06,Magic Valley,104104 28 | GB06,Magic Valley,103209 29 | GB06,Magic Valley,102711 30 | GB06,Magic Valley,103205 31 | GB06,Magic Valley,102907 32 | GB06,Magic Valley,103403 33 | GB07,Southern Sawtooth,104103 34 | GB07,Southern Sawtooth,104105 35 | GB07,Southern Sawtooth,104004 36 | GB08,Upper Snake River,103903 37 | GB08,Upper Snake River,104203 38 | GB08,Upper Snake River,103703 39 | GB08,Upper Snake River,104006 40 | GB08,Upper Snake River,103902 41 | GB09,Eastern Idaho Highlands,103904 42 | GB09,Eastern Idaho Highlands,102004 43 | GB09,Eastern Idaho Highlands,102301 44 | GB10,Western Wyoming,481307 45 | GB10,Western Wyoming,480707 46 | GB10,Western Wyoming,480709 47 | GB10,Western Wyoming,481302 48 | GB10,Western Wyoming,481306 49 | GB10,Western Wyoming,480708 50 | GB11,Southern Sierra Front,43702 51 | GB11,Southern Sierra Front,260117 52 | GB11,Southern Sierra Front,42802 53 | GB11,Southern Sierra Front,43707 54 | GB12,Northern Sierra Front,261204 55 | GB12,Northern Sierra Front,40724 56 | GB12,Northern Sierra Front,41302 57 | GB12,Northern Sierra Front,260108 58 | GB12,Northern Sierra Front,260114 59 | GB13,Lahontan Basin,260701 60 | GB13,Lahontan Basin,260504 61 | GB14,NW Nevada,260207 62 | GB14,NW Nevada,260208 63 | GB14,NW Nevada,260204 64 | GB14,NW Nevada,260203 65 | GB14,NW Nevada,260112 66 | GB14,NW Nevada,260202 67 | GB14,NW Nevada,260206 68 | GB15,Central NV Mountains,260503 69 | GB15,Central NV Mountains,260501 70 | GB15,Central NV Mountains,260603 71 | GB15,Central NV Mountains,260601 72 | GB16,Central NV Desert,260810 73 | GB16,Central NV Desert,261404 74 | GB17,West Elko,260310 75 | GB17,West Elko,260505 76 | GB18,Jarbidge,260315 77 | GB18,Jarbidge,260309 78 | GB18,Jarbidge,260305 79 | GB19,Ruby,260306 80 | GB19,Ruby,260314 81 | GB19,Ruby,260308 82 | GB20,Ely North,261406 83 | GB20,Ely North,260805 84 | GB20,Ely North,260807 85 | GB20,Ely North,260804 86 | GB21,Ely South,261604 87 | GB21,Ely South,261603 88 | GB21,Ely South,261608 89 | GB22,Amargosa,261408 90 | GB23,Spring Mountain,261702 91 | GB23,Spring Mountain,261708 92 | GB24,Southern NV Desert,261705 93 | GB25,NW Utah,420914 94 | GB25,NW Utah,420911 95 | GB25,NW Utah,420901 96 | GB25,NW Utah,420908 97 | GB25,NW Utah,420915 98 | GB25,NW Utah,420403 99 | GB26,Uinta-Wasatch,421103 100 | GB26,Uinta-Wasatch,420706 101 | GB26,Uinta-Wasatch,420912 102 | GB26,Uinta-Wasatch,421101 103 | GB27,Central Utah,421806 104 | GB27,Central Utah,421502 105 | GB27,Central Utah,421501 106 | GB28,Fishlake-Henry Mountain,421807 107 | GB28,Fishlake-Henry Mountain,421905 108 | GB28,Fishlake-Henry Mountain,422610 109 | GB28,Fishlake-Henry Mountain,422611 110 | GB29,Uinta Basin,421415 111 | GB29,Uinta Basin,421406 112 | GB29,Uinta Basin,421416 113 | GB29,Uinta Basin,421305 114 | GB29,Uinta Basin,421407 115 | GB29,Uinta Basin,421304 116 | GB29,Uinta Basin,421301 117 | GB30,Manti,421602 118 | GB31,Castle,422102 119 | GB31,Castle,421702 120 | GB31,Castle,421405 121 | GB31,Castle,422002 122 | GB32,Canyon,422711 123 | GB32,Canyon,422712 124 | GB32,Canyon,422710 125 | GB33,SW Utah Desert,422203 126 | GB33,SW Utah Desert,422803 127 | GB33,SW Utah Desert,422502 128 | GB34,Dixie-Bryce,422606 129 | GB34,Dixie-Bryce,422503 130 | GB34,Dixie-Bryce,422608 131 | GB34,Dixie-Bryce,422604 132 | GB34,Dixie-Bryce,422807 133 | GB34,Dixie-Bryce,422609 134 | GB35,AZ Strip-Monuments,20224 135 | GB35,AZ Strip-Monuments,20109 136 | GB35,AZ Strip-Monuments,20108 137 | GB35,AZ Strip-Monuments,20107 138 | GB35,AZ Strip-Monuments,422806 139 | GB35,AZ Strip-Monuments,20114 140 | GB35,AZ Strip-Monuments,422805 141 | -------------------------------------------------------------------------------- /RAWS SIGs/NRCC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID 2 | NR01,BONNERS FERRY,100101 3 | NR01,PRIEST LAKE,100204 4 | NR02,LIBBY,240107 5 | NR02,EUREKA RS,240110 6 | NR02,TROY RS,240112 7 | NR03,Pierce,100711 8 | NR03,Shock,100606 9 | NR03,Fishhook,100421 10 | NR03,Kelly,100708 11 | NR04,Blue Mtn (Missoula),241513 12 | NR04,Hot Springs,241211 13 | NR04,Plains,241206 14 | NR04,Saint Regis,241302 15 | NR04,Ninemile,241507 16 | NR04,Pistol Creek,241405 17 | NR05,Slate Creek,101037 18 | NR05,Mission Creek,100901 19 | NR05,Dent,100714 20 | NR06,Fenn RS,101013 21 | NR06,Westfork,242907 22 | NR06,Red River,101045 23 | NR06,Powell,101031 24 | NR06,Sula,242905 25 | NR06,Smith Creek,242912 26 | NR07,Hungry Horse Rd,240217 27 | NR07,Lincoln,241904 28 | NR07,Benchmark,241901 29 | NR07,West Glacier,240207 30 | NR07,Condon,241502 31 | NR07,Polebridge,240210 32 | NR08,Pburg,243002 33 | NR08,Lincoln,241904 34 | NR08,Wise River,245405 35 | NR08,Stinkwater,241518 36 | NR09,Ennis,245501 37 | NR09,Brenner,245409 38 | NR09,Galena,243206 39 | NR09,Antelope,245412 40 | NR09,Wise River,245405 41 | NR10,Gleason,241802 42 | NR10,St Mary,240303 43 | NR10,Browning,240307 44 | NR10,Deep Creek,240308 45 | NR11,Helena,241907 46 | NR11,Dearborn,241910 47 | NR11,South Fork Judith,242102 48 | NR11,Little Snowy,242207 49 | NR11,Elkhorn,243303 50 | NR12,Hebgen,244603 51 | NR12,Timbercrest,245607 52 | NR12,Shenango,244601 53 | NR12,Fishtail,244902 54 | NR12,Main Boulder,244705 55 | NR12,Derby Mt.,244803 56 | NR13,King Coulee,240903 57 | NR13,Bluff Creek,240902 58 | NR13,Little Bull,240704 59 | NR13,Rocky Boy,240601 60 | NR13,Armells,242205 61 | NR13,Horse Thief,243704 62 | NR14,Pryor Mountain,245106 63 | NR14,Wolf Mountain,245105 64 | NR14,Fort Howes,245201 65 | NR14,Little Big Horn,245108 66 | NR14,Wild Horse,245109 67 | NR14,Horse Thief,243704 68 | NR15,Watford ND,321703 69 | NR15,Lostwood ND,320220 70 | NR15,Crosby,320101 71 | NR15,Poplar,242501 72 | NR15,Medicine Lake,241102 73 | NR15,Knife River ND,322701 74 | NR16,Cannonball Creek ND,244301 75 | NR16,Sand Creek ND,323804 76 | NR16,Knowlton,244102 77 | NR16,Big Sheep,244002 78 | NR16,Pine Hill,244201 79 | NR16,Painted Canyon ND,322503 80 | NR17,J. Clark Salyer,320401 81 | NR17,Arrowwood,323536 82 | NR17,Devil's Lake,321401 83 | NR17,Hampden,320701 84 | NR18,Sheyenne,324605 85 | NR18,Arrowwood,323536 86 | NR18,Knife River ND,322701 87 | -------------------------------------------------------------------------------- /RAWS SIGs/NWCC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID 2 | NW01,Ellis,450130 3 | NW01,Owl Mt,450211 4 | NW01,Cougar,450117 5 | NW01,Jefferson,450911 6 | NW01,Sumas,451415 7 | NW01,Gold Mt,451613 8 | NW01,Finney,451509 9 | NW01,Johnson,451611 10 | NW01,Minot,450306 11 | NW02,CedarCk,350215 12 | NW02,Abernathy,451209 13 | NW02,SFork,350216 14 | NW02,Greenwater,451718 15 | NW02,Canyon,451921 16 | NW02,Log,350604 17 | NW02,Rockhouse1,351710 18 | NW02,Kosmos,451105 19 | NW03,Yellowstone,352024 20 | NW03,Wanderer's,350726 21 | NW03,Signal,352816 22 | NW03,Trout Ck,352552 23 | NW03,High,352550 24 | NW03,Goodwin,352545 25 | NW03,RedBox,350718 26 | NW04,Calvert,352919 27 | NW04,Buckhorn,353230 28 | NW04,Red,352920 29 | NW04,Zim,353227 30 | NW04,Evans,353228 31 | NW04,Provolt,353120 32 | NW04,Pebble,352554 33 | NW04,Emigrant,352558 34 | NW04,Quail2,352915 35 | NW05,Grayback,452404 36 | NW05,Peoh,452206 37 | NW05,Dry Ck,452134 38 | NW05,Sedge,452306 39 | NW06,Wamic,350913 40 | NW06,Mutton,350917 41 | NW06,Cold Spr,352701 42 | NW06,Haystack,352107 43 | NW06,Board Hollow,352109 44 | NW06,Colgate,352620 45 | NW07,Cabin,353402 46 | NW07,Parker,353344 47 | NW07,Round,352605 48 | NW07,Strawberry,353423 49 | NW07,Hoyt,353343 50 | NW08,Kramer,452040 51 | NW08,NCSB,452030 52 | NW08,Lost Lk,452029 53 | NW08,Leecher Mtn,452020 54 | NW09,Deer,453412 55 | NW09,Gold,452510 56 | NW09,Owl,452513 57 | NW09,Kettle,452916 58 | NW10,Escure,453601 59 | NW10,Juniper,453201 60 | NW10,Douglas,452601 61 | NW11,Eden,351518 62 | NW11,Harle,351502 63 | NW11,Case,352329 64 | NW11,Alder,453803 65 | NW11,Sparta,352418 66 | NW11,Roberts,351520 67 | NW11,BlueC,352416 68 | NW11,Fall,352327 69 | NW12,Antelope,353524 70 | NW12,Grassy,353612 71 | NW12,Moon,353526 72 | NW12,Wagontire,353512 73 | NW12,Owyhee,353614 74 | -------------------------------------------------------------------------------- /RAWS SIGs/ONCC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID 2 | NC01,North Coast,40427 3 | NC01,North Coast,40428 4 | NC01,North Coast,40421 5 | NC01,North Coast,40102 6 | NC01,North Coast,40425 7 | NC02,Mid Coast To Mendocino,41406 8 | NC02,Mid Coast To Mendocino,41411 9 | NC02,Mid Coast To Mendocino,41005 10 | NC02,Mid Coast To Mendocino,41001 11 | NC02,Mid Coast To Mendocino,41015 12 | NC03,Bay Marine,43402 13 | NC03,Bay Marine,43304 14 | NC03,Bay Marine,43802 15 | NC03,Bay Marine,43009 16 | NC04,Diablo-Santa Cruz Mtns,43404 17 | NC04,Diablo-Santa Cruz Mtns,43809 18 | NC04,Diablo-Santa Cruz Mtns,43008 19 | NC04,Diablo-Santa Cruz Mtns,43502 20 | NC05,Northwestern Mtn,40408 21 | NC05,Northwestern Mtn,40503 22 | NC05,Northwestern Mtn,40244 23 | NC05,Northwestern Mtn,40812 24 | NC05,Northwestern Mtn,40239 25 | NC05,Northwestern Mtn,40222 26 | NC05,Northwestern Mtn,40614 27 | NC05,Northwestern Mtn,40516 28 | NC05,Northwestern Mtn,40231 29 | NC05,Northwestern Mtn,40105 30 | NC05,Northwestern Mtn,40218 31 | NC05,Northwestern Mtn,40217 32 | NC05,Northwestern Mtn,40519 33 | NC05,Northwestern Mtn,40203 34 | NC06,Sac Valley/Foothills,41503 35 | NC06,Sac Valley/Foothills,41907 36 | NC06,Sac Valley/Foothills,40802 37 | NC06,Sac Valley/Foothills,40814 38 | NC06,Sac Valley/Foothills,41410 39 | NC06,Sac Valley/Foothills,41211 40 | NC06,Sac Valley/Foothills,42202 41 | NC06,Sac Valley/Foothills,41201 42 | NC06,Sac Valley/Foothills,40615 43 | NC06,Sac Valley/Foothills,40816 44 | NC06,Sac Valley/Foothills,40611 45 | NC07,NE California,40309 46 | NC07,NE California,40306 47 | NC07,NE California,40228 48 | NC07,NE California,40243 49 | NC07,NE California,40312 50 | NC07,NE California,40221 51 | NC07,NE California,40308 52 | NC07,NE California,40233 53 | NC08,Northern Sierra,42603 54 | NC08,Northern Sierra,41213 55 | NC08,Northern Sierra,40916 56 | NC08,Northern Sierra,41908 57 | NC08,Northern Sierra,40723 58 | NC08,Northern Sierra,40609 59 | NC08,Northern Sierra,41701 60 | NC08,Northern Sierra,40630 61 | NC08,Northern Sierra,40719 62 | NC08,Northern Sierra,41806 63 | NC08,Northern Sierra,42601 64 | NC08,Northern Sierra,40730 65 | NC08,Northern Sierra,40910 66 | NC09,Far Eastside,260111 67 | NC09,Far Eastside,40728 68 | NC09,Far Eastside,40709 69 | NC09,Far Eastside,40714 70 | NC09,Far Eastside,41310 71 | -------------------------------------------------------------------------------- /RAWS SIGs/OSCC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID,Column1 2 | SC01,Crestview,43709, 3 | SC01,Rock Creek,43710, 4 | SC01,Dexter,43711, 5 | SC02,Cottage,43210, 6 | SC02,Crane,44102, 7 | SC02,Dinkey,44521, 8 | SC02,Fence Meadow,44503, 9 | SC02,Minarets,44203, 10 | SC02,Shaver,44522, 11 | SC03,Case Mountain,44733, 12 | SC03,Cedar Grove,44719, 13 | SC03,Johnsondale,44707, 14 | SC03,Park Ridge,44713, 15 | SC03,Piutes,45017, 16 | SC04,North Fork,44204, 17 | SC04,Mariposa,44106, 18 | SC04,Fancher Creek,44516, 19 | SC04,Catheys Valley,44114, 20 | SC04,Green Spring,43613, 21 | SC04,Trimmer,44510, 22 | SC04,Oak Opening,44717, 23 | SC05,Fountain Springs,44731, 24 | SC06,Hernandez,44409, 25 | SC06,Parkfield,44310,Stop 26 | SC06,La Panza,44914, 27 | SC06,Carrizo,44916, 28 | SC06,Branch Mtn,44901, 29 | SC06,Pinnacles,44410, 30 | SC07,Los Prietos,45203, 31 | SC07,Big Sur,44302, 32 | SC07,San Luis Obispo,44915, 33 | SC07,Arroyo Seco,44301, 34 | SC07,Las Tablas,44904, 35 | SC07,Vandenberg,45220, 36 | SC08,Malibu Hills,45433, 37 | SC08,Malibu Canyon,45452, 38 | SC08,Saugus,45412, 39 | SC08,Valley Center,45734, 40 | SC08,El Cariso,45619, 41 | SC08,Claremont,45443, 42 | SC08,Cheeseboro,45313, 43 | SC08,Devore,45113, 44 | SC09,Chuchupate,45302, 45 | SC09,Warm Springs,45426, 46 | SC09,Tanbark,45421, 47 | SC09,Rose Valley,45314, 48 | SC09,Ozena,45303, 49 | SC09,Mormon Rock,45114, 50 | SC09,Mill Creek ANF,45435, 51 | SC10,Fawnskin,45101, 52 | SC10,Converse,45105, 53 | SC10,Big Pine Flat,45102, 54 | SC10,Rock Camp,45111, 55 | SC11,Descanso,45707, 56 | SC11,Julian,45708, 57 | SC11,Keenwild,45604, 58 | SC11,Mt Laguna,45709, 59 | SC11,Oak Grove,45710, 60 | SC11,Palomar,45740, 61 | SC12,Squaw Lake,45801, 62 | SC12,Rice Valley,45620, 63 | SC12,Cibola,20121, 64 | SC12,Havasu,20118, 65 | SC13,Squaw Lake,45801, 66 | SC13,Rice Valley,45620, 67 | SC13,Cibola,20121, 68 | SC13,Havasu,20118, 69 | SC14,Horse Thief Spring,45129, 70 | SC14,Yucca Valley,45112, 71 | SC14,Apple Valley 2,45134, 72 | SC14,Mid Hills,45128, 73 | SC14,Opal Mtn,45127, 74 | SC15,Acton,45438,yes 75 | SC15,Poppy Park,45440,yes 76 | SC15,Saddelback Butte,45444, 77 | SC16,Oak Creek,44804,yes 78 | SC16,Benton,43708,yes 79 | SC16,Owens Valley,44803,yes 80 | -------------------------------------------------------------------------------- /RAWS SIGs/RMCC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID 2 | RM01,Eagle,480214 3 | RM01,Elkhorn,481410 4 | RM02,Crandall,480213 5 | RM02,Grass Creek,480804 6 | RM02,Hyatt High,480307 7 | RM02,Leigh Creek,480906 8 | RM02,Rattlesnake,480212 9 | RM02,Split Rock,480904 10 | RM03,School House,481002 11 | RM03,Leigh Creek,480906 12 | RM04,Echeta,480501 13 | RM04,Rochelle Hills,480502 14 | RM04,Indian Butte,390901 15 | RM05,Nemo,392506 16 | RM05,Rushmore,392603 17 | RM06,Red Canyon,395105 18 | RM06,WICA Elk Mountain,393505 19 | RM06,Custer West,393506 20 | RM07,Anderson Ridge,481903 21 | RM07,Snow Springs Creek,481904 22 | RM07,Muddy Creek,481801 23 | RM08,Camp Creek,482010 24 | RM08,Casper Mountain,481502 25 | RM08,Fales Rock,481504 26 | RM08,Wind River,481411 27 | RM08,Poker Creek,481003 28 | RM09,Dodge Creek,482106 29 | RM09,Ester Brook,482102 30 | RM10,Great Divide,50106 31 | RM11,Porcupine,50406 32 | RM11,Dead Horse,51404 33 | RM11,Willow Creek,50304 34 | RM11,Sawmill,482105 35 | RM12,Sugarloaf,50604 36 | RM12,Redstone,50508 37 | RM13,Red Feather,50505 38 | RM13,Estes Park,50507 39 | RM13,Bailey,52001 40 | RM13,Pickle Gulch,51901 41 | RM14,Dragon Road,51407 42 | RM14,Pinto,51402 43 | RM14,Demaree,51507 44 | RM14,Little Delores,52410 45 | RM14,Hunter Creek,51406 46 | RM14,Rifle,51504 47 | RM14,Pine Ridge,52407 48 | RM15,Crown,51506 49 | RM15,Dowd Jct,51606 50 | RM15,Gypsum,51607 51 | RM15,Soda Creek,51703 52 | RM16,Black Canyon,53806 53 | RM16,Carpenter Ridge,53808 54 | RM16,Cottonwood Basin,53805 55 | RM16,Dominguez,52409 56 | RM16,Jay,52704 57 | RM16,Sanborn,53804 58 | RM16,Nulca,53807 59 | RM17,Huntsman Mesa,52813 60 | RM17,Lujan,54702 61 | RM17,Red Deer,52902 62 | RM17,Taylor Park,52812 63 | RM18,Cheeseman,53102 64 | RM18,Copper Gulch,53904 65 | RM18,Fort Carson,53603 66 | RM18,Lake George,53002 67 | RM19,Chapin,55704 68 | RM19,Mesa Mountain,55805 69 | RM19,Salter,55205 70 | RM20,Bighorn,56005 71 | RM20,Blue Park,55305 72 | RM21,Sand Dunes,55503 73 | RM21,Bighorn,56005 74 | RM22,Four Mile,53903 75 | RM22,Bosque (Cuchara),56203 76 | RM22,Copper Gulch,53904 77 | RM23,Bear Creek,391201 78 | RM23,Huron,393101 79 | RM23,Fort Pierre,393801 80 | RM23,Magpie,395601 81 | RM23,Lake Andes,395901 82 | RM24,Kincan,250203 83 | RM24,Pinnacles,392602 84 | RM25,Agate,250105 85 | RM25,Scotts Bluff,251905 86 | RM26,Valentine,250402 87 | RM26,Bessey,252402 88 | RM27,Pinion Canyon,56202 89 | RM27,Cimarron,148601 90 | RM28,Stafford,146501 91 | RM28,Kirwin,140401 92 | RM28,Potowatomi,142301 93 | -------------------------------------------------------------------------------- /RAWS SIGs/SACC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID 2 | SA01,TX Pan N,418701 3 | SA01,TX Pan N,418702 4 | SA01,TX Pan N,418801 5 | SA01,TX Pan N,418803 6 | SA01,TX Pan N,418901 7 | SA02,OK West,341541 8 | SA02,OK West,341640 9 | SA02,OK West,342540 10 | SA02,OK West,343301 11 | SA02,OK West,345801 12 | SA03,OK Cent,341840 13 | SA03,OK Cent,342640 14 | SA03,OK Cent,344540 15 | SA03,OK Cent,345940 16 | SA03,OK Cent,347240 17 | SA04,TX Pan S,418801 18 | SA04,TX Pan S,418901 19 | SA04,TX Pan S,418902 20 | SA04,TX Pan S,419002 21 | SA05,TX Cent NW,418901 22 | SA05,TX Cent NW,418902 23 | SA05,TX Cent NW,419301 24 | SA05,TX Cent NW,419401 25 | SA06,TX Cent NE,419402 26 | SA06,TX Cent NE,419601 27 | SA06,TX Cent NE,419701 28 | SA06,TX Cent NE,419702 29 | SA07,TX East N,410202 30 | SA07,TX East N,410401 31 | SA07,TX East N,411401 32 | SA07,TX East N,412101 33 | SA07,TX East N,419602 34 | SA08,TX Mountains,417101 35 | SA08,TX Mountains,417201 36 | SA08,TX Mountains,417403 37 | SA09,TX West,417601 38 | SA09,TX West,417701 39 | SA09,TX West,419202 40 | SA10,TX Cent SW,417701 41 | SA10,TX Cent SW,418001 42 | SA10,TX Cent SW,419203 43 | SA10,TX Cent SW,419403 44 | SA10,TX Cent SW,419502 45 | SA11,TX Cent SE,415501 46 | SA11,TX Cent SE,416601 47 | SA11,TX Cent SE,418101 48 | SA11,TX Cent SE,419501 49 | SA11,TX Cent SE,419802 50 | SA12,TX East S,413101 51 | SA12,TX East S,413701 52 | SA12,TX East S,415109 53 | SA12,TX East S,416101 54 | SA12,TX East S,416601 55 | SA13,TX NE Coast,415201 56 | SA13,TX NE Coast,416099 57 | SA13,TX NE Coast,416601 58 | SA13,TX NE Coast,418301 59 | SA13,TX NE Coast,419901 60 | SA14,TX Rio Grande Plains N,418001 61 | SA14,TX Rio Grande Plains N,418101 62 | SA14,TX Rio Grande Plains N,418102 63 | SA14,TX Rio Grande Plains N,418201 64 | SA15,TX South Coast,418202 65 | SA15,TX South Coast,418502 66 | SA15,TX South Coast,418603 67 | SA16,TX Rio Grande Plains S,418602 68 | SA16,TX Rio Grande Plains S,418604 69 | SA16,TX Rio Grande Plains S,418605 70 | SA17,OK East,341240 71 | SA17,OK East,342040 72 | SA17,OK East,344140 73 | SA17,OK East,346303 74 | SA17,OK East,347701 75 | SA18,AR West,31201 76 | SA18,AR West,31404 77 | SA18,AR West,32001 78 | SA18,AR West,33001 79 | SA18,AR West,33202 80 | SA19,AR East,31502 81 | SA19,AR East,35102 82 | SA19,AR East,36502 83 | SA19,AR East,36901 84 | SA20,LA W,160401 85 | SA20,LA W,161803 86 | SA20,LA W,161902 87 | SA20,LA W,162302 88 | SA20,LA W,162502 89 | SA21,LA Coast Center & West,165102 90 | SA21,LA Coast Center & West,165103 91 | SA21,LA Coast Center & West,414501 92 | SA22,LA Coast Southeast Toe,165002 93 | SA22,LA Coast Southeast Toe,228002 94 | SA22,LA Coast Southeast Toe,228202 95 | SA23,MS Coast,165002 96 | SA23,MS Coast,228002 97 | SA23,MS Coast,228202 98 | SA23,MS Coast,228204 99 | SA24,AL Coast,16703 100 | SA24,AL Coast,227601 101 | SA24,AL Coast,228204 102 | SA25,MS Cent & South,223501 103 | SA25,MS Cent & South,224601 104 | SA25,MS Cent & South,225301 105 | SA25,MS Cent & South,227001 106 | SA25,MS Cent & South,227601 107 | SA26,LA E,165002 108 | SA26,LA E,227001 109 | SA26,LA E,227202 110 | SA27,MS North,220202 111 | SA27,MS North,220601 112 | SA27,MS North,222101 113 | SA27,MS North,222401 114 | SA28,TN W,159901 115 | SA28,TN W,404001 116 | SA28,TN W,408001 117 | SA28,TN W,408302 118 | SA29,TN Cent,400902 119 | SA29,TN Cent,402102 120 | SA29,TN Cent,406601 121 | SA29,TN Cent,407102 122 | SA29,TN Cent,409201 123 | SA30,TN Mountains,403301 124 | SA30,TN Mountains,403604 125 | SA30,TN Mountains,405101 126 | SA31,KY West,150703 127 | SA31,KY West,151191 128 | SA31,KY West,156502 129 | SA31,KY West,159901 130 | SA32,KY Mountains,152001 131 | SA32,KY Mountains,154401 132 | SA32,KY Mountains,154801 133 | SA32,KY Mountains,157002 134 | SA33,VA SW Mountains,159801 135 | SA33,VA SW Mountains,447502 136 | SA33,VA SW Mountains,448502 137 | SA34,VA West Mountains,440402 138 | SA34,VA West Mountains,441801 139 | SA34,VA West Mountains,441906 140 | SA34,VA West Mountains,444002 141 | SA34,VA West Mountains,447502 142 | SA35,VA Cent,180303 143 | SA35,VA Cent,310301 144 | SA35,VA Cent,310801 145 | SA35,VA Cent,441906 146 | SA35,VA Cent,446801 147 | SA36,VA Coast,181510 148 | SA36,VA Coast,446801 149 | SA36,VA Coast,449801 150 | SA36,VA Coast,449905 151 | SA37,NC Mountains,312001 152 | SA37,NC Mountains,313302 153 | SA37,NC Mountains,315602 154 | SA37,NC Mountains,315803 155 | SA38,GA Mountains,90402 156 | SA38,GA Mountains,90601 157 | SA38,GA Mountains,90701 158 | SA38,GA Mountains,91201 159 | SA38,GA Mountains,91301 160 | SA39,SC Mountains,90802 161 | SA39,SC Mountains,380102 162 | SA40,NC Cent,310301 163 | SA40,NC Cent,310801 164 | SA40,NC Cent,312501 165 | SA40,NC Cent,314602 166 | SA40,NC Cent,316302 167 | SA41,NC Coastal Plain,317501 168 | SA41,NC Coastal Plain,318503 169 | SA41,NC Coastal Plain,319302 170 | SA42,NC Coast,311503 171 | SA42,NC Coast,315201 172 | SA42,NC Coast,319402 173 | SA42,NC Coast,319507 174 | SA42,NC Coast,319701 175 | SA43,SC Cent,380601 176 | SA43,SC Cent,380902 177 | SA43,SC Cent,381201 178 | SA43,SC Cent,383101 179 | SA44,SC Coastal Plain,319701 180 | SA44,SC Coastal Plain,383401 181 | SA44,SC Coastal Plain,383701 182 | SA45,SC Coast,384002 183 | SA45,SC Coast,384101 184 | SA45,SC Coast,384201 185 | SA46,AL North,10702 186 | SA46,AL North,12201 187 | SA46,AL North,12701 188 | SA47,AL South,13201 189 | SA47,AL South,14201 190 | SA47,AL South,15902 191 | SA47,AL South,225301 192 | SA48,GA North,90401 193 | SA48,GA North,91101 194 | SA48,GA North,92201 195 | SA48,GA North,92901 196 | SA49,GA Cent,93701 197 | SA49,GA Cent,94501 198 | SA49,GA Cent,95501 199 | SA49,GA Cent,95701 200 | SA50,GA South,96201 201 | SA50,GA South,96301 202 | SA50,GA South,98201 203 | SA50,GA South,98401 204 | SA50,GA South,99701 205 | SA51,GA Coast,96801 206 | SA51,GA Coast,98801 207 | SA51,GA Coast,99902 208 | SA51,GA Coast,384201 209 | SA52,FL Northwest,15902 210 | SA52,FL Northwest,80802 211 | SA52,FL Northwest,82001 212 | SA52,FL Northwest,82002 213 | SA52,FL Northwest,82201 214 | SA53,FL Northeast,81301 215 | SA53,FL Northeast,81302 216 | SA53,FL Northeast,83001 217 | SA53,FL Northeast,83502 218 | SA54,FL Central,84802 219 | SA54,FL Central,83501 220 | SA54,FL Central,83502 221 | SA54,FL Central,84402 222 | SA55,FL South,84802 223 | SA55,FL South,85801 224 | SA55,FL South,86001 225 | SA55,FL South,86405 226 | SA55,FL South,86704 227 | SA56,PR,512901 228 | SA56,PR,516301 229 | -------------------------------------------------------------------------------- /RAWS SIGs/SWCC_StationList.csv: -------------------------------------------------------------------------------- 1 | PSA Code,Station Name,RAWSID 2 | SW01,Tusayan,20207 3 | SW01,Dry Park,20212 4 | SW01,Frazier Wells,20213 5 | SW02,Moss Basin,20115 6 | SW02,Iron Springs,20501 7 | SW02,Stanton,20509 8 | SW03,Squaw Lake,45801 9 | SW04,Piney Hill,20402 10 | SW04,Washington Pass,290101 11 | SW04,Albino,290102 12 | SW05,Flagstaff,20209 13 | SW05,Heber,20301 14 | SW05,Lakeside,20303 15 | SW06,Globe,20601 16 | SW06,Tonto Basin,20606 17 | SW07,Columbine,21005 18 | SW07,Muleshoe,21007 19 | SW07,Saguaro,21202 20 | SW07,Sasabe,21206 21 | SW08,Jemez,290702 22 | SW08,Tower,290801 23 | SW08,Grants,291302 24 | SW09,Alpine,20401 25 | SW09,Beaverhead,292001 26 | SW09,Slaughter,292008 27 | SW09,Pelona,292009 28 | SW10,Bosque,292103 29 | SW10,Hachita Valley,292702 30 | SW10,Dripping Springs,292903 31 | SW11,Truchas,290210 32 | SW11,Pecos,291202 33 | SW12,Mountainair,291501 34 | SW12,Chupadera,292102 35 | SW13,Smokey Bear,292203 36 | SW13,Mayhill,293002 37 | SW13,Mescal,293003 38 | SW14,Cedar,418701 39 | SW14,Eight Mile,292301 40 | SW15,Eight Mile,292301 41 | SW15,Batdraw,293101 42 | SW15,Caprock,293104 43 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | firewxpy logo ![image](https://github.com/user-attachments/assets/da1b43c0-2b6a-4a5c-9eb4-f08b30cab42b) 3 | 4 | 5 | # FireWxPy 6 | 7 | [![Conda Version](https://img.shields.io/conda/vn/conda-forge/firewxpy.svg)](https://anaconda.org/conda-forge/firewxpy) 8 | ![PyPI](https://img.shields.io/pypi/v/firewxpy?label=pypi%20firewxpy) 9 | [![Anaconda-Server Badge](https://anaconda.org/conda-forge/firewxpy/badges/latest_release_date.svg)](https://anaconda.org/conda-forge/firewxpy) 10 | [![Anaconda-Server Badge](https://anaconda.org/conda-forge/firewxpy/badges/latest_release_relative_date.svg)](https://anaconda.org/conda-forge/firewxpy) 11 | [![Anaconda-Server Badge](https://anaconda.org/conda-forge/firewxpy/badges/platforms.svg)](https://anaconda.org/conda-forge/firewxpy) 12 | [![Anaconda-Server Badge](https://anaconda.org/conda-forge/firewxpy/badges/license.svg)](https://anaconda.org/conda-forge/firewxpy) 13 | [![Conda Recipe](https://img.shields.io/badge/recipe-firewxpy-green.svg)](https://anaconda.org/conda-forge/firewxpy) 14 | 15 | 16 | [![DOI](https://zenodo.org/badge/DOI/10.5281/zenodo.14318635.svg)](https://doi.org/10.5281/zenodo.14318635) 17 | 18 | 19 | Anaconda Downloads: 20 | 21 | [![Conda Downloads](https://img.shields.io/conda/dn/conda-forge/firewxpy.svg)](https://anaconda.org/conda-forge/firewxpy) 22 | 23 | PIP Downloads: 24 | 25 | ![PyPI - Downloads](https://img.shields.io/pypi/dm/firewxpy) 26 | 27 | Thank you for checking out FireWxPy! An open-source user friendly Python package to create visualizations of data specific to fire weather and fire weather forecasting. 28 | There are also graphics in FireWxPy that can be used in the meteorological field universally as well. 29 | 30 | This package makes it easy for meteorologists to create analysis & forecast graphics specific to their needs. 31 | 32 | Copyright (C) Meteorologist Eric J. Drewitz 2025 33 | 34 | # Inspiration 35 | This package is largely inspired by the MetPy package which was developed and is currently being maintained by Unidata (please see citation below in the citations section). 36 | 37 | # FireWxPy Documentation 38 | 39 | **Table Of Contents** 40 | 41 | This is the landing page for all of the firewxpy documentation. The links below will direct you to the documentation for each firewxpy module. 42 | 43 | To visit the firewxpy tutorials page where you can see examples in jupyter lab - [click here](https://github.com/edrewitz/FireWxPy-Jupyter-Labs/blob/main/Examples_Guide.md) 44 | 45 | For video tutorials/demostrations checkout the FireWxPy Tutorial Series on the South Ops YouTube Channel - [click here](https://www.youtube.com/playlist?list=PLLKWSry9WlbPfeTWEQjuKIdNhYuxd8r96) 46 | 47 | **FireWxPy Graphics Classes And Functions** 48 | 49 | 1) [rtma](https://github.com/edrewitz/firewxpy/blob/main/Documentation/RTMA.md) 50 | 2) [spc](https://github.com/edrewitz/firewxpy/blob/main/Documentation/SPC_Outlook_Graphics.md) 51 | 3) [nws_temperature_forecast](https://github.com/edrewitz/firewxpy/blob/main/Documentation/NWS_Forecasts.md#temperature-class) 52 | 4) [nws_relative_humidity_forecast](https://github.com/edrewitz/firewxpy/blob/main/Documentation/NWS_Forecasts.md#relative-humidity-class) 53 | 5) [nws_critical_firewx_forecast](https://github.com/edrewitz/firewxpy/blob/main/Documentation/NWS_Forecasts.md#critical-fire-weather-class) 54 | 6) [model_dynamics](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#dynamics-class) 55 | 7) [model_temperature](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#temperature-class) 56 | 8) [model_relative_humidity](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#relative-humidity-class) 57 | 9) [model_critical_firewx_conditions](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#critical-firewx-conditions-class) 58 | 10) [model_precipitation](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#precipitation-class) 59 | 11) [time_cross_sections](https://github.com/edrewitz/firewxpy/blob/main/Documentation/cross_sections.md#time-cross-sections) 60 | 12) [two_point_cross_sections](https://github.com/edrewitz/firewxpy/blob/main/Documentation/cross_sections.md#cross-sections-between-two-points) 61 | 13) [gridded_obs](https://github.com/edrewitz/firewxpy/blob/main/Documentation/observations.md#gridded-observations-class) 62 | 14) [scatter_obs](https://github.com/edrewitz/firewxpy/blob/main/Documentation/observations.md#scatter-plot-observations-class) 63 | 15) [metar_obs](https://github.com/edrewitz/firewxpy/blob/main/Documentation/observations.md#metar-observations-class) 64 | 16) [plot_observed_sounding](https://github.com/edrewitz/firewxpy/blob/main/Documentation/soundings.md#plot_observed_soundingstation_id) 65 | 17) [plot_observed_sounding_custom_date_time](https://github.com/edrewitz/firewxpy/blob/main/Documentation/soundings.md#plot_observed_sounding_custom_date_timestation_id-year-month-day-hour) 66 | 18) [plot_forecast_soundings](https://github.com/edrewitz/firewxpy/blob/main/Documentation/soundings.md#plot_forecast_soundingsmodel-station_id) 67 | 19) [sawti](https://github.com/edrewitz/firewxpy/blob/main/Documentation/sawti.md) 68 | 20) [plot_daily_solar_information](https://github.com/edrewitz/firewxpy/blob/main/Documentation/solar_information.md#plot_daily_solar_informationlatitude-longitude) 69 | 21) [fuels charts](https://github.com/edrewitz/firewxpy/blob/main/Documentation/fuels_charts.md) 70 | 22) [ensemble_8_day_mean_eofs](https://github.com/edrewitz/firewxpy/blob/main/Documentation/forecast_models.md#ensemble-8-day-mean-and-eofs) 71 | 72 | **Additional Resources For Users Who Download The Data Outside Of The Function And Pass It In** 73 | 74 | *This is recommended for users generating a lot of graphics with the same dataset (i.e. a lot of RTMA graphics etc.)* 75 | 76 | *This method reduces the amount of data requests on the servers hosting the data* 77 | 78 | 1) [RTMA (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#rtma) 79 | 2) [NDFD_GRIDS (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#ndfd_grids) 80 | 3) [obs (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#obs) 81 | 4) [model_data (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#model_data) 82 | 5) [FEMS (Data Access)](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#fems) 83 | 6) [plot_creation_time](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#plot_creation_time) 84 | 7) [get_metar_mask](https://github.com/edrewitz/firewxpy/blob/main/Documentation/miscellaneous.md#get_metar_maskstate-gacc_region-rtma_wsfalse) 85 | 86 | **Regional Abbreviations for Model Data** 87 | 88 | If the user wants to analyze model data in the U.S. the regional abbreviations consist of the following: 89 | 90 | - CONUS & South Canada & North Mexico 91 | - CONUS 92 | - NA 93 | - 2-letter state abbreviation 94 | - 4-letter Geographic Area Coordination Center abbreviation 95 | 96 | If the user wants to analyze model data for an area outside of the U.S: 97 | 98 | *One important thing to note is only global models (GFS, GEFS etc.) are available here* 99 | 100 | International Regional Selections: 101 | 102 | - Canada 103 | - Mexico & Central America 104 | - Caribbean 105 | - South America 106 | - Western Europe & Iceland 107 | - Central & Eastern Europe 108 | - West Africa 109 | - Saharan Africa 110 | - Sub Saharan Africa 111 | - Middle East 112 | - Asia 113 | - East Asia 114 | - Southeast Asia 115 | - India 116 | - Australia New Zealand 117 | - Guyana 118 | 119 | # Author 120 | Eric J. Drewitz 121 | 122 | USDA/USFS Predictive Services Meteorologist 123 | 124 | Southern California Geographic Area Coordination Center 125 | 126 | # Citations 127 | 128 | **MetPy**: May, R. M., Goebbert, K. H., Thielen, J. E., Leeman, J. R., Camron, M. D., Bruick, Z., 129 | Bruning, E. C., Manser, R. P., Arms, S. C., and Marsh, P. T., 2022: MetPy: A 130 | Meteorological Python Library for Data Analysis and Visualization. Bull. Amer. Meteor. 131 | Soc., 103, E2273-E2284, https://doi.org/10.1175/BAMS-D-21-0125.1. 132 | 133 | **xarray**: Hoyer, S., Hamman, J. (In revision). Xarray: N-D labeled arrays and datasets in Python. Journal of Open Research Software. 134 | 135 | **pygrib**: Jeff Whitaker, daryl herzmann, Eric Engle, Josef Kemetmüller, Hugo van Kemenade, Martin Zackrisson, Jos de Kloe, Hrobjartur Thorsteinsson, Ryan May, Benjamin R. J. Schwedler, OKAMURA Kazuhide, ME-Mark-O, Mike Romberg, Ryan Grout, Tim Hopper, asellappenIBM, Hiroaki Itoh, Magnus Hagdorn, & Filipe. (2021). jswhit/pygrib: version 2.1.4 release (v2.1.4rel). Zenodo. https://doi.org/10.5281/zenodo.5514317 136 | 137 | **siphon**: May, R. M., Arms, S. C., Leeman, J. R., and Chastang, J., 2017: 138 | Siphon: A collection of Python Utilities for Accessing Remote Atmospheric 139 | and Oceanic Datasets. Unidata, Accessed 30 September 2017. 140 | [Available online at https://github.com/Unidata/siphon.] 141 | doi:10.5065/D6CN72NW. 142 | 143 | **cartopy**: Phil Elson, Elliott Sales de Andrade, Greg Lucas, Ryan May, Richard Hattersley, Ed Campbell, Andrew Dawson, Bill Little, Stephane Raynaud, scmc72, Alan D. Snow, Ruth Comer, Kevin Donkers, Byron Blay, Peter Killick, Nat Wilson, Patrick Peglar, lgolston, lbdreyer, … Chris Havlin. (2023). SciTools/cartopy: v0.22.0 (v0.22.0). Zenodo. https://doi.org/10.5281/zenodo.8216315 144 | 145 | **SAWTI**: Rolinski, T., S. B. Capps, R. G. Fovell, Y. Cao, B. J. D’Agostino, and S. Vanderburg, 2016: The Santa Ana Wildfire Threat Index: Methodology and Operational Implementation. Wea. Forecasting, 31, 1881–1897, https://doi.org/10.1175/WAF-D-15-0141.1. 146 | 147 | **NumPy**: Harris, C.R., Millman, K.J., van der Walt, S.J. et al. Array programming with NumPy. Nature 585, 357–362 (2020). DOI: 10.1038/s41586-020-2649-2. (Publisher link). 148 | 149 | **PySolar**: Stafford, B. et. al, PySolar (2007), [https://pysolar.readthedocs.io/en/latest/#contributors] 150 | 151 | **Pandas**: Pandas: McKinney, W., & others. (2010). Data structures for statistical computing in python. In Proceedings of the 9th Python in Science Conference (Vol. 445, pp. 51–56). 152 | 153 | **xeofs**: xeofs: Rieger, N. & Levang, S. J. (2024). xeofs: Comprehensive EOF analysis in Python with xarray. Journal of Open Source Software, 9(93), 6060. DOI: https://doi.org/10.21105/joss.06060 154 | 155 | 156 | -------------------------------------------------------------------------------- /firewxpy.egg-info/PKG-INFO: -------------------------------------------------------------------------------- 1 | Metadata-Version: 2.1 2 | Name: firewxpy 3 | Version: 1.0.0.5 4 | Summary: Weather Analysis and Forecasting For Fire Weather 5 | Author: Eric J Drewitz, USDA/USFS 6 | Keywords: meteorology,science,data-analysis,weather,forecasting 7 | Classifier: Programming Language :: Python 8 | Classifier: Programming Language :: Python :: 3.10 9 | Classifier: Programming Language :: Python :: 3.11 10 | Classifier: Topic :: Scientific/Engineering 11 | Classifier: Topic :: Scientific/Engineering :: Atmospheric Science 12 | Classifier: Operating System :: OS Independent 13 | Classifier: License :: OSI Approved :: MIT License 14 | Requires-Python: >=3.8 15 | Description-Content-Type: text/markdown 16 | License-File: LICENSE 17 | 18 | # FireWxPy 19 | 20 | Thank you for checking out FireWxPy! A user friendly Python package to create visualizations of data specific to fire weather and fire weather forecasting. 21 | 22 | This repository consists of functions to make plots of weather data with an emphasis on fire weather. 23 | 24 | This open source project will help meteorologists download, sort and plot both analysis and forecast data. 25 | 26 | This package focuses on fire weather, however some modules will be universally useful across the entire field of meteorology. 27 | 28 | This package makes it easier for users to access and parse through the 2.5km × 2.5km Real Time Mesoscale Analysis data from the UCAR THREDDS server. 29 | 30 | This package makes it easier for users to access and parse through the National Weather Service NDFD gridded forecast data. 31 | 32 | This package makes it easier for users to automate their weather graphics since the plotting functions of FireWxPy handle different run times so users will be able to automate their scripts in either the Windows Task Scheduler or a Cron Job. 33 | 34 | Copyright (C) Meteorologist Eric J. Drewitz 2024 35 | 36 | # Inspiration 37 | This package is largely inspired by the MetPy package which was developed and is currently being maintained by Unidata (please see citation below in the citations section). 38 | 39 | # Python Module Dependencies 40 | 1. PyGrib 41 | 2. Xarray 42 | 3. os 43 | 4. ftplib 44 | 5. MetPy 45 | 6. Siphon 46 | 7. NumPy 47 | 8. cartopy 48 | 9. Pandas 49 | 50 | # FireWxPy Documentation 51 | https://github.com/edrewitz/FireWxPy/blob/main/FireWxPy_docs.md 52 | 53 | # Author 54 | Eric J. Drewitz 55 | 56 | USDA/USFS Meteorologist 57 | 58 | Southern California Geographic Area Coordination Center 59 | 60 | # Citations 61 | 62 | **MetPy**: May, R. M., Goebbert, K. H., Thielen, J. E., Leeman, J. R., Camron, M. D., Bruick, Z., 63 | Bruning, E. C., Manser, R. P., Arms, S. C., and Marsh, P. T., 2022: MetPy: A 64 | Meteorological Python Library for Data Analysis and Visualization. Bull. Amer. Meteor. 65 | Soc., 103, E2273-E2284, https://doi.org/10.1175/BAMS-D-21-0125.1. 66 | 67 | **xarray**: Hoyer, S., Hamman, J. (In revision). Xarray: N-D labeled arrays and datasets in Python. Journal of Open Research Software. 68 | 69 | **pygrib**: Jeff Whitaker, daryl herzmann, Eric Engle, Josef Kemetmüller, Hugo van Kemenade, Martin Zackrisson, Jos de Kloe, Hrobjartur Thorsteinsson, Ryan May, Benjamin R. J. Schwedler, OKAMURA Kazuhide, ME-Mark-O, Mike Romberg, Ryan Grout, Tim Hopper, asellappenIBM, Hiroaki Itoh, Magnus Hagdorn, & Filipe. (2021). jswhit/pygrib: version 2.1.4 release (v2.1.4rel). Zenodo. https://doi.org/10.5281/zenodo.5514317 70 | 71 | **siphon**: May, R. M., Arms, S. C., Leeman, J. R., and Chastang, J., 2017: 72 | Siphon: A collection of Python Utilities for Accessing Remote Atmospheric 73 | and Oceanic Datasets. Unidata, Accessed 30 September 2017. 74 | [Available online at https://github.com/Unidata/siphon.] 75 | doi:10.5065/D6CN72NW. 76 | 77 | **cartopy**: Phil Elson, Elliott Sales de Andrade, Greg Lucas, Ryan May, Richard Hattersley, Ed Campbell, Andrew Dawson, Bill Little, Stephane Raynaud, scmc72, Alan D. Snow, Ruth Comer, Kevin Donkers, Byron Blay, Peter Killick, Nat Wilson, Patrick Peglar, lgolston, lbdreyer, … Chris Havlin. (2023). SciTools/cartopy: v0.22.0 (v0.22.0). Zenodo. https://doi.org/10.5281/zenodo.8216315 78 | 79 | **NumPy**: Harris, C.R., Millman, K.J., van der Walt, S.J. et al. Array programming with NumPy. Nature 585, 357–362 (2020). DOI: 10.1038/s41586-020-2649-2. (Publisher link). 80 | 81 | 82 | 83 | 84 | -------------------------------------------------------------------------------- /firewxpy.egg-info/SOURCES.txt: -------------------------------------------------------------------------------- 1 | LICENSE 2 | README.md 3 | pyproject.toml 4 | setup.py 5 | firewxpy/NWS_Forecast_Graphics.py 6 | firewxpy/NWS_Hot_Dry_And_Windy_Forecast_Graphics.py 7 | firewxpy/Real_Time_Mesoscale_Analysis_Graphics_Alaska.py 8 | firewxpy/Real_Time_Mesoscale_Analysis_Graphics_CONUS.py 9 | firewxpy/Real_Time_Mesoscale_Analysis_Graphics_Islands.py 10 | firewxpy/SPC_Outlook_Graphics.py 11 | firewxpy/__init__.py 12 | firewxpy/calc.py 13 | firewxpy/colormaps.py 14 | firewxpy/data_access.py 15 | firewxpy/geometry.py 16 | firewxpy/observations_graphics.py 17 | firewxpy/parsers.py 18 | firewxpy/settings.py 19 | firewxpy/standard.py 20 | firewxpy/utilities.py 21 | firewxpy.egg-info/PKG-INFO 22 | firewxpy.egg-info/SOURCES.txt 23 | firewxpy.egg-info/dependency_links.txt 24 | firewxpy.egg-info/requires.txt 25 | firewxpy.egg-info/top_level.txt 26 | test/test.py -------------------------------------------------------------------------------- /firewxpy.egg-info/dependency_links.txt: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /firewxpy.egg-info/requires.txt: -------------------------------------------------------------------------------- 1 | matplotlib>=3.7 2 | metpy>=1.5.1 3 | netcdf4>=1.7.1 4 | numpy>=1.24 5 | pandas>=2 6 | siphon>=0.9 7 | xarray>=2023.1.0 8 | pysolar>=0.11 9 | pygrib>=2.1.4 10 | cfgrib>=0.9.10.4 11 | cartopy>=0.21.0 12 | imageio>=2.34.0 13 | -------------------------------------------------------------------------------- /firewxpy.egg-info/top_level.txt: -------------------------------------------------------------------------------- 1 | firewxpy 2 | -------------------------------------------------------------------------------- /firewxpy/__init__.py: -------------------------------------------------------------------------------- 1 | import firewxpy.RTMA as rtma 2 | 3 | import firewxpy.SPC_Outlook_Graphics as spc 4 | 5 | from firewxpy.standard import plot_creation_time 6 | 7 | from firewxpy.data_access import RTMA, NDFD_GRIDS, obs, model_data, FEMS 8 | 9 | from firewxpy.NWS_Forecasts import temperature as nws_temperature_forecast 10 | from firewxpy.NWS_Forecasts import relative_humidity as nws_relative_humidity_forecast 11 | from firewxpy.NWS_Forecasts import critical_firewx as nws_critical_firewx_forecast 12 | 13 | from firewxpy.forecast_models import dynamics as model_dynamics 14 | from firewxpy.forecast_models import temperature as model_temperature 15 | from firewxpy.forecast_models import relative_humidity as model_relative_humidity 16 | from firewxpy.forecast_models import critical_firewx_conditions as model_critical_firewx_conditions 17 | from firewxpy.forecast_models import precipitation as model_precipitation 18 | from firewxpy.forecast_models import ensemble_8_day_mean_eofs 19 | 20 | from firewxpy.cross_sections import time_cross_sections, two_point_cross_sections 21 | 22 | from firewxpy.fuels_graphics import create_psa_100hr_fuels_charts, create_psa_1000hr_fuels_charts, create_psa_erc_fuels_charts, create_psa_bi_fuels_charts, create_psa_sc_fuels_charts, create_psa_ic_fuels_charts 23 | 24 | from firewxpy.observations import gridded_observations as gridded_obs 25 | from firewxpy.observations import METAR_Observations as metar_obs 26 | from firewxpy.observations import scatter_observations as scatter_obs 27 | 28 | from firewxpy.soundings import plot_observed_sounding, plot_observed_sounding_custom_date_time, plot_forecast_soundings 29 | 30 | from firewxpy.dims import get_metar_mask 31 | 32 | from firewxpy.sawti import sawti 33 | 34 | from firewxpy.solar_information import plot_daily_solar_information 35 | -------------------------------------------------------------------------------- /firewxpy/__pycache__/NWS_Forecast_Graphics.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/NWS_Forecast_Graphics.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/__init__.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/__init__.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/calc.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/calc.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/colormaps.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/colormaps.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/data_access.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/data_access.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/geometry.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/geometry.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/parsers.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/parsers.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/settings.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/settings.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/standard.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/standard.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/__pycache__/utilities.cpython-310.pyc: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/firewxpy/__pycache__/utilities.cpython-310.pyc -------------------------------------------------------------------------------- /firewxpy/calc.py: -------------------------------------------------------------------------------- 1 | 2 | 3 | import math 4 | import numpy as np 5 | import warnings 6 | warnings.filterwarnings('ignore') 7 | 8 | class unit_conversion: 9 | 10 | r''' 11 | THIS CLASS HOSTS A VARIETY OF FUNCTIONS TO CONVERT UNITS 12 | ''' 13 | 14 | def fahrenheit_to_celsius(f): 15 | 16 | c = (5/9) * (f-32) 17 | return c 18 | 19 | def meters_per_second_to_mph(wind_speed): 20 | 21 | return wind_speed * 2.23694 22 | 23 | def knots_to_mph(wind_speed): 24 | 25 | r''' 26 | This function converts wind speed from kts to mph 27 | ''' 28 | 29 | mph = wind_speed * 1.15078 30 | return mph 31 | 32 | def celsius_to_fahrenheit(temperature): 33 | 34 | r''' 35 | This function converts temperature from celsius to fahrenheit 36 | ''' 37 | 38 | frac = 9/5 39 | degF = (temperature * frac) + 32 40 | return degF 41 | 42 | def Temperature_Data_or_Dewpoint_Data_Kelvin_to_Fahrenheit(temperature_data_or_dewpoint_data): 43 | 44 | r''' 45 | THIS FUNCTION TAKES IN THE CURRENT TEMPERATURE OR DEWPOINT DATA ARRAY AND THE TEMPERATURE OR DEWPOINT DATA ARRAY FROM 24 HOURS AGO AND RETURNS THE TEMPERATURE OR DEWPOINT DIFFERENCE. THIS FUNCTION CONVERTS THE DATA FROM KELVIN TO FAHRENHEIT. 46 | 47 | THIS FUNCTION ALSO RETURNS A BLANK PANDAS DATAFRAME IF THERE IS NO DATA AVAILIABLE 48 | 49 | (C) METEOROLOGIST ERIC J. DREWITZ 50 | ''' 51 | 52 | degC = temperature_data_or_dewpoint_data - 273.15 53 | frac = 9/5 54 | degF = (degC * frac) + 32 55 | 56 | return degF 57 | 58 | 59 | def Temperature_Data_or_Dewpoint_Data_Kelvin_to_Celsius(temperature_data_or_dewpoint_data): 60 | 61 | r''' 62 | THIS FUNCTION TAKES IN THE CURRENT TEMPERATURE OR DEWPOINT DATA ARRAY AND THE TEMPERATURE OR DEWPOINT DATA ARRAY FROM 24 HOURS AGO AND RETURNS THE TEMPERATURE OR DEWPOINT DIFFERENCE. THIS FUNCTION CONVERTS THE DATA FROM KELVIN TO FAHRENHEIT. 63 | 64 | 65 | (C) METEOROLOGIST ERIC J. DREWITZ 66 | ''' 67 | 68 | degC = (temperature_data_or_dewpoint_data - 273.15) 69 | 70 | return degC 71 | 72 | 73 | def Temperature_or_Dewpoint_Change_Data_Kelvin_to_Fahrenheit(current_temperature_or_dewpoint_data, temperature_or_dewpoint_data_from_24_hours_ago): 74 | 75 | r''' 76 | THIS FUNCTION TAKES IN THE CURRENT TEMPERATURE DATA ARRAY AND THE TEMPERATURE DATA ARRAY FROM 24 HOURS AGO AND RETURNS THE TEMPERATURE DIFFERENCE. THIS FUNCTION CONVERTS THE DATA FROM KELVIN TO FAHRENHEIT. 77 | 78 | THIS FUNCTION ALSO RETURNS A BLANK PANDAS DATAFRAME IF THERE IS NO DATA AVAILIABLE 79 | 80 | (C) METEOROLOGIST ERIC J. DREWITZ 81 | ''' 82 | 83 | degC = current_temperature_or_dewpoint_data - 273.15 84 | frac = 9/5 85 | degF = (degC * frac) + 32 86 | degC_24 = temperature_or_dewpoint_data_from_24_hours_ago - 273.15 87 | degF_24 = (degC_24 * frac) + 32 88 | diff = degF - degF_24 89 | 90 | return diff 91 | 92 | 93 | def Temperature_or_Dewpoint_Change_Data_Kelvin_to_Celsius(current_temperature_or_dewpoint_data, temperature_or_dewpoint_data_from_24_hours_ago): 94 | 95 | r''' 96 | THIS FUNCTION TAKES IN THE CURRENT TEMPERATURE DATA ARRAY AND THE TEMPERATURE DATA ARRAY FROM 24 HOURS AGO AND RETURNS THE TEMPERATURE DIFFERENCE. THIS FUNCTION CONVERTS THE DATA FROM KELVIN TO FAHRENHEIT. 97 | 98 | THIS FUNCTION ALSO RETURNS A BLANK PANDAS DATAFRAME IF THERE IS NO DATA AVAILIABLE 99 | 100 | (C) METEOROLOGIST ERIC J. DREWITZ 101 | ''' 102 | 103 | degC = current_temperature_or_dewpoint_data - 273.15 104 | degC_24 = temperature_or_dewpoint_data_from_24_hours_ago - 273.15 105 | diff = degC - degC_24 106 | 107 | return diff 108 | 109 | 110 | 111 | def Temperature_Or_Dewpoint_Change_to_Fahrenheit_24_hour_comparison(current_temperature_or_dewpoint_dataset, temperature_or_dewpoint_dataset_from_24_hours_ago): 112 | 113 | r''' 114 | THIS FUNCTION PARSES THROUGH THE TEMPERATURE CHANGE AND RETURNS THE TEMPERATURE CHANGE. THIS FUNCTION CONVERTS THE DATA ARRAY FROM KELVIN TO FAHRENHEIT 115 | 116 | 117 | (C) METEOROLOGIST ERIC J. DREWITZ 118 | 119 | ''' 120 | 121 | degF = current_temperature_dataset * 1.8 122 | degF_24 = temperature_dataset_from_24_hours_ago * 1.8 123 | 124 | return degF, degF_24 125 | 126 | def Temperature_Or_Dewpoint_Change_to_Fahrenheit(current_temperature_or_dewpoint_dataset): 127 | 128 | r''' 129 | THIS FUNCTION PARSES THROUGH THE TEMPERATURE CHANGE AND RETURNS THE TEMPERATURE CHANGE. THIS FUNCTION CONVERTS THE DATA ARRAY FROM KELVIN TO FAHRENHEIT 130 | 131 | 132 | (C) METEOROLOGIST ERIC J. DREWITZ 133 | 134 | ''' 135 | 136 | return current_temperature_or_dewpoint_dataset * 1.8 137 | 138 | 139 | def longitude_correction(longitude): 140 | 141 | long_diff = longitude - 180 142 | 143 | new_coords = (180 - long_diff) * -1 144 | 145 | return new_coords 146 | 147 | 148 | class Thermodynamics: 149 | 150 | def saturation_vapor_pressure(temperature): 151 | 152 | r''' 153 | This function calculates the saturation vapor pressure from temperature. 154 | This function uses the formula from Bolton 1980. 155 | 156 | ''' 157 | 158 | e = 6.112 * np.exp(17.67 * (temperature) / (temperature + 243.5)) 159 | return e 160 | 161 | 162 | def relative_humidity_from_temperature_and_dewpoint_celsius(temperature, dewpoint): 163 | 164 | r''' 165 | This function calculates the relative humidity from temperature and dewpoint. 166 | ''' 167 | 168 | e = Thermodynamics.saturation_vapor_pressure(dewpoint) 169 | e_s = Thermodynamics.saturation_vapor_pressure(temperature) 170 | return (e / e_s) * 100 171 | 172 | def find_mixing_height(temperature, height): 173 | temperture = temperature 174 | height = height 175 | len_temp = len(temperature) 176 | len_height = len(height) 177 | if len_temp >= len_height: 178 | df_len = len_height 179 | else: 180 | df_len = len_temp 181 | 182 | df_len = df_len - 1 183 | vals = [] 184 | i = 0 185 | for i in range(0, df_len): 186 | if temperature.iloc[i+1] >= temperature.iloc[i]: 187 | val = height.iloc[i+1] 188 | vals.append(val) 189 | 190 | mixing_height = vals[0] 191 | if mixing_height < 0: 192 | mixing_height = 0 193 | return round(mixing_height * 3.28084, 1) 194 | 195 | 196 | class scaling: 197 | 198 | def get_ndfd_decimation(western_bound, eastern_bound, southern_bound, northern_bound): 199 | 200 | western_bound_init = -126 201 | eastern_bound_init = -66 202 | southern_bound_init = 24 203 | northern_bound_init = 50.5 204 | 205 | wb_init = abs(western_bound_init) 206 | eb_init = abs(eastern_bound_init) 207 | nb_init = abs(northern_bound_init) 208 | sb_init = abs(southern_bound_init) 209 | 210 | L1_init = wb_init - eb_init 211 | L2_init = nb_init - sb_init 212 | 213 | A_init = L1_init * L2_init 214 | 215 | wb = abs(western_bound) 216 | eb = abs(eastern_bound) 217 | nb = abs(northern_bound) 218 | sb = abs(southern_bound) 219 | 220 | L1 = wb - eb 221 | L2 = nb - sb 222 | 223 | A = L1 * L2 224 | 225 | decimate_init = 100 226 | 227 | decimate = (A * decimate_init) / A_init 228 | 229 | decimate = int(round(decimate, -1)) 230 | 231 | if decimate <= 20: 232 | if decimate <= 5: 233 | decimate = 20 234 | else: 235 | decimate = decimate * 5 236 | elif decimate < 100 and decimate > 20: 237 | decimate = decimate * 2 238 | else: 239 | decimate = decimate 240 | 241 | return decimate 242 | 243 | 244 | def get_nomads_decimation(western_bound, eastern_bound, southern_bound, northern_bound, barbs): 245 | 246 | western_bound_init = -122 247 | eastern_bound_init = -114 248 | southern_bound_init = 32 249 | northern_bound_init = 41 250 | 251 | wb_init = abs(western_bound_init) 252 | eb_init = abs(eastern_bound_init) 253 | nb_init = abs(northern_bound_init) 254 | sb_init = abs(southern_bound_init) 255 | 256 | L1_init = wb_init - eb_init 257 | L2_init = nb_init - sb_init 258 | 259 | A_init = L1_init * L2_init 260 | 261 | wb = abs(western_bound) 262 | eb = abs(eastern_bound) 263 | nb = abs(northern_bound) 264 | sb = abs(southern_bound) 265 | 266 | L1 = wb - eb 267 | L2 = nb - sb 268 | 269 | A = L1 * L2 270 | 271 | if barbs == False: 272 | decimate_init = 30 273 | 274 | if barbs == True: 275 | decimate_init = 40 276 | 277 | decimate = (A * decimate_init) / A_init 278 | 279 | decimate = int(round(decimate, -1)) 280 | 281 | if A > A_init: 282 | decimate = int(round((decimate / 2), 0)) 283 | if decimate > 100: 284 | decimate = 100 285 | else: 286 | decimate = decimate 287 | 288 | if decimate == 0: 289 | decimate = 10 290 | else: 291 | decimate = decimate 292 | 293 | return decimate 294 | 295 | 296 | def get_tds_rtma_decimation_by_state_or_gacc_region(state, gacc_region): 297 | 298 | if state != None and gacc_region == None: 299 | if state == 'US' or state == 'us' or state == 'USA' or state == 'usa': 300 | decimate = 3800 301 | 302 | if state == 'FL' or state == 'fl': 303 | decimate = 300 304 | 305 | if state == 'GA' or state == 'ga': 306 | decimate = 300 307 | 308 | if state == 'TN' or state == 'tn': 309 | decimate = 300 310 | 311 | if state == 'KY' or state == 'ky': 312 | decimate = 300 313 | 314 | if state == 'ME' or state == 'me': 315 | decimate = 300 316 | 317 | if state == 'NH' or state == 'nh': 318 | decimate = 300 319 | 320 | if state == 'VT' or state == 'vt': 321 | decimate = 300 322 | 323 | if state == 'MA' or state == 'ma': 324 | decimate = 300 325 | 326 | if state == 'RI' or state == 'ri': 327 | decimate = 300 328 | 329 | if state == 'CT' or state == 'ct': 330 | decimate = 300 331 | 332 | if state == 'NJ' or state == 'nj': 333 | decimate = 300 334 | 335 | if state == 'DE' or state == 'de': 336 | decimate = 300 337 | 338 | if state == 'PA' or state == 'pa': 339 | decimate = 300 340 | 341 | if state == 'OH' or state == 'oh': 342 | decimate = 300 343 | 344 | if state == 'MI' or state == 'mi': 345 | decimate = 300 346 | 347 | if state == 'MN' or state == 'mn': 348 | decimate = 300 349 | 350 | if state == 'WI' or state == 'wi': 351 | decimate = 300 352 | 353 | if state == 'IA' or state == 'ia': 354 | decimate = 300 355 | 356 | if state == 'IN' or state == 'in': 357 | decimate = 300 358 | 359 | if state == 'MO' or state == 'mo': 360 | decimate = 300 361 | 362 | if state == 'IL' or state == 'il': 363 | decimate = 300 364 | 365 | if state == 'ND' or state == 'nd': 366 | decimate = 300 367 | 368 | if state == 'SD' or state == 'sd': 369 | decimate = 300 370 | 371 | if state == 'NE' or state == 'ne': 372 | decimate = 300 373 | 374 | if state == 'MD' or state == 'md': 375 | decimate = 300 376 | 377 | if state == 'VA' or state == 'va': 378 | decimate = 300 379 | 380 | if state == 'SC' or state == 'sc': 381 | decimate = 300 382 | 383 | if state == 'KY' or state == 'ky': 384 | decimate = 300 385 | 386 | if state == 'WV' or state == 'wv': 387 | decimate = 300 388 | 389 | if state == 'NC' or state == 'nc': 390 | decimate = 300 391 | 392 | if state == 'NV' or state == 'nv': 393 | decimate = 300 394 | 395 | if state == 'FL' or state == 'fl': 396 | decimate = 300 397 | 398 | if state == 'OR' or state == 'or': 399 | decimate = 300 400 | 401 | if state == 'WA' or state == 'wa': 402 | decimate = 300 403 | 404 | if state == 'ID' or state == 'id': 405 | decimate = 300 406 | 407 | if state == 'GA' or state == 'ga': 408 | decimate = 300 409 | 410 | if state == 'AL' or state == 'al': 411 | decimate = 300 412 | 413 | if state == 'MS' or state == 'ms': 414 | decimate = 300 415 | 416 | if state == 'LA' or state == 'la': 417 | decimate = 300 418 | 419 | if state == 'AR' or state == 'ar': 420 | decimate = 300 421 | 422 | if state == 'TX' or state == 'tx': 423 | decimate = 300 424 | 425 | if state == 'OK' or state == 'ok': 426 | decimate = 300 427 | 428 | if state == 'NM' or state == 'nm': 429 | decimate = 300 430 | 431 | if state == 'AZ' or state == 'az': 432 | decimate = 300 433 | 434 | if state == 'UT' or state == 'ut': 435 | decimate = 300 436 | 437 | if state == 'CO' or state == 'co': 438 | decimate = 300 439 | 440 | if state == 'WY' or state == 'wy': 441 | decimate = 300 442 | 443 | if state == 'MT' or state == 'mt': 444 | decimate = 300 445 | 446 | if state == 'KS' or state == 'ks': 447 | decimate = 300 448 | 449 | if state == 'TN' or state == 'tn': 450 | decimate = 300 451 | 452 | if state == None and gacc_region != None: 453 | if gacc_region == 'OSCC' or gacc_region == 'oscc' or gacc_region == 'SOPS' or gacc_region == 'sops': 454 | decimate = 300 455 | if gacc_region == 'ONCC' or gacc_region == 'oncc' or gacc_region == 'NOPS' or gacc_region == 'nops': 456 | decimate = 300 457 | if gacc_region == 'GBCC' or gacc_region == 'gbcc' or gacc_region == 'GB' or gacc_region == 'gb': 458 | decimate = 900 459 | if gacc_region == 'NRCC' or gacc_region == 'nrcc' or gacc_region == 'NR' or gacc_region == 'nr': 460 | decimate = 900 461 | if gacc_region == 'RMCC' or gacc_region == 'rmcc' or gacc_region == 'RM' or gacc_region == 'rm': 462 | decimate = 600 463 | if gacc_region == 'SWCC' or gacc_region == 'swcc' or gacc_region == 'SW' or gacc_region == 'sw': 464 | decimate = 300 465 | if gacc_region == 'SACC' or gacc_region == 'sacc' or gacc_region == 'SE' or gacc_region == 'se': 466 | decimate = 1200 467 | if gacc_region == 'EACC' or gacc_region == 'eacc' or gacc_region == 'E' or gacc_region == 'e': 468 | decimate = 1200 469 | if gacc_region == 'PNW' or gacc_region == 'pnw' or gacc_region == 'NWCC' or gacc_region == 'nwcc' or gacc_region == 'NW' or gacc_region == 'nw': 470 | decimate = 300 471 | 472 | return decimate 473 | 474 | 475 | 476 | def get_NDFD_decimation_by_region(western_bound, eastern_bound, southern_bound, northern_bound, directory_name): 477 | 478 | directory_name = directory_name 479 | 480 | western_bound_init = -122 481 | eastern_bound_init = -114 482 | southern_bound_init = 32 483 | northern_bound_init = 40 484 | 485 | wb_init = abs(western_bound_init) 486 | eb_init = abs(eastern_bound_init) 487 | nb_init = abs(northern_bound_init) 488 | sb_init = abs(southern_bound_init) 489 | 490 | L1_init = wb_init - eb_init 491 | L2_init = nb_init - sb_init 492 | 493 | A_init = L1_init * L2_init 494 | 495 | wb = abs(western_bound) 496 | eb = abs(eastern_bound) 497 | nb = abs(northern_bound) 498 | sb = abs(southern_bound) 499 | 500 | L1 = wb - eb 501 | L2 = nb - sb 502 | 503 | A = L1 * L2 504 | 505 | if directory_name == 'CONUS': 506 | decimate_init = 2100 507 | elif directory_name == 'Northeast' or directory_name == 'northeast' or directory_name == 'neast' or directory_name == 'NE' or directory_name == 'ne' or directory_name == 'NEAST' or directory_name == 'Neast': 508 | decimate_init = 300 509 | 510 | elif directory_name == 'Central Great Lakes' or directory_name == 'CGL' or directory_name == 'central great lakes' or directory_name == 'cgl': 511 | decimate_init = 350 512 | 513 | elif directory_name == 'Eastern Great Lakes' or directory_name == 'eastern great lakes' or directory_name == 'EGL' or directory_name == 'egl': 514 | decimate_init = 250 515 | 516 | elif directory_name == 'Northern Plains' or directory_name == 'NORTHERN PLAINS' or directory_name == 'northern plains' or directory_name == 'NP' or directory_name == 'np' or directory_name == 'NPLAINS' or directory_name == 'nplains': 517 | decimate_init = 200 518 | 519 | elif directory_name == 'Central Plains' or directory_name == 'central plains' or directory_name == 'CP' or directory_name == 'cp': 520 | decimate_init = 200 521 | 522 | elif directory_name == 'Central Rockies' or directory_name == 'central rockies' or directory_name == 'CR' or directory_name == 'cr': 523 | decimate_init = 300 524 | 525 | elif directory_name == 'Northern Rockies' or directory_name == 'northern rockies' or directory_name == 'NR' or directory_name == 'nr': 526 | decimate_init = 350 527 | 528 | elif directory_name == 'Southern Rockies' or directory_name == 'southern rockies' or directory_name == 'SR' or directory_name == 'sr': 529 | decimate_init = 200 530 | 531 | elif directory_name == 'Mid Atlantic' or directory_name == 'Mid-Atlantic' or directory_name == 'mid atlantic' or directory_name == 'mid-atlantic' or directory_name == 'ma' or directory_name == 'Mid Atl' or directory_name == 'mid atl' or directory_name == 'Mid-Atl' or directory_name == 'mid-atl': 532 | decimate_init = 250 533 | 534 | else: 535 | decimate_init = 900 536 | 537 | decimate = (A * decimate_init) / A_init 538 | 539 | decimate = int(round(decimate, -2)) 540 | 541 | west = 124 542 | east = 67 543 | south = 25 544 | north = 49 545 | 546 | Lwe_conus = west - east 547 | Lns_conus = north - south 548 | A_conus = Lwe_conus * Lns_conus 549 | 550 | if A > A_init: 551 | decimate = (int(round((decimate / 2), 0))) + 500 552 | 553 | if A >= A_conus: 554 | decimate = decimate * 2 555 | else: 556 | decimate = decimate 557 | 558 | elif A < A_init: 559 | decimate = int(round((decimate / 2), 0)) 560 | 561 | else: 562 | decimate = decimate 563 | 564 | return decimate 565 | 566 | def get_rtma_decimation_by_state(state): 567 | 568 | state = state 569 | 570 | if state == 'US' or state == 'us' or state == 'USA' or state == 'usa': 571 | decimation = 11300 572 | if state == 'ME' or state =='me': 573 | decimation = 300 574 | if state == 'NH' or state =='nh': 575 | decimation = 300 576 | if state == 'VT' or state =='vt': 577 | decimation = 300 578 | if state == 'MA' or state =='ma': 579 | decimation = 300 580 | if state == 'RI' or state =='ri': 581 | decimation = 100 582 | if state == 'CT' or state =='ct': 583 | decimation = 300 584 | if state == 'NJ' or state =='nj': 585 | decimation = 300 586 | if state == 'DE' or state =='de': 587 | decimation = 100 588 | if state == 'NY' or state =='ny': 589 | decimation = 300 590 | if state == 'PA' or state =='pa': 591 | decimation = 300 592 | 593 | return decimation 594 | 595 | def get_NDFD_decimation_by_state(state): 596 | 597 | r''' 598 | This function returns the proper decimation factor for each state 599 | 600 | Required Arguments: 601 | 602 | 1) state (String) - The 2-letter identifier for the state in either all caps or lower case. 603 | For the entire United States use eiter CONUS or conus 604 | 605 | Return: The decimation factor to apply to the data 606 | 607 | ''' 608 | 609 | state = state 610 | 611 | if state == 'CONUS' or state == 'conus': 612 | decimate = 5525 613 | if state == 'AK' or state == 'ak': 614 | decimate = 4025 615 | if state == 'HI' or state == 'hi': 616 | decimate = 90 617 | if state == 'ME' or state == 'me': 618 | decimate = 100 619 | if state == 'NH' or state == 'nh': 620 | decimate = 30 621 | if state == 'VT' or state == 'vt': 622 | decimate = 30 623 | if state == 'NY' or state == 'ny': 624 | decimate = 2100 625 | if state == 'MA' or state == 'ma': 626 | decimate = 30 627 | if state == 'RI' or state == 'ri': 628 | decimate = 10 629 | if state == 'CT' or state == 'ct': 630 | decimate = 30 631 | if state == 'NJ' or state == 'nj': 632 | decimate = 30 633 | if state == 'DE' or state == 'de': 634 | decimate = 30 635 | if state == 'PA' or state == 'pa': 636 | decimate = 2100 637 | if state == 'OH' or state == 'oh': 638 | decimate = 2100 639 | if state == 'MI' or state == 'mi': 640 | decimate = 2100 641 | if state == 'MN' or state == 'mn': 642 | decimate = 225 643 | if state == 'ND' or state == 'nd': 644 | decimate = 225 645 | if state == 'SD' or state == 'sd': 646 | decimate = 225 647 | if state == 'NE' or state == 'ne': 648 | decimate = 225 649 | if state == 'MD' or state == 'md': 650 | decimate = 2100 651 | if state == 'VA' or state == 'va': 652 | decimate = 125 653 | if state == 'WV' or state == 'wv': 654 | decimate = 210 655 | if state == 'NC' or state == 'nc': 656 | decimate = 125 657 | if state == 'SC' or state == 'sc': 658 | decimate = 125 659 | if state == 'CA' or state == 'ca': 660 | decimate = 2100 661 | if state == 'NV' or state == 'nv': 662 | decimate = 2100 663 | if state == 'FL' or state == 'fl': 664 | decimate = 200 665 | if state == 'OR' or state == 'or': 666 | decimate = 200 667 | if state == 'WA' or state == 'wa': 668 | decimate = 200 669 | if state == 'ID' or state == 'id': 670 | decimate = 200 671 | if state == 'GA' or state == 'ga': 672 | decimate = 2100 673 | if state == 'AL' or state == 'al': 674 | decimate = 2100 675 | if state == 'MS' or state == 'ms': 676 | decimate = 90 677 | if state == 'LA' or state == 'la': 678 | decimate = 90 679 | if state == 'AR' or state == 'ar': 680 | decimate = 90 681 | if state == 'TX' or state == 'tx': 682 | decimate = 300 683 | if state == 'OK' or state == 'ok': 684 | decimate = 300 685 | if state == 'NM' or state == 'nm': 686 | decimate = 2100 687 | if state == 'AZ' or state == 'az': 688 | decimate = 900 689 | if state == 'UT' or state == 'ut': 690 | decimate = 600 691 | if state == 'CO' or state == 'co': 692 | decimate = 600 693 | if state == 'WY' or state == 'wy': 694 | decimate = 125 695 | if state == 'MT' or state == 'mt': 696 | decimate = 225 697 | if state == 'KS' or state == 'ks': 698 | decimate = 125 699 | if state == 'WI' or state == 'wi': 700 | decimate = 100 701 | if state == 'IA' or state == 'ia': 702 | decimate = 100 703 | if state == 'IN' or state == 'in': 704 | decimate = 30 705 | if state == 'IL' or state == 'il': 706 | decimate = 2100 707 | if state == 'MO' or state == 'mo': 708 | decimate = 90 709 | if state == 'KY' or state == 'ky': 710 | decimate = 2100 711 | if state == 'TN' or state == 'tn': 712 | decimate = 2100 713 | 714 | return decimate 715 | 716 | 717 | def get_NDFD_decimation_by_gacc_region(gacc_region): 718 | 719 | r''' 720 | This function returns the proper decimation factor for each GACC Region 721 | 722 | Required Arguments: 723 | 724 | 1) gacc_region (String) - The 4-letter identifier for the state in either all caps or lower case. 725 | 726 | Return: The decimation factor to apply to the data 727 | 728 | ''' 729 | 730 | gacc_region = gacc_region 731 | 732 | if gacc_region == 'OSCC' or gacc_region == 'oscc' or gacc_region == 'SOPS' or gacc_region == 'sops': 733 | decimate = 900 734 | 735 | if gacc_region == 'ONCC' or gacc_region == 'oncc' or gacc_region == 'NOPS' or gacc_region == 'nops': 736 | decimate = 2100 737 | 738 | if gacc_region == 'PNW' or gacc_region == 'pnw' or gacc_region == 'NWCC' or gacc_region == 'nwcc' or gacc_region == 'NW' or gacc_region == 'nw': 739 | decimate = 200 740 | 741 | if gacc_region == 'GBCC' or gacc_region == 'gbcc' or gacc_region == 'GB' or gacc_region == 'gb': 742 | decimate = 2100 743 | 744 | if gacc_region == 'NRCC' or gacc_region == 'nrcc' or gacc_region == 'NR' or gacc_region == 'nr': 745 | decimate = 2100 746 | 747 | if gacc_region == 'SWCC' or gacc_region == 'swcc' or gacc_region == 'SW' or gacc_region == 'sw': 748 | decimate = 2100 749 | 750 | if gacc_region == 'RMCC' or gacc_region == 'rmcc' or gacc_region == 'RM' or gacc_region == 'rm': 751 | decimate = 2100 752 | 753 | if gacc_region == 'SACC' or gacc_region == 'sacc' or gacc_region == 'SE' or gacc_region == 'se': 754 | decimate = 6525 755 | 756 | if gacc_region == 'EACC' or gacc_region == 'eacc' or gacc_region == 'E' or gacc_region == 'e': 757 | decimate = 6525 758 | 759 | return decimate 760 | 761 | 762 | class contouring: 763 | 764 | def get_label_levels(start, stop, step): 765 | 766 | start=start 767 | stop=stop 768 | step=step 769 | 770 | levels = [] 771 | 772 | levels.append(start) 773 | for i in range(start, stop): 774 | val = ((start + step) * i) + step 775 | if val < stop: 776 | levels.append(val) 777 | 778 | levels.append(stop) 779 | 780 | return levels 781 | 782 | 783 | 784 | 785 | -------------------------------------------------------------------------------- /firewxpy/colormaps.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file hosts all the various colortables used in FireWxPy 3 | 4 | (C) Eric J. Drewitsz 2025 5 | USDA/USFS 6 | 7 | """ 8 | 9 | 10 | import matplotlib.colors 11 | import warnings 12 | warnings.filterwarnings('ignore') 13 | 14 | def cross_section_wind_speed(): 15 | cross_section_wind_speed = matplotlib.colors.LinearSegmentedColormap.from_list("cs wind speed", ["darkblue", "blue", "cyan", "lawngreen", "yellowgreen", "orange", "red", "darkred", "violet", "dimgrey"]) 16 | 17 | return cross_section_wind_speed 18 | 19 | def precipitation_colormap(): 20 | precipitation_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("precipitation", ["magenta", "blue", "cyan", "lime", "darkgreen", "gold", "orange", "red", "darkred", "maroon", "dimgrey"]) 21 | 22 | return precipitation_colormap 23 | 24 | def eof_colormap(): 25 | eof_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("eof", ["darkblue", "blue", "deepskyblue", "gray", "gray", "gray", "orangered", "red", "darkred"]) 26 | 27 | return eof_colormap 28 | 29 | def gph_colormap(): 30 | gph_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("gph", [ "indigo", "purple", "darkblue", "blue", "dodgerblue", "cyan", "orange", "darkorange", "orangered", "red", "darkred", "maroon"]) 31 | 32 | return gph_colormap 33 | 34 | def vorticity_colormap(): 35 | vorticity_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("vorticity", [ "white", "white", "cyan", "lime", "gold", "orangered", "darkred", "blueviolet", "dimgrey"]) 36 | 37 | return vorticity_colormap 38 | 39 | def temperature_colormap(): 40 | temperature_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("temperature", ["darkviolet", "blue", "deepskyblue", "white", "orangered", "red", "darkred"]) 41 | 42 | return temperature_colormap 43 | 44 | def temperature_colormap_alt(): 45 | temperature_colormap_alt = matplotlib.colors.LinearSegmentedColormap.from_list("temperature alt", ["darkviolet", "blue", "deepskyblue", "lime", "gold", "orangered", "red", "darkred"]) 46 | 47 | return temperature_colormap_alt 48 | 49 | def gph_change_colormap(): 50 | gph_change_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("gph change", ["darkblue", "blue", "deepskyblue", "white", "orangered", "red", "darkred"]) 51 | 52 | return gph_change_colormap 53 | 54 | def temperature_change_colormap(): 55 | temperature_change_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("temperature change", ["darkblue", "blue", "deepskyblue", "lightgrey", "lightgrey", "orangered", "red", "darkred"]) 56 | 57 | return temperature_change_colormap 58 | 59 | def vertical_velocity_colormap(): 60 | vertical_velocity_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("vv", ["darkblue", "blue", "deepskyblue", "orangered", "red", "darkred"]) 61 | 62 | return vertical_velocity_colormap 63 | 64 | def dew_point_colormap(): 65 | dew_point_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("dew point", ["darkorange", "orange", "darkkhaki", "forestgreen", "lime", "aqua"]) 66 | 67 | return dew_point_colormap 68 | 69 | def dew_point_change_colormap(): 70 | dew_point_change_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("dew point change", ["darkorange", "darkkhaki", "lightgrey", "forestgreen", "aqua"]) 71 | 72 | return dew_point_change_colormap 73 | 74 | def wind_speed_colormap(): 75 | wind_speed_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("wind speed", ["magenta", "purple", "blue", "cyan", "goldenrod", "darkgoldenrod", "orange", "darkorange"]) 76 | 77 | return wind_speed_colormap 78 | 79 | def theta_e_colormap(): 80 | theta_e_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("theta e", ["darkblue", "dodgerblue", "turquoise", "lawngreen", "gold", "darkorange", "darkred"]) 81 | 82 | return theta_e_colormap 83 | 84 | def wind_speed_change_colormap(): 85 | wind_speed_change_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("wind speed change", ["magenta", "blue", "lightgrey", "darkorange", "darkred"]) 86 | 87 | return wind_speed_change_colormap 88 | 89 | def thresh_contour_line_relative_humidity_colormap(): 90 | thresh_contour_line_relative_humidity_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("relative humidity thresh", ["black"]) 91 | 92 | return thresh_contour_line_relative_humidity_colormap 93 | 94 | def relative_humidity_colormap(): 95 | relative_humidity_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("relative humidity", ["saddlebrown", "darkorange", "gold", "lightgoldenrodyellow", "yellowgreen", "lawngreen", "springgreen", "lime"]) 96 | 97 | return relative_humidity_colormap 98 | 99 | 100 | def relative_humidity_change_colormap(): 101 | relative_humidity_change_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("relative humidity", ["saddlebrown", "peru", "orange", "gold", "lightgrey", "yellowgreen", "lawngreen", "springgreen", "lime"]) 102 | 103 | return relative_humidity_change_colormap 104 | 105 | 106 | def excellent_recovery_colormap(): 107 | excellent_recovery_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("relative humidity", ["greenyellow", "lightgreen", "palegreen", "mediumspringgreen", "springgreen", "lime"]) 108 | 109 | return excellent_recovery_colormap 110 | 111 | def low_relative_humidity_colormap(): 112 | low_relative_humidity_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("relative humidity", ["saddlebrown", "chocolate", "darkorange", "orange"]) 113 | 114 | return low_relative_humidity_colormap 115 | 116 | def SPC_Critical_Fire_Weather_Risk_Outlook_colormap(): 117 | SPC_Critical_Fire_Weather_Risk_Outlook_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("SPC Critical Fire Weather Outlook", ["gold", "darkorange", "red"]) 118 | 119 | return SPC_Critical_Fire_Weather_Risk_Outlook_colormap 120 | 121 | def SPC_Dry_Lightning_Risk_Outlook_colormap(): 122 | SPC_Dry_Lightning_Risk_Outlook_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("SPC Dry Lightning Outlook", ["darkorange", "red"]) 123 | 124 | return SPC_Dry_Lightning_Risk_Outlook_colormap 125 | 126 | def spc_convective_outlook_colormap(): 127 | spc_convective_outlook_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("SPC Convective Outlook", ["green", "yellowgreen", "darkorange", "darkred", "violet"]) 128 | 129 | return spc_convective_outlook_colormap 130 | 131 | 132 | def red_flag_warning_alaska_temperature_parameter_colormap(): 133 | red_flag_warning_alaska_temperature_parameter_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("temperature", ["pink", "lightcoral", "red", "darkred"]) 134 | 135 | return red_flag_warning_alaska_temperature_parameter_colormap 136 | 137 | def red_flag_warning_wind_parameter_colormap(): 138 | red_flag_warning_wind_parameter_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("wind speed", ["dodgerblue", "royalblue", "blue", "darkblue", "blueviolet", "darkviolet"]) 139 | 140 | return red_flag_warning_wind_parameter_colormap 141 | 142 | def red_flag_warning_criteria_colormap(): 143 | red_flag_warning_criteria_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("red flag warning", ["beige", "red"]) 144 | return red_flag_warning_criteria_colormap 145 | 146 | def red_flag_warning_criteria_colormap_alt(): 147 | red_flag_warning_criteria_colormap_alt = matplotlib.colors.LinearSegmentedColormap.from_list("red flag warning alt", ["beige", "purple"]) 148 | return red_flag_warning_criteria_colormap_alt 149 | 150 | def cool_temperatures_colormap(): 151 | cool_temperatures_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("cool temperatures", ["darkviolet", "darkblue", "blue", "dodgerblue"]) 152 | return cool_temperatures_colormap 153 | 154 | def warm_temperatures_colormap(): 155 | warm_temperatures_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("warm temperatures", ["pink", "tomato", "red", "darkred"]) 156 | return warm_temperatures_colormap 157 | 158 | def negative_relative_humidity_trend_colormap(): 159 | negative_relative_humidity_trend_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("negative relative humidity", ["saddlebrown", "peru", "darkgoldenrod", "goldenrod", "darkorange", "orange"]) 160 | 161 | return negative_relative_humidity_trend_colormap 162 | 163 | 164 | def positive_relative_humidity_trend_colormap(): 165 | positive_relative_humidity_trend_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("positive relative humidity", ["yellowgreen", "chartreuse", "lime", "springgreen", "green", "darkgreen"]) 166 | 167 | return positive_relative_humidity_trend_colormap 168 | 169 | def relative_humidity_change_filtered_colormap(): 170 | relative_humidity_change_filtered_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("relative humidity change filtered", ["saddlebrown", "peru", "darkgoldenrod", "darkorange", "white", "white", "lawngreen", "springgreen", "green", "darkgreen"]) 171 | 172 | return relative_humidity_change_filtered_colormap 173 | 174 | def cloud_cover_colormap(): 175 | cloud_cover_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("cloud cover", ["deepskyblue", "lightslategrey"]) 176 | 177 | return cloud_cover_colormap 178 | 179 | def cloud_cover_change_colormap(): 180 | cloud_cover_change_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("cloud cover change", ["deepskyblue", "white", "lightslategrey"]) 181 | 182 | return cloud_cover_change_colormap 183 | 184 | def colorblind_mode_divergent_colormap(): 185 | colorblind_mode_divergent_colormap = matplotlib.colors.LinearSegmentedColormap.from_list("colorblind mode divergent", ["indigo", "darkviolet", "white", "white", "orange", "darkorange"]) 186 | 187 | return colorblind_mode_divergent_colormap 188 | -------------------------------------------------------------------------------- /firewxpy/geometry.py: -------------------------------------------------------------------------------- 1 | # THIS FILE CONTAINS FUNCTIONS THAT RETURN VARIOUS TYPES OF GEOMETRIES FOR PLOTTING 2 | # PYTHON DEPENDENCIES: 3 | # 1) MATPLOTLIB 4 | # 2) CARTOPY 5 | # 6 | # (C) METEOROLOGIST ERIC J. DREWITZ 7 | # USDA/USFS 8 | 9 | ###### IMPORTS ################ 10 | import urllib.request 11 | import os 12 | import matplotlib.pyplot as plt 13 | import cartopy.crs as ccrs 14 | import warnings 15 | warnings.filterwarnings('ignore') 16 | 17 | from cartopy.io.shapereader import Reader 18 | from cartopy.feature import ShapelyFeature 19 | from firewxpy.utilities import file_functions 20 | 21 | def get_shapes(file_path): 22 | 23 | try: 24 | shape_feature = ShapelyFeature(Reader(file_path).geometries(), 25 | ccrs.PlateCarree(), facecolor=(0,0,0,0), edgecolor='black') 26 | 27 | fname = os.path.basename(file_path) 28 | 29 | return shape_feature 30 | 31 | except Exception as a: 32 | error = shape_file_error() 33 | print(error) 34 | 35 | 36 | def shape_file_error(): 37 | error_msg = f""" 38 | 39 | WARNING: COULD NOT FIND FILE. PLEASE MAKE SURE YOU HAVE THE CORRECT FILE PATH. 40 | 41 | ALSO, BE SURE TO HAVE ALL THE FILES AS FOLLOWS LOCATED IN THE FOLDER. 42 | HERE IS AN EXAMPLE WITH USING THE PSA BOUNDARY SHAPE FILES. 43 | 44 | National_PSA_Current.shp 45 | National_PSA_Current.shx 46 | National_PSA_Current.xml 47 | National_PSA_Current.cpg 48 | National_PSA_Current.dbf 49 | National_PSA_Current.prj 50 | 51 | THE .SHP FILE IS THE FILE THAT NEEDS TO BE USED IN THE FUNCTION. 52 | 53 | """ 54 | return error_msg 55 | 56 | 57 | def download_shape_files(): 58 | 59 | # Defines file paths for different shapefiles 60 | cwa_path = f"NWS CWA Boundaries" 61 | fwz_path = f"NWS Fire Weather Zones" 62 | pz_path = f"NWS Public Zones" 63 | psa_path = f"PSA Shapefiles" 64 | gacc_path = f"GACC Boundaries Shapefiles" 65 | 66 | # CWAs 67 | 68 | if os.path.exists(cwa_path): 69 | pass 70 | else: 71 | # Makes new folder 72 | print("Welcome First Time FireWxPy User!\nLet me set you up automatically by downloading & installing all the shapefiles while also building the Weather Data directory for you.\nMy Motto is: 'Let the FireWxPy functions do the work so you don't have to!'\nSetting Up...") 73 | os.mkdir("NWS CWA Boundaries") 74 | # Downloads the CWA Shapefiles 75 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_CWA_Boundaries/w_05mr24.dbf', 'w_05mr24.dbf') 76 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_CWA_Boundaries/w_05mr24.prj', 'w_05mr24.prj') 77 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_CWA_Boundaries/w_05mr24.shx', 'w_05mr24.shx') 78 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_CWA_Boundaries/w_05mr24.zip', 'w_05mr24.zip') 79 | # Moves files to new folder 80 | os.replace('w_05mr24.zip', f"NWS CWA Boundaries/w_05mr24.zip") 81 | os.replace('w_05mr24.dbf', f"NWS CWA Boundaries/w_05mr24.dbf") 82 | os.replace('w_05mr24.prj', f"NWS CWA Boundaries/w_05mr24.prj") 83 | os.replace('w_05mr24.shx', f"NWS CWA Boundaries/w_05mr24.shx") 84 | 85 | # Fire Weather Zones 86 | 87 | if os.path.exists(fwz_path): 88 | pass 89 | else: 90 | # Makes new folder 91 | os.mkdir("NWS Fire Weather Zones") 92 | # Downloads the FWZ Shapefiles 93 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_Fire_Weather_Zones/fz05mr24.zip', 'fz05mr24.zip') 94 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_Fire_Weather_Zones/fz05mr24.dbf', 'fz05mr24.dbf') 95 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_Fire_Weather_Zones/fz05mr24.prj', 'fz05mr24.prj') 96 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_Fire_Weather_Zones/fz05mr24.shx', 'fz05mr24.shx') 97 | # Moves files to new folder 98 | os.replace('fz05mr24.zip', f"NWS Fire Weather Zones/fz05mr24.zip") 99 | os.replace('fz05mr24.dbf', f"NWS Fire Weather Zones/fz05mr24.dbf") 100 | os.replace('fz05mr24.prj', f"NWS Fire Weather Zones/fz05mr24.prj") 101 | os.replace('fz05mr24.shx', f"NWS Fire Weather Zones/fz05mr24.shx") 102 | 103 | # Public Zones 104 | 105 | if os.path.exists(pz_path): 106 | pass 107 | else: 108 | # Makes new folder 109 | os.mkdir("NWS Public Zones") 110 | # Downloads files 111 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_Public_Zones/z_05mr24.zip', 'z_05mr24.zip') 112 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_Public_Zones/z_05mr24.dbf', 'z_05mr24.dbf') 113 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_Public_Zones/z_05mr24.prj', 'z_05mr24.prj') 114 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/NWS_Public_Zones/z_05mr24.shx', 'z_05mr24.shx') 115 | # Moves files to new folder 116 | os.replace('z_05mr24.zip', f"NWS Public Zones/z_05mr24.zip") 117 | os.replace('z_05mr24.dbf', f"NWS Public Zones/z_05mr24.dbf") 118 | os.replace('z_05mr24.prj', f"NWS Public Zones/z_05mr24.prj") 119 | os.replace('z_05mr24.shx', f"NWS Public Zones/z_05mr24.shx") 120 | 121 | # GACC Boundaries 122 | if os.path.exists(gacc_path): 123 | pass 124 | else: 125 | # Makes new folder 126 | os.mkdir("GACC Boundaries Shapefiles") 127 | # Downloads files 128 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/GACC%20Boundaries%20Shapefiles/National_GACC_Boundaries.xml', 'National_GACC_Boundaries.xml') 129 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/GACC%20Boundaries%20Shapefiles/National_GACC_Current.cpg', 'National_GACC_Current.cpg') 130 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/GACC%20Boundaries%20Shapefiles/National_GACC_Current.dbf', 'National_GACC_Current.dbf') 131 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/GACC%20Boundaries%20Shapefiles/National_GACC_Current.prj', 'National_GACC_Current.prj') 132 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/GACC%20Boundaries%20Shapefiles/National_GACC_Current.shp', 'National_GACC_Current.shp') 133 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/GACC%20Boundaries%20Shapefiles/National_GACC_Current.shx', 'National_GACC_Current.shx') 134 | # Moves files to folder 135 | os.replace('National_GACC_Boundaries.xml', f"GACC Boundaries Shapefiles/National_GACC_Boundaries.xml") 136 | os.replace('National_GACC_Current.cpg', f"GACC Boundaries Shapefiles/National_GACC_Current.cpg") 137 | os.replace('National_GACC_Current.dbf', f"GACC Boundaries Shapefiles/National_GACC_Current.dbf") 138 | os.replace('National_GACC_Current.prj', f"GACC Boundaries Shapefiles/National_GACC_Current.prj") 139 | os.replace('National_GACC_Current.shp', f"GACC Boundaries Shapefiles/National_GACC_Current.shp") 140 | os.replace('National_GACC_Current.shx', f"GACC Boundaries Shapefiles/National_GACC_Current.shx") 141 | 142 | # PSA Boundaries 143 | if os.path.exists(psa_path): 144 | pass 145 | else: 146 | # Makes new folder 147 | os.mkdir("PSA Shapefiles") 148 | # Downloads files 149 | 150 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/PSA%20Shapefiles/National_PSA_Current.xml', 'National_PSA_Current.xml') 151 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/PSA%20Shapefiles/National_PSA_Current.cpg', 'National_PSA_Current.cpg') 152 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/PSA%20Shapefiles/National_PSA_Current.dbf', 'National_PSA_Current.dbf') 153 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/PSA%20Shapefiles/National_PSA_Current.prj', 'National_PSA_Current.prj') 154 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/PSA%20Shapefiles/National_PSA_Current.shp', 'National_PSA_Current.shp') 155 | urllib.request.urlretrieve('https://raw.githubusercontent.com/edrewitz/firewxpy/refs/heads/main/shapefiles/PSA%20Shapefiles/National_PSA_Current.shx', 'National_PSA_Current.shx') 156 | 157 | # Moves files to folder 158 | os.replace('National_PSA_Current.xml', f"PSA Shapefiles/National_PSA_Current.xml") 159 | os.replace('National_PSA_Current.cpg', f"PSA Shapefiles/National_PSA_Current.cpg") 160 | os.replace('National_PSA_Current.dbf', f"PSA Shapefiles/National_PSA_Current.dbf") 161 | os.replace('National_PSA_Current.prj', f"PSA Shapefiles/National_PSA_Current.prj") 162 | os.replace('National_PSA_Current.shp', f"PSA Shapefiles/National_PSA_Current.shp") 163 | os.replace('National_PSA_Current.shx', f"PSA Shapefiles/National_PSA_Current.shx") 164 | print("Set Up Complete! Have Fun!") 165 | 166 | 167 | 168 | def import_shapefiles(file_path, line_color, boundary_type): 169 | 170 | r''' 171 | This function reads and returns the shapefiles (.shp) files from a specific file location. 172 | 173 | Required Arguments: 1) file_path (String) - The file location of the SHP files. 174 | 2) line_color (String) - The color the user wishes to display for the borders in the shapefile. 175 | 3) boundary_type (String) - The type of geographical boundaries the user wishes to use. 176 | This is necessary because the NWS boundaries have a large file size which to be able to host on github, the files need to be zipped so we need to unzip and extract those files. 177 | 178 | Returns: 1) The shapefile borders the user wishes to import into the weather graphics. 179 | 180 | ''' 181 | file_path = file_path 182 | line_color = line_color 183 | boundary_type = boundary_type 184 | 185 | download_shape_files() 186 | 187 | if boundary_type == 'cwa': 188 | 189 | if os.path.exists(f"NWS CWA Boundaries/w_05mr24.shp"): 190 | pass 191 | else: 192 | file_functions.extract_zipped_files(f"NWS CWA Boundaries/w_05mr24.zip", f"NWS CWA Boundaries") 193 | 194 | elif boundary_type == 'fwz': 195 | 196 | if os.path.exists(f"NWS Fire Weather Zones/fz05mr24.shp"): 197 | pass 198 | else: 199 | file_functions.extract_zipped_files(f"NWS Fire Weather Zones/fz05mr24.zip", f"NWS Fire Weather Zones") 200 | 201 | elif boundary_type == 'pz': 202 | 203 | if os.path.exists(f"NWS Public Zones/z_05mr24.shp"): 204 | pass 205 | else: 206 | file_functions.extract_zipped_files(f"NWS Public Zones/z_05mr24.zip", f"NWS Public Zones") 207 | 208 | else: 209 | pass 210 | 211 | PSAs = import_shapefiles(f"PSA Shapefiles/National_PSA_Current.shp", 'black', 'psa') 212 | 213 | GACC = import_shapefiles(f"GACC Boundaries Shapefiles/National_GACC_Current.shp", 'black', 'gacc') 214 | 215 | CWAs = import_shapefiles(f"NWS CWA Boundaries/w_05mr24.shp", 'black', 'cwa') 216 | 217 | FWZs = import_shapefiles(f"NWS Fire Weather Zones/fz05mr24.shp", 'black', 'fwz') 218 | 219 | PZs = import_shapefiles(f"NWS Public Zones/z_05mr24.shp", 'black', 'pz') 220 | 221 | -------------------------------------------------------------------------------- /firewxpy/parsers.py: -------------------------------------------------------------------------------- 1 | """ 2 | This file is written by (C) Meteorologist Eric J. Drewitz 3 | USDA/USFS 4 | 5 | """ 6 | 7 | import pandas as pd 8 | import warnings 9 | warnings.filterwarnings('ignore') 10 | 11 | from dateutil import tz 12 | from datetime import datetime, timedelta 13 | from firewxpy.calc import unit_conversion 14 | 15 | from_zone = tz.tzutc() 16 | to_zone = tz.tzlocal() 17 | 18 | class NDFD: 19 | 20 | r''' 21 | This class hosts functions to parse the NDFD GRIB2 files 22 | 23 | ''' 24 | 25 | def ndfd_to_dataframe(ds, parameter, diff=False, temperature_to_F=False, decimate=None): 26 | 27 | r''' 28 | This function parses the NDFD GRIB2 file and converts the data array into a pandas dataframe 29 | 30 | Required Arguments: 31 | 32 | 1) ds (xarray.dataarray) - The NDFD GRIB2 dataset 33 | 34 | 2) parameter (String) - The variable name. 35 | 36 | Optional Arguments: 37 | 38 | 1) diff (Boolean) - Default = False. If set to True, the difference between value[i+1] and value[i] will be returned (val[i+1] - val[i]). 39 | 40 | 2) temperature_to_F (Boolean) - Default = False. If set to True, values will be converted from Kelvin to Fahrenheit. 41 | 42 | 3) decimate (Integer) - Default = None. If set to a non-None value, the data will be decimated on both the x and y coordinates by the magnitude of the set value. 43 | 44 | Return: A pandas dataframe of the NDFD values. 45 | 46 | ''' 47 | 48 | ds = ds 49 | 50 | try: 51 | stop = len(ds['valid_time']) 52 | except Exception as e: 53 | stop = len(ds['step']) 54 | 55 | vals = [] 56 | 57 | if temperature_to_F == True: 58 | ds[parameter] = unit_conversion.Temperature_Data_or_Dewpoint_Data_Kelvin_to_Fahrenheit(ds[parameter]) 59 | else: 60 | pass 61 | 62 | if decimate != None: 63 | if diff == False: 64 | for i in range(0, stop, 1): 65 | val = ds[parameter][i, ::decimate, ::decimate].to_dataframe() 66 | vals.append(val) 67 | else: 68 | for i in range(1, stop, 1): 69 | try: 70 | val = ds[parameter][i, ::decimate, ::decimate] - ds[parameter][i-1, ::decimate, ::decimate] 71 | val = val.to_dataframe() 72 | vals.append(val) 73 | except Exception as e: 74 | pass 75 | 76 | if decimate == None: 77 | 78 | if diff == False: 79 | for i in range(0, stop, 1): 80 | val = ds[parameter][i, :, :].to_dataframe() 81 | vals.append(val) 82 | 83 | else: 84 | for i in range(1, stop, 1): 85 | try: 86 | val = ds[parameter][i, :, :] - ds[parameter][i-1, :, :] 87 | val = val.to_dataframe() 88 | vals.append(val) 89 | except Exception as e: 90 | pass 91 | 92 | return vals 93 | 94 | 95 | def get_valid_times_xarray(ds, time_interval): 96 | 97 | r''' 98 | This function will get all of the forecast validity times for the time length of the grid for the specific weather element in NDFD. 99 | 100 | Required Arguments: 101 | 102 | 1) ds (xarray.dataarray) - The NDFD GRIB2 dataset 103 | 104 | 2) time_interval (Integer) - The time length of the grid in hours. 105 | 106 | Returns: A list of the start and end times in local time for each forecast interval. 107 | 108 | ''' 109 | 110 | ds = ds 111 | 112 | stop = len(ds['valid_time']) 113 | 114 | start_times = [] 115 | end_times = [] 116 | start_times_utc = [] 117 | 118 | for i in range(0, stop, 1): 119 | end_time = ds['valid_time'][i] 120 | end_time = end_time.to_pandas() 121 | end_time = pd.to_datetime(end_time) 122 | end_time = end_time.replace(tzinfo=from_zone) 123 | end_time = end_time.astimezone(to_zone) 124 | end_times.append(end_time) 125 | 126 | for i in range(0, stop, 1): 127 | start_time = end_times[i] - timedelta(hours=time_interval) 128 | start_times.append(start_time) 129 | start_time_utc = start_time.replace(tzinfo=to_zone) 130 | start_time_utc = start_time.astimezone(from_zone) 131 | start_times_utc.append(start_time_utc) 132 | 133 | return start_times, end_times, start_times_utc 134 | 135 | class checks: 136 | 137 | r''' 138 | 139 | This class hosts functions to check various things: 140 | 141 | 1) Wind Direction 142 | 2) RTMA vs. METAR Observation times 143 | 144 | ''' 145 | 146 | def wind_direction_number_to_abbreviation(wind_direction): 147 | 148 | r''' 149 | This function takes the numerical wind direction and assigns an abbreviation (i.e. N vs. NW) to the value 150 | 151 | Inputs: 152 | 1) wind_direction (Integer or Float) 153 | 154 | Returns: 155 | 1) wind_direction (String) 156 | 157 | ''' 158 | wind_direction = wind_direction 159 | 160 | if wind_direction >= 358 or wind_direction <= 2: 161 | wind_dir = 'N' 162 | if wind_direction > 2 and wind_direction <= 30: 163 | wind_dir = 'NNE' 164 | if wind_direction > 30 and wind_direction <= 60: 165 | wind_dir = 'NE' 166 | if wind_direction > 60 and wind_direction < 88: 167 | wind_dir = 'ENE' 168 | if wind_direction >= 88 and wind_direction <= 92: 169 | wind_dir = 'E' 170 | if wind_direction > 92 and wind_direction <= 120: 171 | wind_dir = 'ESE' 172 | if wind_direction > 120 and wind_direction <= 150: 173 | wind_dir = 'SE' 174 | if wind_direction > 150 and wind_direction < 178: 175 | wind_dir = 'SSE' 176 | if wind_direction >= 178 and wind_direction <= 182: 177 | wind_dir = 'S' 178 | if wind_direction > 182 and wind_direction <= 210: 179 | wind_dir = 'SSW' 180 | if wind_direction > 210 and wind_direction <= 240: 181 | wind_dir = 'SW' 182 | if wind_direction > 240 and wind_direction < 268: 183 | wind_dir = 'WSW' 184 | if wind_direction >= 268 and wind_direction <= 272: 185 | wind_dir = 'W' 186 | if wind_direction > 272 and wind_direction <= 300: 187 | wind_dir = 'WNW' 188 | if wind_direction > 300 and wind_direction <= 330: 189 | wind_dir = 'NW' 190 | if wind_direction > 330 and wind_direction < 358: 191 | wind_dir = 'NNW' 192 | 193 | return wind_dir 194 | 195 | 196 | def check_RTMA_vs_METAR_Times(real_time_mesoscale_analysis_time, metar_observation_time): 197 | 198 | r''' 199 | This function compares the time of the RTMA and the time of the observations to make them match. 200 | 201 | Required Arguments: 202 | 203 | 1) real_time_mesoscale_analysis_time (datetime) - The time of the RTMA 204 | 205 | 2) metar_observation_time (datetime) - The time of the METAR observations 206 | 207 | Returns: The latest time where there is a match between RTMA & METAR Observations 208 | 209 | ''' 210 | 211 | metar_time = metar_observation_time 212 | 213 | rtma_time = real_time_mesoscale_analysis_time 214 | 215 | time_diff = metar_time.hour - rtma_time.hour 216 | 217 | if metar_time.hour > rtma_time.hour: 218 | new_metar_time = metar_time - timedelta(hours=time_diff) 219 | 220 | if metar_time.hour < rtma_time.hour: 221 | hour = rtma_time.hour 222 | new_metar_time = metar_time - timedelta(days=1) 223 | year = new_metar_time.year 224 | month = new_metar_time.month 225 | day = new_metar_time.day 226 | new_metar_time = datetime(year, month, day, hour) 227 | 228 | else: 229 | new_metar_time = rtma_time 230 | 231 | 232 | return new_metar_time 233 | 234 | 235 | 236 | 237 | 238 | 239 | 240 | -------------------------------------------------------------------------------- /firewxpy/solar_information.py: -------------------------------------------------------------------------------- 1 | import firewxpy.standard as standard 2 | import matplotlib.gridspec as gridspec 3 | import matplotlib.pyplot as plt 4 | import matplotlib.dates as md 5 | import matplotlib as mpl 6 | import numpy as np 7 | import warnings 8 | import os 9 | warnings.filterwarnings('ignore') 10 | 11 | from dateutil import tz 12 | from pysolar import solar, radiation 13 | from datetime import datetime, timedelta 14 | 15 | def get_solar_noon(times_list, solar_elevation): 16 | 17 | times_list, solar_elevation = times_list, solar_elevation 18 | max_elevation = np.nanmax(solar_elevation) 19 | for i, j in zip(times_list, solar_elevation): 20 | if j == max_elevation: 21 | return i 22 | 23 | def get_solar_midnight(times_list, solar_elevation): 24 | 25 | times_list, solar_elevation = times_list, solar_elevation 26 | min_elevation = np.nanmin(solar_elevation) 27 | for i, j in zip(times_list, solar_elevation): 28 | if j == min_elevation: 29 | return i 30 | 31 | def plot_daily_solar_information(latitude, longitude): 32 | 33 | r''' 34 | This function plots a daily solar graph and gives other types of solar information. 35 | 36 | Required Arguments: 1) latitude (Float) - The latitude coordinate in decimal degrees format. 37 | 2) longitude (Float) - The longitude coordinate in decimal degrees format. 38 | 39 | Optional Arguments: None 40 | 41 | Return: A graphic showing the following information saved to f:Weather Data/Solar Information: 42 | 43 | 1) Daily solar elevation graphic 44 | 2) A data table showing the following information: 45 | i) Maximum Daily Solar Elevation (solar-noon sun angle) 46 | ii) Minimum Daily Solar Elevation (solar-midnight sun angle) 47 | iii) Difference in daily solar elevation between current day, equinox, summer solstice and winter solstice 48 | iv) Total Daily Solar Radiation [W/m^2] 49 | 50 | 51 | ''' 52 | 53 | 54 | latitude, longitude = latitude, longitude 55 | local, utc = standard.plot_creation_time() 56 | 57 | from_zone = tz.tzutc() 58 | to_zone = tz.tzlocal() 59 | 60 | start = utc 61 | year = start.year 62 | month = start.month 63 | day = start.day 64 | 65 | start = datetime(year, month, day, tzinfo=to_zone) 66 | if latitude >= 0: 67 | start_summer_solstice = datetime(year, 6, 21, tzinfo=to_zone) 68 | start_winter_solstice = datetime(year, 12, 21, tzinfo=to_zone) 69 | if latitude < 0: 70 | start_winter_solstice = datetime(year, 6, 21, tzinfo=to_zone) 71 | start_summer_solstice = datetime(year, 12, 21, tzinfo=to_zone) 72 | 73 | start_equinox = datetime(year, 3, 21, tzinfo=to_zone) 74 | times_list = [start + timedelta(minutes=i *15) for i in range(24*4)] 75 | times_list_summer_solstice = [start_summer_solstice + timedelta(minutes=i *15) for i in range(24*4)] 76 | times_list_winter_solstice = [start_winter_solstice + timedelta(minutes=i *15) for i in range(24*4)] 77 | times_list_equinox = [start_equinox + timedelta(minutes=i *15) for i in range(24*4)] 78 | 79 | solar_elevation = [solar.get_altitude(latitude, longitude, t) for t in times_list] 80 | solar_radiation = [radiation.get_radiation_direct(t, ele) for t, ele in zip(times_list, solar_elevation)] 81 | solar_azimuth = [solar.get_azimuth(latitude, longitude, t) for t in times_list] 82 | 83 | solar_elevation_summer = [solar.get_altitude(latitude, longitude, t) for t in times_list_summer_solstice] 84 | solar_radiation_summer = [radiation.get_radiation_direct(t, ele) for t, ele in zip(times_list_summer_solstice, solar_elevation_summer)] 85 | solar_azimuth_summer = [solar.get_azimuth(latitude, longitude, t) for t in times_list_summer_solstice] 86 | 87 | solar_elevation_winter = [solar.get_altitude(latitude, longitude, t) for t in times_list_winter_solstice] 88 | solar_radiation_winter = [radiation.get_radiation_direct(t, ele) for t, ele in zip(times_list_winter_solstice, solar_elevation_winter)] 89 | solar_azimuth_winter = [solar.get_azimuth(latitude, longitude, t) for t in times_list_winter_solstice] 90 | 91 | solar_elevation_equinox = [solar.get_altitude(latitude, longitude, t) for t in times_list_equinox] 92 | solar_radiation_equinox = [radiation.get_radiation_direct(t, ele) for t, ele in zip(times_list_equinox, solar_elevation_equinox)] 93 | solar_azimuth_equinox = [solar.get_azimuth(latitude, longitude, t) for t in times_list_equinox] 94 | 95 | 96 | max_elevation = np.nanmax(solar_elevation) 97 | min_elevation = np.nanmin(solar_elevation) 98 | 99 | max_elevation_summer = np.nanmax(solar_elevation_summer) 100 | min_elevation_summer = np.nanmin(solar_elevation_summer) 101 | 102 | max_elevation_winter = np.nanmax(solar_elevation_winter) 103 | min_elevation_winter = np.nanmin(solar_elevation_winter) 104 | 105 | max_elevation_equinox = np.nanmax(solar_elevation_equinox) 106 | min_elevation_equinox = np.nanmin(solar_elevation_equinox) 107 | 108 | sum_rad = np.nansum(solar_radiation) 109 | 110 | diff_ele_ss = max_elevation - max_elevation_summer 111 | diff_ele_ws = max_elevation - max_elevation_winter 112 | diff_ele_e = max_elevation - max_elevation_equinox 113 | 114 | solar_noon = get_solar_noon(times_list, solar_elevation) 115 | solar_midnight = get_solar_midnight(times_list, solar_elevation) 116 | 117 | plt.style.use('fivethirtyeight') 118 | props = dict(boxstyle='round', facecolor='wheat', alpha=1) 119 | props_table = dict(boxstyle='round', facecolor='darkslateblue', alpha=1) 120 | 121 | print("Creating Image - Please Wait...") 122 | 123 | fig = plt.figure(figsize=(15,9)) 124 | fig.set_facecolor('silver') 125 | gs = gridspec.GridSpec(2, 4) 126 | 127 | fig.suptitle("Daily Solar Information | Date: " + local.strftime('%m/%d/%Y'), color='black', fontsize=28, fontweight='bold') 128 | 129 | if latitude >= 0 and longitude <= 0: 130 | fig.text(0.315, 0.9, "Latitude: " + str(abs(latitude)) + " (\N{DEGREE SIGN}N) | Longitude: " + str(abs(longitude)) + " (\N{DEGREE SIGN}W)", color='black', fontsize=16, fontweight='bold') 131 | if latitude >= 0 and longitude > 0: 132 | fig.text(0.315, 0.9, "Latitude: " + str(abs(latitude)) + " (\N{DEGREE SIGN}N) | Longitude: " + str(abs(longitude)) + " (\N{DEGREE SIGN}E)", color='black', fontsize=16, fontweight='bold') 133 | if latitude < 0 and longitude <= 0: 134 | fig.text(0.315, 0.9, "Latitude: " + str(abs(latitude)) + " (\N{DEGREE SIGN}S) | Longitude: " + str(abs(longitude)) + " (\N{DEGREE SIGN}W)", color='black', fontsize=16, fontweight='bold') 135 | if latitude < 0 and longitude > 0: 136 | fig.text(0.315, 0.9, "Latitude: " + str(abs(latitude)) + " (\N{DEGREE SIGN}S) | Longitude: " + str(abs(longitude)) + " (\N{DEGREE SIGN}E)", color='black', fontsize=16, fontweight='bold') 137 | 138 | ax1 = fig.add_subplot(gs[0:2, 0:4]) 139 | ax1.plot(times_list, solar_elevation, c='orange', label=local.strftime('%b %d'), alpha=1) 140 | ax1.plot(times_list, solar_elevation_summer, c='red', label='Summer Solstice', alpha=1) 141 | ax1.plot(times_list, solar_elevation_winter, c='blue', label='Winter Solstice', alpha=1) 142 | ax1.plot(times_list, solar_elevation_equinox, c='magenta', label='Equinox', alpha=1) 143 | ax1.axhspan(90, 0, color='gold', alpha=0.25) 144 | ax1.axhspan(0, -6, color='dodgerblue', alpha=0.25) 145 | ax1.axhspan(-6, -12, color='blue', alpha=0.25) 146 | ax1.axhspan(-12, -18, color='midnightblue', alpha=0.25) 147 | ax1.axhspan(-18, -90, color='black', alpha=0.25) 148 | ax1.xaxis.set_major_formatter(md.DateFormatter('%H', tz=to_zone)) 149 | ax1.set_xlabel("Hour", color='black', fontsize=12, fontweight='bold') 150 | ax1.set_ylabel("Solar Elevation Angle (Degrees)", color='black', fontsize=12, fontweight='bold') 151 | ax1.axhline(0, c='black', linestyle='--', linewidth=2) 152 | ax1.tick_params(axis='x', colors='black') 153 | ax1.tick_params(axis='y', colors='black') 154 | ax1.legend(loc=(0.88,0.9), prop={'size': 8}) 155 | ax1.set_ylim(-90, 90) 156 | ax1.text(0.01, 0.95, 'DAYTIME (0-90 \N{DEGREE SIGN}ABOVE)', fontsize=7, fontweight='bold', transform=ax1.transAxes, bbox=props) 157 | ax1.text(0.01, 0.4775, 'CIVIL TWILIGHT (0-6 \N{DEGREE SIGN}BELOW)', fontsize=7, fontweight='bold', transform=ax1.transAxes, bbox=props) 158 | ax1.text(0.01, 0.445, 'NAUTICAL TWILIGHT (6-12 \N{DEGREE SIGN}BELOW)', fontsize=7, fontweight='bold', transform=ax1.transAxes, bbox=props) 159 | ax1.text(0.01, 0.41, 'ASTRONOMICAL TWILIGHT (12-18 \N{DEGREE SIGN}BELOW)', fontsize=7, fontweight='bold', transform=ax1.transAxes, bbox=props) 160 | ax1.text(0.01, 0.3, 'NIGHTIME (18-90 \N{DEGREE SIGN}BELOW)', fontsize=7, fontweight='bold', transform=ax1.transAxes, bbox=props) 161 | 162 | if diff_ele_e >= 0: 163 | sym='+' 164 | else: 165 | sym='' 166 | 167 | if max_elevation >= 0: 168 | sym1 = '+' 169 | else: 170 | sym1 = '' 171 | 172 | if min_elevation >= 0: 173 | sym2 = '+' 174 | else: 175 | sym2 = '' 176 | 177 | if max_elevation_equinox >= 0: 178 | sym3 = '+' 179 | else: 180 | sym3 = '' 181 | 182 | if max_elevation_winter >= 0: 183 | sym4 = '+' 184 | else: 185 | sym4 = '' 186 | 187 | ax1.text(0.3, 0.01, "Maximum Elevation: "+sym1+""+ str(round(max_elevation, 1)) + " [\N{DEGREE SIGN} From Horizon] @ "+solar_noon.strftime('%H:%M Local')+"\n\nMinimum Elevation: "+sym2+""+ str(round(min_elevation, 1)) + " [\N{DEGREE SIGN} From Horizon] @ "+solar_midnight.strftime('%H:%M Local')+"\n\nMaximum Elevation Difference:\nSummer Solstice: "+str(round(diff_ele_ss,1))+" [\N{DEGREE SIGN}] | Max Elevation: "+sym1+""+str(round(max_elevation_summer,1))+" [\N{DEGREE SIGN} From Horizon]\nEquinox: "+sym+""+str(round(diff_ele_e,1))+" [\N{DEGREE SIGN}] | Max Elevation: "+sym3+""+str(round(max_elevation_equinox,1))+" [\N{DEGREE SIGN} From Horizon]\nWinter Solstice: "+str(round(diff_ele_ws,1))+" [\N{DEGREE SIGN}] | Max Elevation: "+sym4+""+str(round(max_elevation_winter,1))+" [\N{DEGREE SIGN} From Horizon]\n\nTotal Daily Solar Radiation: " + str(round(sum_rad, 1)) + " (W/m^2)", fontsize=10, fontweight='bold', color='white', transform=ax1.transAxes, bbox=props_table) 188 | 189 | 190 | fig.text(0.08, 0.04, "Plot Created With FireWxPy (C) Eric J. Drewitz "+utc_time.strftime('%Y')+"\nImage Created: " + local.strftime('%m/%d/%Y %H:%M Local') + " (" + utc.strftime('%H:%M UTC') + ")", fontsize=10, fontweight='bold', verticalalignment='top', bbox=props, zorder=10) 191 | 192 | if latitude >= 0: 193 | lat_char = 'N' 194 | if latitude < 0: 195 | lat_char = 'S' 196 | if longitude >= 0: 197 | lon_char = 'E' 198 | if longitude < 0: 199 | lon_char = 'W' 200 | 201 | lat_name = str(abs(latitude)) 202 | lon_name = str(abs(longitude)) 203 | 204 | fname = f"{lat_name}{lat_char}_{lon_name}{lon_char}_SolarInfo.png" 205 | 206 | path = f"Weather Data/Solar Information/{fname}" 207 | 208 | if os.path.exists(f"Weather Data"): 209 | print("Already Satisfied: f:Weather Data exists.") 210 | 211 | if os.path.exists(f"Weather Data/Solar Information"): 212 | print("Already Satisfied: f:Weather Data/Solar Information exists.") 213 | fig.savefig(path) 214 | plt.close(fig) 215 | print(f"Image saved to: {path}") 216 | 217 | 218 | else: 219 | print("f:Weather Data does not exist. Building the new branch...") 220 | os.mkdir(f"Weather Data/Solar Information") 221 | print("Successfully built new branch") 222 | fig.savefig(path) 223 | plt.close(fig) 224 | print(f"Image saved to: {path}") 225 | 226 | else: 227 | print("f:Weather Data does not exist. Building the new directory...") 228 | os.mkdir(f"Weather Data") 229 | os.mkdir(f"Weather Data/Solar Information") 230 | print("Successfully built directory.") 231 | fig.savefig(path) 232 | plt.close(fig) 233 | print(f"Image saved to: {path}") 234 | 235 | 236 | -------------------------------------------------------------------------------- /firewxpy/standard.py: -------------------------------------------------------------------------------- 1 | ''' 2 | This file hosts standard functions which are used across all plotting functions: 3 | 4 | 1) plot_creation_time() 5 | 2) no_data_graphic() 6 | 3) get_timezone() 7 | 8 | This file was written by Meteorologist Eric J. Drewitz 9 | 10 | (C) Meteorologist Eric J. Drewitz 11 | USDA/USFS 12 | 13 | ''' 14 | 15 | #### IMPORTS #### 16 | 17 | import pytz 18 | from datetime import datetime, timedelta 19 | from matplotlib import pyplot as plt 20 | import time as t 21 | import warnings 22 | warnings.filterwarnings('ignore') 23 | 24 | def get_timezone_abbreviation(): 25 | 26 | r''' 27 | This function returns the current timezone abbreviation from the computer's date/time settings. 28 | Example: Pacific Standard Time = PST 29 | 30 | ''' 31 | now = datetime.now() 32 | timezone = now.astimezone().tzinfo 33 | capital_letters = "" 34 | for char in str(timezone): 35 | if char.isupper(): 36 | capital_letters += char 37 | 38 | return capital_letters 39 | 40 | def get_timezone(): 41 | 42 | now = datetime.now() 43 | timezone = now.astimezone().tzinfo 44 | 45 | return timezone 46 | 47 | 48 | 49 | def plot_creation_time(): 50 | 51 | r''' 52 | This function uses the datetime module to find the time at which the script ran. 53 | 54 | This can be used in many ways: 55 | 1) Timestamp for graphic in both local time and UTC 56 | 2) When downloading data with functions in the data_access module, this function is called to find 57 | the time which is passed into the data downloading functions in order for the latest data to be 58 | downloaded. 59 | 60 | There are no variables to pass into this function. 61 | 62 | Returns: 1) Current Local Time 63 | 2) Current UTC Time 64 | 65 | ''' 66 | 67 | now = datetime.now() 68 | UTC = now.astimezone(pytz.utc) 69 | 70 | sec = now.second 71 | mn = now.minute 72 | hr = now.hour 73 | dy = now.day 74 | mon = now.month 75 | yr = now.year 76 | 77 | sec1 = UTC.second 78 | mn1 = UTC.minute 79 | hr1 = UTC.hour 80 | dy1 = UTC.day 81 | mon1 = UTC.month 82 | yr1 = UTC.year 83 | 84 | Local_Time_Now = datetime(yr, mon, dy, hr, mn, sec) 85 | UTC_Now = datetime(yr1, mon1, dy1, hr1, mn1, sec1) 86 | 87 | return Local_Time_Now, UTC_Now 88 | 89 | 90 | def idle(): 91 | 92 | 93 | now = datetime.now() 94 | year = now.year 95 | month = now.month 96 | day = now.day 97 | hour = now.hour 98 | minute = now.minute 99 | second = now.second 100 | sec = minute * 60 101 | current = second + sec 102 | resume = 48 * 60 103 | idle = resume - current 104 | resume_time = datetime(year, month, day, hour, 48) 105 | current_time = datetime(year, month, day, hour, minute) 106 | mins = idle/60 107 | 108 | print("NDFD grid files update on the NWS FTP server from the 17th through 47th minute of the hour.\nThe program will idle until "+resume_time.strftime('%H:%M Local')+".\nYou have "+str(int(round(mins, 0)))+" minutes until the program automatically resumes and tries re-downloading and plotting the data again.") 109 | 110 | print("Current time: "+current_time.strftime('%H:%M Local')) 111 | 112 | t.sleep(idle) 113 | 114 | print("Resuming!") 115 | 116 | 117 | def no_data_graphic(): 118 | 119 | r''' 120 | This function creates a default graphic for when there is no data present. 121 | On the image, it shows the time at which the image was created and that there is 122 | no data availiable at this time. 123 | 124 | There are no variables to pass into this function. 125 | 126 | Returns: 1) A standard graphic stating there is no data available and the time at which the graphic was created. 127 | 128 | ''' 129 | 130 | local_time, utc_time = plot_creation_time() 131 | 132 | fig = plt.figure(figsize=(20,10)) 133 | ax = plt.subplot(1, 1, 1) 134 | plt.axis('off') 135 | fig.text(0.04, 0.08, 'Plot Created With FireWxPy (C) Eric J. Drewitz 2024 | Image Created: ' + local_time.strftime('%m/%d/%Y %H:%M Local') + ' | ' + utc_time.strftime('%m/%d/%Y %H:%M UTC'), fontsize=20, fontweight='bold') 136 | ax.text(0.1, 0.6, 'NO DATA FOR: ' + utc_time.strftime('%m/%d/%Y %HZ'), fontsize=60, fontweight='bold') 137 | 138 | return fig 139 | 140 | def no_sounding_graphic(date): 141 | 142 | r''' 143 | This function creates a default graphic for when there is no sounding data present. 144 | On the image, it shows the time at which the image was created and that there is 145 | no data availiable at this time. 146 | 147 | There are no variables to pass into this function. 148 | 149 | Returns: 1) A standard graphic stating there is no data available and the time at which the graphic was created. 150 | 151 | ''' 152 | date = date 153 | local_time, utc_time = plot_creation_time() 154 | props = dict(boxstyle='round', facecolor='bisque', alpha=1) 155 | 156 | fig = plt.figure(figsize=(5,2)) 157 | ax = plt.subplot(1, 1, 1) 158 | plt.axis('off') 159 | fig.text(0.25, 0.08, 'Plot Created With FireWxPy (C) Eric J. Drewitz 2024\nImage Created: ' + local_time.strftime('%m/%d/%Y %H:%M Local') + ' | ' + utc_time.strftime('%m/%d/%Y %H:%M UTC'), fontsize=10, fontweight='bold', bbox=props) 160 | ax.text(0.1, 0.6, 'NO DATA FOR: ' + date.strftime('%m/%d/%Y %H:00 UTC'), fontsize=20, fontweight='bold') 161 | 162 | return fig 163 | 164 | 165 | 166 | 167 | 168 | 169 | 170 | -------------------------------------------------------------------------------- /firewxpy_citation.bib: -------------------------------------------------------------------------------- 1 | @software{eric_drewitz_2024_14318635, 2 | author = {Eric Drewitz}, 3 | title = {A Python Package For Fire Weather Analysis And 4 | Forecasting 5 | }, 6 | month = dec, 7 | year = 2024, 8 | publisher = {Zenodo}, 9 | version = {FireWxPy1.1}, 10 | doi = {10.5281/zenodo.14318635}, 11 | url = {https://doi.org/10.5281/zenodo.14318635} 12 | } 13 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [build-system] 2 | requires = ["setuptools>=64"] 3 | build-backend = "setuptools.build_meta" 4 | 5 | [project] 6 | name = "firewxpy" 7 | version = "1.6.2" 8 | authors = [ 9 | { name="Eric J Drewitz, USDA/USFS"}, 10 | ] 11 | description = "Weather Analysis and Forecasting For Fire Weather" 12 | readme = "README.md" 13 | keywords = ["meteorology", "science", "data-analysis", "weather", "forecasting"] 14 | requires-python = ">=3.10" 15 | classifiers = [ 16 | "Programming Language :: Python", 17 | "Topic :: Scientific/Engineering", 18 | "Topic :: Scientific/Engineering :: Atmospheric Science", 19 | "Operating System :: OS Independent", 20 | "License :: OSI Approved :: MIT License", 21 | ] 22 | dependencies = [ 23 | "matplotlib>=3.7", 24 | "protobuf>=3.20.3", 25 | "metpy>=1.5.1", 26 | "netcdf4>=1.7.1", 27 | "numpy>=1.24", 28 | "pandas>=2.2", 29 | "siphon>=0.10.0", 30 | "xarray>=2023.1.0", 31 | "pysolar>=0.11", 32 | "cfgrib>=0.9.10.4", 33 | "cartopy>=0.21.0", 34 | "pytz>=2024.1", 35 | "xeofs>=3.0.4" 36 | ] 37 | 38 | -------------------------------------------------------------------------------- /pyproject.yml: -------------------------------------------------------------------------------- 1 | build-system: 2 | requires: 3 | - setuptools>=68.0 4 | build-backend: setuptools.build_meta 5 | project: 6 | name: firewxpy 7 | version: '1.6.2' 8 | authors: 9 | - name: 'Eric J Drewitz, USDA/USFS' 10 | description: Weather Analysis and Forecasting For Fire Weather 11 | readme: README.md 12 | keywords: 13 | - meteorology 14 | - science 15 | - data-analysis 16 | - weather 17 | - forecasting 18 | requires-python: '>=3.10' 19 | classifiers: 20 | - 'Programming Language :: Python' 21 | - 'Programming Language :: Python :: 3.10' 22 | - 'Programming Language :: Python :: 3.11' 23 | - 'Topic :: Scientific/Engineering' 24 | - 'Topic :: Scientific/Engineering :: Atmospheric Science' 25 | - 'Operating System :: OS Independent' 26 | - 'License :: OSI Approved :: MIT License' 27 | dependencies: 28 | - matplotlib>=3.7 29 | - metpy>=1.5.1 30 | - protobuf>=3.20.3 31 | - netcdf4>=1.7.1 32 | - numpy>=1.24 33 | - pandas>=2.2 34 | - siphon>=0.10.0 35 | - xarray>=2023.1.0 36 | - pysolar>=0.11 37 | - cfgrib>=0.9.10.4 38 | - cartopy>=0.21.0 39 | - pytz>=2024.1 40 | - xeofs>=3.0.4 41 | -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from setuptools import setup, find_packages 3 | 4 | if sys.version_info[0] < 3: 5 | print("ERROR: User is running a version of Python older than Python 3\nTo use FireWxPy, the user must be using Python 3 or newer.") 6 | 7 | setup( 8 | name = "firewxpy", 9 | version = "1.6.2", 10 | packages = find_packages(), 11 | install_requires=[ 12 | "matplotlib>=3.7", 13 | "protobuf>=3.20.3", 14 | "metpy>=1.5.1", 15 | "netcdf4>=1.7.1", 16 | "numpy>=1.24", 17 | "pandas>=2.2", 18 | "siphon>=0.10.0", 19 | "xarray>=2023.1.0", 20 | "pysolar>=0.11", 21 | "cfgrib>=0.9.10.4", 22 | "cartopy>=0.21.0", 23 | "pytz>=2024.1", 24 | "xeofs>=3.0.4" 25 | 26 | ], 27 | author="Eric J. Drewitz", 28 | description="Provides automated weather graphics with a focus on fire weather.", 29 | long_description=open("README.md").read(), 30 | long_description_content_type="text/markdown" 31 | 32 | ) 33 | -------------------------------------------------------------------------------- /shapefiles/GACC Boundaries Shapefiles/National_GACC_Boundaries.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | eng 4 | 5 | 6 | utf8 7 | 8 | 9 | dataset 10 | 11 | 12 | dataset 13 | 14 | 15 | 16 | 2023-04-06 17 | 18 | 19 | ISO 19139 Geographic Information - Metadata - Implementation Specification 20 | 21 | 22 | 2007 23 | 24 | 25 | 26 | 27 | geometryOnly 28 | 29 | 30 | 31 | 32 | composite 33 | 34 | 35 | 10 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 4269 47 | 48 | 49 | EPSG 50 | 51 | 52 | 6.5(3.0.1) 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | <gco:CharacterString>Geographic Area Coordination Center Boundaries (polygon)</gco:CharacterString> 64 | 65 | 66 | 67 | mapDigital 68 | 69 | 70 | 71 | 72 | The physical location of an interagency, regional operation center for the effective coordination, mobilization and demobilization of emergency management resources. A coordination center serves federal, state and local wildland fire agencies through logistical coordination of resources throughout the geographic area, and with other geographic areas, as well. Listings of geographic coordination centers and their respective geographic coordinating areas can be found within the National Interagency Mobilization Guide.3/23/2023 - Tabular changes only. Name changes per Official Unit IDs list "Unit Idx Name" field supplied by Kara Stringer (Combined Dispatch Centers 03222023.xlsx), co-lead for NWCG Unit ID Committee. Edits by JKuenzi, USFS. Changes include:From "Southwest Coordination Center" to "Southwest Area Coordination Center"From "Southern California Geographic Area Coordination Center" to "Southern California Coordination Center" 9/6/2022 - 9/26/2022 - Geospatial and tabular changes in accordance with proposed GACC boundary re-alignments between Southern California and Great Basin in the state of Nevada, specifically between Queen Valley and Mono Valley, . The team making the changes are led by James Tomaselli, Gina Dingman, and Ian Mills. Changes proposed will be put into effect for the 2023 calendar year, and will also impact alignments of Initial Attack Frequency Zones and Dispatch boundaries in the area described. Initial edits provided by Daniel Yarborough. Final edits by JKuenzi, USFS. A description of the change is as follows: The northwest end of changes start approximately 1 mile west of Mt Olsen and approximately 0.5 mile south of the Virginia Lakes area.Head northwest passing on the northeast side of Red Lake and the south side of Big Virginia Lake to follow HWY 395 North east to CA 270.East through Bodie to the CA/NV state line.Follows the CA/NV State Line south to HWY CA 167/NV 359.East on NV359 to where the HWY intersects the corner of FS/BLM land.Follows the FS/BLM boundary to the east and then south where it ties into the current GACC boundary. 1/3/2022 - Tabular changes in accordance with data shown in WFMI (Wildland Fire Management Information) Application. Edits by JKuenzi, USFS. GACCLocation Field for Alaska Interagency Coordination Center modified from "Fairbanks, AK" to "Fairbanks, AK (Fort Wainwright,AK)".GACCLocation Field for Great Basin Coordination Center changed from "Boise, ID" to "Salt Lake City, UT". 3/24/2021 - Geospatial and tabular changes in accordance with proposed GACC boundary re-alignments between Southwestern and Southern GACCs proposed and implemented. The interagency team making the change are led by Kenan Jaycox, Calvin Miller, and Dana (Nancy) Ellsworth, but also include: Elliott Herrera, David Sosa, Tiffany Fralie, Chris Adamcik, Jonathan Nash, Tammy Milton, Juan Ortiz, Cathy Peterson, and Kim Albracht, among others. Portions of Texas, formerly under Southwestern GACC direction were moved to the Southern GACC with a few exceptions that will remain part of the Southwestern GACC, including:Kiowa/Rita Blanca National Grasslands. Black Kettle National Grasslands, including Lake Martin, and Lake McClellan. Guadalupe Mountains National Park. Fort Bliss Military Reservation and McGregor Range. All changes proposed for implementation starting 1/10/2022. Current changes to be released in January 2022. Edits by JKuenzi, USFS. See also data sets for Dispatch Areas, and Initial Attack Frequency Zones Federal for related changes. 73 | 74 | 75 | Polygon boundaries depicting the administrative area of Geographic Area Coordination Centers (GACC) across the USA used in incident management, including wildland fire. GACC Boundaries may also be known as Tier 2 Dispatch Boundaries. 76 | 77 | 78 | National Wildfire Coordinating Group 79 | Geospatial Subcommittee 80 | National Interagency Fire Center 81 | Boise, ID 83705 82 | 83 | 84 | 85 | 86 | GACC 87 | 88 | 89 | Geographic Area Coordination Center 90 | 91 | 92 | Wildland Fire 93 | 94 | 95 | NWCG 96 | 97 | 98 | National Wildfire Coordinating Group 99 | 100 | 101 | Geospatial Subcommittee 102 | 103 | 104 | National Interagency Fire Center 105 | 106 | 107 | NIFC 108 | 109 | 110 | NIFC Open Data 111 | 112 | 113 | Boundary_OpenData 114 | 115 | 116 | 117 | 118 | 119 | 120 | The National Wildfire Coordinating Group (NWCG) makes no claims, promises, or guarantees about the accuracy, completeness, or adequacy of the content; and expressly disclaims liability for errors and omissions. No warranty of any kind, implied, expressed or statutory is given with respect to the contents. 121 | 122 | 123 | 124 | 125 | vector 126 | 127 | 128 | eng 129 | 130 | 131 | utf8 132 | 133 | 134 | Esri ArcGIS 12.9.4.32739 135 | 136 | 137 | 138 | 139 | 140 | 141 | true 142 | 143 | 144 | -179.231086 145 | 146 | 147 | 179.859681 148 | 149 | 150 | -14.601813 151 | 152 | 153 | 71.439786 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 166 | File Geodatabase Feature Class 167 | 168 | 169 | 170 | 171 | 172 | 173 | 174 | -------------------------------------------------------------------------------- /shapefiles/GACC Boundaries Shapefiles/National_GACC_Current.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /shapefiles/GACC Boundaries Shapefiles/National_GACC_Current.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/GACC Boundaries Shapefiles/National_GACC_Current.dbf -------------------------------------------------------------------------------- /shapefiles/GACC Boundaries Shapefiles/National_GACC_Current.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] -------------------------------------------------------------------------------- /shapefiles/GACC Boundaries Shapefiles/National_GACC_Current.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/GACC Boundaries Shapefiles/National_GACC_Current.shp -------------------------------------------------------------------------------- /shapefiles/GACC Boundaries Shapefiles/National_GACC_Current.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/GACC Boundaries Shapefiles/National_GACC_Current.shx -------------------------------------------------------------------------------- /shapefiles/NWS_CWA_Boundaries/w_05mr24.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_CWA_Boundaries/w_05mr24.dbf -------------------------------------------------------------------------------- /shapefiles/NWS_CWA_Boundaries/w_05mr24.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],VERTCS["NAD_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PARAMETER["Vertical_Shift",0.0],PARAMETER["Direction",1.0],UNIT["Meter",1.0]] -------------------------------------------------------------------------------- /shapefiles/NWS_CWA_Boundaries/w_05mr24.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_CWA_Boundaries/w_05mr24.shx -------------------------------------------------------------------------------- /shapefiles/NWS_CWA_Boundaries/w_05mr24.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_CWA_Boundaries/w_05mr24.zip -------------------------------------------------------------------------------- /shapefiles/NWS_Fire_Weather_Zones/fz05mr24.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_Fire_Weather_Zones/fz05mr24.dbf -------------------------------------------------------------------------------- /shapefiles/NWS_Fire_Weather_Zones/fz05mr24.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],VERTCS["NAD_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PARAMETER["Vertical_Shift",0.0],PARAMETER["Direction",1.0],UNIT["Meter",1.0]] -------------------------------------------------------------------------------- /shapefiles/NWS_Fire_Weather_Zones/fz05mr24.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_Fire_Weather_Zones/fz05mr24.shx -------------------------------------------------------------------------------- /shapefiles/NWS_Fire_Weather_Zones/fz05mr24.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_Fire_Weather_Zones/fz05mr24.zip -------------------------------------------------------------------------------- /shapefiles/NWS_Public_Zones/z_05mr24.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_Public_Zones/z_05mr24.dbf -------------------------------------------------------------------------------- /shapefiles/NWS_Public_Zones/z_05mr24.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_North_American_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]],VERTCS["NAD_1983",DATUM["D_North_American_1983",SPHEROID["GRS_1980",6378137.0,298.257222101]],PARAMETER["Vertical_Shift",0.0],PARAMETER["Direction",1.0],UNIT["Meter",1.0]] -------------------------------------------------------------------------------- /shapefiles/NWS_Public_Zones/z_05mr24.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_Public_Zones/z_05mr24.shx -------------------------------------------------------------------------------- /shapefiles/NWS_Public_Zones/z_05mr24.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/NWS_Public_Zones/z_05mr24.zip -------------------------------------------------------------------------------- /shapefiles/PSA Shapefiles/National_PSA_Current.cpg: -------------------------------------------------------------------------------- 1 | UTF-8 -------------------------------------------------------------------------------- /shapefiles/PSA Shapefiles/National_PSA_Current.dbf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/PSA Shapefiles/National_PSA_Current.dbf -------------------------------------------------------------------------------- /shapefiles/PSA Shapefiles/National_PSA_Current.prj: -------------------------------------------------------------------------------- 1 | GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]],PRIMEM["Greenwich",0.0],UNIT["Degree",0.0174532925199433]] -------------------------------------------------------------------------------- /shapefiles/PSA Shapefiles/National_PSA_Current.shp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/PSA Shapefiles/National_PSA_Current.shp -------------------------------------------------------------------------------- /shapefiles/PSA Shapefiles/National_PSA_Current.shx: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/edrewitz/firewxpy/1f19a425dfc58739e880b3d1f29237bc994b8da7/shapefiles/PSA Shapefiles/National_PSA_Current.shx -------------------------------------------------------------------------------- /tutorials/Examples_Guide.md: -------------------------------------------------------------------------------- 1 | [Click Here](https://github.com/edrewitz/FireWxPy-Jupyter-Labs/blob/main/Examples_Guide.md) to visit the new examples guide page. 2 | 3 | --------------------------------------------------------------------------------