usdata 0.9.0__tar.gz → 0.10.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. {usdata-0.9.0 → usdata-0.10.0}/PKG-INFO +33 -18
  2. {usdata-0.9.0 → usdata-0.10.0}/README.md +32 -17
  3. {usdata-0.9.0 → usdata-0.10.0}/pyproject.toml +66 -1
  4. {usdata-0.9.0 → usdata-0.10.0}/pyproject.toml.orig +60 -1
  5. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/data/nexrad_sites.csv +211 -211
  6. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/data/registry.yaml +109 -12
  7. usdata-0.10.0/src/usdata/providers/noaa/coops.py +141 -0
  8. usdata-0.10.0/src/usdata/providers/noaa/gsoy.py +46 -0
  9. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/readers.py +3 -2
  10. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/__init__.py +0 -0
  11. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/_files.py +0 -0
  12. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/_netcdf.py +0 -0
  13. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/_progress.py +0 -0
  14. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/_radar.py +0 -0
  15. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/cache.py +0 -0
  16. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/cli/__init__.py +0 -0
  17. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/cli/app.py +0 -0
  18. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/cli/progress.py +0 -0
  19. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/data/places.csv +0 -0
  20. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/data/places.sources.json +0 -0
  21. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/fetch.py +0 -0
  22. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/manifest.py +0 -0
  23. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/models.py +0 -0
  24. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/protocols/__init__.py +0 -0
  25. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/protocols/erddap.py +0 -0
  26. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/protocols/http.py +0 -0
  27. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/protocols/s3.py +0 -0
  28. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/provenance.py +0 -0
  29. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/__init__.py +0 -0
  30. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/_http.py +0 -0
  31. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/base.py +0 -0
  32. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/noaa/__init__.py +0 -0
  33. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/noaa/coastwatch.py +0 -0
  34. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/noaa/ghcnd.py +0 -0
  35. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/noaa/goes.py +0 -0
  36. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/noaa/gsom.py +0 -0
  37. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/noaa/nexrad.py +0 -0
  38. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/noaa/sites.py +0 -0
  39. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/noaa/storm_events.py +0 -0
  40. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/usgs/__init__.py +0 -0
  41. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/providers/usgs/daily.py +0 -0
  42. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/pull.py +0 -0
  43. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/py.typed +0 -0
  44. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/query.py +0 -0
  45. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/registry.py +0 -0
  46. {usdata-0.9.0 → usdata-0.10.0}/src/usdata/selection.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: usdata
3
- Version: 0.9.0
3
+ Version: 0.10.0
4
4
  Summary: Unified Python SDK and CLI for discovering, fetching, and tracking provenance of U.S. public scientific data
5
5
  Keywords: noaa,usgs,nasa,open-data,scientific-data,provenance
6
6
  Author: Jake Van Slyke
@@ -52,33 +52,39 @@ open the resulting local files. Provenance and manifests connect those steps.
52
52
  - [Runnable examples with saved outputs](examples/README.md)
53
53
  - [Readers](docs/reference/readers.md) and [reproducible manifests](docs/reference/manifests.md)
54
54
 
