Complete Köppen-Geiger filter review with Mixed climate class
Classify each county by area-weighted Köppen class shares: a county is predominantly its top class when that class covers at least 50% of its land and leads the runner-up by at least 5 percentage points; otherwise it is Mixed (133 of 3,143 counties in the 50 states and DC). - Add build_county_koppen_metric.py (writes data/metrics/koppen.csv) and apply_koppen_metric_to_climate_data.py (writes koppenZone plus koppenPrimaryClass/koppenSecondaryClass for Mixed counties). - Move shared helpers into scripts/common/ (county loading, Köppen legend, area-weighted raster shares); fix the 180th-meridian raster window for Aleutians West. - Add check_climate_data.py to validate the app CSV. - Draw Mixed counties in app.js as diagonal stripes of their top two classes, fixed to the ground and following the map at every zoom, with a crossfade only when the stripe size changes. Filtering a class also matches Mixed counties where it is primary or secondary. - Document the rule, display, and pipeline plan in docs/ and update the README and data-source notes. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -28,7 +28,7 @@ The browser currently loads 3,221 county-level records from
|
||||
|
||||
| Group | Metrics |
|
||||
| --- | --- |
|
||||
| Koppen-Geiger Classification | Majority county climate class |
|
||||
| Koppen-Geiger Classification | Predominant county climate class (covering at least 50% of the county's land and leading the runner-up by at least 5 points), or Mixed, drawn as stripes of the county's top two classes |
|
||||
| Temperature & Extremes | Annual average temperature, diurnal temperature range, annual extreme temperature days, and annual 90 F+ heat-index days |
|
||||
| Precipitation & Moisture | Annual precipitation, precipitation seasonality, wettest month, driest month, and summer specific humidity |
|
||||
| Solar Resource | Mean daily global horizontal radiation (GHI) and clear-sky GHI reduction index |
|
||||
@@ -92,11 +92,13 @@ will not work.
|
||||
| `app.js` | Map rendering, filtering, county details, and source metadata |
|
||||
| `serve.ps1` | Local HTTP server launcher |
|
||||
| `data/climate-data.csv` | Browser-ready county climate records |
|
||||
| `data/metrics/` | Per-metric county outputs, starting with `koppen.csv` |
|
||||
| `data/geojson-counties-fips.json` | County geometry keyed by FIPS code |
|
||||
| `scripts/` | Climate-data download, aggregation, and update tools |
|
||||
| `scripts/county_data_sources.md` | Detailed metric definitions, data provenance, and pipeline examples |
|
||||
| `scripts/requirements_county_etl.txt` | Python dependencies for the offline data pipeline |
|
||||
| `tests/` | Tests for NSRDB request/download wrappers, cloud-metric merging, and gridMET heat-index calculations |
|
||||
| `docs/` | Filter calculations, the pipeline plan, and design notes |
|
||||
| `tests/` | Tests for the Köppen metric, the climate CSV check, NSRDB request/download wrappers, cloud-metric merging, and gridMET heat-index calculations |
|
||||
|
||||
## Climate Data Pipeline
|
||||
|
||||
@@ -133,7 +135,8 @@ default.
|
||||
|
||||
| Script | Current role |
|
||||
| --- | --- |
|
||||
| `build_county_climate_data.py` | Builds the base app CSV from county geometry, Koppen-Geiger data, NOAA temperature/precipitation data, and optional solar inputs. Its older `extremeDays` output is replaced by the current absolute-threshold stage below. |
|
||||
| `build_county_climate_data.py` | Builds the base app CSV from county geometry, Koppen-Geiger data, NOAA temperature/precipitation data, and optional solar inputs. Its older `extremeDays` output is replaced by the current absolute-threshold stage below, and its largest-share `koppenZone` by the Köppen stage. It writes only the base columns, so do not run it over the live CSV. |
|
||||
| `build_county_koppen_metric.py` / `apply_koppen_metric_to_climate_data.py` | Builds area-weighted Köppen class shares per county in `data/metrics/koppen.csv`, classifies each county as predominant or Mixed, and writes `koppenZone` plus the two stripe-class columns for Mixed counties. |
|
||||
| `apply_precipitation_month_metrics_to_climate_data.py` | Recomputes and merges the 1991-2020 wettest- and driest-month categories from monthly nClimGrid precipitation. |
|
||||
| `build_county_locally_extreme_data.py` | Downloads or reads cached nClimGrid-Daily county Tmax/Tmin files, calculates county-percentile diagnostics, and calculates the app-facing absolute 95 F / 0 F day counts. |
|
||||
| `apply_locally_extreme_metric_to_climate_data.py` | Writes `absoluteExtremeDays`, removes retired locally extreme/legacy fields, and selects polygon GHI with representative-point GHI as fallback. The filename is retained from the earlier pipeline. |
|
||||
@@ -150,6 +153,8 @@ default.
|
||||
| `summarize_nsrdb_county_polygon_archives.py` | Combines county/tile GHI archives into area-weighted county summaries. |
|
||||
| `summarize_nsrdb_county_polygon_cloud_archives.py` | Combines county/tile cloud archives into area-weighted clear-sky GHI reduction summaries. |
|
||||
| `apply_nsrdb_cloud_metric_to_climate_data.py` | Merges the clear-sky GHI reduction index, preferring polygon summaries and falling back to representative points. |
|
||||
| `check_climate_data.py` | Validates `data/climate-data.csv`, including Köppen codes and the stripe-class columns. |
|
||||
| `common/` | Shared helpers: county loading, the Köppen legend, and area-weighted raster shares. |
|
||||
|
||||
The metric-specific NSRDB request and download wrappers are the normal entry
|
||||
points. The shared engines remain available for custom attributes or artifact
|
||||
@@ -160,6 +165,8 @@ Common local enrichment stages, after their source files have been downloaded,
|
||||
are:
|
||||
|
||||
```powershell
|
||||
.venv\Scripts\python.exe scripts\build_county_koppen_metric.py
|
||||
.venv\Scripts\python.exe scripts\apply_koppen_metric_to_climate_data.py
|
||||
.venv\Scripts\python.exe scripts\build_county_locally_extreme_data.py --skip-download
|
||||
.venv\Scripts\python.exe scripts\apply_locally_extreme_metric_to_climate_data.py
|
||||
.venv\Scripts\python.exe scripts\build_county_diurnal_temperature_range.py
|
||||
@@ -169,11 +176,19 @@ are:
|
||||
.venv\Scripts\python.exe scripts\apply_nsrdb_cloud_metric_to_climate_data.py
|
||||
```
|
||||
|
||||
The order matters when rebuilding from scratch: generate the locally extreme
|
||||
comparison and solar summaries before running their apply step, and summarize
|
||||
gridMET or NSRDB downloads before merging them. See the data-source document
|
||||
linked above for acquisition commands, expected artifacts, FIPS handling, and
|
||||
the representative-point and polygon NSRDB workflows.
|
||||
The order matters when rebuilding from scratch: run the Köppen apply step after
|
||||
the base build, generate the locally extreme comparison and solar summaries
|
||||
before running their apply step, and summarize gridMET or NSRDB downloads
|
||||
before merging them. See the data-source document linked above for acquisition
|
||||
commands, expected artifacts, FIPS handling, and the representative-point and
|
||||
polygon NSRDB workflows. The full rebuild order is in
|
||||
[`docs/pipeline-plan.md`](docs/pipeline-plan.md).
|
||||
|
||||
After updating the CSV, validate it with:
|
||||
|
||||
```powershell
|
||||
.venv\Scripts\python.exe scripts\check_climate_data.py
|
||||
```
|
||||
|
||||
Run the current automated tests with:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user