├── 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 |
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 |

3 |
4 |
5 | # FireWxPy
6 |
7 | [](https://anaconda.org/conda-forge/firewxpy)
8 | 
9 | [](https://anaconda.org/conda-forge/firewxpy)
10 | [](https://anaconda.org/conda-forge/firewxpy)
11 | [](https://anaconda.org/conda-forge/firewxpy)
12 | [](https://anaconda.org/conda-forge/firewxpy)
13 | [](https://anaconda.org/conda-forge/firewxpy)
14 |
15 |
16 | [](https://doi.org/10.5281/zenodo.14318635)
17 |
18 |
19 | Anaconda Downloads:
20 |
21 | [](https://anaconda.org/conda-forge/firewxpy)
22 |
23 | PIP Downloads:
24 |
25 | 
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 | Geographic Area Coordination Center Boundaries (polygon)
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 |
--------------------------------------------------------------------------------