55
- ## Providers
55
+ ## Source installation
56
+
57
+ For features marked **Unreleased**, install this checkout with
58
+ [uv](https://docs.astral.sh/uv/):
59
+
60
+ ```sh
61
+ git clone https://github.com/jakeryderv/usdata && cd usdata
62
+ uv sync --extra pandas
63
+ uv run usdata info noaa:coops-water-levels
64
+ ```
65
+
66
+ Run source examples from this checkout with `uv run usdata` (CLI) or
67
+ `uv run python` (Python). The pandas extra enables CSV reading; use `--extra radar`
68
+ or `--extra netcdf` for those formats. For contribution checks, continue with
69
+ [development setup](#development).
56
70
 
57
- <!-- registry:start -->
58
- | Provider | Available | Stub | Planned | Next up (unassigned) | Datasets |
59
- |---|---:|---:|---:|---|---|
60
- | [NOAA](docs/providers/noaa.md) | 6 | 0 | 23 | — | `ghcn-daily`, `gsom`, `storm-events`, `nexrad-level2`, `goes-abi`, `coastwatch-sst`, +23 planned |
61
- | [USGS](docs/providers/usgs.md) | 1 | 0 | 2 | — | `water-daily`, +2 planned |
62
- | [Census Bureau](docs/providers/census.md) | 0 | 0 | 1 | — | +1 planned |
63
- | [EPA](docs/providers/epa.md) | 0 | 0 | 1 | — | +1 planned |
64
- | [FEMA](docs/providers/fema.md) | 0 | 0 | 1 | — | +1 planned |
65
- | [NASA](docs/providers/nasa.md) | 0 | 0 | 1 | — | +1 planned |
66
- | [USDA](docs/providers/usda.md) | 0 | 0 | 1 | — | +1 planned |
71
+ ## Providers
67
72
 
68
- Available datasets are in `code`, stubs in _italics_; planned ones are counted. Available means implemented in this source checkout; consult the [releases](https://github.com/jakeryderv/usdata/releases) for published support. Provider pages link access notes to the generated dataset catalog; [the roadmap](docs/roadmap.md) explains future priorities.
69
- <!-- registry:end -->
73
+ Browse the [dataset catalog](docs/generated/catalog/index.md) for current support,
74
+ release availability, and dataset details. [Provider access notes](docs/providers/README.md)
75
+ explain agency-specific services; the [roadmap](docs/roadmap.md) describes priorities.
70
76
 
71
77
  ## Development
72
78
 
73
- Requires [uv](https://docs.astral.sh/uv/) and [just](https://just.systems/).
79
+ From a [source checkout](#source-installation), requires [uv](https://docs.astral.sh/uv/) and [just](https://just.systems/).
74
80
 
75
81
  `just setup` uses the tested Python 3.14.7 pin in `.python-version`. Older Linux
76
82
  uv Python 3.14 builds can crash during NumPy array operations; see
77
83
  [the upstream fix](https://github.com/astral-sh/python-build-standalone/issues/991).
78
84
 
79
85
  ```sh
80
- git clone https://github.com/jakeryderv/usdata && cd usdata
81
86
  just setup # install toolchain and dependencies
87
+ just hooks-install # optional: install fast staged-file checks
82
88
  just test # all offline tests
83
89
  just check # format, lint, typecheck, offline tests, generated docs, release notices
84
90
  just check-pandas # install the CSV extra and run the same checks
@@ -90,9 +96,17 @@ just docs-serve # build and preview the documentation locally, with reload
90
96
  just check-docs # validate generated content and build the site strictly
91
97
  just build # build wheel and sdist
92
98
  just smoke # exercise core and pandas wheel installations outside the checkout
99
+ just changes # preview upcoming release notes
100
+ just cleanup 123 # from main: remove PR #123's merged branch and clean worktree
93
101
  just run search radar
94
102
  ```
95
103
 
104
+ Commit hooks fix and format staged Python files using the locked Ruff version,
105
+ and check configuration, merge conflicts, and GitHub Actions workflows. Full
106
+ validation remains `just check`; `just check-hooks` runs the non-mutating config
107
+ and workflow checks alone. Hooks do not rewrite notebooks or raw data fixtures.
108
+ The first hook run downloads its isolated tools and requires network access.
109
+
96
110
  Offline tests mechanically block network connections. Tests that hit
97
111
  live services run with `just test-live`; see [testing levels and organization](docs/testing.md). CI checks Python 3.11 and 3.14 on
98
112
  Linux with core-only, pandas, radar, and NetCDF dependency profiles. Installed-wheel
@@ -101,8 +115,9 @@ live-service suites run on Linux. `just setup` restores a core-only development
101
115
  environment; the `check-pandas`, `check-radar`, and `check-netcdf` commands install
102
116
  their respective extras.
103
117
 
104
- Releases: `just release minor` opens a version-bump PR; merging it publishes
105
- to PyPI and creates the tag and GitHub release. See
118
+ Releases: `just release minor` prepares a release branch. Update release notices,
119
+ then `just release-pr` validates and opens a draft for review. Merging the reviewed
120
+ PR publishes to PyPI and creates the tag and GitHub release. See
106
121
  [docs/versioning.md](docs/versioning.md).
107
122
 
108
123
  See [provider access notes](docs/providers/README.md),
@@ -24,33 +24,39 @@ open the resulting local files. Provenance and manifests connect those steps.
24
24
  - [Runnable examples with saved outputs](examples/README.md)
25
25
  - [Readers](docs/reference/readers.md) and [reproducible manifests](docs/reference/manifests.md)
26
26
 
27
- ## Providers
27
+ ## Source installation
28
+
29
+ For features marked **Unreleased**, install this checkout with
30
+ [uv](https://docs.astral.sh/uv/):
31
+
32
+ ```sh
33
+ git clone https://github.com/jakeryderv/usdata && cd usdata
34
+ uv sync --extra pandas
35
+ uv run usdata info noaa:coops-water-levels
36
+ ```
37
+
38
+ Run source examples from this checkout with `uv run usdata` (CLI) or
39
+ `uv run python` (Python). The pandas extra enables CSV reading; use `--extra radar`
40
+ or `--extra netcdf` for those formats. For contribution checks, continue with
41
+ [development setup](#development).
28
42
 
29
- <!-- registry:start -->
30
- | Provider | Available | Stub | Planned | Next up (unassigned) | Datasets |
31
- |---|---:|---:|---:|---|---|
32
- | [NOAA](docs/providers/noaa.md) | 6 | 0 | 23 | — | `ghcn-daily`, `gsom`, `storm-events`, `nexrad-level2`, `goes-abi`, `coastwatch-sst`, +23 planned |
33
- | [USGS](docs/providers/usgs.md) | 1 | 0 | 2 | — | `water-daily`, +2 planned |
34
- | [Census Bureau](docs/providers/census.md) | 0 | 0 | 1 | — | +1 planned |
35
- | [EPA](docs/providers/epa.md) | 0 | 0 | 1 | — | +1 planned |
36
- | [FEMA](docs/providers/fema.md) | 0 | 0 | 1 | — | +1 planned |
37
- | [NASA](docs/providers/nasa.md) | 0 | 0 | 1 | — | +1 planned |
38
- | [USDA](docs/providers/usda.md) | 0 | 0 | 1 | — | +1 planned |
43
+ ## Providers
39
44
 
40
- Available datasets are in `code`, stubs in _italics_; planned ones are counted. Available means implemented in this source checkout; consult the [releases](https://github.com/jakeryderv/usdata/releases) for published support. Provider pages link access notes to the generated dataset catalog; [the roadmap](docs/roadmap.md) explains future priorities.
41
- <!-- registry:end -->
45
+ Browse the [dataset catalog](docs/generated/catalog/index.md) for current support,
46
+ release availability, and dataset details. [Provider access notes](docs/providers/README.md)
47
+ explain agency-specific services; the [roadmap](docs/roadmap.md) describes priorities.
42
48
 
43
49
  ## Development
44
50
 
45
- Requires [uv](https://docs.astral.sh/uv/) and [just](https://just.systems/).
51
+ From a [source checkout](#source-installation), requires [uv](https://docs.astral.sh/uv/) and [just](https://just.systems/).
46
52
 
47
53
  `just setup` uses the tested Python 3.14.7 pin in `.python-version`. Older Linux
48
54
  uv Python 3.14 builds can crash during NumPy array operations; see
49
55
  [the upstream fix](https://github.com/astral-sh/python-build-standalone/issues/991).
50
56
 
51
57
  ```sh
52
- git clone https://github.com/jakeryderv/usdata && cd usdata
53
58
  just setup # install toolchain and dependencies
59
+ just hooks-install # optional: install fast staged-file checks
54
60
  just test # all offline tests
55
61
  just check # format, lint, typecheck, offline tests, generated docs, release notices
56
62
  just check-pandas # install the CSV extra and run the same checks
@@ -62,9 +68,17 @@ just docs-serve # build and preview the documentation locally, with reload
62
68
  just check-docs # validate generated content and build the site strictly
63
69
  just build # build wheel and sdist
64
70
  just smoke # exercise core and pandas wheel installations outside the checkout
71
+ just changes # preview upcoming release notes
72
+ just cleanup 123 # from main: remove PR #123's merged branch and clean worktree
65
73
  just run search radar
66
74
  ```
67
75
 
76
+ Commit hooks fix and format staged Python files using the locked Ruff version,
77
+ and check configuration, merge conflicts, and GitHub Actions workflows. Full
78
+ validation remains `just check`; `just check-hooks` runs the non-mutating config
79
+ and workflow checks alone. Hooks do not rewrite notebooks or raw data fixtures.
80
+ The first hook run downloads its isolated tools and requires network access.
81
+
68
82
  Offline tests mechanically block network connections. Tests that hit
69
83
  live services run with `just test-live`; see [testing levels and organization](docs/testing.md). CI checks Python 3.11 and 3.14 on
70
84
  Linux with core-only, pandas, radar, and NetCDF dependency profiles. Installed-wheel
@@ -73,8 +87,9 @@ live-service suites run on Linux. `just setup` restores a core-only development
73
87
  environment; the `check-pandas`, `check-radar`, and `check-netcdf` commands install
74
88
  their respective extras.
75
89
 
76
- Releases: `just release minor` opens a version-bump PR; merging it publishes
77
- to PyPI and creates the tag and GitHub release. See
90
+ Releases: `just release minor` prepares a release branch. Update release notices,
91
+ then `just release-pr` validates and opens a draft for review. Merging the reviewed
92
+ PR publishes to PyPI and creates the tag and GitHub release. See
78
93
  [docs/versioning.md](docs/versioning.md).
79
94
 
80
95
  See [provider access notes](docs/providers/README.md),
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "usdata"
3
- version = "0.9.0"
3
+ version = "0.10.0"
4
4
  description = "Unified Python SDK and CLI for discovering, fetching, and tracking provenance of U.S. public scientific data"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -47,15 +47,19 @@ usdata = "usdata.cli:app"
47
47
 
48
48
  [dependency-groups]
49
49
  dev = [
50
+ "pre-commit>=4.6.0",
50
51
  "pyright>=1.1.380",
51
52
  "pytest>=8.0",
52
53
  "pytest-cov>=7.1.0",
53
54
  "respx>=0.23.1",
54
55
  "ruff>=0.6",
56
+ "towncrier>=26.9",
55
57
  ]
56
58
  docs = [
59
+ "tomli-w>=1.2.0",
57
60
  "mkdocstrings-python>=2.0.8",
58
61
  "nbconvert>=7.17.1",
62
+ "towncrier>=26.9",
59
63
  "zensical>=0.0.60",
60
64
  ]
61
65
  examples = [
@@ -126,3 +130,64 @@ markers = [
126
130
  "netcdf: optional NetCDF reader coverage",
127
131
  ]
128
132
  addopts = "-ra --strict-markers"
133
+
134
+ [tool.towncrier]
135
+ directory = "changes"
136
+ filename = "CHANGELOG.md"
137
+ start_string = """
138
+ <!-- towncrier release notes start -->
139
+ """
140
+ underlines = [
141
+ "",
142
+ "",
143
+ "",
144
+ ]
145
+ title_format = "## [{version}](https://github.com/jakeryderv/usdata/releases/tag/v{version}) - {project_date}"
146
+ issue_format = "[#{issue}](https://github.com/jakeryderv/usdata/issues/{issue})"
147
+ template = "scripts/templates/changelog.md.jinja"
148
+ wrap = false
149
+
150
+ [[tool.towncrier.type]]
151
+ directory = "breaking"
152
+ name = "Breaking"
153
+ showcontent = true
154
+
155
+ [[tool.towncrier.type]]
156
+ directory = "security"
157
+ name = "Security"
158
+ showcontent = true
159
+
160
+ [[tool.towncrier.type]]
161
+ directory = "removed"
162
+ name = "Removed"
163
+ showcontent = true
164
+
165
+ [[tool.towncrier.type]]
166
+ directory = "added"
167
+ name = "Added"
168
+ showcontent = true
169
+
170
+ [[tool.towncrier.type]]
171
+ directory = "changed"
172
+ name = "Changed"
173
+ showcontent = true
174
+
175
+ [[tool.towncrier.type]]
176
+ directory = "fixed"
177
+ name = "Fixed"
178
+ showcontent = true
179
+
180
+ [[tool.towncrier.type]]
181
+ directory = "documentation"
182
+ name = "Documentation"
183
+ showcontent = true
184
+
185
+ [[tool.towncrier.type]]
186
+ directory = "development"
187
+ name = "Development"
188
+ showcontent = true
189
+
190
+ [[tool.towncrier.type]]
191
+ directory = "internal"
192
+ name = "Internal"
193
+ showcontent = true
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "usdata"
3
- version = "0.9.0"
3
+ version = "0.10.0"
4
4
  description = "Unified Python SDK and CLI for discovering, fetching, and tracking provenance of U.S. public scientific data"
5
5
  readme = "README.md"
6
6
  license = "Apache-2.0"
@@ -36,15 +36,19 @@ usdata = "usdata.cli:app"
36
36
 
37
37
  [dependency-groups]
38
38
  dev = [
39
+ "pre-commit>=4.6.0",
39
40
  "pyright>=1.1.380",
40
41
  "pytest>=8.0",
41
42
  "pytest-cov>=7.1.0",
42
43
  "respx>=0.23.1",
43
44
  "ruff>=0.6",
45
+ "towncrier>=26.9",
44
46
  ]
45
47
  docs = [
48
+ "tomli-w>=1.2.0",
46
49
  "mkdocstrings-python>=2.0.8",
47
50
  "nbconvert>=7.17.1",
51
+ "towncrier>=26.9",
48
52
  "zensical>=0.0.60",
49
53
  ]
50
54
  examples = [
@@ -98,3 +102,58 @@ markers = [
98
102
  "netcdf: optional NetCDF reader coverage",
99
103
  ]
100
104
  addopts = "-ra --strict-markers"
105
+
106
+ [tool.towncrier]
107
+ directory = "changes"
108
+ filename = "CHANGELOG.md"
109
+ start_string = "<!-- towncrier release notes start -->\n"
110
+ underlines = ["", "", ""]
111
+ title_format = "## [{version}](https://github.com/jakeryderv/usdata/releases/tag/v{version}) - {project_date}"
112
+ issue_format = "[#{issue}](https://github.com/jakeryderv/usdata/issues/{issue})"
113
+ template = "scripts/templates/changelog.md.jinja"
114
+ wrap = false
115
+
116
+ [[tool.towncrier.type]]
117
+ directory = "breaking"
118
+ name = "Breaking"
119
+ showcontent = true
120
+
121
+ [[tool.towncrier.type]]
122
+ directory = "security"
123
+ name = "Security"
124
+ showcontent = true
125
+
126
+ [[tool.towncrier.type]]
127
+ directory = "removed"
128
+ name = "Removed"
129
+ showcontent = true
130
+
131
+ [[tool.towncrier.type]]
132
+ directory = "added"
133
+ name = "Added"
134
+ showcontent = true
135
+
136
+ [[tool.towncrier.type]]
137
+ directory = "changed"
138
+ name = "Changed"
139
+ showcontent = true
140
+
141
+ [[tool.towncrier.type]]
142
+ directory = "fixed"
143
+ name = "Fixed"
144
+ showcontent = true
145
+
146
+ [[tool.towncrier.type]]
147
+ directory = "documentation"
148
+ name = "Documentation"
149
+ showcontent = true
150
+
151
+ [[tool.towncrier.type]]
152
+ directory = "development"
153
+ name = "Development"
154
+ showcontent = true
155
+
156
+ [[tool.towncrier.type]]
157
+ directory = "internal"
158
+ name = "Internal"
159
+ showcontent = true
@@ -1,211 +1,211 @@
1
- id,name,state,lat,lon,elev_ft,type
2
- KABR,Aberdeen,SD,45.455833,-98.413333,1383,NEXRAD
3
- KABX,Albuquerque,NM,35.149722,-106.82388,5951,NEXRAD
4
- KAKQ,Norfolk Rich,VA,36.98405,-77.007361,255,NEXRAD
5
- KAMA,Amarillo,TX,35.233333,-101.70927,3703,NEXRAD
6
- KAMX,Miami,FL,25.611083,-80.412667,111,NEXRAD
7
- KAPX,Gaylord,MI,44.90635,-84.719533,1561,NEXRAD
8
- KARX,La Crosse,WI,43.822778,-91.191111,1357,NEXRAD
9
- KATX,Seattle,WA,48.194611,-122.49569,642,NEXRAD
10
- KBBX,Beale Afb,CA,39.495639,-121.63161,221,NEXRAD
11
- KBGM,Binghamton,NY,42.199694,-75.984722,1703,NEXRAD
12
- KBHX,Eureka,CA,40.498583,-124.29216,2516,NEXRAD
13
- KBIS,Bismarck,ND,46.770833,-100.76055,1755,NEXRAD
14
- KBLX,Billings,MT,45.853778,-108.60680,3703,NEXRAD
15
- KBMX,Birmingham,AL,33.172417,-86.770167,759,NEXRAD
16
- KBOX,Boston,MA,41.955778,-71.136861,232,NEXRAD
17
- KBRO,Brownsville,TX,25.916,-97.418967,88,NEXRAD
18
- KBUF,Buffalo,NY,42.948789,-78.736781,790,NEXRAD
19
- KBYX,Key West,FL,24.5975,-81.703167,89,NEXRAD
20
- KCAE,Columbia,SC,33.948722,-81.118278,345,NEXRAD
21
- KCBW,Houlton,ME,46.03925,-67.806431,860,NEXRAD
22
- KCBX,Boise,ID,43.490217,-116.23603,3172,NEXRAD
23
- KCCX,State College,PA,40.923167,-78.003722,2486,NEXRAD
24
- KCLE,Cleveland,OH,41.413217,-81.859867,860,NEXRAD
25
- KCLX,Charleston,SC,32.655528,-81.042194,229,NEXRAD
26
- KCRI,Roc Faa Redundant Rda 1,OK,35.238333,-97.46,1315,TEST
27
- KCRP,Corpus Christi,TX,27.784017,-97.51125,142,NEXRAD
28
- KCXX,Burlington,VT,44.511,-73.166431,431,NEXRAD
29
- KCYS,Cheyenne,WY,41.151919,-104.80603,6193,NEXRAD
30
- KDAX,Sacramento,CA,38.501111,-121.67783,144,NEXRAD
31
- KDDC,Dodge City,KS,37.760833,-99.968889,2671,NEXRAD
32
- KDFX,Laughlin Afb,TX,29.273139,-100.28033,1196,NEXRAD
33
- KDGX,Jackson Brandon,MS,32.279944,-89.984444,609,NEXRAD
34
- KDIX,Philadelphia,NJ,39.947089,-74.410731,230,NEXRAD
35
- KDLH,Duluth,MN,46.836944,-92.209722,1542,NEXRAD
36
- KDMX,Des Moines,IA,41.7312,-93.722869,1095,NEXRAD
37
- KDOX,Dover Afb,DE,38.825767,-75.440117,164,NEXRAD
38
- KDTX,Detroit,MI,42.7,-83.471667,1216,NEXRAD
39
- KDVN,Davenport,IA,41.611667,-90.580833,851,NEXRAD
40
- KDYX,Dyess Afb,TX,32.5385,-99.254333,1582,NEXRAD
41
- KEAX,Kansas City,MO,38.81025,-94.264472,1092,NEXRAD
42
- KEMX,Tucson,AZ,31.89365,-110.63025,5319,NEXRAD
43
- KENX,Albany,NY,42.586556,-74.064083,1935,NEXRAD
44
- KEOX,Fort Rucker,AL,31.460556,-85.459389,537,NEXRAD
45
- KEPZ,El Paso,NM,31.873056,-106.698,4218,NEXRAD
46
- KESX,Las Vegas,NV,35.70135,-114.89165,4948,NEXRAD
47
- KEVX,Eglin Afb,FL,30.565033,-85.921667,221,NEXRAD
48
- KEWX,Austin San Antonio,TX,29.704056,-98.028611,767,NEXRAD
49
- KEYX,Edwards,CA,35.09785,-117.56075,2873,NEXRAD
50
- KFCX,Roanoke,VA,37.0244,-80.273969,2965,NEXRAD
51
- KFDR,Altus Afb,OK,34.362194,-98.976667,1315,NEXRAD
52
- KFDX,Cannon Afb,NM,34.634167,-103.61888,4698,NEXRAD
53
- KFFC,Atlanta,GA,33.36355,-84.56595,972,NEXRAD
54
- KFSD,Sioux Falls,SD,43.587778,-96.729444,1495,NEXRAD
55
- KFSX,Flagstaff,AZ,34.574333,-111.19844,7514,NEXRAD
56
- KFTG,Denver Front Range Ap,CO,39.786639,-104.54580,5611,NEXRAD
57
- KFWS,Dallas,TX,32.573,-97.30315,777,NEXRAD
58
- KGGW,Glasgow,MT,48.206361,-106.62469,2384,NEXRAD
59
- KGJX,Grand Junction,CO,39.062169,-108.21376,10101,NEXRAD
60
- KGLD,Goodland,KS,39.366944,-101.70027,3716,NEXRAD
61
- KGRB,Green Bay,WI,44.498633,-88.111111,823,NEXRAD
62
- KGRK,Fort Hood,TX,30.721833,-97.382944,603,NEXRAD
63
- KGRR,Grand Rapids,MI,42.893889,-85.544889,875,NEXRAD
64
- KGSP,Greer,SC,34.883306,-82.219833,1069,NEXRAD
65
- KGWX,Columbus Afb,MS,33.896917,-88.329194,590,NEXRAD
66
- KGYX,Portland,ME,43.891306,-70.256361,474,NEXRAD
67
- KHDC,Hammond Municipal Airport,LA,30.5193,-90.4074,43,NEXRAD
68
- KHDX,Holloman Afb,NM,33.077,-106.12003,4270,NEXRAD
69
- KHGX,Houston,TX,29.4719,-95.078733,115,NEXRAD
70
- KHNX,San Joaquin Valley,CA,36.314181,-119.63213,340,NEXRAD
71
- KHPX,Fort Campbell,KY,36.736972,-87.285583,613,NEXRAD
72
- KHTX,Huntsville,AL,34.930556,-86.083611,1859,NEXRAD
73
- KICT,Wichita,KS,37.654444,-97.443056,1400,NEXRAD
74
- KICX,Cedar City,UT,37.59105,-112.86218,10757,NEXRAD
75
- KILN,Cincinnati,OH,39.420483,-83.82145,1170,NEXRAD
76
- KILX,Lincoln,IL,40.1505,-89.336792,731,NEXRAD
77
- KIND,Indianapolis,IN,39.7075,-86.280278,887,NEXRAD
78
- KINX,Tulsa,OK,36.175131,-95.564161,749,NEXRAD
79
- KIWA,Phoenix,AZ,33.289233,-111.66991,1426,NEXRAD
80
- KIWX,Fort Wayne,IN,41.358611,-85.7,1056,NEXRAD
81
- KJAX,Jacksonville,FL,30.484633,-81.7019,160,NEXRAD
82
- KJGX,Robins Afb,GA,32.675683,-83.350833,618,NEXRAD
83
- KJKL,Jackson,KY,37.590833,-83.313056,1461,NEXRAD
84
- KLBB,Lubbock,TX,33.654139,-101.81416,3378,NEXRAD
85
- KLCH,Lake Charles,LA,30.125306,-93.215889,137,NEXRAD
86
- KLGX,Langley Hill Nw Washington,WA,47.116944,-124.10666,366,NEXRAD
87
- KLIX,New Orleans,LA,30.336667,-89.825417,179,NEXRAD
88
- KLNX,North Platte,NE,41.957944,-100.57622,3113,NEXRAD
89
- KLOT,Chicago,IL,41.604444,-88.084444,760,NEXRAD
90
- KLRX,Elko,NV,40.73955,-116.8027,6895,NEXRAD
91
- KLSX,St Louis,MO,38.698611,-90.682778,722,NEXRAD
92
- KLTX,Wilmington,NC,33.98915,-78.429108,145,NEXRAD
93
- KLVX,Louisville,KY,37.975278,-85.943889,833,NEXRAD
94
- KLWX,Sterling,VA,38.976111,-77.4875,404,NEXRAD
95
- KLZK,Little Rock,AR,34.8365,-92.262194,649,NEXRAD
96
- KMAF,Midland Odessa,TX,31.943461,-102.18925,2962,NEXRAD
97
- KMAX,Medford,OR,42.081169,-122.71736,7561,NEXRAD
98
- KMBX,Minot Afb,ND,48.393056,-100.86444,1590,NEXRAD
99
- KMHX,Morehead City,NC,34.775908,-76.876189,145,NEXRAD
100
- KMKX,Milwaukee,WI,42.9679,-88.550667,1023,NEXRAD
101
- KMLB,Melbourne,FL,28.113194,-80.654083,149,NEXRAD
102
- KMOB,Mobile,AL,30.679444,-88.24,289,NEXRAD
103
- KMPX,Minneapolis,MN,44.848889,-93.565528,1101,NEXRAD
104
- KMQT,Marquette,MI,46.531111,-87.548333,1525,NEXRAD
105
- KMRX,Knoxville,TN,36.168611,-83.401944,1434,NEXRAD
106
- KMSX,Missoula,MT,47.041,-113.98622,7978,NEXRAD
107
- KMTX,Salt Lake City,UT,41.262778,-112.44777,6594,NEXRAD
108
- KMUX,San Francisco,CA,37.155222,-121.89844,3550,NEXRAD
109
- KMVX,Grand Forks,ND,47.527778,-97.325556,1083,NEXRAD
110
- KMXX,Maxwell Afb,AL,32.53665,-85.78975,560,NEXRAD
111
- KNKX,San Diego,CA,32.919017,-117.0418,1052,NEXRAD
112
- KNQA,Memphis,TN,35.344722,-89.873333,435,NEXRAD
113
- KOAX,Omaha,NE,41.320369,-96.366819,1262,NEXRAD
114
- KOHX,Nashville,TN,36.247222,-86.5625,676,NEXRAD
115
- KOKX,New York City,NY,40.865528,-72.863917,199,NEXRAD
116
- KOTX,Spokane,WA,47.680417,-117.62677,2449,NEXRAD
117
- KOUN,Norman Nssl,OK,35.236058,-97.46235,1284,TEST
118
- KPAH,Paducah,KY,37.068333,-88.771944,506,NEXRAD
119
- KPBZ,Pittsburgh,PA,40.531717,-80.217967,1266,NEXRAD
120
- KPDT,Pendleton,OR,45.69065,-118.85293,1580,NEXRAD
121
- KPOE,Fort Polk,LA,31.155278,-92.976111,473,NEXRAD
122
- KPUX,Pueblo,CO,38.45955,-104.18135,5363,NEXRAD
123
- KRAX,Raleigh Durham,NC,35.665519,-78.48975,462,NEXRAD
124
- KRGX,Reno,NV,39.754056,-119.46202,8396,NEXRAD
125
- KRIW,Riverton,WY,43.066089,-108.4773,5633,NEXRAD
126
- KRLX,Charleston,WV,38.311111,-81.722778,1213,NEXRAD
127
- KRTX,Portland,OR,45.715039,-122.965,1728,NEXRAD
128
- KSFX,Pocatello,ID,43.1056,-112.68613,4539,NEXRAD
129
- KSGF,Springfield,MO,37.235239,-93.400419,1375,NEXRAD
130
- KSHV,Shreveport,LA,32.450833,-93.84125,387,NEXRAD
131
- KSJT,San Angelo,TX,31.371278,-100.4925,2004,NEXRAD
132
- KSOX,Santa Ana Mountains,CA,33.817733,-117.636,3106,NEXRAD
133
- KSRX,Fort Smith,AR,35.290417,-94.361889,737,NEXRAD
134
- KTBW,Tampa,FL,27.7055,-82.401778,122,NEXRAD
135
- KTFX,Great Falls,MT,47.459583,-111.38533,3805,NEXRAD
136
- KTLH,Tallahassee,FL,30.397583,-84.328944,177,NEXRAD
137
- KTLX,Oklahoma City,OK,35.333361,-97.277761,1278,NEXRAD
138
- KTWX,Topeka,KS,38.99695,-96.23255,1415,NEXRAD
139
- KTYX,Fort Drum,NY,43.755694,-75.679861,1960,NEXRAD
140
- KUDX,Rapid City,SD,44.124722,-102.83,3195,NEXRAD
141
- KUEX,Hastings,NE,40.320833,-98.441944,2057,NEXRAD
142
- KVAX,Moody Afb,GA,30.890278,-83.001806,330,NEXRAD
143
- KVBX,Vandenberg Afb,CA,34.83855,-120.39791,1354,NEXRAD
144
- KVNX,Vance Afb,OK,36.740617,-98.127717,1258,NEXRAD
145
- KVTX,Los Angeles,CA,34.412017,-119.17875,2807,NEXRAD
146
- KVWX,Evansville,IN,38.26025,-87.724528,625,NEXRAD
147
- KYUX,Yuma,AZ,32.495281,-114.65671,239,NEXRAD
148
- LPLA,Lajes Ab,,38.73028,-27.32167,3334,NEXRAD
149
- PABC,Bethel Faa,AK,60.791944,-161.87638,193,NEXRAD
150
- PACG,Sitka,AK,56.852778,-135.52916,272,NEXRAD
151
- PAEC,Nome,AK,64.511389,-165.295,90,NEXRAD
152
- PAHG,Anchorage,AK,60.725914,-151.35146,356,NEXRAD
153
- PAIH,Middleton Island,AK,59.460767,-146.30344,132,NEXRAD
154
- PAKC,King Salmon,AK,58.679444,-156.62944,144,NEXRAD
155
- PAPD,Fairbanks,AK,65.035114,-147.50143,2707,NEXRAD
156
- PGUA,Andersen Afb Agana,GU,13.455833,144.811111,386,NEXRAD
157
- PHKI,South Kauai,HI,21.893889,-159.5525,340,NEXRAD
158
- PHKM,Kamuela,HI,20.125278,-155.77777,3966,NEXRAD
159
- PHMO,Molokai,HI,21.132778,-157.18027,1444,NEXRAD
160
- PHWA,South Shore,HI,19.095,-155.56888,1461,NEXRAD
161
- RKJK,Kunsan,,35.924167,126.622222,192,NEXRAD
162
- RKSG,Camp Humphreys,,37.207569,127.285561,1521,NEXRAD
163
- RODN,Kadena,,26.3078,127.903469,412,NEXRAD
164
- TADW,Andrews Afb,MD,38.695,-76.845,344,TDWR
165
- TATL,Atlanta,GA,33.646944,-84.261944,1076,TDWR
166
- TBNA,Nashville,TN,35.98,-86.661944,817,TDWR
167
- TBOS,Boston,MA,42.158056,-70.933056,262,TDWR
168
- TBWI,Baltimore Washington,MD,39.09,-76.63,299,TDWR
169
- TCLT,Charlotte,NC,35.336944,-80.885,869,TDWR
170
- TCMH,Columbus,OH,40.006111,-82.715,1148,TDWR
171
- TCVG,Covington,KY,38.898056,-84.58,1053,TDWR
172
- TDAL,Dallas Love Field,TX,32.926111,-96.968056,623,TDWR
173
- TDAY,Dayton,OH,40.021944,-84.123056,1020,TDWR
174
- TDCA,Washington National,MD,38.758889,-76.961944,344,TDWR
175
- TDEN,Denver,CO,39.728056,-104.52611,5702,TDWR
176
- TDFW,Dallas Ft Worth,TX,33.065,-96.918056,584,TDWR
177
- TDTW,Detroit,MI,42.111111,-83.515,771,TDWR
178
- TEWR,Newark,NJ,40.593056,-74.27,135,TDWR
179
- TFLL,Ft Lauderdale,FL,26.143056,-80.343889,121,TDWR
180
- THOU,Houston Hobby,TX,29.516111,-95.241944,118,TDWR
181
- TIAD,Washington Dulles,VA,39.083889,-77.528889,472,TDWR
182
- TIAH,Houston International,TX,30.065,-95.566944,253,TDWR
183
- TICH,Wichita,KS,37.506944,-97.436944,1352,TDWR
184
- TIDS,Indianapolis,IN,39.636944,-86.436111,846,TDWR
185
- TJBQ,Rafael Hernandez Airport,PR,18.485,-67.143,280,TDWR
186
- TJFK,New York City Jfk,NY,40.588889,-73.881111,112,TDWR
187
- TJRV,Jose Aponte De La Torre Airpor,PR,18.256,-65.637,50,TDWR
188
- TJUA,San Juan,PR,18.115667,-66.078167,2958,NEXRAD
189
- TLAS,Las Vegas,NV,36.143889,-115.00694,2057,TDWR
190
- TLVE,Cleveland,OH,41.29,-82.008056,932,TDWR
191
- TMCI,Kansas City,MO,39.498056,-94.741944,1089,TDWR
192
- TMCO,Orlando International,FL,28.343889,-81.326111,171,TDWR
193
- TMDW,Chicago Midway,IL,41.651111,-87.73,764,TDWR
194
- TMEM,Memphis,MS,34.896111,-89.993056,482,TDWR
195
- TMIA,Miami,FL,25.758056,-80.491111,125,TDWR
196
- TMKE,Milwaukee,WI,42.818889,-88.046111,932,TDWR
197
- TMSP,Minneapolis,MN,44.871111,-92.933056,1122,TDWR
198
- TMSY,New Orleans,LA,30.021944,-90.403056,98,TDWR
199
- TOKC,Norman Wfo,OK,35.276111,-97.51,1309,TDWR
200
- TORD,Chicago Ohare,IL,41.796944,-87.858056,745,TDWR
201
- TPBI,West Palm Beach,FL,26.688056,-80.273056,135,TDWR
202
- TPHL,Philadelphia,NJ,39.948889,-75.068889,154,TDWR
203
- TPHX,Phoenix,AZ,33.421111,-112.16305,1089,TDWR
204
- TPIT,Pittsburgh,PA,40.501111,-80.486111,1385,TDWR
205
- TRDU,Raleigh,NC,36.001944,-78.696944,515,TDWR
206
- TSDF,Louisville,KY,38.046111,-85.61,732,TDWR
207
- TSJU,San Juan,PR,18.473889,-66.178889,157,TDWR
208
- TSLC,Salt Lake City,UT,40.966944,-111.93,4295,TDWR
209
- TSTL,St Louis,MO,38.805,-90.488889,646,TDWR
210
- TTPA,Tampa,FL,27.86,-82.518056,92,TDWR
211
- TTUL,Tulsa,OK,36.071111,-95.826944,823,TDWR
1
+ id,name,state,lat,lon,elev_ft,type
2
+ KABR,Aberdeen,SD,45.455833,-98.413333,1383,NEXRAD
3
+ KABX,Albuquerque,NM,35.149722,-106.82388,5951,NEXRAD
4
+ KAKQ,Norfolk Rich,VA,36.98405,-77.007361,255,NEXRAD
5
+ KAMA,Amarillo,TX,35.233333,-101.70927,3703,NEXRAD
6
+ KAMX,Miami,FL,25.611083,-80.412667,111,NEXRAD
7
+ KAPX,Gaylord,MI,44.90635,-84.719533,1561,NEXRAD
8
+ KARX,La Crosse,WI,43.822778,-91.191111,1357,NEXRAD
9
+ KATX,Seattle,WA,48.194611,-122.49569,642,NEXRAD
10
+ KBBX,Beale Afb,CA,39.495639,-121.63161,221,NEXRAD
11
+ KBGM,Binghamton,NY,42.199694,-75.984722,1703,NEXRAD
12
+ KBHX,Eureka,CA,40.498583,-124.29216,2516,NEXRAD
13
+ KBIS,Bismarck,ND,46.770833,-100.76055,1755,NEXRAD
14
+ KBLX,Billings,MT,45.853778,-108.60680,3703,NEXRAD
15
+ KBMX,Birmingham,AL,33.172417,-86.770167,759,NEXRAD
16
+ KBOX,Boston,MA,41.955778,-71.136861,232,NEXRAD
17
+ KBRO,Brownsville,TX,25.916,-97.418967,88,NEXRAD
18
+ KBUF,Buffalo,NY,42.948789,-78.736781,790,NEXRAD
19
+ KBYX,Key West,FL,24.5975,-81.703167,89,NEXRAD
20
+ KCAE,Columbia,SC,33.948722,-81.118278,345,NEXRAD
21
+ KCBW,Houlton,ME,46.03925,-67.806431,860,NEXRAD
22
+ KCBX,Boise,ID,43.490217,-116.23603,3172,NEXRAD
23
+ KCCX,State College,PA,40.923167,-78.003722,2486,NEXRAD
24
+ KCLE,Cleveland,OH,41.413217,-81.859867,860,NEXRAD
25
+ KCLX,Charleston,SC,32.655528,-81.042194,229,NEXRAD
26
+ KCRI,Roc Faa Redundant Rda 1,OK,35.238333,-97.46,1315,TEST
27
+ KCRP,Corpus Christi,TX,27.784017,-97.51125,142,NEXRAD
28
+ KCXX,Burlington,VT,44.511,-73.166431,431,NEXRAD
29
+ KCYS,Cheyenne,WY,41.151919,-104.80603,6193,NEXRAD
30
+ KDAX,Sacramento,CA,38.501111,-121.67783,144,NEXRAD
31
+ KDDC,Dodge City,KS,37.760833,-99.968889,2671,NEXRAD
32
+ KDFX,Laughlin Afb,TX,29.273139,-100.28033,1196,NEXRAD
33
+ KDGX,Jackson Brandon,MS,32.279944,-89.984444,609,NEXRAD
34
+ KDIX,Philadelphia,NJ,39.947089,-74.410731,230,NEXRAD
35
+ KDLH,Duluth,MN,46.836944,-92.209722,1542,NEXRAD
36
+ KDMX,Des Moines,IA,41.7312,-93.722869,1095,NEXRAD
37
+ KDOX,Dover Afb,DE,38.825767,-75.440117,164,NEXRAD
38
+ KDTX,Detroit,MI,42.7,-83.471667,1216,NEXRAD
39
+ KDVN,Davenport,IA,41.611667,-90.580833,851,NEXRAD
40
+ KDYX,Dyess Afb,TX,32.5385,-99.254333,1582,NEXRAD
41
+ KEAX,Kansas City,MO,38.81025,-94.264472,1092,NEXRAD
42
+ KEMX,Tucson,AZ,31.89365,-110.63025,5319,NEXRAD
43
+ KENX,Albany,NY,42.586556,-74.064083,1935,NEXRAD
44
+ KEOX,Fort Rucker,AL,31.460556,-85.459389,537,NEXRAD
45
+ KEPZ,El Paso,NM,31.873056,-106.698,4218,NEXRAD
46
+ KESX,Las Vegas,NV,35.70135,-114.89165,4948,NEXRAD
47
+ KEVX,Eglin Afb,FL,30.565033,-85.921667,221,NEXRAD
48
+ KEWX,Austin San Antonio,TX,29.704056,-98.028611,767,NEXRAD
49
+ KEYX,Edwards,CA,35.09785,-117.56075,2873,NEXRAD
50
+ KFCX,Roanoke,VA,37.0244,-80.273969,2965,NEXRAD
51
+ KFDR,Altus Afb,OK,34.362194,-98.976667,1315,NEXRAD
52
+ KFDX,Cannon Afb,NM,34.634167,-103.61888,4698,NEXRAD
53
+ KFFC,Atlanta,GA,33.36355,-84.56595,972,NEXRAD
54
+ KFSD,Sioux Falls,SD,43.587778,-96.729444,1495,NEXRAD
55
+ KFSX,Flagstaff,AZ,34.574333,-111.19844,7514,NEXRAD
56
+ KFTG,Denver Front Range Ap,CO,39.786639,-104.54580,5611,NEXRAD
57
+ KFWS,Dallas,TX,32.573,-97.30315,777,NEXRAD
58
+ KGGW,Glasgow,MT,48.206361,-106.62469,2384,NEXRAD
59
+ KGJX,Grand Junction,CO,39.062169,-108.21376,10101,NEXRAD
60
+ KGLD,Goodland,KS,39.366944,-101.70027,3716,NEXRAD
61
+ KGRB,Green Bay,WI,44.498633,-88.111111,823,NEXRAD
62
+ KGRK,Fort Hood,TX,30.721833,-97.382944,603,NEXRAD
63
+ KGRR,Grand Rapids,MI,42.893889,-85.544889,875,NEXRAD
64
+ KGSP,Greer,SC,34.883306,-82.219833,1069,NEXRAD
65
+ KGWX,Columbus Afb,MS,33.896917,-88.329194,590,NEXRAD
66
+ KGYX,Portland,ME,43.891306,-70.256361,474,NEXRAD
67
+ KHDC,Hammond Municipal Airport,LA,30.5193,-90.4074,43,NEXRAD
68
+ KHDX,Holloman Afb,NM,33.077,-106.12003,4270,NEXRAD
69
+ KHGX,Houston,TX,29.4719,-95.078733,115,NEXRAD
70
+ KHNX,San Joaquin Valley,CA,36.314181,-119.63213,340,NEXRAD
71
+ KHPX,Fort Campbell,KY,36.736972,-87.285583,613,NEXRAD
72
+ KHTX,Huntsville,AL,34.930556,-86.083611,1859,NEXRAD
73
+ KICT,Wichita,KS,37.654444,-97.443056,1400,NEXRAD
74
+ KICX,Cedar City,UT,37.59105,-112.86218,10757,NEXRAD
75
+ KILN,Cincinnati,OH,39.420483,-83.82145,1170,NEXRAD
76
+ KILX,Lincoln,IL,40.1505,-89.336792,731,NEXRAD
77
+ KIND,Indianapolis,IN,39.7075,-86.280278,887,NEXRAD
78
+ KINX,Tulsa,OK,36.175131,-95.564161,749,NEXRAD
79
+ KIWA,Phoenix,AZ,33.289233,-111.66991,1426,NEXRAD
80
+ KIWX,Fort Wayne,IN,41.358611,-85.7,1056,NEXRAD
81
+ KJAX,Jacksonville,FL,30.484633,-81.7019,160,NEXRAD
82
+ KJGX,Robins Afb,GA,32.675683,-83.350833,618,NEXRAD
83
+ KJKL,Jackson,KY,37.590833,-83.313056,1461,NEXRAD
84
+ KLBB,Lubbock,TX,33.654139,-101.81416,3378,NEXRAD
85
+ KLCH,Lake Charles,LA,30.125306,-93.215889,137,NEXRAD
86
+ KLGX,Langley Hill Nw Washington,WA,47.116944,-124.10666,366,NEXRAD
87
+ KLIX,New Orleans,LA,30.336667,-89.825417,179,NEXRAD
88
+ KLNX,North Platte,NE,41.957944,-100.57622,3113,NEXRAD
89
+ KLOT,Chicago,IL,41.604444,-88.084444,760,NEXRAD
90
+ KLRX,Elko,NV,40.73955,-116.8027,6895,NEXRAD
91
+ KLSX,St Louis,MO,38.698611,-90.682778,722,NEXRAD
92
+ KLTX,Wilmington,NC,33.98915,-78.429108,145,NEXRAD
93
+ KLVX,Louisville,KY,37.975278,-85.943889,833,NEXRAD
94
+ KLWX,Sterling,VA,38.976111,-77.4875,404,NEXRAD
95
+ KLZK,Little Rock,AR,34.8365,-92.262194,649,NEXRAD
96
+ KMAF,Midland Odessa,TX,31.943461,-102.18925,2962,NEXRAD
97
+ KMAX,Medford,OR,42.081169,-122.71736,7561,NEXRAD
98
+ KMBX,Minot Afb,ND,48.393056,-100.86444,1590,NEXRAD
99
+ KMHX,Morehead City,NC,34.775908,-76.876189,145,NEXRAD
100
+ KMKX,Milwaukee,WI,42.9679,-88.550667,1023,NEXRAD
101
+ KMLB,Melbourne,FL,28.113194,-80.654083,149,NEXRAD
102
+ KMOB,Mobile,AL,30.679444,-88.24,289,NEXRAD
103
+ KMPX,Minneapolis,MN,44.848889,-93.565528,1101,NEXRAD
104
+ KMQT,Marquette,MI,46.531111,-87.548333,1525,NEXRAD
105
+ KMRX,Knoxville,TN,36.168611,-83.401944,1434,NEXRAD
106
+ KMSX,Missoula,MT,47.041,-113.98622,7978,NEXRAD
107
+ KMTX,Salt Lake City,UT,41.262778,-112.44777,6594,NEXRAD
108
+ KMUX,San Francisco,CA,37.155222,-121.89844,3550,NEXRAD
109
+ KMVX,Grand Forks,ND,47.527778,-97.325556,1083,NEXRAD
110
+ KMXX,Maxwell Afb,AL,32.53665,-85.78975,560,NEXRAD
111
+ KNKX,San Diego,CA,32.919017,-117.0418,1052,NEXRAD
112
+ KNQA,Memphis,TN,35.344722,-89.873333,435,NEXRAD
113
+ KOAX,Omaha,NE,41.320369,-96.366819,1262,NEXRAD
114
+ KOHX,Nashville,TN,36.247222,-86.5625,676,NEXRAD
115
+ KOKX,New York City,NY,40.865528,-72.863917,199,NEXRAD
116
+ KOTX,Spokane,WA,47.680417,-117.62677,2449,NEXRAD
117
+ KOUN,Norman Nssl,OK,35.236058,-97.46235,1284,TEST
118
+ KPAH,Paducah,KY,37.068333,-88.771944,506,NEXRAD
119
+ KPBZ,Pittsburgh,PA,40.531717,-80.217967,1266,NEXRAD
120
+ KPDT,Pendleton,OR,45.69065,-118.85293,1580,NEXRAD
121
+ KPOE,Fort Polk,LA,31.155278,-92.976111,473,NEXRAD
122
+ KPUX,Pueblo,CO,38.45955,-104.18135,5363,NEXRAD
123
+ KRAX,Raleigh Durham,NC,35.665519,-78.48975,462,NEXRAD
124
+ KRGX,Reno,NV,39.754056,-119.46202,8396,NEXRAD
125
+ KRIW,Riverton,WY,43.066089,-108.4773,5633,NEXRAD
126
+ KRLX,Charleston,WV,38.311111,-81.722778,1213,NEXRAD
127
+ KRTX,Portland,OR,45.715039,-122.965,1728,NEXRAD
128
+ KSFX,Pocatello,ID,43.1056,-112.68613,4539,NEXRAD
129
+ KSGF,Springfield,MO,37.235239,-93.400419,1375,NEXRAD
130
+ KSHV,Shreveport,LA,32.450833,-93.84125,387,NEXRAD
131
+ KSJT,San Angelo,TX,31.371278,-100.4925,2004,NEXRAD
132
+ KSOX,Santa Ana Mountains,CA,33.817733,-117.636,3106,NEXRAD
133
+ KSRX,Fort Smith,AR,35.290417,-94.361889,737,NEXRAD
134
+ KTBW,Tampa,FL,27.7055,-82.401778,122,NEXRAD
135
+ KTFX,Great Falls,MT,47.459583,-111.38533,3805,NEXRAD
136
+ KTLH,Tallahassee,FL,30.397583,-84.328944,177,NEXRAD
137
+ KTLX,Oklahoma City,OK,35.333361,-97.277761,1278,NEXRAD
138
+ KTWX,Topeka,KS,38.99695,-96.23255,1415,NEXRAD
139
+ KTYX,Fort Drum,NY,43.755694,-75.679861,1960,NEXRAD
140
+ KUDX,Rapid City,SD,44.124722,-102.83,3195,NEXRAD
141
+ KUEX,Hastings,NE,40.320833,-98.441944,2057,NEXRAD
142
+ KVAX,Moody Afb,GA,30.890278,-83.001806,330,NEXRAD
143
+ KVBX,Vandenberg Afb,CA,34.83855,-120.39791,1354,NEXRAD
144
+ KVNX,Vance Afb,OK,36.740617,-98.127717,1258,NEXRAD
145
+ KVTX,Los Angeles,CA,34.412017,-119.17875,2807,NEXRAD
146
+ KVWX,Evansville,IN,38.26025,-87.724528,625,NEXRAD
147
+ KYUX,Yuma,AZ,32.495281,-114.65671,239,NEXRAD
148
+ LPLA,Lajes Ab,,38.73028,-27.32167,3334,NEXRAD
149
+ PABC,Bethel Faa,AK,60.791944,-161.87638,193,NEXRAD
150
+ PACG,Sitka,AK,56.852778,-135.52916,272,NEXRAD
151
+ PAEC,Nome,AK,64.511389,-165.295,90,NEXRAD
152
+ PAHG,Anchorage,AK,60.725914,-151.35146,356,NEXRAD
153
+ PAIH,Middleton Island,AK,59.460767,-146.30344,132,NEXRAD
154
+ PAKC,King Salmon,AK,58.679444,-156.62944,144,NEXRAD
155
+ PAPD,Fairbanks,AK,65.035114,-147.50143,2707,NEXRAD
156
+ PGUA,Andersen Afb Agana,GU,13.455833,144.811111,386,NEXRAD
157
+ PHKI,South Kauai,HI,21.893889,-159.5525,340,NEXRAD
158
+ PHKM,Kamuela,HI,20.125278,-155.77777,3966,NEXRAD
159
+ PHMO,Molokai,HI,21.132778,-157.18027,1444,NEXRAD
160
+ PHWA,South Shore,HI,19.095,-155.56888,1461,NEXRAD
161
+ RKJK,Kunsan,,35.924167,126.622222,192,NEXRAD
162
+ RKSG,Camp Humphreys,,37.207569,127.285561,1521,NEXRAD
163
+ RODN,Kadena,,26.3078,127.903469,412,NEXRAD
164
+ TADW,Andrews Afb,MD,38.695,-76.845,344,TDWR
165
+ TATL,Atlanta,GA,33.646944,-84.261944,1076,TDWR
166
+ TBNA,Nashville,TN,35.98,-86.661944,817,TDWR
167
+ TBOS,Boston,MA,42.158056,-70.933056,262,TDWR
168
+ TBWI,Baltimore Washington,MD,39.09,-76.63,299,TDWR
169
+ TCLT,Charlotte,NC,35.336944,-80.885,869,TDWR
170
+ TCMH,Columbus,OH,40.006111,-82.715,1148,TDWR
171
+ TCVG,Covington,KY,38.898056,-84.58,1053,TDWR
172
+ TDAL,Dallas Love Field,TX,32.926111,-96.968056,623,TDWR
173
+ TDAY,Dayton,OH,40.021944,-84.123056,1020,TDWR
174
+ TDCA,Washington National,MD,38.758889,-76.961944,344,TDWR
175
+ TDEN,Denver,CO,39.728056,-104.52611,5702,TDWR
176
+ TDFW,Dallas Ft Worth,TX,33.065,-96.918056,584,TDWR
177
+ TDTW,Detroit,MI,42.111111,-83.515,771,TDWR
178
+ TEWR,Newark,NJ,40.593056,-74.27,135,TDWR
179
+ TFLL,Ft Lauderdale,FL,26.143056,-80.343889,121,TDWR
180
+ THOU,Houston Hobby,TX,29.516111,-95.241944,118,TDWR
181
+ TIAD,Washington Dulles,VA,39.083889,-77.528889,472,TDWR
182
+ TIAH,Houston International,TX,30.065,-95.566944,253,TDWR
183
+ TICH,Wichita,KS,37.506944,-97.436944,1352,TDWR
184
+ TIDS,Indianapolis,IN,39.636944,-86.436111,846,TDWR
185
+ TJBQ,Rafael Hernandez Airport,PR,18.485,-67.143,280,TDWR
186
+ TJFK,New York City Jfk,NY,40.588889,-73.881111,112,TDWR
187
+ TJRV,Jose Aponte De La Torre Airpor,PR,18.256,-65.637,50,TDWR
188
+ TJUA,San Juan,PR,18.115667,-66.078167,2958,NEXRAD
189
+ TLAS,Las Vegas,NV,36.143889,-115.00694,2057,TDWR
190
+ TLVE,Cleveland,OH,41.29,-82.008056,932,TDWR
191
+ TMCI,Kansas City,MO,39.498056,-94.741944,1089,TDWR
192
+ TMCO,Orlando International,FL,28.343889,-81.326111,171,TDWR
193
+ TMDW,Chicago Midway,IL,41.651111,-87.73,764,TDWR
194
+ TMEM,Memphis,MS,34.896111,-89.993056,482,TDWR
195
+ TMIA,Miami,FL,25.758056,-80.491111,125,TDWR
196
+ TMKE,Milwaukee,WI,42.818889,-88.046111,932,TDWR
197
+ TMSP,Minneapolis,MN,44.871111,-92.933056,1122,TDWR
198
+ TMSY,New Orleans,LA,30.021944,-90.403056,98,TDWR
199
+ TOKC,Norman Wfo,OK,35.276111,-97.51,1309,TDWR
200
+ TORD,Chicago Ohare,IL,41.796944,-87.858056,745,TDWR
201
+ TPBI,West Palm Beach,FL,26.688056,-80.273056,135,TDWR
202
+ TPHL,Philadelphia,NJ,39.948889,-75.068889,154,TDWR
203
+ TPHX,Phoenix,AZ,33.421111,-112.16305,1089,TDWR
204
+ TPIT,Pittsburgh,PA,40.501111,-80.486111,1385,TDWR
205
+ TRDU,Raleigh,NC,36.001944,-78.696944,515,TDWR
206
+ TSDF,Louisville,KY,38.046111,-85.61,732,TDWR
207
+ TSJU,San Juan,PR,18.473889,-66.178889,157,TDWR
208
+ TSLC,Salt Lake City,UT,40.966944,-111.93,4295,TDWR
209
+ TSTL,St Louis,MO,38.805,-90.488889,646,TDWR
210
+ TTPA,Tampa,FL,27.86,-82.518056,92,TDWR
211
+ TTUL,Tulsa,OK,36.071111,-95.826944,823,TDWR
@@ -1,5 +1,5 @@
1
1
  # Curated dataset registry: the single source of truth for what usdata knows about.
2
- # Rendered to docs/reference/datasets.md and the README by `just docs`.
2
+ # Rendered exclusively to docs/generated/catalog/ by `just docs`.
3
3
  #
4
4
  # status: available = adapter implemented and tested (since: version it shipped in)
5
5
  # stub = adapter class exists but raises NotImplementedProvider (target: version or later)
@@ -196,20 +196,21 @@ datasets:
196
196
 
197
197
  - id: noaa:coops-water-levels
198
198
  provider: noaa
199
- status: planned
199
+ status: available
200
200
  domain: sea-level-tides
201
- target: later
202
- title: CO-OPS Water Levels and Tides
201
+ since: "0.10"
202
+ title: CO-OPS Observed Water Levels
203
203
  description: >-
204
- Observed and predicted water levels, tide predictions, and related
205
- products for NWLON tide stations from the CO-OPS Data API, with a
206
- companion metadata API for station lookup. Anonymous REST with
207
- station, product, datum, and date-range parameters.
204
+ Preliminary or verified six-minute observed water levels from the
205
+ anonymous CO-OPS Data API. Select one station, an explicit vertical datum,
206
+ units, and a UTC interval of at most 28 days. Raw CSV retains quality flags;
207
+ predictions and station discovery are not included.
208
208
  keywords: [tides, water level, sea level, coastal, coops, nwlon, stations]
209
209
  protocol: http
210
210
  homepage: https://api.tidesandcurrents.noaa.gov/api/prod/
211
211
  license: US Government Work (public domain)
212
- capabilities: { spatial_subset: false, temporal_subset: true, variable_subset: true }
212
+ capabilities: { spatial_subset: false, temporal_subset: true, variable_subset: false }
213
+ adapter: usdata.providers.noaa.coops:CoopsWaterLevels
213
214
 
214
215
  - id: noaa:gsom
215
216
  provider: noaa
@@ -232,18 +233,21 @@ datasets:
232
233
 
233
234
  - id: noaa:gsoy
234
235
  provider: noaa
235
- status: planned
236
+ status: available
236
237
  domain: surface-weather
237
- target: later
238
+ since: "0.10"
238
239
  title: Global Summary of the Year
239
240
  description: >-
240
241
  Annual station summaries derived from GHCN-Daily via the NCEI Access Data
241
- Service dataset global-summary-of-the-year. Shares the GHCN-Daily client.
242
+ Service dataset global-summary-of-the-year. Selects complete UTC calendar
243
+ years and explicit stations, or discovers stations through the search service.
242
244
  keywords: [climate, annual, stations, temperature, precipitation, gsoy, ncei]
243
245
  protocol: http
244
246
  homepage: https://www.ncei.noaa.gov/access/search/data-search/global-summary-of-the-year
245
247
  license: US Government Work (public domain)
246
248
  capabilities: { spatial_subset: false, temporal_subset: true, variable_subset: true }
249
+ spatial_extent: { west: -180.0, south: -90.0, east: 180.0, north: 90.0 }
250
+ adapter: usdata.providers.noaa.gsoy:GlobalSummaryYearly
247
251
 
248
252
  - id: noaa:climate-normals
249
253
  provider: noaa
@@ -675,3 +679,96 @@ datasets:
675
679
  homepage: https://www.nass.usda.gov/Research_and_Science/Cropland/SARS1a.php
676
680
  license: US Government Work (public domain)
677
681
  capabilities: { spatial_subset: true, temporal_subset: true, variable_subset: false }
682
+
683
+ # Documentation composition keyed by stable dataset ID; validated by just docs.
684
+ catalog:
685
+ noaa:ghcn-daily:
686
+ guide: docs/providers/noaa-ghcn.md
687
+ summary: Daily station weather
688
+ formats:
689
+ - CSV
690
+ selection: Station observations within inclusive calendar dates; selected elements
691
+ inputs: Both dates; station IDs or a geographic query
692
+ reader_extra: pandas
693
+ examples:
694
+ - examples/weather-and-streamflow/example.ipynb
695
+ noaa:gsom:
696
+ guide: docs/providers/noaa-gsom.md
697
+ summary: Monthly station climate
698
+ formats:
699
+ - CSV
700
+ selection: Complete UTC calendar months touched by the query; station and element filters
701
+ inputs: Both dates; station IDs or a geographic query
702
+ reader_extra: pandas
703
+ examples:
704
+ - examples/monthly-climate/example.ipynb
705
+ noaa:gsoy:
706
+ guide: docs/providers/noaa-gsoy.md
707
+ summary: Annual station climate
708
+ formats:
709
+ - CSV
710
+ selection: Complete UTC calendar years touched by the query; station and element filters
711
+ inputs: Both dates; station IDs or a geographic query
712
+ reader_extra: pandas
713
+ examples:
714
+ - examples/annual-climate/README.md
715
+ noaa:nexrad-level2:
716
+ guide: docs/providers/noaa-nexrad.md
717
+ summary: NEXRAD radar scans
718
+ formats:
719
+ - NEXRAD Level II
720
+ selection: Whole radar scans by site and inclusive UTC scan-start time
721
+ inputs: Both timestamps; radar IDs or a geographic query
722
+ reader_extra: radar
723
+ examples:
724
+ - examples/radar-reflectivity/example.ipynb
725
+ noaa:goes-abi:
726
+ guide: docs/providers/noaa-goes.md
727
+ summary: GOES CONUS imagery
728
+ formats:
729
+ - NetCDF4
730
+ selection: Whole single-channel CONUS scenes by inclusive UTC scan-start time
731
+ inputs: Satellite, channel, and both timestamps
732
+ reader_extra: netcdf
733
+ examples:
734
+ - examples/goes-imagery/example.ipynb
735
+ noaa:storm-events:
736
+ guide: docs/providers/noaa-storm-events.md
737
+ summary: Storm Events details
738
+ formats:
739
+ - gzip CSV
740
+ selection: Whole annual archives; filter rows locally after downloading
741
+ inputs: Both dates (selects the containing years)
742
+ reader_extra: pandas
743
+ examples:
744
+ - examples/storm-events/example.ipynb
745
+ noaa:coastwatch-sst:
746
+ guide: docs/providers/noaa-coastwatch.md
747
+ summary: Sea-surface temperature
748
+ formats:
749
+ - CSV with units row
750
+ selection: Grid centers and timestamps inside the requested bounds; optional stride
751
+ inputs: BBox or location, and both timestamps
752
+ reader_extra: pandas
753
+ examples:
754
+ - examples/sst-analysis/example.ipynb
755
+ noaa:coops-water-levels:
756
+ guide: docs/providers/noaa-coops.md
757
+ summary: Coastal water levels
758
+ formats:
759
+ - CSV
760
+ selection: Six-minute observations for one station and datum; at most 28 days
761
+ inputs: Station, datum, and both minute-aligned timestamps
762
+ reader_extra: pandas
763
+ examples:
764
+ - examples/coastal-water-levels/README.md
765
+ usgs:water-daily:
766
+ guide: docs/providers/usgs-water-daily.md
767
+ summary: Daily water observations
768
+ formats:
769
+ - CSV
770
+ selection: Site observations for inclusive local calendar dates; parameter and statistic filters
771
+ inputs: Both dates; site IDs or a geographic query
772
+ reader_extra: pandas
773
+ examples:
774
+ - examples/weather-and-streamflow/example.ipynb
@@ -0,0 +1,141 @@
1
+ """Observed six-minute CO-OPS water levels as raw CSV.
2
+
3
+ Params: one seven-digit ``station``, an explicit ``datum``, and optional
4
+ ``units`` (metric or english). Both dates are required at minute precision;
5
+ requests use UTC and span at most 28 days. Predictions are not included.
6
+ """
7
+
8
+ from __future__ import annotations
9
+
10
+ import csv
11
+ import hashlib
12
+ from datetime import UTC, datetime, timedelta
13
+ from pathlib import Path
14
+
15
+ import httpx
16
+
17
+ from usdata._files import staged_path
18
+ from usdata.models import Asset, Protocol, Query, TimeRange
19
+ from usdata.protocols import http
20
+ from usdata.providers._http import _HttpProvider
21
+ from usdata.providers.base import QueryError
22
+
23
+ DATA_URL = "https://api.tidesandcurrents.noaa.gov/api/prod/datagetter"
24
+ DATUMS = {"CRD", "IGLD", "LWD", "MHHW", "MHW", "MTL", "MSL", "MLW", "MLLW", "NAVD", "STND"}
25
+ MAX_INTERVAL = timedelta(days=28)
26
+ REQUIRED_COLUMNS = {
27
+ "Date Time",
28
+ "Water Level",
29
+ "Sigma",
30
+ "O or I (for verified)",
31
+ "F",
32
+ "R",
33
+ "L",
34
+ "Quality",
35
+ }
36
+
37
+
38
+ def _validate_csv(path: Path, asset: Asset) -> None:
39
+ """Reject error documents and malformed/empty responses before committing bytes."""
40
+ try:
41
+ with path.open(encoding="utf-8-sig", newline="") as stream:
42
+ records = csv.reader(stream, strict=True)
43
+ columns = [name.strip() for name in next(records, [])]
44
+ if (
45
+ any(not name for name in columns)
46
+ or len(set(columns)) != len(columns)
47
+ or not REQUIRED_COLUMNS.issubset(columns)
48
+ ):
49
+ raise ValueError("missing expected water-level CSV columns")
50
+ count = 0
51
+ for values in records:
52
+ if values and values[0].startswith("Error:"):
53
+ raise ValueError(values[0][:512])
54
+ if len(values) != len(columns):
55
+ raise ValueError("CSV row does not match the header")
56
+ row = dict(zip(columns, values, strict=True))
57
+ when = datetime.strptime(row["Date Time"].strip(), "%Y-%m-%d %H:%M").replace(
58
+ tzinfo=UTC
59
+ )
60
+ if asset.time is not None and not asset.time.overlaps(
61
+ TimeRange(start=when, end=when)
62
+ ):
63
+ raise ValueError("observation lies outside the requested interval")
64
+ if row["Quality"].strip() not in {"p", "v"}:
65
+ raise ValueError("unrecognized observation quality")
66
+ for field in ("Water Level", "Sigma"):
67
+ if row[field].strip():
68
+ float(row[field])
69
+ count += 1
70
+ if not count:
71
+ raise ValueError("no water-level observations returned")
72
+ except (ValueError, UnicodeError, csv.Error) as error:
73
+ raise httpx.DecodingError(
74
+ f"CO-OPS returned no usable water-level CSV: {error}",
75
+ request=httpx.Request("GET", asset.href),
76
+ ) from error
77
+
78
+
79
+ class CoopsWaterLevels(_HttpProvider):
80
+ """One station's observed water levels, preserving source units and quality fields."""
81
+
82
+ def list_assets(self, query: Query) -> list[Asset]:
83
+ """Describe one bounded CSV request; availability is checked during fetching."""
84
+ if unknown := set(query.params) - {"station", "datum", "units"}:
85
+ raise QueryError(f"unsupported {self.dataset.id} params: {', '.join(sorted(unknown))}")
86
+ if query.bbox is not None or query.text is not None or query.variables:
87
+ raise QueryError(
88
+ "CO-OPS requires an explicit station; location, text and variables are unsupported"
89
+ )
90
+ station = query.params.get("station")
91
+ if (
92
+ not isinstance(station, str)
93
+ or len(station) != 7
94
+ or not station.isascii()
95
+ or not station.isdigit()
96
+ ):
97
+ raise QueryError("station must be a seven-digit string, for example '8518750'")
98
+ datum = query.params.get("datum")
99
+ if not isinstance(datum, str) or datum not in DATUMS:
100
+ raise QueryError(f"datum must be explicit: {', '.join(sorted(DATUMS))}")
101
+ units = query.params.get("units", "metric")
102
+ if units not in ("metric", "english"):
103
+ raise QueryError("units must be metric or english")
104
+ if query.time is None or query.time.start is None or query.time.end is None:
105
+ raise QueryError(f"{self.dataset.id} requires both start and end timestamps")
106
+ start = query.time.start.replace(tzinfo=query.time.start.tzinfo or UTC).astimezone(UTC)
107
+ end = query.time.end.replace(tzinfo=query.time.end.tzinfo or UTC).astimezone(UTC)
108
+ if any(value.second or value.microsecond for value in (start, end)):
109
+ raise QueryError("CO-OPS timestamps must have minute precision (zero seconds)")
110
+ if end - start > MAX_INTERVAL:
111
+ raise QueryError("CO-OPS requests must span at most 28 days; split longer intervals")
112
+ params = {
113
+ "station": station,
114
+ "product": "water_level",
115
+ "begin_date": start.strftime("%Y%m%d %H:%M"),
116
+ "end_date": end.strftime("%Y%m%d %H:%M"),
117
+ "datum": datum,
118
+ "units": units,
119
+ "time_zone": "gmt",
120
+ "format": "csv",
121
+ "application": "usdata",
122
+ }
123
+ url = str(httpx.URL(DATA_URL, params=params))
124
+ digest = hashlib.sha256(url.encode()).hexdigest()[:16]
125
+ return [
126
+ Asset(
127
+ id=f"water_level_{station}_{digest}.csv",
128
+ dataset_id=self.dataset.id,
129
+ href=url,
130
+ protocol=Protocol.HTTP,
131
+ media_type="text/csv",
132
+ time=TimeRange(start=start, end=end),
133
+ )
134
+ ]
135
+
136
+ def fetch(self, asset: Asset, dest: Path) -> Path:
137
+ """Download raw CSV, validating the response before replacing the destination."""
138
+ with staged_path(dest) as temporary:
139
+ http.download(asset.href, temporary, self._http())
140
+ _validate_csv(temporary, asset)
141
+ return dest
@@ -0,0 +1,46 @@
1
+ """Annual station summaries through the NCEI Access Data Service.
2
+
3
+ Params: ``stations`` (list or comma string) and ``units`` (metric or standard).
4
+ Both dates are required; every UTC calendar year touched by the interval is
5
+ selected in full. Geographic discovery uses the same normalized year bounds.
6
+ """
7
+
8
+ from datetime import UTC
9
+
10
+ from usdata.models import Asset, Query, TimeRange
11
+ from usdata.providers.base import QueryError
12
+ from usdata.providers.noaa.ghcnd import GhcnDaily
13
+
14
+
15
+ class GlobalSummaryYearly(GhcnDaily):
16
+ """GSOY CSV subsets, reusing NCEI station discovery and HTTP transport."""
17
+
18
+ ncei_dataset = "global-summary-of-the-year"
19
+
20
+ def _yearly_query(self, query: Query) -> Query:
21
+ if query.text is not None:
22
+ raise QueryError(f"{self.dataset.id} does not support text queries")
23
+ if "stations" in query.params and query.bbox is not None:
24
+ raise QueryError("pass stations or a location/bbox, not both")
25
+ if query.time is None or query.time.start is None or query.time.end is None:
26
+ raise QueryError(f"{self.dataset.id} requires both start and end dates")
27
+ start = query.time.start.replace(tzinfo=query.time.start.tzinfo or UTC).astimezone(UTC)
28
+ end = query.time.end.replace(tzinfo=query.time.end.tzinfo or UTC).astimezone(UTC)
29
+ return query.model_copy(
30
+ update={
31
+ "time": TimeRange(
32
+ start=start.replace(month=1, day=1, hour=0, minute=0, second=0, microsecond=0),
33
+ end=end.replace(
34
+ month=12, day=31, hour=23, minute=59, second=59, microsecond=999999
35
+ ),
36
+ )
37
+ }
38
+ )
39
+
40
+ def find_stations(self, query: Query) -> list[str]:
41
+ """Find stations overlapping the selected complete calendar years."""
42
+ return super().find_stations(self._yearly_query(query))
43
+
44
+ def list_assets(self, query: Query) -> list[Asset]:
45
+ """Resolve annual CSVs with stable URLs and complete-year asset bounds."""
46
+ return super().list_assets(self._yearly_query(query))
@@ -58,8 +58,9 @@ def open_asset(
58
58
  Gzip CSVs are decompressed locally without changing cached bytes.
59
59
  Infer ``csv`` or ``erddap-csv`` from media type and protocol, or use an
60
60
  explicit reader for ambiguous metadata. Identifier columns default to pandas
61
- strings; explicit dtype entries override those defaults. Dates remain strings
62
- unless named in parse_dates. No checksum verification or downloading occurs.
61
+ strings; explicit dtype entries override those defaults. Dates are not parsed
62
+ unless named in parse_dates; use dtype to preserve numeric-looking date labels
63
+ as strings. No checksum verification or downloading occurs.
63
64
  Radar accepts zero-based ``sweep`` indices (one integer or a non-empty list);
64
65
  the default opens the whole volume after checking sweep record alignment.
65
66
  """
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes