diff --git a/.clang-format b/.clang-format new file mode 100644 index 0000000..fb886f9 --- /dev/null +++ b/.clang-format @@ -0,0 +1,76 @@ +--- +Language: Cpp +BasedOnStyle: LLVM +IndentWidth: 4 +TabWidth: 4 +UseTab: Always +ColumnLimit: 100 +AccessModifierOffset: -4 +AlignAfterOpenBracket: Align +AlignConsecutiveAssignments: false +AlignConsecutiveDeclarations: false +AlignEscapedNewlines: Left +AlignOperands: true +AlignTrailingComments: true +AllowAllParametersOfDeclarationOnNextLine: true +AllowShortBlocksOnASingleLine: Never +AllowShortCaseLabelsOnASingleLine: false +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: false +AlwaysBreakTemplateDeclarations: Yes +BinPackArguments: true +BinPackParameters: true +BreakBeforeBinaryOperators: None +BreakBeforeBraces: Attach +BreakBeforeTernaryOperators: true +BreakConstructorInitializers: BeforeColon +BreakStringLiterals: true +CommentPragmas: '^ IWYU pragma:' +CompactNamespaces: false +ConstructorInitializerAllOnOneLineOrOnePerLine: false +ConstructorInitializerIndentWidth: 4 +ContinuationIndentWidth: 4 +Cpp11BracedListStyle: true +DerivePointerAlignment: false +DisableFormat: false +FixNamespaceComments: true +IncludeBlocks: Regroup +IncludeCategories: + - Regex: '^"spc/' + Priority: 1 + - Regex: '^<' + Priority: 2 + - Regex: '.*' + Priority: 3 +IndentCaseLabels: true +IndentPPDirectives: None +IndentWrappedFunctionNames: false +KeepEmptyLinesAtTheStartOfBlocks: false +MaxEmptyLinesToKeep: 1 +NamespaceIndentation: None +PenaltyBreakAssignment: 2 +PenaltyBreakBeforeFirstCallParameter: 19 +PenaltyBreakComment: 300 +PenaltyBreakFirstLessLess: 120 +PenaltyBreakString: 1000 +PenaltyExcessCharacter: 1000000 +PenaltyReturnTypeOnItsOwnLine: 60 +PointerAlignment: Left +ReflowComments: true +SortIncludes: true +SortUsingDeclarations: true +SpaceAfterCStyleCast: false +SpaceAfterTemplateKeyword: true +SpaceBeforeAssignmentOperators: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesBeforeTrailingComments: 1 +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: true +SpacesInParentheses: false +SpacesInSquareBrackets: false +Standard: c++20 diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..cb16122 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,34 @@ +# EditorConfig — consistent style across editors for PredictionCastAI C++ repos +# https://editorconfig.org/ +# Matches the fleet-standard .clang-format: tab-indent (width 4), LF, UTF-8. + +root = true + +[*] +end_of_line = lf +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.{cpp,hpp,c,h,cc,cxx,hxx}] +indent_style = tab +indent_size = 4 +max_line_length = 100 + +[*.{cmake,CMakeLists.txt}] +indent_style = tab +indent_size = 4 + +[Makefile] +indent_style = tab + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 + +[*.{json,jsonc}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..27e94ce --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,38 @@ +name: Bug report +description: A bug, crash, or incorrect behavior. +labels: [bug] +body: + - type: textarea + id: what + attributes: + label: What happened? + description: A clear description of the bug. Include error messages, crash backtraces, or wire-format dumps if relevant. + validations: + required: true + - type: textarea + id: repro + attributes: + label: Reproduction steps + description: Minimum steps + minimum code that triggers the bug. Inline snippets are fine; please don't paste a whole project. + placeholder: | + 1. Build with `make build` + 2. Run `./build/bin/example_` + 3. Observe ... + validations: + required: true + - type: textarea + id: env + attributes: + label: Environment + description: SDK version, compiler, OS, dependency versions (libcurl/libwebsockets/openssl). + placeholder: | + - SDK version: vX.Y.Z (or commit SHA) + - OS: Ubuntu 24.04 / macOS 14 / Windows 2022 + - Compiler: gcc 13.3 / clang 18 / MSVC 19.40 + - cmake --version: ... + validations: + required: true + - type: markdown + attributes: + value: | + **Security vulnerabilities:** please use the channel in [SECURITY.md](../SECURITY.md), not a public issue. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..87f27c6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,5 @@ +blank_issues_enabled: false +contact_links: + - name: Security vulnerability + url: https://github.com/Reddimus/spc-cpp/security/policy + about: Please do NOT open a public issue for security vulnerabilities. Use the private channel in SECURITY.md. diff --git a/.github/ISSUE_TEMPLATE/feature_request.yml b/.github/ISSUE_TEMPLATE/feature_request.yml new file mode 100644 index 0000000..38e6a62 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.yml @@ -0,0 +1,21 @@ +name: Feature request +description: Propose a new API surface, endpoint coverage gap, or developer-experience improvement. +labels: [enhancement] +body: + - type: textarea + id: what + attributes: + label: What feature would you like? + description: Describe the API or behavior you'd like to see, and what consumer code it would enable. + validations: + required: true + - type: textarea + id: alternatives + attributes: + label: Alternatives considered + description: Other ways you could solve this today (workarounds, system installs, vendored copies). Helps us see whether the request is a gap or a preference. + - type: textarea + id: context + attributes: + label: Additional context + description: Links to upstream API docs, related issues, or example code. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..9a0d7d8 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,16 @@ +## Summary + + + +## Test plan + + + +- [ ] `make lint` clean +- [ ] `make test` passes (or specify which subset) +- [ ] CHANGELOG.md updated under `## [Unreleased]` (if user-visible) +- [ ] No new public API → no SemVer minor/major bump needed + +## Notes for reviewers + + diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..2fc6066 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,54 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +jobs: + build-linux: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + sudo apt-get update + sudo apt-get install -y --no-install-recommends \ + build-essential cmake pkg-config clang-format \ + libcurl4-openssl-dev + + - name: Build + run: make build + + - name: Test + run: make test + + - name: Lint + run: make lint + + build-macos: + runs-on: macos-latest + steps: + - uses: actions/checkout@v6 + + - name: Install dependencies + run: | + brew install pkg-config curl clang-format + echo "CMAKE_PREFIX_PATH=$(brew --prefix curl)" >> "$GITHUB_ENV" + + - name: Build + run: make build + + - name: Test + run: make test + + - name: Lint + run: make lint + + markdown-lint: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + - uses: DavidAnson/markdownlint-cli2-action@v23 diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..8a2309c --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,72 @@ +name: Release + +# Auto-publish a GitHub Release when a vX.Y.Z tag is pushed. +# Body is the matching section of CHANGELOG.md (between the "## [X.Y.Z]" +# heading and the next "## " heading), so tag → release stays in sync +# without a separate manual step. + +on: + push: + tags: + - "v[0-9]+.[0-9]+.[0-9]+" + - "v[0-9]+.[0-9]+.[0-9]+-*" + +permissions: + contents: write + +jobs: + release: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v6 + with: + fetch-depth: 0 + + - name: Verify tag matches CMakeLists project VERSION + # Pin the source-of-truth: the tag X.Y.Z must equal the + # `project(spc-cpp VERSION X.Y.Z ...)` field in + # CMakeLists.txt. Without this guard the two can drift + # silently and corrupt `find_package(spc-cpp VERSION X.Y.Z)` + # consumer queries (the generated spc-cppConfigVersion.cmake + # tracks PROJECT_VERSION). + run: | + tag="${GITHUB_REF#refs/tags/}" + version="${tag#v}" + cmake_version=$(awk -F 'VERSION |LANGUAGES' ' + /^project\(spc-cpp / { gsub(/[ \t]/,"",$2); print $2; exit } + ' CMakeLists.txt) + if [ "$cmake_version" != "$version" ]; then + echo "::error::tag $tag implies version '$version' but CMakeLists.txt says '$cmake_version'" >&2 + echo "Bump 'project(spc-cpp VERSION ...)' to match before tagging." >&2 + exit 1 + fi + echo "OK: tag $tag matches CMakeLists VERSION $cmake_version" + + - name: Extract release notes from CHANGELOG.md + run: | + tag="${GITHUB_REF#refs/tags/}" + version="${tag#v}" + # Pipe directly to a file. DO NOT capture into a shell var + # and echo it back — bash treats backticks as command + # substitution, which silently strips every inline `code` + # span from the release body. Reading via `gh release create + # --notes-file` preserves the bytes verbatim. + awk -v v="$version" ' + $0 ~ "^## \\["v"\\]" { capture=1; next } + capture && /^## / { exit } + capture { print } + ' CHANGELOG.md > /tmp/release_notes.md + if [ ! -s /tmp/release_notes.md ]; then + printf 'Release %s. See CHANGELOG.md for details.\n' "$tag" \ + > /tmp/release_notes.md + fi + + - name: Create GitHub Release + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + tag="${GITHUB_REF#refs/tags/}" + gh release create "$tag" \ + --title "$tag" \ + --notes-file /tmp/release_notes.md \ + --verify-tag diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..f7b900e --- /dev/null +++ b/.gitignore @@ -0,0 +1,54 @@ +build/ +build-*/ +cmake-build-*/ +.cache/ +compile_commands.json + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Env +.env +*.pem + +# === Production-hardening patterns (added 2026-05-02) === +# Credentials — never commit secrets to a public SDK +*.pem +*.key +*.p12 +*.pfx +credentials.json +credentials*.json +secrets/ +service-account*.json +gha-secrets.txt + +# Build cache +_deps/ +build-*/ + +# Coverage + analysis artifacts +*.gcov +*.gcda +*.gcno +coverage/ +*.profraw +*.profdata + +# Sanitizer / valgrind output +asan.log +ubsan.log +*.callgrind +*.cachegrind + +# OS noise +.DS_Store +Thumbs.db diff --git a/.markdownlint-cli2.yaml b/.markdownlint-cli2.yaml new file mode 100644 index 0000000..1caa6ab --- /dev/null +++ b/.markdownlint-cli2.yaml @@ -0,0 +1,21 @@ +config: + default: true + MD013: false + MD033: false + MD040: false + MD041: false + MD060: false + # MD004 disables ul-style enforcement so a literal "+" at the start of + # an indented continuation line isn't misread as a "+"-style list item. + MD004: false + MD024: + siblings_only: true +globs: + - "**/*.md" + - "!**/node_modules/**" + - "!**/build*/**" + - "!**/.git/**" + - "!**/_deps/**" + - "!**/vendor/**" + - "!**/.venv/**" + - "!**/*.egg-info/**" diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..98ce22e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,53 @@ +# Changelog + +All notable changes to **spc-cpp** are recorded here. The format follows +[Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and the project +uses [Semantic Versioning](https://semver.org/spec/v2.0.0.html). + +## [Unreleased] + +## [0.1.0] - 2026-05-17 + +Initial public release. Open-source C++23 SDK for NOAA Storm Prediction +Center (SPC) severe-weather products, extracted from the internal +`spc-data` ingestion service so its battle-tested NOAA-GeoJSON parser +(case-variant keys, numeric-as-string labels, Polygon/MultiPolygon +geometry) can be reused instead of re-implemented per consumer. + +### Added + +- **`spc_core`**: `Error`/`Result` (`std::expected`-based; adds + `ErrorCode::FeedUnavailable` for SPC's HTTP-404 "no active outlook"), + token-bucket `RateLimiter`, exponential-backoff `retry`, GeoJSON + pagination helpers incl. `ArcGISPager` (2000-record offset paging, + stops on `exceededTransferLimit == false`). `geometry.*` (ray-cast + point-in-polygon) and `types.hpp` (contract-stable outlook shapes) + **extracted verbatim** from `spc-data`. +- **`spc_http`**: pimpl GET-only `HttpClient`, behavior-parity with + `spc-data`'s libcurl fetcher (FOLLOWLOCATION / NOSIGNAL / + ACCEPT_ENCODING / UA), absolute-URL pass-through so one client serves + `spc.noaa.gov`, the ArcGIS MapServer, and the IEM archive. +- **`spc_models`**: null-safe `glz::generic` helpers + the verbatim + `severity_from_label` / `parse_categorical` / `parse_probabilistic` + AST walkers (lifted from `spc-data/src/parser.cpp`); GeoJSON + + Esri-FeatureSet wrappers. +- Layered CMake static libs `spc_core → spc_http → spc_models → + spc_api → spc` with `install(EXPORT)` + `spc::` namespace and a + `find_package(spc)` config. +- House-standard tooling: `Makefile` (build/test/lint/format/coverage), + `.clang-format`, `.editorconfig`, `.markdownlint-cli2.yaml`, + `tools/cpp_auto_audit.py` (empty allowlist), GitHub Actions CI + (linux + macos + markdown-lint) and tag-driven release workflow. + +### JSON-library divergence (intentional) + +`spc-cpp` parses JSON with **[Glaze](https://github.com/stephenberry/glaze) +v7.6.0**, *not* `nlohmann/json` like the sibling `nws-cpp` / `ncei-cpp` +SDKs. SPC's `properties` block is shape-loose (case-variant `LABEL` vs +`label` vs `dn`; a probabilistic `LABEL` that is sometimes the string +`"5"` and sometimes the number `5`) and its geometry is polymorphic +(`Polygon` vs `MultiPolygon`). The extracted parser walks a +`glz::generic` AST rather than a static `glz::meta` schema; this is the +exact, proven `spc-data` code path and is preserved verbatim so the +downstream byte-identity guarantee holds. See the README +"JSON library: Glaze (divergence note)" section. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..37005dc --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,62 @@ +# spc-cpp Development Guide + +## Build & Test + +```bash +make build # Release build (CMake + make) +make debug # Debug build +make test # Run unit tests (ctest) +make lint # Check formatting (clang-format --dry-run) + cpp_auto_audit +make format # Format in place +make coverage # lcov coverage report +make clean # Remove build/ +make run- # Build + run an example (see examples/) +``` + +## Architecture + +- **Layered static libraries**: spc_core -> spc_http -> spc_models -> + spc_api -> spc (INTERFACE). `install(EXPORT)` + `spc::` namespace. +- **C++23**: `std::expected` for all returns, no exceptions. +- **Patterns**: Pimpl (HttpClient, the spc_api clients), non-copyable / + movable clients, `[[nodiscard]]`. +- **JSON**: [Glaze](https://github.com/stephenberry/glaze) v7.6.0 via + FetchContent. This **diverges** from the sibling `nws-cpp` / + `ncei-cpp` SDKs (nlohmann/json) on purpose — SPC's properties block + is shape-loose (case-variant `LABEL`/`label`/`dn`, numeric-as-string) + and geometry is polymorphic (`Polygon`/`MultiPolygon`), so the parser + walks a `glz::generic` AST rather than a static `glz::meta`. The + convective path is lifted verbatim from the internal `spc-data` + service and must stay parity-exact (a downstream byte-identity gate + depends on it). Documented in README + CHANGELOG. +- **Tests**: GoogleTest via FetchContent. Fixture files in + `tests/fixtures/` (live-captured SPC payloads, shared corpus with + `spc-data`). + +## Conventions + +- Code style: `.clang-format` (LLVM base, tabs, 100 cols). +- Namespace: `spc`. +- **No `auto`**: explicit types except iterators, structured bindings, + range-for. `tools/cpp_auto_audit.py`, empty allowlist. +- Verbatim convective parser is frozen behavior. Net-new product + models carry their own severity mappers — never reuse + `severity_from_label` for fire weather / watches / etc. +- Include order: project headers first, then system (clang-format + enforced). + +## Data sources + +- **ArcGIS MapServer** (`mapservices.weather.noaa.gov`) — primary, + contract-stable; `ArcGISClient` + `ArcGISPager` (2000-rec paging). +- **Static `www.spc.noaa.gov` `.nolyr.geojson`** — fallback; + `StaticFeedClient` (the 7 feeds `spc-data` ships + day4-8 / fire). +- **IEM** (`mesonet.agron.iastate.edu`) — best-effort historical + backfill; `ArchiveClient` (conservative rate/retry, off any hot path). + +## CI + +GitHub Actions `.github/workflows/ci.yml`: build + test + lint on +Ubuntu 24.04 and macos-latest, markdown-lint via DavidAnson. Release +workflow auto-creates a GitHub Release on `vX.Y.Z` tag push (notes +from `CHANGELOG.md`; the tag must equal `project(spc-cpp VERSION ...)`). diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..aa93431 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,147 @@ +cmake_minimum_required(VERSION 3.20) +project(spc-cpp VERSION 0.1.0 LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 23) +set(CMAKE_CXX_STANDARD_REQUIRED ON) +set(CMAKE_CXX_EXTENSIONS OFF) +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) + +include(GNUInstallDirs) +include(CMakePackageConfigHelpers) + +# Options +option(SPC_BUILD_TESTS "Build tests" ON) +option(SPC_BUILD_EXAMPLES "Build examples" ON) +option(SPC_ENABLE_LTO "Enable Link Time Optimization" ON) +option(SPC_NATIVE_ARCH "Use -march=native for CPU-specific tuning" OFF) + +# Aggressive optimization flags for Release builds. MSVC has its own +# Release defaults; only override for GCC/Clang. +if(NOT MSVC) + set(CMAKE_CXX_FLAGS_RELEASE "-O3 -DNDEBUG") +endif() + +# Enable LTO if requested and supported +if(SPC_ENABLE_LTO) + include(CheckIPOSupported) + check_ipo_supported(RESULT LTO_SUPPORTED OUTPUT LTO_ERROR) + if(LTO_SUPPORTED) + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION_RELEASE ON) + message(STATUS "LTO enabled for Release builds") + else() + message(WARNING "LTO not supported: ${LTO_ERROR}") + endif() +endif() + +# CPU-specific tuning. GCC/Clang only. +if(NOT MSVC) + if(SPC_NATIVE_ARCH) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=native") + message(STATUS "Using -march=native for CPU-specific optimizations") + else() + include(CheckCXXCompilerFlag) + check_cxx_compiler_flag("-march=x86-64-v3" COMPILER_SUPPORTS_X86_64_V3) + if(COMPILER_SUPPORTS_X86_64_V3) + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -march=x86-64-v3") + else() + set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -mtune=generic") + endif() + endif() +endif() + +# Sanitizer support +option(SPC_ENABLE_SANITIZERS "Enable AddressSanitizer and UBSanitizer" OFF) +if(SPC_ENABLE_SANITIZERS) + add_compile_options(-fsanitize=address,undefined -fno-omit-frame-pointer) + add_link_options(-fsanitize=address,undefined) + message(STATUS "Sanitizers enabled (ASan + UBSan)") +endif() + +# Code coverage support +option(SPC_ENABLE_COVERAGE "Enable code coverage instrumentation (gcov)" OFF) +if(SPC_ENABLE_COVERAGE) + add_compile_options(--coverage -fprofile-arcs -ftest-coverage) + add_link_options(--coverage) + message(STATUS "Code coverage enabled") +endif() + +# Find dependencies +find_package(CURL REQUIRED) + +include(FetchContent) + +# Glaze - JSON library (compile-time reflection + a generic AST). spc-cpp +# parses through `glz::generic` because SPC's properties block is shape-loose +# (case-variant `LABEL`/`label`/`dn`, numeric-as-string) and geometry is +# polymorphic (Polygon/MultiPolygon). This DIVERGES from the nlohmann-based +# nws-cpp / ncei-cpp SDKs on purpose (see README + CHANGELOG). The convective +# parse path is lifted verbatim from the internal spc-data service. +# License: MIT. Pinned to the same v7.6.0 the rest of the estate uses so a +# combined FetchContent build dedupes to a single glaze::glaze target. +FetchContent_Declare( + glaze + GIT_REPOSITORY https://github.com/stephenberry/glaze.git + GIT_TAG v7.6.0 + GIT_SHALLOW TRUE +) +FetchContent_MakeAvailable(glaze) + +# Include directories +include_directories(${PROJECT_SOURCE_DIR}/include) + +# Add subdirectories +add_subdirectory(src) + +if(SPC_BUILD_TESTS) + FetchContent_Declare( + googletest + GIT_REPOSITORY https://github.com/google/googletest.git + GIT_TAG v1.15.2 + GIT_SHALLOW TRUE + ) + set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) + FetchContent_MakeAvailable(googletest) + enable_testing() + add_subdirectory(tests) +endif() + +if(SPC_BUILD_EXAMPLES) + add_subdirectory(examples) +endif() + +# Install targets +set(SPC_INSTALL_CMAKEDIR "${CMAKE_INSTALL_LIBDIR}/cmake/spc") + +install(TARGETS spc_core spc_http spc_models spc_api spc + EXPORT spcTargets + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} +) +install(DIRECTORY include/spc DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}) + +configure_package_config_file( + ${CMAKE_CURRENT_SOURCE_DIR}/cmake/spcConfig.cmake.in + ${CMAKE_CURRENT_BINARY_DIR}/spcConfig.cmake + INSTALL_DESTINATION ${SPC_INSTALL_CMAKEDIR} +) +write_basic_package_version_file( + ${CMAKE_CURRENT_BINARY_DIR}/spcConfigVersion.cmake + VERSION ${PROJECT_VERSION} + COMPATIBILITY SameMajorVersion +) +export(EXPORT spcTargets + FILE ${CMAKE_CURRENT_BINARY_DIR}/spcTargets.cmake + NAMESPACE spc:: +) +install(EXPORT spcTargets + FILE spcTargets.cmake + NAMESPACE spc:: + DESTINATION ${SPC_INSTALL_CMAKEDIR} +) +install(FILES + ${CMAKE_CURRENT_BINARY_DIR}/spcConfig.cmake + ${CMAKE_CURRENT_BINARY_DIR}/spcConfigVersion.cmake + DESTINATION ${SPC_INSTALL_CMAKEDIR} +) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..600903d --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,53 @@ +# Contributing to spc-cpp + +Thanks for your interest in contributing. This guide covers the local +build flow, code style expectations, and PR conventions used in this +repo. For security-vulnerability reports, see [SECURITY.md](SECURITY.md) +— do **not** open a public issue for those. + +## Getting started + +```bash +git clone https://github.com/Reddimus/spc-cpp.git +cd spc-cpp + +# One-time: install build deps (Ubuntu 24.04 example) +sudo apt install -y build-essential cmake clang-format \ + libcurl4-openssl-dev + +make build # CMake configure + Release build +make test # Run unit tests (ctest) +make lint # clang-format --dry-run + cpp_auto_audit +``` + +## Code style + +- `.clang-format` (LLVM base, **tabs**, width 4, 100-col). `make + format` rewrites in place; `make lint` is the gate. +- **No `auto`** except iterators, structured bindings, and range-for + loop variables. `tools/cpp_auto_audit.py` enforces this with an + empty allowlist; mark genuine one-offs with a trailing `// auto-ok`. +- Namespace `spc`. Include order: `"spc/..."` first, then system + headers (clang-format regroups). +- All fallible APIs return `Result = std::expected`. No + exceptions across the public surface. + +## Parser-divergence rule (important) + +The **convective** path (`severity_from_label`, `parse_categorical`, +`parse_probabilistic`, `parse_rings`, `geometry.*`, `types.hpp`) is +extracted *verbatim* from the internal `spc-data` service and is +load-bearing for a downstream byte-identity guarantee. Do not change +its behavior. Net-new product models (fire weather, watches, mesoscale +discussions, storm reports, Day4-8 / conditional intensity) are +additive and must not reuse `severity_from_label` blindly — they carry +their own product-specific severity mappers. + +## PRs + +- Branch, push, open a PR against `main`. CI (linux + macos + + markdown-lint) must be green. +- Conventional-commit subject lines. +- Update `CHANGELOG.md` under `[Unreleased]`. +- A maintainer merges with a **merge commit** (history reachability + matters for the consumers that vendor this via FetchContent). diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..84dd954 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Kevin Martinez Lopez + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..27da88c --- /dev/null +++ b/Makefile @@ -0,0 +1,113 @@ +# spc-cpp - Root Makefile +# Wraps CMake for convenient day-to-day workflow + +BUILD_DIR := build +CPP_AUTO_AUDIT := python3 tools/cpp_auto_audit.py +CMAKE := cmake +NPROC := $(shell nproc 2>/dev/null || sysctl -n hw.performancecores 2>/dev/null || echo 4) + +.PHONY: all build debug test lint clean configure configure-debug help format pre-commit \ + install-hooks coverage lint-md format-md \ + run-static_feed run-arcgis run-archive + +all: build + +configure: + @mkdir -p $(BUILD_DIR) + @cd $(BUILD_DIR) && $(CMAKE) .. -DCMAKE_BUILD_TYPE=Release -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + +configure-debug: + @mkdir -p $(BUILD_DIR) + @cd $(BUILD_DIR) && $(CMAKE) .. -DCMAKE_BUILD_TYPE=Debug -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + +build: configure + @$(CMAKE) --build $(BUILD_DIR) -j$(NPROC) + +debug: configure-debug + @$(CMAKE) --build $(BUILD_DIR) -j$(NPROC) + +test: build + @cd $(BUILD_DIR) && ctest --output-on-failure + +lint: + @if command -v clang-format >/dev/null 2>&1; then \ + echo "Checking code formatting..."; \ + find src include tests examples \( -name '*.cpp' -o -name '*.hpp' \) -print0 | \ + xargs -0 clang-format --dry-run --Werror && \ + echo "Format check passed."; \ + else \ + echo "clang-format not found. Install clang-format to run lint."; \ + exit 1; \ + fi + $(CPP_AUTO_AUDIT) + +format: + @if command -v clang-format >/dev/null 2>&1; then \ + echo "Formatting code..."; \ + find src include tests examples \( -name '*.cpp' -o -name '*.hpp' \) -print0 | xargs -0 clang-format -i; \ + echo "Done"; \ + else \ + echo "clang-format not found. Install clang-format to format code."; \ + exit 1; \ + fi + +coverage: + @mkdir -p build-coverage + @cd build-coverage && $(CMAKE) .. -DCMAKE_BUILD_TYPE=Debug -DSPC_ENABLE_COVERAGE=ON -DCMAKE_EXPORT_COMPILE_COMMANDS=ON + @$(CMAKE) --build build-coverage -j$(NPROC) + @cd build-coverage && ctest --output-on-failure + @lcov --capture --directory build-coverage --output-file build-coverage/coverage.info --ignore-errors mismatch + @lcov --remove build-coverage/coverage.info '/usr/*' '*/build-coverage/_deps/*' --output-file build-coverage/coverage_filtered.info --ignore-errors unused + @genhtml build-coverage/coverage_filtered.info --output-directory build-coverage/coverage-report + @echo "Coverage report: build-coverage/coverage-report/index.html" + +# pre-commit: auto-format, then lint. Idempotent. +pre-commit: format lint + +install-hooks: + @mkdir -p .git/hooks + @if [ -f .git/hooks/pre-commit ] && grep -q 'make pre-commit' .git/hooks/pre-commit 2>/dev/null; then \ + echo "pre-commit hook already installed"; \ + else \ + printf '#!/bin/sh\nexec make pre-commit\n' > .git/hooks/pre-commit; \ + chmod +x .git/hooks/pre-commit; \ + echo "Installed .git/hooks/pre-commit -> make pre-commit"; \ + fi + +clean: + @rm -rf $(BUILD_DIR) build-coverage + @echo "Cleaned build directory" + +# Examples (added in PR-2; targets declared here so the surface is stable) +run-static_feed: build + @./$(BUILD_DIR)/examples/example_static_feed + +run-arcgis: build + @./$(BUILD_DIR)/examples/example_arcgis + +run-archive: build + @./$(BUILD_DIR)/examples/example_archive + +lint-md: + npx markdownlint-cli2 "**/*.md" + +format-md: + npx markdownlint-cli2 --fix "**/*.md" + +help: + @echo "spc-cpp C++ SDK Build System" + @echo "" + @echo "Targets:" + @echo " make build - Configure and build the SDK (Release)" + @echo " make debug - Configure and build the SDK (Debug)" + @echo " make test - Run tests" + @echo " make lint - Check formatting + cpp_auto_audit" + @echo " make format - Format code in place" + @echo " make coverage - Generate code coverage report (requires lcov)" + @echo " make clean - Remove build artifacts" + @echo " make help - Show this help" + @echo "" + @echo "Examples:" + @echo " make run-static_feed - Static-feed client example" + @echo " make run-arcgis - ArcGIS MapServer client example" + @echo " make run-archive - IEM archive client example" diff --git a/README.md b/README.md index ab7cae2..ef96e94 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,155 @@ # spc-cpp -Open-source C++23 SDK for NOAA Storm Prediction Center products. +[![CI](https://github.com/Reddimus/spc-cpp/actions/workflows/ci.yml/badge.svg)](https://github.com/Reddimus/spc-cpp/actions/workflows/ci.yml) +[![Release](https://img.shields.io/github/v/release/Reddimus/spc-cpp)](https://github.com/Reddimus/spc-cpp/releases) +[![C++23](https://img.shields.io/badge/C%2B%2B-23-blue.svg)](https://en.cppreference.com/w/cpp/23) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) -Scaffolding and implementation land via PRs — see open pull requests. +C++23 SDK for [NOAA Storm Prediction Center](https://www.spc.noaa.gov/) +(SPC) severe-weather products: convective outlooks (Day 1-3 categorical & +probabilistic, Day 4-8, conditional intensity), fire-weather outlooks, +active watches, mesoscale discussions, and storm reports. + +Typed, `std::expected`-based access over three sources: the **ArcGIS +MapServer** (`mapservices.weather.noaa.gov`, primary — contract-stable), +the static **`www.spc.noaa.gov` GeoJSON feeds** (fallback), and the +**IEM archive** (`mesonet.agron.iastate.edu`, historical backfill). No +API key required. + +## Quick Start + +```cpp +#include "spc/spc.hpp" +#include + +int main() { + spc::HttpClient http; // absolute-URL pass-through; serves SPC/ArcGIS/IEM + + spc::Result r = http.get( + "https://www.spc.noaa.gov/products/outlook/day1otlk_cat.nolyr.geojson"); + if (!r) { + std::cerr << r.error().message << "\n"; + return 1; + } + if (r->status_code == 404) { + // SPC's normal "no active outlook" state — clear, don't error. + return 0; + } + + const spc::CategoricalOutlookPayload p = + spc::parse_categorical(r->body, /*day_offset=*/1); + for (const spc::OutlookFeature& f : p.features) { + std::cout << f.label << " (severity " << static_cast(f.severity) + << ") rings=" << f.rings.size() << "\n"; + } +} +``` + +## Features + +- **C++23** with `Result = std::expected` for all fallible + APIs (no exceptions across the public surface). +- **Convective outlooks**: Day 1-3 categorical + probabilistic + (tornado/hail/wind), Day 4-8, conditional intensity. +- **Fire weather, watches, mesoscale discussions, storm reports** + (the mesoscale-discussion narrative is exposed raw — not parsed). +- **Three sources, one client**: `ArcGISClient` (+ `ArcGISPager` for + the 2000-record transfer limit), `StaticFeedClient`, `ArchiveClient` + (IEM, conservative rate/retry). +- Ray-cast **point-in-polygon** + Polygon/MultiPolygon geometry. +- Battle-tested NOAA-GeoJSON parsing: case-variant keys + (`LABEL`/`label`/`dn`), numeric-as-string labels, polymorphic + geometry — lifted verbatim from a production ingestion service. + +## Install + +### CMake `find_package` + +```bash +cmake -B build -DCMAKE_BUILD_TYPE=Release +cmake --build build +cmake --install build --prefix /your/prefix +``` + +```cmake +find_package(spc 0.1.0 REQUIRED) +target_link_libraries(myapp PRIVATE spc::spc) +``` + +### FetchContent + +```cmake +FetchContent_Declare(spc_cpp + GIT_REPOSITORY https://github.com/Reddimus/spc-cpp.git + GIT_TAG v0.1.0 # pin a tagged release +) +FetchContent_MakeAvailable(spc_cpp) +target_link_libraries(myapp PRIVATE spc::spc) +``` + +## Architecture + +```mermaid +graph LR + spc_core["spc_core
error, geometry, rate_limit, retry, pagination"] + spc_http["spc_http
libcurl GET client (abs-URL pass-through)"] + spc_models["spc_models
glz::generic parsers
+ GeoJSON/Esri shapes
"] + spc_api["spc_api
StaticFeed / ArcGIS / Archive clients"] + spc["spc
INTERFACE"] + spc_core --> spc_http --> spc_models --> spc_api --> spc +``` + +Layered static libraries with `install(EXPORT)` and a `spc::` namespace. + +## JSON library: Glaze (divergence note) + +**spc-cpp parses JSON with [Glaze](https://github.com/stephenberry/glaze) +v7.6.0, not `nlohmann/json`.** This is a deliberate divergence from the +sibling Reddimus SDKs `nws-cpp` and `ncei-cpp`, which use +`nlohmann/json`. + +Why: SPC's GeoJSON `properties` block is shape-loose — the same logical +field appears as `LABEL`, `label`, or `dn` depending on the product; a +probabilistic label is sometimes the string `"5"` and sometimes the +number `5`; timestamps are a compact `YYYYMMDDHHMM`; and geometry is +polymorphic (`Polygon` vs `MultiPolygon`). A compile-time +`glz::meta` schema would either reject these or force tagged-variant +gymnastics. Instead the parser walks a `glz::generic` AST with +null-safe extractors (missing/null/type-mismatch → default-constructed +value). This is the exact, audit-clean code path proven in the internal +`spc-data` ingestion service; it is lifted **verbatim** so a downstream +consumer that swaps its in-tree copy for this SDK gets byte-identical +parse output. Net-new product models reuse the same `glz::generic` +helpers but **do not** reuse the convective `severity_from_label` +(different label sets — they carry product-specific severity mappers). + +If you vendor multiple Reddimus SDKs via FetchContent, note that +spc-cpp pins the **same** glaze `v7.6.0` tag the rest of the estate +uses, so a combined build dedupes to a single `glaze::glaze` target. + +## Build & Test + +```bash +make build # Release +make test # ctest +make lint # clang-format --dry-run + cpp_auto_audit +make coverage # lcov report +``` + +## Dependencies + +| Dependency | Purpose | Source | +| ---------- | ------- | ------ | +| [Glaze](https://github.com/stephenberry/glaze) v7.6.0 | JSON (generic-AST parse of shape-loose SPC GeoJSON) | `FetchContent` | +| libcurl | HTTP GET | system (`find_package(CURL)`) | +| GoogleTest v1.15.2 | Unit testing | `FetchContent` | + +## References + +- [SPC Products](https://www.spc.noaa.gov/products/) +- [NWS ArcGIS MapServer — SPC outlooks](https://mapservices.weather.noaa.gov/vector/rest/services/outlooks/SPC_wx_outlks/MapServer) +- [IEM SPC archive](https://mesonet.agron.iastate.edu/) + +## License + +MIT — see [LICENSE](LICENSE). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..fcb97f3 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,51 @@ +# Security Policy + +`spc-cpp` is a third-party C++ client for NOAA Storm Prediction Center +(SPC) public products (static GeoJSON feeds, the ArcGIS MapServer, and +the IEM historical archive). Those endpoints are unauthenticated, but +consumers of this library may run it inside services that handle +credentials or sensitive operator data. This file is the canonical +contact path for reporting a vulnerability in the client. + +## Supported Versions + +Security fixes are made on the latest published `vX.Y.Z` tag. Older +tags are not back-patched — bump your `FetchContent_Declare(... GIT_TAG ...)` +pin or your `find_package(spc X.Y.Z REQUIRED)` constraint to the +latest minor on the same major as part of the upgrade. + +| Version | Supported | +| ---------- | ------------------ | +| latest tag | :white_check_mark: | +| older | :x: | + +## Reporting a Vulnerability + +**Do not open a public issue.** Use GitHub's [private vulnerability +reporting](https://github.com/Reddimus/spc-cpp/security/advisories/new) +flow, which delivers the report to the maintainer privately and tracks +coordinated disclosure. + +When reporting, please include: + +- Affected version (tag or commit SHA) +- A reproduction — minimal code or test case +- Impact (memory corruption / DoS / something else) +- Whether you've notified anyone else + +You can expect: + +- Acknowledgement within **3 business days** +- An initial assessment + severity rating within **7 business days** +- A fix on a new `vX.Y.Z+1` tag, or a clear timeline if the fix is + larger + +## Out of Scope + +- Bugs against the SPC / NWS MapServer / IEM endpoints themselves — + those go to the respective operators, not this client library. +- Operational issues (rate-limit handling, network blips, third-party + IEM flakiness) — file a regular issue. +- Theoretical issues against dependencies — report them upstream + (`libcurl`, `glaze`, `googletest`). We pin via FetchContent and bump + on credible advisories. diff --git a/cmake/spcConfig.cmake.in b/cmake/spcConfig.cmake.in new file mode 100644 index 0000000..377c855 --- /dev/null +++ b/cmake/spcConfig.cmake.in @@ -0,0 +1,6 @@ +@PACKAGE_INIT@ + +include(CMakeFindDependencyMacro) +find_dependency(CURL) + +include("${CMAKE_CURRENT_LIST_DIR}/spcTargets.cmake") diff --git a/examples/CMakeLists.txt b/examples/CMakeLists.txt new file mode 100644 index 0000000..80244f6 --- /dev/null +++ b/examples/CMakeLists.txt @@ -0,0 +1,5 @@ +add_executable(example_parse_outlook parse_outlook.cpp) +target_link_libraries(example_parse_outlook PRIVATE spc) + +# PR-2 adds: example_static_feed, example_arcgis, example_archive +# (and the matching Makefile run-* targets). diff --git a/examples/parse_outlook.cpp b/examples/parse_outlook.cpp new file mode 100644 index 0000000..476133d --- /dev/null +++ b/examples/parse_outlook.cpp @@ -0,0 +1,31 @@ +/// @file parse_outlook.cpp +/// @brief Minimal example: parse an SPC categorical GeoJSON body and print +/// the per-severity feature summary. (PR-2 adds the network-fetching +/// static-feed / ArcGIS / archive examples.) + +#include "spc/spc.hpp" + +#include +#include + +int main() { + // A tiny inline day-1 categorical outlook (SLGT over a box). + const std::string body = R"({ + "type": "FeatureCollection", + "features": [{ + "type": "Feature", + "properties": {"LABEL": "SLGT", "ISSUE": "202605170100", + "VALID": "202605171200", "EXPIRE": "202605181200"}, + "geometry": {"type": "Polygon", + "coordinates": [[[-98,34],[-94,34],[-94,38],[-98,38],[-98,34]]]} + }] + })"; + + const spc::CategoricalOutlookPayload p = spc::parse_categorical(body, 1); + std::cout << "day_offset=" << p.day_offset << " features=" << p.features.size() << "\n"; + for (const spc::OutlookFeature& f : p.features) { + std::cout << " label=" << f.label << " severity=" << static_cast(f.severity) + << " rings=" << f.rings.size() << " valid_from=" << f.valid_from << "\n"; + } + return 0; +} diff --git a/include/spc/error.hpp b/include/spc/error.hpp new file mode 100644 index 0000000..e02e75d --- /dev/null +++ b/include/spc/error.hpp @@ -0,0 +1,106 @@ +#pragma once + +#include +#include +#include +#include + +namespace spc { + +/// Error codes for SPC SDK operations. +enum class ErrorCode { + Ok = 0, + NetworkError, + RateLimited, + ServerError, + NotFound, + /// SPC returns HTTP 404 for "no active outlook" (e.g. overnight day-1 + /// probabilistic). This is a normal, expected state — distinct from a + /// genuine `NotFound` (bad URL / retired product). Consumers treat it as + /// "clear the rows for this day/hazard", not as an error. + FeedUnavailable, + InvalidRequest, + ParseError, + Unknown +}; + +/// Convert ErrorCode to string. +[[nodiscard]] constexpr std::string_view to_string(ErrorCode code) noexcept { + switch (code) { + case ErrorCode::Ok: + return "Ok"; + case ErrorCode::NetworkError: + return "NetworkError"; + case ErrorCode::RateLimited: + return "RateLimited"; + case ErrorCode::ServerError: + return "ServerError"; + case ErrorCode::NotFound: + return "NotFound"; + case ErrorCode::FeedUnavailable: + return "FeedUnavailable"; + case ErrorCode::InvalidRequest: + return "InvalidRequest"; + case ErrorCode::ParseError: + return "ParseError"; + case ErrorCode::Unknown: + return "Unknown"; + } + return "Unknown"; +} + +/// Error information returned by SDK operations. +struct Error { + ErrorCode code; + std::string message; + int http_status{0}; + std::string detail; + + [[nodiscard]] constexpr bool is_ok() const noexcept { return code == ErrorCode::Ok; } + + /// True for SPC's "no active outlook" 404 — callers branch on this to + /// clear the corresponding rows instead of surfacing an error. + [[nodiscard]] constexpr bool is_feed_unavailable() const noexcept { + return code == ErrorCode::FeedUnavailable; + } + + [[nodiscard]] static Error ok() { return {ErrorCode::Ok, ""}; } + + [[nodiscard]] static Error network(std::string msg) { + return {ErrorCode::NetworkError, std::move(msg)}; + } + + [[nodiscard]] static Error parse(std::string msg) { + return {ErrorCode::ParseError, std::move(msg)}; + } + + [[nodiscard]] static Error not_found(std::string msg) { + return {ErrorCode::NotFound, std::move(msg)}; + } + + [[nodiscard]] static Error feed_unavailable(std::string msg) { + return {ErrorCode::FeedUnavailable, std::move(msg)}; + } + + [[nodiscard]] static Error rate_limited(std::string msg) { + return {ErrorCode::RateLimited, std::move(msg)}; + } + + [[nodiscard]] static Error server(std::string msg) { + return {ErrorCode::ServerError, std::move(msg)}; + } + + [[nodiscard]] static Error invalid_request(std::string msg) { + return {ErrorCode::InvalidRequest, std::move(msg)}; + } + + /// Create an Error from an HTTP response status code and body. SPC's 404 + /// "no active outlook" maps to `FeedUnavailable` (not `NotFound`). + [[nodiscard]] static Error from_response(int status, const std::string& body); +}; + +/// Result type for SDK operations. +template +using Result = std::expected; + +} // namespace spc diff --git a/include/spc/geo.hpp b/include/spc/geo.hpp new file mode 100644 index 0000000..81cb228 --- /dev/null +++ b/include/spc/geo.hpp @@ -0,0 +1,50 @@ +/// @file geo.hpp +/// @brief GeoJSON + Esri-FeatureSet wrapper shapes. +/// +/// The verbatim convective parser walks the raw `glz::generic` AST (it has +/// to — SPC's properties block is shape-loose). These typed wrappers are for +/// net-new models and the ArcGIS path; `parse_esri_rings` (the Esri-rings +/// adapter, kept SEPARATE from the verbatim `detail::parse_rings` to preserve +/// GeoJSON parity) is added in PR-2. + +#pragma once + +#include "spc/types.hpp" + +#include +#include + +namespace spc { + +/// A generic GeoJSON Feature: typed properties + already-flattened rings +/// (via `detail::parse_rings`, so Polygon/MultiPolygon are uniform). +template +struct GeoJsonFeature { + std::string type{"Feature"}; + Properties properties; + std::vector rings; +}; + +/// A GeoJSON FeatureCollection. +template +struct GeoJsonFeatureCollection { + std::string type{"FeatureCollection"}; + std::vector> features; +}; + +/// An ArcGIS Esri `FeatureSet` (the `f=json` response shape): `attributes` +/// map + `geometry.rings`. Populated by the ArcGIS path in PR-2. +template +struct EsriFeature { + Attributes attributes; + std::vector rings; +}; + +template +struct EsriFeatureSet { + std::string geometry_type; + bool exceeded_transfer_limit{false}; + std::vector> features; +}; + +} // namespace spc diff --git a/include/spc/geometry.hpp b/include/spc/geometry.hpp new file mode 100644 index 0000000..ea57755 --- /dev/null +++ b/include/spc/geometry.hpp @@ -0,0 +1,21 @@ +/// @file geometry.hpp +/// @brief Minimal point-in-polygon helpers for SPC outlook geometry. +/// +/// EXTRACTED VERBATIM from spc-data/src/geometry.hpp (Workstream C); only +/// the namespace changed (`predictioncast::spc_data` -> `spc`). + +#pragma once + +#include "spc/types.hpp" + +namespace spc { + +/// Ray-casting point-in-polygon test (WGS84 lat/lon, planar approximation). +/// Accurate enough for CONUS-sized SPC outlook polygons. +[[nodiscard]] bool point_in_polygon(double lon, double lat, const Polygon& poly) noexcept; + +/// True if (lon, lat) lies inside any ring of the feature. +[[nodiscard]] bool point_in_feature(double lon, double lat, const OutlookFeature& f) noexcept; +[[nodiscard]] bool point_in_feature(double lon, double lat, const ProbOutlookFeature& f) noexcept; + +} // namespace spc diff --git a/include/spc/http_client.hpp b/include/spc/http_client.hpp new file mode 100644 index 0000000..6ef37b2 --- /dev/null +++ b/include/spc/http_client.hpp @@ -0,0 +1,61 @@ +#pragma once + +#include "spc/error.hpp" + +#include +#include +#include +#include +#include +#include +#include + +namespace spc { + +/// HTTP response. +struct HttpResponse { + std::int16_t status_code; // HTTP status codes fit in int16 (100-599) + std::string body; + std::vector> headers; +}; + +/// HTTP client configuration. SPC / ArcGIS / IEM are all unauthenticated +/// GETs; the only required field semantics match spc-data's fetcher. +struct ClientConfig { + /// Optional base URL. Empty (the default) means callers pass absolute + /// URLs — one client then serves spc.noaa.gov, the ArcGIS MapServer, + /// and the IEM archive interchangeably (spc-data's fetcher behavior). + std::string base_url; + std::string user_agent{"PredictionCastAI spc-cpp/0.1.0 (contact@predictioncast.ai)"}; + std::chrono::seconds timeout{15}; + bool verify_ssl{true}; +}; + +/// GET-only HTTP client. Behavior parity with spc-data/src/fetcher.cpp: +/// FOLLOWLOCATION on, NOSIGNAL on, empty ACCEPT_ENCODING (advertise all +/// supported), and the SPC User-Agent. +/// +/// @note NOT thread-safe — the CURL handle is shared per instance. Use one +/// client per thread or guard with a mutex. +class HttpClient { +public: + explicit HttpClient(ClientConfig config = {}); + ~HttpClient(); + + HttpClient(HttpClient&&) noexcept; + HttpClient& operator=(HttpClient&&) noexcept; + HttpClient(const HttpClient&) = delete; + HttpClient& operator=(const HttpClient&) = delete; + + /// GET `path`. If `path` is an absolute URL (starts with http) it is + /// used verbatim; otherwise it is appended to `config().base_url`. + [[nodiscard]] Result get(std::string_view path) const; + + [[nodiscard]] const ClientConfig& config() const noexcept; + +private: + struct Impl; + std::unique_ptr impl_; +}; + +} // namespace spc diff --git a/include/spc/models/common.hpp b/include/spc/models/common.hpp new file mode 100644 index 0000000..2c37ac0 --- /dev/null +++ b/include/spc/models/common.hpp @@ -0,0 +1,58 @@ +/// @file common.hpp +/// @brief Null-safe `glz::generic` AST helpers shared by the SPC parsers. +/// +/// Glaze adaptation of the house null-safe helper family. The bodies are +/// copied **verbatim** from spc-data/src/parser.cpp:28-152 — the exact, +/// audit-clean, production-proven extractors — so the convective parse path +/// stays byte-identical for the downstream byte-identity gate. The only +/// changes are: these now live in a named `spc::detail` namespace (instead +/// of an anonymous namespace inside parser.cpp) so net-new model parsers can +/// reuse them, and `parse_root` returns `Result` instead of +/// throwing (the public `parse_*` wrappers re-throw to keep the spc-data +/// contract — see outlook.cpp). + +#pragma once + +#include "spc/types.hpp" + +#include +#include +#include +#include +#include + +namespace spc { + +/// `using Json = glz::generic;` — the SDK's loose-JSON AST alias. +using Json = glz::generic; + +namespace detail { + +/// Look up `key` in a JSON object; nullptr if absent / not an object. +const Json* lookup(const Json& obj, const char* key); + +/// String value of `obj[key]`, or "" if absent / null / non-string. +std::string json_string(const Json& obj, const char* key); + +/// SPC ships `LABEL` as either a string ("SLGT", "5") or a number (5). +/// Always returns a numeric view; non-numeric / missing yields 0. +double json_number_or_numeric_string(const Json& obj, const char* key); + +/// Convert SPC's compact "YYYYMMDDHHMM" timestamp to ISO 8601 +/// "YYYY-MM-DDTHH:MM:00Z"; returns the input unchanged on format mismatch. +std::string spc_ts_to_iso8601(std::string_view spc_ts); + +/// `spc_ts_to_iso8601(json_string(j, key))`. +std::string as_spc_ts(const Json& j, const char* key); + +/// Parse either a `Polygon` or a `MultiPolygon` geometry into rings. Both +/// shapes collapse to `std::vector`. Verbatim spc-data semantics. +std::vector parse_rings(const Json& geom); + +/// Parse a JSON body into a `glz::generic` root. Glaze read; on malformed +/// JSON returns the formatted error message (the public parse_* wrappers +/// turn this into the std::runtime_error that spc-data's main.cpp catches). +glz::expected parse_root(std::string_view body); + +} // namespace detail +} // namespace spc diff --git a/include/spc/models/outlook.hpp b/include/spc/models/outlook.hpp new file mode 100644 index 0000000..766156e --- /dev/null +++ b/include/spc/models/outlook.hpp @@ -0,0 +1,32 @@ +/// @file outlook.hpp +/// @brief SPC convective (categorical + probabilistic) GeoJSON parsers. +/// +/// EXTRACTED VERBATIM from spc-data/src/parser.hpp (Workstream C). Signatures +/// and throw-contract are byte-identical to spc-data; only the namespace +/// changed (`predictioncast::spc_data` -> `spc`). This is the parity-critical +/// path — the byte-identity gate in the spc-data refactor depends on it. + +#pragma once + +#include "spc/types.hpp" + +#include + +namespace spc { + +/// Map SPC categorical label to a 1..5 severity value. Returns 0 if unknown. +[[nodiscard]] std::uint8_t severity_from_label(std::string_view label) noexcept; + +/// Parse SPC's day-N categorical outlook GeoJSON (day{1,2,3}otlk_cat.geojson, +/// day4-8otlk.geojson) from a raw JSON body. Caller passes the target day for +/// the payload header. Throws std::runtime_error on malformed JSON. +[[nodiscard]] CategoricalOutlookPayload parse_categorical(std::string_view body, + std::int32_t day_offset); + +/// Parse SPC's day-N probabilistic outlook GeoJSON +/// (day{1,2}probotlk_{torn,hail,wind}.geojson) from a raw JSON body. Throws +/// std::runtime_error on malformed JSON. +[[nodiscard]] ProbOutlookPayload parse_probabilistic(std::string_view body, std::int32_t day_offset, + std::string hazard); + +} // namespace spc diff --git a/include/spc/pagination.hpp b/include/spc/pagination.hpp new file mode 100644 index 0000000..75df3c2 --- /dev/null +++ b/include/spc/pagination.hpp @@ -0,0 +1,53 @@ +#pragma once + +#include + +namespace spc { + +/// ArcGIS MapServer `query` paging. +/// +/// An ArcGIS layer query caps the result set (commonly 1000-2000 records) +/// and signals truncation with `"exceededTransferLimit": true` in the +/// response envelope. To page, re-issue with `resultOffset` advanced by the +/// page size until the server stops reporting truncation. +/// +/// SPC outlook layers are tiny (single-digit feature counts), so paging +/// rarely triggers — but storm-report / LSR layers can exceed the cap, and +/// the contract is explicit, so the SDK implements it correctly rather than +/// assuming one page. +class ArcGISPager { +public: + /// `page_size` is the `resultRecordCount` passed per request. ArcGIS's + /// hard server max is typically 2000; that is the default. + explicit ArcGISPager(std::int32_t page_size = 2000) + : page_size_(page_size > 0 ? page_size : 2000) {} + + [[nodiscard]] std::int32_t page_size() const noexcept { return page_size_; } + + /// Current `resultOffset` to send on the next request. + [[nodiscard]] std::int32_t offset() const noexcept { return offset_; } + + /// Whether another page should be fetched. Seeded `true`; the caller + /// passes the response's `exceededTransferLimit` after each page. + [[nodiscard]] bool has_more() const noexcept { return has_more_; } + + /// Record the just-fetched page: advance the offset by `page_size` and + /// keep going only while the server still reports truncation. + void advance(bool exceeded_transfer_limit) noexcept { + offset_ += page_size_; + has_more_ = exceeded_transfer_limit; + } + + /// Reset to the first page. + void reset() noexcept { + offset_ = 0; + has_more_ = true; + } + +private: + std::int32_t page_size_; + std::int32_t offset_{0}; + bool has_more_{true}; +}; + +} // namespace spc diff --git a/include/spc/rate_limit.hpp b/include/spc/rate_limit.hpp new file mode 100644 index 0000000..ded2213 --- /dev/null +++ b/include/spc/rate_limit.hpp @@ -0,0 +1,61 @@ +#pragma once + +#include +#include +#include +#include +#include + +namespace spc { + +/// Token-bucket rate limiter with optional daily quota. +/// +/// SPC / ArcGIS impose no published rate limit, but the IEM archive +/// (`mesonet.agron.iastate.edu`) is a courtesy third party — `ArchiveClient` +/// constructs this with conservative defaults. Thread-safe. +/// +/// Logic is the ncei-cpp RateLimiter verbatim (namespace adapted). +class RateLimiter { +public: + struct Config { + std::uint16_t max_tokens = 2; ///< default: gentle on IEM + std::chrono::milliseconds refill_interval{1000}; ///< 1 token / sec + std::uint16_t initial_tokens = 2; + std::optional max_wait; + std::int32_t daily_limit{0}; ///< 0 = no daily cap + }; + + explicit RateLimiter(Config config); + + [[nodiscard]] bool try_acquire() noexcept; + [[nodiscard]] bool acquire(); + [[nodiscard]] bool acquire_for(std::chrono::milliseconds max_wait); + [[nodiscard]] std::uint16_t available_tokens() const noexcept; + [[nodiscard]] std::int32_t daily_requests_remaining() const noexcept; + void reset() noexcept; + [[nodiscard]] const Config& config() const noexcept; + +private: + void refill() noexcept; + void check_daily_reset() noexcept; + + Config config_; + mutable std::mutex mutex_; + std::uint16_t tokens_; + std::chrono::steady_clock::time_point last_refill_; + std::int32_t daily_requests_used_{0}; + std::chrono::system_clock::time_point day_start_; +}; + +/// RAII rate-limit acquisition. +class ScopedRateLimit { +public: + explicit ScopedRateLimit(RateLimiter& limiter); + [[nodiscard]] bool acquired() const noexcept; + explicit operator bool() const noexcept; + +private: + bool acquired_; +}; + +} // namespace spc diff --git a/include/spc/retry.hpp b/include/spc/retry.hpp new file mode 100644 index 0000000..6ecc881 --- /dev/null +++ b/include/spc/retry.hpp @@ -0,0 +1,104 @@ +#pragma once + +#include "spc/error.hpp" +#include "spc/http_client.hpp" + +#include +#include +#include +#include +#include + +namespace spc { + +/// Retry policy. Logic verbatim from ncei-cpp/include/ncei/retry.hpp +/// (namespace adapted). `ArchiveClient` (IEM) uses a conservative instance; +/// the SPC / ArcGIS paths default to a light policy since those endpoints +/// are stable. +struct RetryPolicy { + std::chrono::milliseconds initial_delay{200}; + std::chrono::milliseconds max_delay{30000}; + double backoff_multiplier{2.0}; + double jitter_factor{0.1}; + std::uint8_t max_attempts{3}; + bool retry_on_network_error{true}; + bool retry_on_rate_limit{true}; + bool retry_on_server_error{true}; +}; + +struct RetryResult { + std::chrono::milliseconds total_delay; + std::uint8_t attempts_made; + bool succeeded; +}; + +[[nodiscard]] inline bool should_retry(const HttpResponse& response, + const RetryPolicy& policy) noexcept { + if (policy.retry_on_rate_limit && + (response.status_code == 429 || response.status_code == 503)) { + return true; + } + if (policy.retry_on_server_error && response.status_code >= 500) { + return true; + } + return false; +} + +[[nodiscard]] inline bool should_retry(const Error& error, const RetryPolicy& policy) noexcept { + if (policy.retry_on_network_error && error.code == ErrorCode::NetworkError) { + return true; + } + return false; +} + +[[nodiscard]] inline std::chrono::milliseconds calculate_retry_delay(std::uint8_t attempt, + const RetryPolicy& policy) { + double delay_ms = static_cast(policy.initial_delay.count()); + for (std::uint8_t i = 1; i < attempt; ++i) { + delay_ms *= policy.backoff_multiplier; + } + + delay_ms = std::min(delay_ms, static_cast(policy.max_delay.count())); + + if (policy.jitter_factor > 0) { + static thread_local std::mt19937 rng{std::random_device{}()}; + std::uniform_real_distribution dist(1.0 - policy.jitter_factor, + 1.0 + policy.jitter_factor); + delay_ms *= dist(rng); + } + + return std::chrono::milliseconds{static_cast(delay_ms)}; +} + +/// Execute an HTTP operation with exponential-backoff retry. +template +[[nodiscard]] Result with_retry(Operation&& operation, const RetryPolicy& policy) { + std::chrono::milliseconds total_delay{0}; + + for (std::uint8_t attempt = 1; attempt <= policy.max_attempts; ++attempt) { + Result result = operation(); + + if (result.has_value()) { + if (should_retry(*result, policy) && attempt < policy.max_attempts) { + std::chrono::milliseconds delay = calculate_retry_delay(attempt, policy); + total_delay += delay; + std::this_thread::sleep_for(delay); + continue; + } + return result; + } + + if (should_retry(result.error(), policy) && attempt < policy.max_attempts) { + std::chrono::milliseconds delay = calculate_retry_delay(attempt, policy); + total_delay += delay; + std::this_thread::sleep_for(delay); + continue; + } + + return result; + } + + return std::unexpected(Error::network("Max retry attempts exceeded")); +} + +} // namespace spc diff --git a/include/spc/spc.hpp b/include/spc/spc.hpp new file mode 100644 index 0000000..1090edd --- /dev/null +++ b/include/spc/spc.hpp @@ -0,0 +1,17 @@ +/// @file spc.hpp +/// @brief Umbrella header — pulls in the whole spc-cpp public surface. + +#pragma once + +#include "spc/error.hpp" +#include "spc/geo.hpp" +#include "spc/geometry.hpp" +#include "spc/http_client.hpp" +#include "spc/models/common.hpp" +#include "spc/models/outlook.hpp" +#include "spc/pagination.hpp" +#include "spc/retry.hpp" +#include "spc/types.hpp" + +// Net-new product models + the StaticFeed/ArcGIS/Archive clients are added +// to this umbrella in PR-2. diff --git a/include/spc/types.hpp b/include/spc/types.hpp new file mode 100644 index 0000000..1aad1de --- /dev/null +++ b/include/spc/types.hpp @@ -0,0 +1,60 @@ +/// @file types.hpp +/// @brief Plain data types for SPC outlook ingestion. +/// +/// EXTRACTED VERBATIM from spc-data/src/types.hpp (Workstream C). The only +/// change is the namespace (`predictioncast::spc_data` -> `spc`). These are +/// contract-stable shapes; downstream byte-identity depends on them being +/// unchanged. + +#pragma once + +#include +#include +#include + +namespace spc { + +/// A (lon, lat) pair in GeoJSON / WGS84 order. +struct LonLat { + double lon = 0.0; + double lat = 0.0; +}; + +/// One polygon (outer ring; SPC outlooks are single-ring polygons in practice). +using Polygon = std::vector; + +/// One feature from a day-N categorical outlook GeoJSON. +/// Classification values: MRGL (1), SLGT (2), ENH (3), MDT (4), HIGH (5). +struct OutlookFeature { + std::string label; ///< raw label from GeoJSON, e.g. "MRGL" + std::uint8_t severity = 0; ///< 1..5; 0 if unrecognized + std::vector rings; ///< all polygons in the MultiPolygon + std::string issued_at; ///< ISO 8601 + std::string valid_from; + std::string valid_until; +}; + +/// One probabilistic outlook feature (tornado/hail/wind percentage isopleth). +struct ProbOutlookFeature { + std::string hazard; ///< "tornado" | "hail" | "wind" + double probability = 0.0; ///< [0, 1] + std::vector rings; + std::string issued_at; + std::string valid_from; + std::string valid_until; +}; + +/// Parsed view of a single-day categorical outlook GeoJSON file. +struct CategoricalOutlookPayload { + std::int32_t day_offset = 0; ///< 1..8 + std::vector features; +}; + +/// Parsed view of a single-day probabilistic outlook GeoJSON file. +struct ProbOutlookPayload { + std::int32_t day_offset = 0; + std::string hazard; + std::vector features; +}; + +} // namespace spc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt new file mode 100644 index 0000000..ca9a44c --- /dev/null +++ b/src/CMakeLists.txt @@ -0,0 +1,54 @@ +# Layered static libraries: spc_core -> spc_http -> spc_models -> spc_api -> spc +# +# Glaze is header-only and pulled in via include-path only (matching how +# nws-cpp / ncei-cpp integrate it). Linking glaze::glaze directly onto these +# installable static libs trips CMake's "INTERFACE target not in export set". + +add_library(spc_core STATIC + core/error.cpp + core/geometry.cpp + core/rate_limit.cpp +) +target_compile_features(spc_core PUBLIC cxx_std_23) +target_include_directories(spc_core PUBLIC + $ + $ + $ +) + +add_library(spc_http STATIC + http/client.cpp +) +target_link_libraries(spc_http PUBLIC spc_core CURL::libcurl) +target_include_directories(spc_http PUBLIC + $ + $ +) + +add_library(spc_models STATIC + models/common.cpp + models/outlook.cpp +) +target_link_libraries(spc_models PUBLIC spc_core) +target_include_directories(spc_models PUBLIC + $ + $ + $ +) + +# API client library. PR-1 ships a placeholder TU so the layered target / +# install-export shape is locked from the start; the StaticFeed / ArcGIS / +# Archive clients land in PR-2. +add_library(spc_api STATIC + api/client.cpp +) +target_link_libraries(spc_api PUBLIC spc_core spc_http spc_models) +target_include_directories(spc_api PUBLIC + $ + $ + $ +) + +# Umbrella INTERFACE library: link spc::spc to get everything. +add_library(spc INTERFACE) +target_link_libraries(spc INTERFACE spc_core spc_http spc_models spc_api) diff --git a/src/api/client.cpp b/src/api/client.cpp new file mode 100644 index 0000000..c6e2dd4 --- /dev/null +++ b/src/api/client.cpp @@ -0,0 +1,15 @@ +/// @file client.cpp +/// @brief spc_api translation unit. +/// +/// PR-1 placeholder: locks the layered `spc_api` target and its +/// install/export shape from the start. The real high-level clients — +/// `StaticFeedClient` (7 static `.nolyr.geojson` feeds), `ArcGISClient` +/// (primary path, `ArcGISPager` 2000-rec paging) and `ArchiveClient` (IEM +/// historical backfill) — are implemented in PR-2. + +namespace spc { + +// Intentionally empty in PR-1. A TU with no external symbols is a valid +// static-library member; CMake/ar handle the empty archive object fine. + +} // namespace spc diff --git a/src/core/error.cpp b/src/core/error.cpp new file mode 100644 index 0000000..9bc0c0a --- /dev/null +++ b/src/core/error.cpp @@ -0,0 +1,60 @@ +#include "spc/error.hpp" + +#include +#include +#include + +namespace spc { + +Error Error::from_response(int status, const std::string& body) { + Error err; + err.http_status = status; + + // Determine error code from HTTP status. SPC serves a static HTML 404 + // page when a product has no active outlook (the documented normal + // overnight state for e.g. day-1 probabilistic); we surface that as + // FeedUnavailable so callers clear rows rather than treat it as a fault. + if (status == 404) { + err.code = ErrorCode::FeedUnavailable; + } else if (status == 400) { + err.code = ErrorCode::InvalidRequest; + } else if (status == 429 || status == 503) { + err.code = ErrorCode::RateLimited; + } else if (status >= 500) { + err.code = ErrorCode::ServerError; + } else { + err.code = ErrorCode::Unknown; + } + + // Best-effort: ArcGIS returns JSON `{"error":{"code":...,"message":...}}` + // on logical failures even with HTTP 200. Parse via glz::generic (no + // schema to reject on); fall back to the raw body for SPC's HTML pages. + glz::generic root{}; + glz::error_ctx ec = glz::read_json(root, body); + if (!ec && root.is_object()) { + const glz::generic::object_t& obj = root.get_object(); + glz::generic::object_t::const_iterator it = obj.find("error"); + if (it != obj.end() && it->second.is_object()) { + const glz::generic::object_t& eo = it->second.get_object(); + glz::generic::object_t::const_iterator m = eo.find("message"); + if (m != eo.end() && m->second.is_string()) { + err.message = m->second.get(); + } + glz::generic::object_t::const_iterator d = eo.find("details"); + if (d != eo.end() && d->second.is_string()) { + err.detail = d->second.get(); + } + } + } else { + // Not valid JSON (SPC's HTML 404) — keep a short raw snippet. + err.message = body.substr(0, 256); + } + + if (err.message.empty()) { + err.message = "HTTP " + std::to_string(status); + } + + return err; +} + +} // namespace spc diff --git a/src/core/geometry.cpp b/src/core/geometry.cpp new file mode 100644 index 0000000..a446c87 --- /dev/null +++ b/src/core/geometry.cpp @@ -0,0 +1,46 @@ +/// @file geometry.cpp +/// +/// EXTRACTED VERBATIM from spc-data/src/geometry.cpp (Workstream C); only +/// the namespace changed (`predictioncast::spc_data` -> `spc`). The ray-cast +/// algorithm is byte-for-byte the spc-data implementation. + +#include "spc/geometry.hpp" + +namespace spc { + +bool point_in_polygon(double lon, double lat, const Polygon& poly) noexcept { + bool inside = false; + const std::size_t n = poly.size(); + for (std::size_t i = 0, j = n - 1; i < n; j = i++) { + const double xi = poly[i].lon; + const double yi = poly[i].lat; + const double xj = poly[j].lon; + const double yj = poly[j].lat; + const bool intersect = + ((yi > lat) != (yj > lat)) && (lon < (xj - xi) * (lat - yi) / (yj - yi) + xi); + if (intersect) { + inside = !inside; + } + } + return inside; +} + +bool point_in_feature(double lon, double lat, const OutlookFeature& f) noexcept { + for (const Polygon& ring : f.rings) { + if (point_in_polygon(lon, lat, ring)) { + return true; + } + } + return false; +} + +bool point_in_feature(double lon, double lat, const ProbOutlookFeature& f) noexcept { + for (const Polygon& ring : f.rings) { + if (point_in_polygon(lon, lat, ring)) { + return true; + } + } + return false; +} + +} // namespace spc diff --git a/src/core/rate_limit.cpp b/src/core/rate_limit.cpp new file mode 100644 index 0000000..45eaa3c --- /dev/null +++ b/src/core/rate_limit.cpp @@ -0,0 +1,114 @@ +// Logic verbatim from ncei-cpp/src/core/rate_limit.cpp (Workstream C); +// only the namespace changed (`ncei` -> `spc`). + +#include "spc/rate_limit.hpp" + +#include + +namespace spc { + +RateLimiter::RateLimiter(Config config) + : config_(std::move(config)), tokens_(config_.initial_tokens), + last_refill_(std::chrono::steady_clock::now()), + day_start_(std::chrono::floor(std::chrono::system_clock::now())) {} + +void RateLimiter::check_daily_reset() noexcept { + std::chrono::system_clock::time_point now = std::chrono::system_clock::now(); + std::chrono::system_clock::time_point current_day = std::chrono::floor(now); + if (current_day > day_start_) { + daily_requests_used_ = 0; + day_start_ = current_day; + } +} + +void RateLimiter::refill() noexcept { + std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now(); + std::chrono::milliseconds elapsed = + std::chrono::duration_cast(now - last_refill_); + + if (elapsed >= config_.refill_interval) { + std::uint16_t new_tokens = + static_cast(elapsed.count() / config_.refill_interval.count()); + tokens_ = std::min(static_cast(tokens_ + new_tokens), config_.max_tokens); + last_refill_ = now; + } +} + +bool RateLimiter::try_acquire() noexcept { + std::lock_guard lock(mutex_); + check_daily_reset(); + + if (config_.daily_limit > 0 && daily_requests_used_ >= config_.daily_limit) { + return false; + } + + refill(); + if (tokens_ > 0) { + --tokens_; + ++daily_requests_used_; + return true; + } + return false; +} + +bool RateLimiter::acquire() { + if (config_.max_wait) { + return acquire_for(*config_.max_wait); + } + + while (true) { + if (try_acquire()) { + return true; + } + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } +} + +bool RateLimiter::acquire_for(std::chrono::milliseconds max_wait) { + std::chrono::steady_clock::time_point deadline = std::chrono::steady_clock::now() + max_wait; + + while (std::chrono::steady_clock::now() < deadline) { + if (try_acquire()) { + return true; + } + std::this_thread::sleep_for(std::chrono::milliseconds(10)); + } + return false; +} + +std::uint16_t RateLimiter::available_tokens() const noexcept { + std::lock_guard lock(mutex_); + return tokens_; +} + +std::int32_t RateLimiter::daily_requests_remaining() const noexcept { + std::lock_guard lock(mutex_); + if (config_.daily_limit <= 0) { + return 0; + } + return config_.daily_limit - daily_requests_used_; +} + +void RateLimiter::reset() noexcept { + std::lock_guard lock(mutex_); + tokens_ = config_.initial_tokens; + last_refill_ = std::chrono::steady_clock::now(); + daily_requests_used_ = 0; + day_start_ = std::chrono::floor(std::chrono::system_clock::now()); +} + +const RateLimiter::Config& RateLimiter::config() const noexcept { + return config_; +} + +ScopedRateLimit::ScopedRateLimit(RateLimiter& limiter) : acquired_(limiter.acquire()) {} + +bool ScopedRateLimit::acquired() const noexcept { + return acquired_; +} + +ScopedRateLimit::operator bool() const noexcept { + return acquired_; +} + +} // namespace spc diff --git a/src/http/client.cpp b/src/http/client.cpp new file mode 100644 index 0000000..5219535 --- /dev/null +++ b/src/http/client.cpp @@ -0,0 +1,111 @@ +#include "spc/http_client.hpp" + +#include +#include +#include + +namespace spc { + +namespace { + +std::size_t write_cb(char* ptr, std::size_t size, std::size_t nmemb, void* user) { + static_cast(user)->append(ptr, size * nmemb); + return size * nmemb; +} + +std::size_t header_cb(char* buffer, std::size_t size, std::size_t nitems, void* userdata) { + std::vector>* headers = + static_cast>*>(userdata); + std::string line(buffer, size * nitems); + std::size_t colon = line.find(':'); + if (colon != std::string::npos) { + std::string key = line.substr(0, colon); + std::string value = line.substr(colon + 1); + std::size_t start = value.find_first_not_of(" \t\r\n"); + std::size_t end = value.find_last_not_of(" \t\r\n"); + if (start != std::string::npos && end != std::string::npos) { + value = value.substr(start, end - start + 1); + } + headers->emplace_back(std::move(key), std::move(value)); + } + return size * nitems; +} + +bool is_absolute_url(std::string_view path) { + return path.starts_with("http://") || path.starts_with("https://"); +} + +} // namespace + +struct HttpClient::Impl { + ClientConfig config; + CURL* curl{nullptr}; + + explicit Impl(ClientConfig cfg) : config(std::move(cfg)) { + curl_global_init(CURL_GLOBAL_DEFAULT); + curl = curl_easy_init(); + } + + ~Impl() { + if (curl != nullptr) { + curl_easy_cleanup(curl); + } + curl_global_cleanup(); + } + + Impl(const Impl&) = delete; + Impl& operator=(const Impl&) = delete; +}; + +HttpClient::HttpClient(ClientConfig config) : impl_(std::make_unique(std::move(config))) {} + +HttpClient::~HttpClient() = default; +HttpClient::HttpClient(HttpClient&&) noexcept = default; +HttpClient& HttpClient::operator=(HttpClient&&) noexcept = default; + +Result HttpClient::get(std::string_view path) const { + if (impl_->curl == nullptr) { + return std::unexpected(Error::network("curl_easy_init failed")); + } + + CURL* curl = impl_->curl; + const std::string url = + is_absolute_url(path) ? std::string{path} : impl_->config.base_url + std::string{path}; + std::string body; + std::vector> response_headers; + + curl_easy_reset(curl); + curl_easy_setopt(curl, CURLOPT_URL, url.c_str()); + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, &write_cb); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, &body); + curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, &header_cb); + curl_easy_setopt(curl, CURLOPT_HEADERDATA, &response_headers); + curl_easy_setopt(curl, CURLOPT_TIMEOUT, static_cast(impl_->config.timeout.count())); + // Parity with spc-data/src/fetcher.cpp: + curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L); + curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L); + curl_easy_setopt(curl, CURLOPT_USERAGENT, impl_->config.user_agent.c_str()); + curl_easy_setopt(curl, CURLOPT_ACCEPT_ENCODING, ""); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, impl_->config.verify_ssl ? 1L : 0L); + curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, impl_->config.verify_ssl ? 2L : 0L); + + CURLcode rc = curl_easy_perform(curl); + if (rc != CURLE_OK) { + return std::unexpected(Error::network(curl_easy_strerror(rc))); + } + + long http_code = 0; + curl_easy_getinfo(curl, CURLINFO_RESPONSE_CODE, &http_code); + + return HttpResponse{ + static_cast(http_code), + std::move(body), + std::move(response_headers), + }; +} + +const ClientConfig& HttpClient::config() const noexcept { + return impl_->config; +} + +} // namespace spc diff --git a/src/models/common.cpp b/src/models/common.cpp new file mode 100644 index 0000000..b4e4b9d --- /dev/null +++ b/src/models/common.cpp @@ -0,0 +1,146 @@ +/// @file common.cpp +/// @brief SPC GeoJSON null-safe helpers — Glaze-backed. +/// +/// Bodies copied VERBATIM from spc-data/src/parser.cpp:28-152. The +/// case-variant-key / numeric-as-string / Polygon-vs-MultiPolygon semantics +/// are exactly the production spc-data behavior; do not "improve" them — a +/// downstream byte-identity gate depends on this code path being unchanged. + +#include "spc/models/common.hpp" + +#include + +namespace spc { +namespace detail { + +// ===== glz::generic null-safe extractors (verbatim from spc-data) ===== + +const Json* lookup(const Json& obj, const char* key) { + if (!obj.is_object()) { + return nullptr; + } + const glz::generic::object_t& o = obj.get_object(); + glz::generic::object_t::const_iterator it = o.find(key); + if (it == o.end()) { + return nullptr; + } + return &it->second; +} + +std::string json_string(const Json& obj, const char* key) { + const Json* v = lookup(obj, key); + if (v == nullptr || v->is_null()) { + return {}; + } + if (v->is_string()) { + return v->get(); + } + return {}; +} + +/// SPC ships `LABEL` as either a string ("SLGT", "5") or a number (5). Always +/// returns a numeric view; non-numeric / missing yields 0. +double json_number_or_numeric_string(const Json& obj, const char* key) { + const Json* v = lookup(obj, key); + if (v == nullptr || v->is_null()) { + return 0.0; + } + if (v->is_number()) { + return v->get(); + } + if (v->is_string()) { + const std::string s = v->get(); + try { + return std::stod(s); + } catch (...) { + return 0.0; + } + } + return 0.0; +} + +/// Convert SPC's compact "YYYYMMDDHHMM" timestamp to ISO 8601 +/// "YYYY-MM-DDTHH:MM:00Z". Returns the input unchanged if the format doesn't +/// match. +std::string spc_ts_to_iso8601(std::string_view spc_ts) { + if (spc_ts.size() != 12) { + return std::string{spc_ts}; + } + for (char c : spc_ts) { + if (c < '0' || c > '9') { + return std::string{spc_ts}; + } + } + return std::format("{}-{}-{}T{}:{}:00Z", spc_ts.substr(0, 4), spc_ts.substr(4, 2), + spc_ts.substr(6, 2), spc_ts.substr(8, 2), spc_ts.substr(10, 2)); +} + +std::string as_spc_ts(const Json& j, const char* key) { + return spc_ts_to_iso8601(json_string(j, key)); +} + +/// Parse either a `Polygon` or a `MultiPolygon` geometry into a list of rings. +/// Both shapes collapse to our `std::vector` representation. +std::vector parse_rings(const Json& geom) { + std::vector out; + if (!geom.is_object()) { + return out; + } + const std::string type = json_string(geom, "type"); + const Json* coords_node = lookup(geom, "coordinates"); + if (type.empty() || coords_node == nullptr || !coords_node->is_array()) { + return out; + } + const glz::generic::array_t& coords = coords_node->get_array(); + + auto parse_ring = [](const Json& ring) -> Polygon { + Polygon r; + if (!ring.is_array()) { + return r; + } + const glz::generic::array_t& ring_arr = ring.get_array(); + r.reserve(ring_arr.size()); + for (const glz::generic& pt : ring_arr) { + if (!pt.is_array()) { + continue; + } + const glz::generic::array_t& pt_arr = pt.get_array(); + if (pt_arr.size() >= 2 && pt_arr[0].is_number() && pt_arr[1].is_number()) { + r.push_back({pt_arr[0].get(), pt_arr[1].get()}); + } + } + return r; + }; + + if (type == "Polygon") { + if (!coords.empty()) { + out.push_back(parse_ring(coords[0])); // outer ring + } + } else if (type == "MultiPolygon") { + for (const glz::generic& poly : coords) { + if (poly.is_array()) { + const glz::generic::array_t& poly_arr = poly.get_array(); + if (!poly_arr.empty()) { + out.push_back(parse_ring(poly_arr[0])); // outer ring of each + } + } + } + } + return out; +} + +/// Parse the top-level JSON body into a glz::generic. Returns the formatted +/// error message on malformed JSON; the public parse_* wrappers turn that +/// into the std::runtime_error the spc-data main.cpp catches (preserving the +/// pre-migration nlohmann::json::parse contract). +glz::expected parse_root(std::string_view body) { + Json root{}; + glz::error_ctx ec = glz::read_json(root, body); + if (ec) { + return glz::unexpected(glz::format_error(ec, body)); + } + return root; +} + +} // namespace detail +} // namespace spc diff --git a/src/models/outlook.cpp b/src/models/outlook.cpp new file mode 100644 index 0000000..c90daac --- /dev/null +++ b/src/models/outlook.cpp @@ -0,0 +1,151 @@ +/// @file outlook.cpp +/// @brief SPC convective GeoJSON parsers, Glaze-backed. +/// +/// `severity_from_label`, `parse_categorical`, `parse_probabilistic` are +/// copied VERBATIM from spc-data/src/parser.cpp:156-268. The only mechanical +/// change is the helper namespace (`detail::` instead of the anonymous +/// namespace inside the old parser.cpp) and that `detail::parse_root` now +/// returns `glz::expected` — this wrapper re-throws std::runtime_error on a +/// malformed body to preserve the exact spc-data contract that the service's +/// main.cpp catches. Parse output is byte-identical to spc-data. Do not +/// change behavior here — the downstream byte-identity gate depends on it. + +#include "spc/models/outlook.hpp" + +#include "spc/models/common.hpp" + +#include +#include +#include + +namespace spc { + +namespace { + +/// VERBATIM equivalent of spc-data parser.cpp's `parse_root`: throws +/// std::runtime_error on malformed JSON (the contract main.cpp relies on). +Json parse_root_or_throw(std::string_view body) { + glz::expected root = detail::parse_root(body); + if (!root) { + throw std::runtime_error(root.error()); + } + return std::move(*root); +} + +} // namespace + +std::uint8_t severity_from_label(std::string_view label) noexcept { + if (label == "TSTM") { + return 1; // General thunderstorm (some feeds include this) + } + if (label == "MRGL") { + return 1; + } + if (label == "SLGT") { + return 2; + } + if (label == "ENH") { + return 3; + } + if (label == "MDT") { + return 4; + } + if (label == "HIGH") { + return 5; + } + return 0; +} + +CategoricalOutlookPayload parse_categorical(std::string_view body, std::int32_t day_offset) { + const Json root = parse_root_or_throw(body); + CategoricalOutlookPayload payload; + payload.day_offset = day_offset; + const Json* features_node = detail::lookup(root, "features"); + if (features_node == nullptr || !features_node->is_array()) { + return payload; + } + for (const glz::generic& feat : features_node->get_array()) { + const Json* props = detail::lookup(feat, "properties"); + const Json* geometry = detail::lookup(feat, "geometry"); + if (props == nullptr || geometry == nullptr) { + continue; + } + OutlookFeature of; + // SPC uses either `LABEL` or `label` or `dn` depending on product. + of.label = detail::json_string(*props, "LABEL"); + if (of.label.empty()) { + of.label = detail::json_string(*props, "label"); + } + if (of.label.empty()) { + of.label = detail::json_string(*props, "dn"); + } + of.severity = severity_from_label(of.label); + of.issued_at = detail::as_spc_ts(*props, "ISSUE"); + if (of.issued_at.empty()) { + of.issued_at = detail::as_spc_ts(*props, "issue"); + } + of.valid_from = detail::as_spc_ts(*props, "VALID"); + if (of.valid_from.empty()) { + of.valid_from = detail::as_spc_ts(*props, "valid"); + } + of.valid_until = detail::as_spc_ts(*props, "EXPIRE"); + if (of.valid_until.empty()) { + of.valid_until = detail::as_spc_ts(*props, "expire"); + } + of.rings = detail::parse_rings(*geometry); + if (of.severity > 0 && !of.rings.empty()) { + payload.features.push_back(std::move(of)); + } + } + return payload; +} + +ProbOutlookPayload parse_probabilistic(std::string_view body, std::int32_t day_offset, + std::string hazard) { + const Json root = parse_root_or_throw(body); + ProbOutlookPayload payload; + payload.day_offset = day_offset; + payload.hazard = hazard; + const Json* features_node = detail::lookup(root, "features"); + if (features_node == nullptr || !features_node->is_array()) { + return payload; + } + for (const glz::generic& feat : features_node->get_array()) { + const Json* props = detail::lookup(feat, "properties"); + const Json* geometry = detail::lookup(feat, "geometry"); + if (props == nullptr || geometry == nullptr) { + continue; + } + ProbOutlookFeature pf; + pf.hazard = hazard; + // SPC prob isopleths store percentage as LABEL ("2", "5", "10", ...) or + // as DN, occasionally as a numeric. + double pct = detail::json_number_or_numeric_string(*props, "LABEL"); + if (pct == 0.0) { + pct = detail::json_number_or_numeric_string(*props, "label"); + } + if (pct == 0.0) { + pct = detail::json_number_or_numeric_string(*props, "dn"); + } + pf.probability = pct / 100.0; + pf.issued_at = detail::as_spc_ts(*props, "ISSUE"); + if (pf.issued_at.empty()) { + pf.issued_at = detail::as_spc_ts(*props, "issue"); + } + pf.valid_from = detail::as_spc_ts(*props, "VALID"); + if (pf.valid_from.empty()) { + pf.valid_from = detail::as_spc_ts(*props, "valid"); + } + pf.valid_until = detail::as_spc_ts(*props, "EXPIRE"); + if (pf.valid_until.empty()) { + pf.valid_until = detail::as_spc_ts(*props, "expire"); + } + pf.rings = detail::parse_rings(*geometry); + if (pf.probability > 0.0 && !pf.rings.empty()) { + payload.features.push_back(std::move(pf)); + } + } + return payload; +} + +} // namespace spc diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt new file mode 100644 index 0000000..d8377f7 --- /dev/null +++ b/tests/CMakeLists.txt @@ -0,0 +1,15 @@ +add_executable(spc_tests + test_geometry.cpp + test_parser.cpp + test_corpus.cpp +) +target_link_libraries(spc_tests PRIVATE + spc_core spc_models + GTest::gtest_main +) +target_compile_definitions(spc_tests PRIVATE + SPC_FIXTURES_DIR="${CMAKE_CURRENT_SOURCE_DIR}/fixtures" +) +target_compile_options(spc_tests PRIVATE -Wall -Wextra -Wpedantic) +include(GoogleTest) +gtest_discover_tests(spc_tests) diff --git a/tests/fixtures/README.md b/tests/fixtures/README.md new file mode 100644 index 0000000..c613890 --- /dev/null +++ b/tests/fixtures/README.md @@ -0,0 +1,42 @@ +# SPC characterization fixtures + +All payloads here were captured **live** on 2026-05-17 from the real upstream +SPC sources (no synthetic/invented data). They pin the byte-identity gate for +the spc-cpp extraction (Workstream C) and double as the spc-cpp parity corpus. + +## Static `www.spc.noaa.gov` GeoJSON (the 7-feed fallback path) + +- `day1otlk_cat.nolyr.geojson`, `day2otlk_cat.nolyr.geojson`, + `day3otlk_cat.nolyr.geojson` — live day 1/2/3 categorical outlooks + (uppercase `LABEL`/`ISSUE`/`VALID`/`EXPIRE`, Polygon + MultiPolygon). +- `day4prob.nolyr.geojson` — live day4-8 experimental probabilistic outlook + (`LABEL` as `"0.15"` numeric-string). +- `spc_404_no_active_outlook.html` — the literal HTML body SPC returns with + HTTP 404 when no active outlook exists (e.g. day-1 probabilistic overnight). + Characterizes `main.cpp`'s 404 -> clear-rows path. The static + `day{1,2}probotlk_*.nolyr.geojson` feeds were 404 at capture time (the + documented normal overnight state) so the probabilistic GeoJSON corpus comes + from the ArcGIS `f=geojson` mirror of the same upstream product (below). + +## ArcGIS MapServer (`mapservices.weather.noaa.gov`, the primary path) + +`SPC_wx_outlks` MapServer, captured both ways for the Esri-vs-GeoJSON parity +test (`*.esri.json` = `f=json` Esri rings; `*.geojson` = `f=geojson`): + +- `arcgis_day{1,2,3}_categorical.{esri.json,geojson}` +- `arcgis_day1_prob_{tornado,hail,wind}.{esri.json,geojson}`, + `arcgis_day2_prob_any.{esri.json,geojson}` — active probabilistic isopleths + (`dn` numeric percent + `label` as `"0.02"`; lowercase `valid`/`expire`). +- `arcgis_day1_torn_conditional_intensity.esri.json` — net-new conditional + intensity (`label` `"CIG1"`). +- `arcgis_day4_8_convective.esri.json` — empty FeatureSet (0 features) at + capture time; pins the empty-collection path. +- `arcgis_day{1,2}_fire_weather.esri.json` — `SPC_firewx` MapServer. +- `arcgis_mesoscale_discussion.esri.json` — `spc_mesoscale_discussion` + MapServer (raw `name`/`folderpath`/`popupinfo`; narrative NOT parsed). + +## IEM archive (`mesonet.agron.iastate.edu`, best-effort backfill) + +- `iem_storm_reports.json` — LSR GeoJSON FeatureCollection (Point geometry). +- `iem_spc_watch.json` — active/historical SPC watch GeoJSON. +- `iem_spcoutlook_torn.json` — IEM's tabular SPC outlook index JSON. diff --git a/tests/fixtures/arcgis_day1_categorical.esri.json b/tests/fixtures/arcgis_day1_categorical.esri.json new file mode 100644 index 0000000..e2fdb61 --- /dev/null +++ b/tests/fixtures/arcgis_day1_categorical.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"objectid":"Object Id","dn":"dn value","valid":"valid","expire":"expire","idp_source":"GIS Source","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)","issue":"issue","label":"label","label2":"label2","stroke":"stroke","fill":"fill"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4269,"latestWkid":4269},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"Object Id"},{"name":"dn","type":"esriFieldTypeInteger","alias":"dn value"},{"name":"valid","type":"esriFieldTypeString","alias":"valid","length":80},{"name":"expire","type":"esriFieldTypeString","alias":"expire","length":80},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"},{"name":"issue","type":"esriFieldTypeString","alias":"issue","length":80},{"name":"label","type":"esriFieldTypeString","alias":"label","length":80},{"name":"label2","type":"esriFieldTypeString","alias":"label2","length":80},{"name":"stroke","type":"esriFieldTypeString","alias":"stroke","length":80},{"name":"fill","type":"esriFieldTypeString","alias":"fill","length":80}],"features":[{"attributes":{"objectid":1,"dn":2,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998530000,"st_area(shape)":5384076320306.1904,"st_perimeter(shape)":33998055.693100072,"issue":"202605170610","label":"TSTM","label2":"General Thunderstorms Risk","stroke":"#55BB55","fill":"#C1E9C1"},"geometry":{"rings":[[[-82.275833948029614,42.632824103041706],[-82.30399579623807,42.545991749849428],[-82.517995750489277,42.325991799709492],[-82.689995706451953,42.223991826314105],[-82.862995657015617,42.180991842438814],[-82.9029956549806,42.06299186568797],[-82.862995674907168,41.979991878502169],[-82.807995697810952,41.910991888184171],[-82.688995738576665,41.86299189071859],[-82.458995807776731,41.877991877037559],[-81.763995996280158,42.177991789380748],[-81.261996130989445,42.420991721698293],[-80.315996412356355,42.599991645468428],[-79.513996647881854,42.794991573444712],[-79.251996716407319,42.965991530845223],[-79.372996627778804,43.552991431905362],[-78.631996844512472,43.793991355754599],[-77.318997267100343,43.788991298613468],[-76.954997385192527,43.790991282214428],[-76.694890840058562,44.094884612623581],[-76.399997564482774,43.799991257658498],[-75.459997923701195,43.099991345902581],[-74.789998203635733,42.199991486487761],[-74.449998401967591,40.839991734805359],[-74.249998541155833,39.569991979172492],[-74.064258964620137,39.226235068935516],[-74.084998614328399,39.197992048565034],[-74.371998536042682,38.981992102473988],[-74.50399850389914,38.813992141110951],[-74.715998444719318,38.669992178188835],[-74.700998461668362,38.441992224216357],[-74.761998454147928,38.238992268465815],[-75.085998383423956,37.665992398602945],[-75.262998334773883,37.547992429145118],[-75.355998316745541,37.333992477597761],[-75.64499825055799,36.893992580586904],[-75.490385340279786,36.50181740651503],[-76.959997851800054,36.759992653389666],[-78.499997393449078,36.519992758915151],[-79.269997190583695,35.959992905559659],[-79.729997090100895,35.239993075845433],[-80.079997033878243,34.299993291918526],[-80.139997073322633,33.119993555162395],[-80.345028124979976,32.007855625335132],[-80.435997036512518,31.965993825664015],[-80.76399695420011,31.63299391181636],[-81.089996895115689,30.739994127819646],[-80.988996949085504,30.127994267945862],[-80.764997037345779,29.49799441140949],[-80.348997182238833,28.8299945601687],[-80.196997236107407,28.551994623517075],[-80.27099722558566,28.231994703332386],[-79.7879974000749,27.147994958758293],[-79.69999743648286,26.776995050062681],[-79.765997432366717,26.227995189316779],[-79.811997436182352,25.575995356211045],[-79.964997401881817,25.157995465947511],[-80.142997356474552,24.858995546734743],[-80.33099730545544,24.704995590010164],[-80.634997221809826,24.486995651962911],[-81.053997103239283,24.360995692635541],[-81.781996895579539,24.207995745293054],[-82.815996597633443,24.16899577449481],[-83.287996461527968,24.220995770561327],[-83.279996457443914,24.512995696312753],[-83.237996462919412,24.797995623151692],[-83.162996478441343,25.011995568253734],[-82.312996723304849,25.016995549464372],[-82.367996704646075,25.133995520731695],[-82.509996659984765,25.287995485130953],[-82.631996620014291,25.452995446564753],[-81.933996817945598,25.609995391799281],[-82.142996744176671,26.089995276022265],[-82.323996690332706,26.170995260410187],[-82.534996620406758,26.479995188778918],[-82.718996555492083,26.891995091219155],[-83.104996425547,27.531994944916143],[-83.069996432786198,27.614994924244346],[-83.182996395403478,27.780994886772078],[-83.18499638352796,28.104994809203532],[-83.155996383180948,28.372994743991729],[-83.089090625981513,28.416342135774855],[-82.969996455769035,27.789994879111596],[-82.619996575604517,27.169995020954019],[-81.659996887309276,25.979995293035376],[-80.999997083876153,25.799995324531263],[-80.679997152977961,26.669995098678797],[-81.089996976217137,28.519994654744703],[-81.65999675283949,30.129994287446607],[-81.999996531876832,32.949993655367088],[-82.289996362519418,34.619993301872306],[-82.979996073999516,36.099993016943515],[-83.639995877122587,36.139993035539923],[-85.129995476330564,35.599993206833432],[-85.649995379242483,34.719993409265676],[-85.649995447036702,33.509993663777365],[-84.639995823721037,31.739994012790245],[-84.289995974464333,30.599994257995554],[-83.239996329349282,29.209994548495583],[-83.160779986911606,28.793375161679389],[-83.272996333644073,28.826994639353629],[-83.420996282175963,29.092994580665877],[-83.624996216221362,29.289994540009278],[-83.894996125468282,29.641994466193132],[-84.072996071473526,29.72999445084038],[-84.170996047464428,29.62599447760271],[-84.466995969447282,29.43799453001802],[-84.92609781194129,29.278017125213768],[-86.219995331131571,32.629993873453223],[-86.789995109116347,33.759993654368436],[-86.939995018295008,34.609993484289589],[-86.679995028768587,35.639993263848226],[-86.289995078175764,36.58999305727712],[-85.609995214187165,37.459992855564948],[-84.999995344147706,38.129992697421102],[-84.959995304658193,38.819992563731361],[-85.529995059691075,39.779992410526731],[-86.28999478355837,40.399992335158352],[-86.949994563287973,40.689992317052258],[-87.329994447268092,40.739992328745387],[-88.009994262328419,40.589992391689805],[-88.769994074677669,40.239992493895521],[-89.429993933565456,39.709992623575801],[-89.999993896720326,38.26999291315191],[-90.859993796599369,36.489993287053984],[-90.559994002510948,34.689993621007993],[-88.93999458967545,32.249994053951966],[-88.326431251029433,29.86487400493106],[-88.405994847668268,29.862994552282117],[-88.431994846096671,29.71399458664013],[-88.694994786798148,29.393994666169679],[-88.580994824355045,29.248994694914092],[-88.618994822279134,29.021994747386547],[-88.936994747785761,28.690994830887146],[-89.174994684836463,28.629994851876379],[-89.398994625294506,28.57699487013776],[-89.711994535522862,28.692994853165807],[-89.827994496081928,28.915994807080459],[-90.101994428094855,28.754994851059884],[-90.539994310725319,28.710994873160878],[-90.744994255357838,28.710994879239152],[-91.082994163807996,28.731994884604443],[-91.314994095703398,28.892994856598147],[-91.555994027877702,28.982994844109484],[-91.654993996042037,29.120994817126157],[-91.741993975367635,29.05799483402448],[-92.078993883446174,29.113994832307409],[-92.163993858001319,29.180994820342026],[-92.628993732562549,29.232994823272517],[-93.242993561800674,29.440994798635874],[-93.587993472576144,29.429994812834295],[-93.776993426055796,29.349994835413604],[-93.96099337814131,29.347994841997618],[-94.265993304251481,29.221994878108184],[-94.501993249520723,29.061994919183],[-94.899993157771263,28.807994985244225],[-95.133993105638325,28.596995036698502],[-95.488993022004422,28.427995082572714],[-96.043992889402929,28.181995150853382],[-96.14699286850599,28.054995180089577],[-96.42699280181327,27.939995212312198],[-96.795992721961397,27.578995298387735],[-97.016992683941453,27.080995408262094],[-96.875992734861811,26.594995507654072],[-96.748992786189604,25.947995642670325],[-97.074992708752646,25.798995682136177],[-97.229992673248319,25.658995715583409],[-97.679992556848674,25.836995687446606],[-98.217992420795909,25.933995679175865],[-98.508992347015607,26.038995664118385],[-99.102992195376999,26.253995633957562],[-99.356992125106714,26.51899558531127],[-99.488992084270436,26.80399553061892],[-99.611992047118633,27.038995486724374],[-99.69699201789301,27.290995438242785],[-99.723992004645041,27.495995397185457],[-99.916991952888793,27.636995375027436],[-100.22999186382417,28.007995310983599],[-100.40999181134134,28.264995265869754],[-100.59599175301065,28.592995208206489],[-100.75399170544274,28.843995164784392],[-100.91099165844508,29.05899512876185],[-101.16099159002691,29.267995097165311],[-101.44999151103831,29.517995060204395],[-101.61599146781376,29.593995051936389],[-101.85199141214015,29.613995056227765],[-102.12499134669909,29.650995059485549],[-102.1834866869594,29.648989506661405],[-101.28999118617197,35.379994016765465],[-100.73999114168926,37.439993650654159],[-101.17999098354703,37.979993591769464],[-101.61999086455562,38.099993599754782],[-102.19999072718306,38.079993638484837],[-102.95999057085835,37.82999372374681],[-106.23998987900794,37.19999402037994],[-107.73998958168973,36.8699941607018],[-111.22998888721118,36.509994427588758],[-113.63998841425114,36.519994579781631],[-114.74998818070053,36.769994622852636],[-116.01998790057847,37.229994655889172],[-117.49998755392585,37.999994678948212],[-118.44998729868297,38.779994672177317],[-118.77998715125743,39.499994630554198],[-118.77998704801927,40.269994561064678],[-118.68998702488631,40.549994529020296],[-117.28998715064589,41.359994340499966],[-116.37998729257048,41.509994250447257],[-115.35998749309861,41.429994172397762],[-114.41998775568528,40.839994155106076],[-113.81998795357299,40.229994171300831],[-113.19998809898843,40.039994144124343],[-112.34998823567264,40.27999405211861],[-111.80998828220787,40.749993957886261],[-111.33998828276705,41.43999384377782],[-110.36998838203453,42.159993685342656],[-108.81998864251595,42.649993503130382],[-107.24998895857667,42.879993348377752],[-106.40998914276726,42.929993274898251],[-105.46998936308131,42.919993200905303],[-104.82998950962472,42.949993146816581],[-104.07998963887006,43.289993044761673],[-102.85998962219175,45.299992697428912],[-100.78699612175164,49.194198121847421],[-99.66398973941115,49.182991969100563],[-98.263990129214449,49.179991847019835],[-96.74699055661948,49.196991715794212],[-95.910990802133824,49.173991649412244],[-95.452990936468524,49.166991612515183],[-95.48999084919221,49.560991567978967],[-94.578991121550246,49.54099149547514],[-94.394991284550045,48.961991552054812],[-93.804991478639138,48.856991518743861],[-93.512991578133239,48.785991504911124],[-93.222991655325885,48.833991476169849],[-92.499991896231521,48.696991438329114],[-91.939992094453586,48.520991419172304],[-91.4769922652833,48.337991409300862],[-90.776992458657602,48.452991342480601],[-90.512992570942089,48.26199134928536],[-90.010992723830157,48.265991312996817],[-89.520992883824462,48.206991286811871],[-88.424993169290161,48.559991162013667],[-87.97076845986966,48.379989772374572],[-90.779992575455168,47.719991442492912],[-96.369991188461285,46.2199920605998],[-99.369990596685653,44.809992479493161],[-101.92999020605554,43.009992914792726],[-103.12999000336968,42.339993094656755],[-107.4099891901418,40.969993593837565],[-110.15998873666389,39.869993934346695],[-111.39998862751612,38.649994171688732],[-111.1399887702858,37.839994253078089],[-109.92998903638119,37.669994193824522],[-106.78998963570881,38.37999389040472],[-104.09999021398878,38.699993667552491],[-101.69999079112772,38.639993522408467],[-100.54999111238088,38.239993512752321],[-100.75999122163481,36.489993804651782],[-101.02999124550171,35.409993998087671],[-101.15999128458316,34.489994159262274],[-101.24999138425568,32.719994470096061],[-100.27999164411438,32.269994507494083],[-99.349991849210653,32.619994403773596],[-98.27999204558337,33.68999416001995],[-95.939992549845144,34.979993814264198],[-93.919993031717738,35.62999359655587],[-92.799993235295659,36.899993307250668],[-91.889993262433777,39.489992796894164],[-90.109993571756988,41.459992358242182],[-88.039994094463367,42.219992111365137],[-83.649995409915363,42.249991869764486],[-82.939995604510315,42.499991789727957],[-82.275833948029614,42.632824103041706]],[[-111.06998728361184,47.449993217208522],[-110.95998747238843,46.659993278387169],[-111.13998755733152,46.039993353849276],[-112.16998746904791,45.359993514335621],[-113.37998731106583,44.869993672628162],[-114.30998719541753,44.489993793391875],[-115.17998706226084,44.289993891702522],[-116.16998687806722,44.269993985579106],[-116.69998676469397,44.349994028650933],[-117.93998645884955,44.779994112724474],[-119.68998590634979,45.999994199564533],[-122.67777071920838,49.273568667569499],[-122.53398465712978,49.246994324841502],[-121.57598483272486,49.179994218016709],[-120.44498501995692,49.20099408793957],[-119.22598523511702,49.202993950065839],[-117.70198551257162,49.216993779093123],[-116.06298582774347,49.222993597995369],[-114.52998613831235,49.219993432157196],[-113.00298645603259,49.226993267912825],[-111.41687705563675,49.212195577203417],[-111.06998728361184,47.449993217208522]]]}},{"attributes":{"objectid":2,"dn":3,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998530000,"st_area(shape)":2303815410889.3203,"st_perimeter(shape)":17316517.639229808,"issue":"202605170610","label":"MRGL","label2":"Marginal Risk","stroke":"#005500","fill":"#66A366"},"geometry":{"rings":[[[-87.97076845986966,48.379989772374572],[-87.079993672302692,48.026991146073549],[-85.676994196003378,47.452991140437014],[-84.652994581645927,46.988991146960437],[-84.443994684328487,46.698991178860304],[-84.033994816367851,46.686991156806343],[-83.879994908911286,46.325991203940887],[-83.81399493718429,46.263991210125468],[-83.742994961567035,46.251991207662293],[-83.600995009333261,46.228991203229683],[-83.413995068267894,46.231991192332636],[-83.250995136321222,46.092991204997766],[-83.287995152712767,45.850991245457294],[-83.291995157693989,45.798991253846019],[-82.23199552737681,45.498991244806071],[-81.964995752132523,44.143991455775129],[-81.901995826084487,43.585991548466403],[-82.086995805574816,43.179991628257916],[-82.072995824944087,43.024991654010357],[-82.195995799503223,42.878991685908964],[-82.275833948029614,42.632824103041706],[-82.939995604510315,42.499991789727957],[-83.649995409915363,42.249991869764486],[-88.039994094463367,42.219992111365137],[-90.109993571756988,41.459992358242182],[-91.889993262433777,39.489992796894164],[-92.799993235295659,36.899993307250668],[-93.919993031717738,35.62999359655587],[-95.939992549845144,34.979993814264198],[-98.27999204558337,33.68999416001995],[-99.349991849210653,32.619994403773596],[-100.27999164411438,32.269994507494083],[-101.24999138425568,32.719994470096061],[-101.15999128458316,34.489994159262274],[-101.02999124550171,35.409993998087671],[-100.75999122163481,36.489993804651782],[-100.54999111238088,38.239993512752321],[-101.69999079112772,38.639993522408467],[-104.09999021398878,38.699993667552491],[-106.78998963570881,38.37999389040472],[-109.92998903638119,37.669994193824522],[-111.1399887702858,37.839994253078089],[-111.39998862751612,38.649994171688732],[-110.15998873666389,39.869993934346695],[-107.4099891901418,40.969993593837565],[-103.12999000336968,42.339993094656755],[-101.92999020605554,43.009992914792726],[-99.369990596685653,44.809992479493161],[-96.369991188461285,46.2199920605998],[-90.779992575455168,47.719991442492912],[-87.97076845986966,48.379989772374572]],[[-104.00999012657275,39.679993522056435],[-103.93999019964038,39.179993588135417],[-103.39999034791758,38.97999358158372],[-100.68999097040681,39.289993359001073],[-100.09999113648236,39.099993350493961],[-99.789991250047876,38.749993386075708],[-99.629991323186644,38.409993429881844],[-100.17999132644672,36.919993701781365],[-100.51999134985869,35.649993930297569],[-100.43999139916789,35.279993988326204],[-100.01999150562216,35.219993977103663],[-99.379991645161269,35.449993904232386],[-99.179991676330204,35.689993852462941],[-97.749991960666662,36.599993619948926],[-96.139992259098705,37.949993300772682],[-95.749992316729873,38.439993195744115],[-95.069992439840462,39.039993054915669],[-92.979992847543798,40.649992662603765],[-92.209992950002913,41.699992443950968],[-91.479993077440227,42.419992281771762],[-91.149993106342734,42.989992170074039],[-90.779993070353314,44.179991959882429],[-90.879992953474371,44.869991860991284],[-91.639992680710591,45.249991855358466],[-92.679992233859466,46.259991781761855],[-94.749991623067515,46.359991918759526],[-96.049991323660592,45.929992075031549],[-98.059990946521268,44.799992380103731],[-101.13999051818621,42.159992972135349],[-102.54999030772574,41.089993222032184],[-104.00999012657275,39.679993522056435]],[[-83.089090625981513,28.416342135774855],[-83.013996420823275,28.464994718544155],[-82.989996424598743,28.550994697047411],[-83.025996407517994,28.752994649992175],[-83.160779986911606,28.793375161679389],[-83.239996329349282,29.209994548495583],[-84.289995974464333,30.599994257995554],[-84.639995823721037,31.739994012790245],[-85.649995447036702,33.509993663777365],[-85.649995379242483,34.719993409265676],[-85.129995476330564,35.599993206833432],[-83.639995877122587,36.139993035539923],[-82.979996073999516,36.099993016943515],[-82.289996362519418,34.619993301872306],[-81.999996531876832,32.949993655367088],[-81.65999675283949,30.129994287446607],[-81.089996976217137,28.519994654744703],[-80.679997152977961,26.669995098678797],[-80.999997083876153,25.799995324531263],[-81.659996887309276,25.979995293035376],[-82.619996575604517,27.169995020954019],[-82.969996455769035,27.789994879111596],[-83.089090625981513,28.416342135774855]]]}},{"attributes":{"objectid":3,"dn":4,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998530000,"st_area(shape)":771919720282.2196,"st_perimeter(shape)":7746170.9260847503,"issue":"202605170610","label":"SLGT","label2":"Slight Risk","stroke":"#DDAA00","fill":"#FFE066"},"geometry":{"rings":[[[-104.00999012657275,39.679993522056435],[-102.54999030772574,41.089993222032184],[-101.13999051818621,42.159992972135349],[-98.059990946521268,44.799992380103731],[-96.049991323660592,45.929992075031549],[-94.749991623067515,46.359991918759526],[-92.679992233859466,46.259991781761855],[-91.639992680710591,45.249991855358466],[-90.879992953474371,44.869991860991284],[-90.779993070353314,44.179991959882429],[-91.149993106342734,42.989992170074039],[-91.479993077440227,42.419992281771762],[-92.209992950002913,41.699992443950968],[-92.979992847543798,40.649992662603765],[-95.069992439840462,39.039993054915669],[-95.749992316729873,38.439993195744115],[-96.139992259098705,37.949993300772682],[-97.749991960666662,36.599993619948926],[-99.179991676330204,35.689993852462941],[-99.379991645161269,35.449993904232386],[-100.01999150562216,35.219993977103663],[-100.43999139916789,35.279993988326204],[-100.51999134985869,35.649993930297569],[-100.17999132644672,36.919993701781365],[-99.629991323186644,38.409993429881844],[-99.789991250047876,38.749993386075708],[-100.09999113648236,39.099993350493961],[-100.68999097040681,39.289993359001073],[-103.39999034791758,38.97999358158372],[-103.93999019964038,39.179993588135417],[-104.00999012657275,39.679993522056435]],[[-102.59999042899274,39.969993384761857],[-102.34999053439526,39.569993425820066],[-101.23999080440082,39.56999335255383],[-99.409991194034788,40.179993140459928],[-98.779991365324079,40.079993115310515],[-98.589991524804304,39.019993269025576],[-97.839991713560167,39.049993218539804],[-97.299991826095678,39.319993141961142],[-96.799991893623201,39.929993013036182],[-95.629992152799971,40.409992863707672],[-94.479992284105322,42.019992535105501],[-93.949992297476442,43.129992328796796],[-94.059992220463997,43.499992280052744],[-94.719991999112935,43.789992281711314],[-95.039991864090666,44.139992253093659],[-96.329991495216788,44.239992329943185],[-97.009991327849974,44.119992396630323],[-97.449991242483264,43.879992462065239],[-100.30999076760536,41.849992955700124],[-102.3999904091349,40.549993287619579],[-102.59999042899274,39.969993384761857]]]}},{"attributes":{"objectid":4,"dn":5,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998530000,"st_area(shape)":397582515913.91675,"st_perimeter(shape)":2816757.8471004926,"issue":"202605170610","label":"ENH","label2":"Enhanced Risk","stroke":"#FF6600","fill":"#FFA366"},"geometry":{"rings":[[[-102.59999042899274,39.969993384761857],[-102.3999904091349,40.549993287619579],[-100.30999076760536,41.849992955700124],[-97.449991242483264,43.879992462065239],[-97.009991327849974,44.119992396630323],[-96.329991495216788,44.239992329943185],[-95.039991864090666,44.139992253093659],[-94.719991999112935,43.789992281711314],[-94.059992220463997,43.499992280052744],[-93.949992297476442,43.129992328796796],[-94.479992284105322,42.019992535105501],[-95.629992152799971,40.409992863707672],[-96.799991893623201,39.929993013036182],[-97.299991826095678,39.319993141961142],[-97.839991713560167,39.049993218539804],[-98.589991524804304,39.019993269025576],[-98.779991365324079,40.079993115310515],[-99.409991194034788,40.179993140459928],[-101.23999080440082,39.56999335255383],[-102.34999053439526,39.569993425820066],[-102.59999042899274,39.969993384761857]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_categorical.geojson b/tests/fixtures/arcgis_day1_categorical.geojson new file mode 100644 index 0000000..1da9601 --- /dev/null +++ b/tests/fixtures/arcgis_day1_categorical.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","id":1,"geometry":{"type":"MultiPolygon","coordinates":[[[[-82.275838150468999,42.632832369680386],[-82.940000000052919,42.499999999861302],[-83.650000000383272,42.249999999955087],[-88.039999999642419,42.220000000132394],[-90.110000000162771,41.4599999998551],[-91.890000000054712,39.490000000014028],[-92.799999999858173,36.900000000250735],[-93.919999999961789,35.630000000090433],[-95.939999999940113,34.980000000013646],[-98.280000000333033,33.689999999633876],[-99.349999999894635,32.620000000363454],[-100.27999999955556,32.269999999972583],[-101.24999999982977,32.720000000111824],[-101.15999999957282,34.489999999920308],[-101.02999999960089,35.410000000281535],[-100.75999999972831,36.489999999766454],[-100.55000000032646,38.240000000263805],[-101.70000000021629,38.640000000181047],[-104.10000000018165,38.69999999982462],[-106.78999999987707,38.380000000099315],[-109.92999999995899,37.670000000172969],[-111.14000000031956,37.839999999999698],[-111.40000000026342,38.65000000007791],[-110.16000000011663,39.869999999736493],[-107.40999999995046,40.96999999984466],[-103.12999999990744,42.340000000110351],[-101.93000000037391,43.010000000010848],[-99.369999999752125,44.810000000223887],[-96.369999999570837,46.220000000084383],[-90.779999999879848,47.719999999932952],[-87.970775120467309,48.379998616514037],[-88.425000000042985,48.560000000124433],[-89.520999999958278,48.207000000246516],[-90.011000000059752,48.265999999971491],[-90.513000000255388,48.261999999877837],[-90.776999999631741,48.452999999767087],[-91.477000000033357,48.338000000040466],[-91.939999999698415,48.520999999840981],[-92.500000000199378,48.696999999814516],[-93.22299999980828,48.833999999833296],[-93.513000000436662,48.785999999946007],[-93.805000000332143,48.856999999971457],[-94.394999999720994,48.961999999837495],[-94.578999999667431,49.540999999758633],[-95.489999999553589,49.561000000091411],[-95.453000000086746,49.167000000166468],[-95.911000000236612,49.17400000029118],[-96.747000000208075,49.196999999859734],[-98.263999999908066,49.180000000029182],[-99.663999999812987,49.183000000193083],[-100.78700669081695,49.194206053947404],[-102.86000000003487,45.300000000146476],[-104.08000000032418,43.289999999978527],[-104.83000000036949,42.950000000137152],[-105.47000000030036,42.919999999908079],[-106.40999999989003,42.930000000099142],[-107.25000000019233,42.879999999854086],[-108.81999999978413,42.650000000028513],[-110.37000000041677,42.160000000224706],[-111.33999999979265,41.440000000163586],[-111.81000000003667,40.750000000209305],[-112.34999999978183,40.280000000024131],[-113.20000000001285,40.04000000018501],[-113.82000000008625,40.230000000056044],[-114.42000000030217,40.840000000316813],[-115.35999999989183,41.42999999978754],[-116.37999999980977,41.510000000251424],[-117.28999999961323,41.36000000000066],[-118.69000000041648,40.549999999810503],[-118.77999999977511,40.269999999755107],[-118.77999999977511,39.499999999966668],[-118.45000000033009,38.779999999935605],[-117.49999999991338,38.000000000211664],[-116.01999999968022,37.229999999854186],[-114.74999999974719,36.770000000249247],[-113.63999999957232,36.519999999923442],[-111.22999999967824,36.509999999905297],[-107.74000000029379,36.869999999998115],[-106.24000000020315,37.199999999799893],[-102.96000000022056,37.82999999984326],[-102.2000000002465,38.079999999661901],[-101.61999999988807,38.099999999844499],[-101.18000000032862,37.980000000179814],[-100.73999999987082,37.440000000222668],[-101.29000000044304,35.380000000130906],[-102.18349535414268,29.648994444753722],[-102.12500000033181,29.65100000003175],[-101.85200000021111,29.613999999618542],[-101.61599999955725,29.593999999949791],[-101.45000000020119,29.517999999844371],[-101.1609999996555,29.267999999726591],[-100.9109999996404,29.059000000061793],[-100.75400000013039,28.844000000126155],[-100.59599999963933,28.593000000275865],[-100.4100000004258,28.265000000035887],[-100.22999999991188,28.00800000026225],[-99.917000000076214,27.637000000091135],[-99.724000000283752,27.495999999607282],[-99.696999999847336,27.291000000325209],[-99.612000000003903,27.039000000354402],[-99.48899999971259,26.803999999878517],[-99.356999999575265,26.518999999824846],[-99.103000000127636,26.25400000027668],[-98.509000000407951,26.038999999961614],[-98.217999999696886,25.933999999803319],[-97.680000000117118,25.836999999964341],[-97.229999999730595,25.659000000309668],[-97.075000000385998,25.799000000337355],[-96.749000000373471,25.948000000296993],[-96.876000000097292,26.595000000233807],[-97.017000000080643,27.080999999707789],[-96.795999999769052,27.579000000093259],[-96.426999999793466,27.939999999852898],[-96.146999999992147,28.054999999794394],[-96.043999999558309,28.182000000113582],[-95.489000000369202,28.427999999877631],[-95.133999999754877,28.597000000223602],[-94.900000000164738,28.808000000246768],[-94.501999999587326,29.061999999968823],[-94.265999999831777,29.221999999997553],[-93.960999999759451,29.348000000174853],[-93.776999999813015,29.349999999955184],[-93.588000000351357,29.430000000354035],[-93.242999999665756,29.440999999652337],[-92.629000000088595,29.232999999617103],[-92.164000000258127,29.181000000137491],[-92.07900000041468,29.114000000296844],[-91.742000000390732,29.058000000326938],[-91.655000000381875,29.120999999795966],[-91.556000000278885,28.982999999816883],[-91.315000000109805,28.892999999995599],[-91.082999999786779,28.731999999653791],[-90.744999999680104,28.710999999717089],[-90.53999999979348,28.710999999717089],[-90.102000000399443,28.755000000345362],[-89.828000000196042,28.916000000310095],[-89.711999999585345,28.693000000119145],[-89.398999999749705,28.577000000217446],[-89.175000000088289,28.630000000363218],[-88.937000000167345,28.691000000019521],[-88.618999999918174,29.022000000354463],[-88.581000000368604,29.248999999949675],[-88.694999999915566,29.394000000151312],[-88.431999999723601,29.714000000047285],[-88.406000000268222,29.862999999612942],[-88.326436381742056,29.864879455188053],[-88.940000000415452,32.249999999858574],[-90.559999999650969,34.689999999795596],[-90.860000000208075,36.489999999766454],[-90.000000000048317,38.26999999980066],[-89.429999999618602,39.710000000021758],[-88.769999999830262,40.239999999799565],[-88.009999999856205,40.590000000320494],[-87.330000000210376,40.740000000215979],[-86.950000000223355,40.689999999700554],[-86.290000000435001,40.399999999964457],[-85.529999999562619,39.780000000036935],[-84.960000000031243,38.820000000330992],[-84.999999999746194,38.129999999695499],[-85.609999999890846,37.459999999884516],[-86.290000000435001,36.590000000102336],[-86.680000000350759,35.639999999966541],[-86.940000000294603,34.609999999985668],[-86.789999999566902,33.759999999733246],[-86.220000000035512,32.630000000283353],[-84.92610196678379,29.278022544943529],[-84.466999999681647,29.438000000111135],[-84.171000000353672,29.625999999889302],[-84.07300000033338,29.730000000081546],[-83.894999999984847,29.642000000249872],[-83.62500000011228,29.289999999788769],[-83.421000000308339,29.092999999968058],[-83.272999999746048,28.82700000000521],[-83.160783619568761,28.793380517439932],[-83.239999999711713,29.210000000378717],[-84.290000000314166,30.600000000294752],[-84.639999999616649,31.740000000044066],[-85.649999999605797,33.509999999983911],[-85.649999999605797,34.719999999708776],[-85.129999999718109,35.599999999696266],[-83.63999999955621,36.139999999949268],[-82.97999999976787,36.099999999750025],[-82.290000000193302,34.620000000285216],[-81.999999999564906,32.950000000297358],[-81.660000000191175,30.130000000287176],[-81.08999999976146,28.520000000284245],[-80.679999999988226,26.669999999861933],[-81.000000000402807,25.800000000274313],[-81.660000000191175,25.979999999758341],[-82.61999999963831,27.170000000043181],[-82.969999999839132,27.790000000032393],[-83.089094224988074,28.416347403842607],[-83.155999999950978,28.372999999943726],[-83.184999999654494,28.105000000322374],[-83.183000000387395,27.781000000113178],[-83.070000000024834,27.615000000386566],[-83.105000000224578,27.532000000110262],[-82.718999999741328,26.891999999910425],[-82.534999999794877,26.480000000350312],[-82.324000000310335,26.171000000156749],[-82.142999999713695,26.089999999620844],[-81.934000000394576,25.609999999746137],[-82.631999999732471,25.45300000034019],[-82.510000000422181,25.287999999999982],[-82.368000000356119,25.133999999702585],[-82.313000000298899,25.016999999980946],[-83.162999999631595,25.012000000332282],[-83.238000000444615,24.797999999849537],[-83.280000000324975,24.513000000204464],[-83.288000000088303,24.221000000253113],[-82.815999999678894,24.168999999757567],[-81.782000000399762,24.207999999851278],[-81.054000000377329,24.361000000288929],[-80.63499999985973,24.487000000098494],[-80.330999999870116,24.705000000229205],[-80.14299999959286,24.859000000304832],[-79.965000000142638,25.157999999906814],[-79.812000000065126,25.576000000267165],[-79.765999999853932,26.227999999949329],[-79.699999999785277,26.7770000003825],[-79.787999999876831,27.147999999773489],[-80.271000000297676,28.231999999937326],[-80.196999999567367,28.551999999931745],[-80.348999999562167,28.82999999997439],[-80.764999999831659,29.498000000270107],[-80.989000000391371,30.127999999644274],[-81.08999999976146,30.739999999707894],[-80.763999999748947,31.632999999794418],[-80.435999999571024,31.966000000040754],[-80.345031062973874,32.007861812112914],[-80.140000000243049,33.119999999986263],[-80.079999999772284,34.299999999944674],[-79.72999999957149,35.240000000065535],[-79.270000000154539,35.960000000201333],[-78.500000000251745,36.519999999923442],[-76.960000000446144,36.759999999642702],[-75.490387022213909,36.501824747335853],[-75.64500000038467,36.894000000075565],[-75.355999999838986,37.333999999945654],[-75.263000000232225,37.547999999653982],[-75.085999999966418,37.665999999819981],[-74.762000000119315,38.23900000001975],[-74.700999999565866,38.441999999808083],[-74.715999999908121,38.670000000184466],[-74.504000000340881,38.813999999844263],[-74.372000000203528,38.982000000031626],[-74.084999999823282,39.1979999998441],[-74.064260345127167,39.226243026655311],[-74.249999999994941,39.570000000078899],[-74.450000000366359,40.840000000316813],[-74.789999999740118,42.19999999983289],[-75.460000000355521,43.100000000193795],[-76.399999999945194,43.80000000012928],[-76.694893395217392,44.094893394980616],[-76.955000000032641,43.790999999677865],[-77.318999999594681,43.789000000101701],[-78.63200000038907,43.794000000002001],[-79.372999999690052,43.552999999821935],[-79.251999999564163,42.966000000002566],[-79.51399999967343,42.795000000022547],[-80.316000000426158,42.600000000149521],[-81.261999999613749,42.420999999785671],[-81.763999999809371,42.177999999872661],[-82.45899999979747,41.878000000022119],[-82.688999999955101,41.862999999808778],[-82.80799999991558,41.911000000073038],[-82.8629999999728,41.980000000054332],[-82.902999999687765,42.063000000106207],[-82.8629999999728,42.18099999987669],[-82.690000000037799,42.223999999966061],[-82.518000000185509,42.325999999999745],[-82.303999999554549,42.545999999735535],[-82.275838150468999,42.632832369680386]]],[[[-111.06999999992009,47.449999999827241],[-111.41689025089788,49.212202474877131],[-113.00299999988957,49.226999999862301],[-114.53000000041662,49.220000000236112],[-116.06299999964328,49.222999999796336],[-117.70199999955187,49.216999999871717],[-119.22599999983079,49.202999999772011],[-120.44500000003741,49.200999999874803],[-121.57600000015246,49.180000000029182],[-122.53400000033251,49.247000000061853],[-122.67778609283022,49.273574327421507],[-119.68999999957857,46.000000000272337],[-117.94000000037113,44.77999999979474],[-116.70000000022436,44.349999999740419],[-116.17000000040792,44.269999999704353],[-115.18000000027624,44.289999999715654],[-114.31000000018774,44.489999999830907],[-113.37999999962848,44.869999999952164],[-112.17000000016621,45.359999999955967],[-111.14000000031956,46.040000000280955],[-110.95999999980565,46.659999999941299],[-111.06999999992009,47.449999999827241]]]]},"properties":{"objectid":1,"dn":2,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998530000,"st_area(shape)":5384076320306.1904,"st_perimeter(shape)":33998055.693100072,"issue":"202605170610","label":"TSTM","label2":"General Thunderstorms Risk","stroke":"#55BB55","fill":"#C1E9C1"}},{"type":"Feature","id":2,"geometry":{"type":"MultiPolygon","coordinates":[[[[-87.970775120467309,48.379998616514037],[-90.779999999879848,47.719999999932952],[-96.369999999570837,46.220000000084383],[-99.369999999752125,44.810000000223887],[-101.93000000037391,43.010000000010848],[-103.12999999990744,42.340000000110351],[-107.40999999995046,40.96999999984466],[-110.16000000011663,39.869999999736493],[-111.40000000026342,38.65000000007791],[-111.14000000031956,37.839999999999698],[-109.92999999995899,37.670000000172969],[-106.78999999987707,38.380000000099315],[-104.10000000018165,38.69999999982462],[-101.70000000021629,38.640000000181047],[-100.55000000032646,38.240000000263805],[-100.75999999972831,36.489999999766454],[-101.02999999960089,35.410000000281535],[-101.15999999957282,34.489999999920308],[-101.24999999982977,32.720000000111824],[-100.27999999955556,32.269999999972583],[-99.349999999894635,32.620000000363454],[-98.280000000333033,33.689999999633876],[-95.939999999940113,34.980000000013646],[-93.919999999961789,35.630000000090433],[-92.799999999858173,36.900000000250735],[-91.890000000054712,39.490000000014028],[-90.110000000162771,41.4599999998551],[-88.039999999642419,42.220000000132394],[-83.650000000383272,42.249999999955087],[-82.940000000052919,42.499999999861302],[-82.275838150468999,42.632832369680386],[-82.195999999605505,42.878999999873919],[-82.073000000212531,43.024999999687225],[-82.086999999573763,43.180000000321606],[-81.902000000442953,43.586000000221262],[-81.965000000263487,44.143999999867013],[-82.231999999887961,45.499000000178953],[-83.292000000419137,45.798999999789963],[-83.288000000088303,45.850999999918884],[-83.250999999723149,46.092999999958195],[-83.413999999729413,46.232000000062598],[-83.600999999923971,46.228999999904573],[-83.742999999990033,46.251999999867309],[-83.813999999573923,46.264000000156429],[-83.879999999642592,46.325999999886392],[-84.033999999802802,46.686999999859879],[-84.44399999957605,46.698999999764233],[-84.652999999793494,46.988999999717691],[-85.677000000042227,47.453000000290707],[-87.08000000019527,48.02699999973062],[-87.970775120467309,48.379998616514037]],[[-104.00999999992469,39.680000000210661],[-102.55000000044731,41.089999999740783],[-101.13999999971534,42.160000000224706],[-98.060000000104154,44.799999999825943],[-96.050000000054567,45.929999999981725],[-94.750000000335334,46.359999999779767],[-92.67999999981501,46.260000000150285],[-91.64000000003962,45.250000000305668],[-90.880000000065564,44.869999999952164],[-90.779999999879848,44.179999999908837],[-91.149999999938132,42.989999999857574],[-91.480000000281478,42.419999999686297],[-92.209999999570996,41.700000000286636],[-92.980000000372115,40.649999999701848],[-95.069999999851618,39.039999999770963],[-95.750000000395758,38.4400000002395],[-96.140000000311545,37.950000000049691],[-97.749999999618296,36.599999999677095],[-99.180000000207755,35.689999999929078],[-99.379999999680848,35.450000000124199],[-100.01999999961173,35.220000000366213],[-100.44000000021202,35.279999999854347],[-100.51999999964194,35.649999999780974],[-100.18000000026818,36.919999999914012],[-99.629999999695954,38.410000000283972],[-99.790000000352421,38.750000000322764],[-100.09999999993995,39.099999999877362],[-100.69000000022714,39.289999999965403],[-103.39999999978002,38.980000000347161],[-103.94000000042351,39.180000000009002],[-104.00999999992469,39.680000000210661]]],[[[-83.089094224988074,28.416347403842607],[-82.969999999839132,27.790000000032393],[-82.61999999963831,27.170000000043181],[-81.660000000191175,25.979999999758341],[-81.000000000402807,25.800000000274313],[-80.679999999988226,26.669999999861933],[-81.08999999976146,28.520000000284245],[-81.660000000191175,30.130000000287176],[-81.999999999564906,32.950000000297358],[-82.290000000193302,34.620000000285216],[-82.97999999976787,36.099999999750025],[-83.63999999955621,36.139999999949268],[-85.129999999718109,35.599999999696266],[-85.649999999605797,34.719999999708776],[-85.649999999605797,33.509999999983911],[-84.639999999616649,31.740000000044066],[-84.290000000314166,30.600000000294752],[-83.239999999711713,29.210000000378717],[-83.160783619568761,28.793380517439932],[-83.025999999979049,28.752999999847599],[-82.989999999696607,28.550999999851761],[-83.013999999884902,28.465000000212459],[-83.089094224988074,28.416347403842607]]]]},"properties":{"objectid":2,"dn":3,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998530000,"st_area(shape)":2303815410889.3203,"st_perimeter(shape)":17316517.639229808,"issue":"202605170610","label":"MRGL","label2":"Marginal Risk","stroke":"#005500","fill":"#66A366"}},{"type":"Feature","id":3,"geometry":{"type":"Polygon","coordinates":[[[-104.00999999992469,39.680000000210661],[-103.94000000042351,39.180000000009002],[-103.39999999978002,38.980000000347161],[-100.69000000022714,39.289999999965403],[-100.09999999993995,39.099999999877362],[-99.790000000352421,38.750000000322764],[-99.629999999695954,38.410000000283972],[-100.18000000026818,36.919999999914012],[-100.51999999964194,35.649999999780974],[-100.44000000021202,35.279999999854347],[-100.01999999961173,35.220000000366213],[-99.379999999680848,35.450000000124199],[-99.180000000207755,35.689999999929078],[-97.749999999618296,36.599999999677095],[-96.140000000311545,37.950000000049691],[-95.750000000395758,38.4400000002395],[-95.069999999851618,39.039999999770963],[-92.980000000372115,40.649999999701848],[-92.209999999570996,41.700000000286636],[-91.480000000281478,42.419999999686297],[-91.149999999938132,42.989999999857574],[-90.779999999879848,44.179999999908837],[-90.880000000065564,44.869999999952164],[-91.64000000003962,45.250000000305668],[-92.67999999981501,46.260000000150285],[-94.750000000335334,46.359999999779767],[-96.050000000054567,45.929999999981725],[-98.060000000104154,44.799999999825943],[-101.13999999971534,42.160000000224706],[-102.55000000044731,41.089999999740783],[-104.00999999992469,39.680000000210661]],[[-102.60000000009101,39.970000000258793],[-102.39999999971961,40.549999999810503],[-100.31000000024011,41.84999999968236],[-97.449999999959502,43.87999999977265],[-97.010000000400012,44.120000000204818],[-96.329999999855886,44.239999999767448],[-95.04000000006539,44.140000000317826],[-94.719999999650796,43.789999999825234],[-94.059999999862441,43.499999999874056],[-93.949999999748002,43.129999999854853],[-94.479999999564427,42.019999999859728],[-95.630000000352581,40.41000000016863],[-96.800000000099871,39.92999999984351],[-97.300000000130083,39.320000000014204],[-97.839999999875246,39.050000000173412],[-98.589999999920579,39.019999999963822],[-98.780000000363245,40.08000000026999],[-99.410000000365386,40.17999999978651],[-101.23999999990103,39.570000000078899],[-102.35000000007591,39.570000000078899],[-102.60000000009101,39.970000000258793]]]},"properties":{"objectid":3,"dn":4,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998530000,"st_area(shape)":771919720282.2196,"st_perimeter(shape)":7746170.9260847503,"issue":"202605170610","label":"SLGT","label2":"Slight Risk","stroke":"#DDAA00","fill":"#FFE066"}},{"type":"Feature","id":4,"geometry":{"type":"Polygon","coordinates":[[[-102.60000000009101,39.970000000258793],[-102.35000000007591,39.570000000078899],[-101.23999999990103,39.570000000078899],[-99.410000000365386,40.17999999978651],[-98.780000000363245,40.08000000026999],[-98.589999999920579,39.019999999963822],[-97.839999999875246,39.050000000173412],[-97.300000000130083,39.320000000014204],[-96.800000000099871,39.92999999984351],[-95.630000000352581,40.41000000016863],[-94.479999999564427,42.019999999859728],[-93.949999999748002,43.129999999854853],[-94.059999999862441,43.499999999874056],[-94.719999999650796,43.789999999825234],[-95.04000000006539,44.140000000317826],[-96.329999999855886,44.239999999767448],[-97.010000000400012,44.120000000204818],[-97.449999999959502,43.87999999977265],[-100.31000000024011,41.84999999968236],[-102.39999999971961,40.549999999810503],[-102.60000000009101,39.970000000258793]]]},"properties":{"objectid":4,"dn":5,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998530000,"st_area(shape)":397582515913.91675,"st_perimeter(shape)":2816757.8471004926,"issue":"202605170610","label":"ENH","label2":"Enhanced Risk","stroke":"#FF6600","fill":"#FFA366"}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_fire_weather.esri.json b/tests/fixtures/arcgis_day1_fire_weather.esri.json new file mode 100644 index 0000000..ea9a420 --- /dev/null +++ b/tests/fixtures/arcgis_day1_fire_weather.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"dn":"Outlook","valid":"Valid Date Time","expire":"Expiration Date","idp_filedate":"GIS FIle Date","idp_ingestdate":"GIS Ingest Date","idp_source":"GIS Source","objectid":"FID","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":102100,"latestWkid":3857},"fields":[{"name":"dn","type":"esriFieldTypeInteger","alias":"Outlook"},{"name":"valid","type":"esriFieldTypeString","alias":"Valid Date Time","length":12},{"name":"expire","type":"esriFieldTypeString","alias":"Expiration Date","length":12},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS FIle Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"objectid","type":"esriFieldTypeOID","alias":"FID"},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"}],"features":[{"attributes":{"dn":5,"valid":"202605171200","expire":"202605181200","idp_filedate":1779000015000,"idp_ingestdate":1779000034000,"idp_source":"firewx_day1_20260517_1200","objectid":1,"st_area(shape)":669642663516.30762,"st_perimeter(shape)":11211064.950436626},"geometry":{"rings":[[[-12387632.9355,4079941.5894000009],[-12329746.8003,4278627.8938999996],[-12227332.868700001,4408485.8277999982],[-12133824.4965,4464226.2524000034],[-11985769.5737,4465623.5305000022],[-11888921.616700001,4448868.381099999],[-11826582.7019,4469816.4754000008],[-11777602.1259,4516049.5012999997],[-11724168.770300001,4562487.679399997],[-11630660.3981,4596391.6853],[-11559415.924000001,4611968.2443000004],[-11474813.111,4617638.2861000001],[-11387983.908199999,4644613.7487000003],[-11221004.672,4748924.0998999998],[-11109685.1812,4792104.8989999965],[-11025082.3682,4803651.1974000037],[-10974988.5973,4771930.7934999987],[-10969422.6228,4704497.1494999975],[-11027308.757999999,4569541.8746000007],[-11110798.3761,4375181.2116999999],[-11165344.9266,4093437.8487000018],[-11192061.6044,3876736.0143999979],[-11282230.391899999,3701772.7164999992],[-11369059.594699999,3518984.0693000033],[-11403568.6369,3452236.5007999986],[-11404157.2897,3451297.4628999978],[-11408689.3334,3449420.1970999986],[-11413662.8127,3436143.3803000003],[-11438077.679,3397301.0700000003],[-11467020.7466,3373100.7292999998],[-11523777.478399999,3365616.6453000009],[-11598489.065199999,3410694.1508999988],[-11625259.4235,3429949.9764999971],[-11649584.7115,3461201.5578999966],[-11678124.5831,3511999.5540999994],[-11680308.890999999,3530700.8616999984],[-11701348.274700001,3564883.121799998],[-11745671.2611,3601250.4244000018],[-11769809.761599999,3627555.4707999974],[-11842167.430599999,3691329.1453000009],[-11857516.9956,3689202.9107000008],[-11863095.494899999,3707389.8320000023],[-11931556.981699999,3711179.5820000023],[-11994118.535500001,3713532.4341999963],[-12022727.6447,3713924.6203999966],[-12027351.098999999,3657560.4390999973],[-12030528.783,3656709.195100002],[-12144288.5286,3648733.3583000004],[-12240913.8466,3649773.6987000033],[-12331193.953600001,3651984.7135000005],[-12375276.471999999,3657969.4482999966],[-12408857.8484,3669414.2079999968],[-12461103.7994,3779072.8197999969],[-12485594.087400001,3937856.0471000001],[-12387632.9355,4079941.5894000009]],[[-12175012.7081,3866138.9184999987],[-12180578.682599999,3764623.3540999964],[-12150522.4201,3654846.6152999997],[-12044768.9038,3662655.1833000034],[-12038089.7344,3663957.0930999964],[-12036976.5395,3723995.0672999993],[-11862204.938900001,3731847.9636999965],[-11443643.6535,3837045.8994000033],[-11331210.967800001,3843651.6652999967],[-11288909.5613,3862167.4649000019],[-11248834.5447,3941853.2911999971],[-11187608.8247,4154372.4878999963],[-11163118.536699999,4301997.4438999966],[-11094100.452500001,4485204.8958000019],[-11039553.902000001,4610551.2211999968],[-11031761.537599999,4677363.5104999989],[-11056251.8256,4711649.6274000034],[-11079628.9187,4715943.5342999995],[-11108571.986300001,4713080.7278999984],[-11170910.9011,4694492.129900001],[-11243268.5701,4673085.8476999998],[-11374625.5693,4603469.0248999968],[-11440304.0688,4575188.6854000017],[-11536038.8309,4551210.9196999967],[-11618415.2541,4510434.6384999976],[-11658490.2708,4450263.6296000034],[-11677414.5842,4364102.6711999997],[-11741979.888900001,4281374.6479000002],[-11800979.219000001,4234773.5375000015],[-11844393.8204,4206089.114699997],[-11873336.888,4195181.319600001],[-11930109.828299999,4184284.2748000026],[-11959052.8959,4172037.8967000023],[-11996901.5228,4153014.7710999995],[-12036976.5395,4120479.0078999996],[-12057014.047800001,4085338.1557999998],[-12072598.7765,4036861.4083999991],[-12143843.250599999,3932528.5279000029],[-12175012.7081,3866138.9184999987]],[[-13487469.5045,4761858.9003999978],[-13425130.5897,4606301.3200000003],[-13340527.776700001,4475409.6635999978],[-13302679.149799999,4390432.9404999986],[-13284868.031300001,4253938.1851999983],[-13324943.048,4208817.7481999993],[-13368357.6494,4236141.3306000009],[-13452960.462400001,4343361.1622999981],[-13501941.0383,4447473.3165000007],[-13574298.7073,4569541.8746000007],[-13622166.088399999,4688779.3898999989],[-13652222.3509,4770491.3343999982],[-13684505.0032,4876119.7088999972],[-13672259.859200001,4957918.9818999991],[-13634411.2324,5000548.8335999995],[-13617713.308699999,4999075.7339999974],[-13565393.1481,4969660.3751000017],[-13531997.300799999,4874665.1504999995],[-13487469.5045,4761858.9003999978]],[[-13632184.842500001,4943262.002700001],[-13655561.935600001,4918395.237499997],[-13665580.6898,4865942.2795000002],[-13643316.7916,4794990.2268000022],[-13605468.164799999,4708788.0317000002],[-13553148.004099999,4610551.2211999968],[-13511959.7925,4558257.4610000029],[-13475224.3605,4546985.2844000012],[-13432922.954,4568130.6520000026],[-13428470.1744,4603469.0248999968],[-13479677.1402,4704497.1494999975],[-13519752.1568,4809429.3422000036],[-13588770.2411,4931552.1604999974],[-13632184.842500001,4943262.002700001]]]}},{"attributes":{"dn":8,"valid":"202605171200","expire":"202605181200","idp_filedate":1779000015000,"idp_ingestdate":1779000034000,"idp_source":"firewx_day1_20260517_1200","objectid":2,"st_area(shape)":494712564203.0119,"st_perimeter(shape)":6217920.8573662844},"geometry":{"rings":[[[-12036976.5395,4120479.0078999996],[-11996901.5228,4153014.7710999995],[-11959052.8959,4172037.8967000023],[-11930109.828299999,4184284.2748000026],[-11873336.888,4195181.319600001],[-11844393.8204,4206089.114699997],[-11800979.219000001,4234773.5375000015],[-11741979.888900001,4281374.6479000002],[-11677414.5842,4364102.6711999997],[-11658490.2708,4450263.6296000034],[-11618415.2541,4510434.6384999976],[-11536038.8309,4551210.9196999967],[-11440304.0688,4575188.6854000017],[-11374625.5693,4603469.0248999968],[-11243268.5701,4673085.8476999998],[-11170910.9011,4694492.129900001],[-11108571.986300001,4713080.7278999984],[-11079628.9187,4715943.5342999995],[-11056251.8256,4711649.6274000034],[-11031761.537599999,4677363.5104999989],[-11039553.902000001,4610551.2211999968],[-11094100.452500001,4485204.8958000019],[-11163118.536699999,4301997.4438999966],[-11187608.8247,4154372.4878999963],[-11248834.5447,3941853.2911999971],[-11288909.5613,3862167.4649000019],[-11331210.967800001,3843651.6652999967],[-11443643.6535,3837045.8994000033],[-11862204.938900001,3731847.9636999965],[-12036976.5395,3723995.0672999993],[-12038089.7344,3663957.0930999964],[-12044768.9038,3662655.1833000034],[-12150522.4201,3654846.6152999997],[-12180578.682599999,3764623.3540999964],[-12175012.7081,3866138.9184999987],[-12143843.250599999,3932528.5279000029],[-12072598.7765,4036861.4083999991],[-12057014.047800001,4085338.1557999998],[-12036976.5395,4120479.0078999996]],[[-11570547.8731,4157088.4179999977],[-11561642.3138,4052997.3125],[-11551623.559599999,4028802.0261000022],[-11523793.686899999,3993943.5794999972],[-11489284.6448,3981901.8421000019],[-11443643.6535,3977890.7289000005],[-11381304.738700001,3980564.6490999982],[-11346795.696599999,4004657.9562000036],[-11303381.095100001,4067808.7298000008],[-11241042.180299999,4259419.9654999971],[-11145307.418199999,4521667.378200002],[-11141967.8335,4604885.0753000006],[-11184269.24,4620474.4780000001],[-11261079.6886,4607717.7590999976],[-11313399.849300001,4593562.1064999998],[-11357927.6456,4555438.2714999989],[-11414700.585899999,4495009.2585999966],[-11468133.941500001,4404317.064000003],[-11570547.8731,4157088.4179999977]],[[-13428470.1744,4603469.0248999968],[-13432922.954,4568130.6520000026],[-13475224.3605,4546985.2844000012],[-13511959.7925,4558257.4610000029],[-13553148.004099999,4610551.2211999968],[-13605468.164799999,4708788.0317000002],[-13643316.7916,4794990.2268000022],[-13665580.6898,4865942.2795000002],[-13655561.935600001,4918395.237499997],[-13632184.842500001,4943262.002700001],[-13588770.2411,4931552.1604999974],[-13519752.1568,4809429.3422000036],[-13479677.1402,4704497.1494999975],[-13428470.1744,4603469.0248999968]]]}},{"attributes":{"dn":10,"valid":"202605171200","expire":"202605181200","idp_filedate":1779000015000,"idp_ingestdate":1779000034000,"idp_source":"firewx_day1_20260517_1200","objectid":3,"st_area(shape)":162866585476.58154,"st_perimeter(shape)":1694249.6095454905},"geometry":{"rings":[[[-11357927.6456,4555438.2714999989],[-11313399.849300001,4593562.1064999998],[-11261079.6886,4607717.7590999976],[-11184269.24,4620474.4780000001],[-11141967.8335,4604885.0753000006],[-11145307.418199999,4521667.378200002],[-11241042.180299999,4259419.9654999971],[-11303381.095100001,4067808.7298000008],[-11346795.696599999,4004657.9562000036],[-11381304.738700001,3980564.6490999982],[-11443643.6535,3977890.7289000005],[-11489284.6448,3981901.8421000019],[-11523793.686899999,3993943.5794999972],[-11551623.559599999,4028802.0261000022],[-11561642.3138,4052997.3125],[-11570547.8731,4157088.4179999977],[-11468133.941500001,4404317.064000003],[-11414700.585899999,4495009.2585999966],[-11357927.6456,4555438.2714999989]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_prob_hail.esri.json b/tests/fixtures/arcgis_day1_prob_hail.esri.json new file mode 100644 index 0000000..92e5610 --- /dev/null +++ b/tests/fixtures/arcgis_day1_prob_hail.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"objectid":"Object Id","dn":"dn value","valid":"valid","expire":"expire","idp_source":"GIS Source","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)","issue":"issue","label":"label","label2":"label2","stroke":"stroke","fill":"fill"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4269,"latestWkid":4269},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"Object Id"},{"name":"dn","type":"esriFieldTypeInteger","alias":"dn value"},{"name":"valid","type":"esriFieldTypeString","alias":"valid","length":80},{"name":"expire","type":"esriFieldTypeString","alias":"expire","length":80},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"},{"name":"issue","type":"esriFieldTypeString","alias":"issue","length":80},{"name":"label","type":"esriFieldTypeString","alias":"label","length":80},{"name":"label2","type":"esriFieldTypeString","alias":"label2","length":80},{"name":"stroke","type":"esriFieldTypeString","alias":"stroke","length":80},{"name":"fill","type":"esriFieldTypeString","alias":"fill","length":80}],"features":[{"attributes":{"objectid":1,"dn":5,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_hail","idp_filedate":1778998516000,"idp_ingestdate":1778998538000,"st_area(shape)":1759525837836.439,"st_perimeter(shape)":14748063.920618078,"issue":"202605170610","label":"0.05","label2":"5% Hail Risk","stroke":"#8B4726","fill":"#C5A392"},"geometry":{"rings":[[[-83.339995488724995,42.419991823805063],[-84.899995018348079,42.359991915149834],[-88.689993891948191,42.33999212843657],[-92.469992970377419,40.829992602735601],[-94.709992555662254,38.829993069893789],[-96.419992234595469,37.399993410105509],[-97.339992052819866,36.749993572345687],[-98.459991858668445,35.649993821454991],[-99.479991765217179,33.439994260802997],[-99.929991679912888,33.06999434833498],[-100.369991570953,33.099994362855696],[-100.67999148034302,33.34999433311625],[-101.13999133607882,33.839994269646795],[-101.15999128458316,34.489994159262274],[-101.04999126573277,35.099994050844593],[-100.77999123288852,36.299993837395974],[-100.54999111238088,38.239993512752321],[-101.69999079112772,38.639993522408467],[-103.3699903808587,38.739993614629029],[-104.9299900180491,38.729993718006462],[-105.51998979268771,39.539993645193576],[-105.37998969787972,40.599993492137365],[-102.2899901578995,42.709992982125684],[-102.1099901791718,42.879992945598168],[-99.369990596685653,44.809992479493161],[-96.369991188461285,46.2199920605998],[-90.779992575455168,47.719991442492912],[-87.888937890697036,48.347561734452398],[-87.079993672302692,48.026991146073549],[-85.676994196003378,47.452991140437014],[-84.652994581645927,46.988991146960437],[-84.443994684328487,46.698991178860304],[-84.033994816367851,46.686991156806343],[-83.879994908911286,46.325991203940887],[-83.81399493718429,46.263991210125468],[-83.742994961567035,46.251991207662293],[-83.600995009333261,46.228991203229683],[-83.413995068267894,46.231991192332636],[-83.250995136321222,46.092991204997766],[-83.287995152712767,45.850991245457294],[-83.291995157693989,45.798991253846019],[-82.23199552737681,45.498991244806071],[-81.964995752132523,44.143991455775129],[-81.901995826084487,43.585991548466403],[-82.086995805574816,43.179991628257916],[-82.072995824944087,43.024991654010357],[-82.195995799503223,42.878991685908964],[-82.253503994783884,42.701674780321866],[-83.339995488724995,42.419991823805063]],[[-94.219992354391209,42.0299925168461],[-91.90999276346156,44.019992057950034],[-91.629992679619718,45.279991850196026],[-92.679992233859466,46.259991781761855],[-94.749991623067515,46.359991918759526],[-96.049991323660592,45.929992075031549],[-98.059990946521268,44.799992380103731],[-101.55999046087716,41.799993052138881],[-102.48999034035178,40.939993238869143],[-103.63999016514654,40.099993437591813],[-104.00999012657275,39.679993522056435],[-103.93999019964038,39.179993588135417],[-103.39999034791758,38.97999358158372],[-102.28999059752329,39.119993487736181],[-100.68999097040681,39.289993359001073],[-99.929991185397995,39.039993348980708],[-99.629991323186644,38.409993429881844],[-99.899991338784346,37.539993585130702],[-100.17999132644672,36.919993701781365],[-100.39999133974746,36.129993843802929],[-100.51999134985869,35.649993930297569],[-100.43999139916789,35.279993988326204],[-100.01999150562216,35.219993977103663],[-99.379991645161269,35.449993904232386],[-98.389991797111776,36.629993650269633],[-97.229991930075613,38.439993281587121],[-95.989992107629575,39.919992964749731],[-94.359992332885753,41.889992547713561],[-94.219992354391209,42.0299925168461]],[[-83.609996186055213,30.179994333392969],[-84.579995809809887,32.409993863065488],[-85.239995574595142,33.319993688954753],[-85.499995421907215,34.72999340127646],[-85.179995469168304,35.489993231457326],[-83.709995860070038,36.089993048875435],[-83.009996070388496,36.009993037122442],[-82.549996256673666,35.149993198473595],[-82.269996375532884,34.48999332862121],[-81.719996722492667,30.449994213858552],[-81.739996752560046,29.49999443745228],[-82.419996566723114,29.199994527860941],[-83.609996186055213,30.179994333392969]]]}},{"attributes":{"objectid":2,"dn":15,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_hail","idp_filedate":1778998516000,"idp_ingestdate":1778998538000,"st_area(shape)":618483922014.41943,"st_perimeter(shape)":7352922.0851441026,"issue":"202605170610","label":"0.15","label2":"15% Hail Risk","stroke":"#FF9600","fill":"#FFEB7F"},"geometry":{"rings":[[[-94.219992354391209,42.0299925168461],[-94.359992332885753,41.889992547713561],[-95.989992107629575,39.919992964749731],[-97.229991930075613,38.439993281587121],[-98.389991797111776,36.629993650269633],[-99.379991645161269,35.449993904232386],[-100.01999150562216,35.219993977103663],[-100.43999139916789,35.279993988326204],[-100.51999134985869,35.649993930297569],[-100.39999133974746,36.129993843802929],[-100.17999132644672,36.919993701781365],[-99.899991338784346,37.539993585130702],[-99.629991323186644,38.409993429881844],[-99.929991185397995,39.039993348980708],[-100.68999097040681,39.289993359001073],[-102.28999059752329,39.119993487736181],[-103.39999034791758,38.97999358158372],[-103.93999019964038,39.179993588135417],[-104.00999012657275,39.679993522056435],[-103.63999016514654,40.099993437591813],[-102.48999034035178,40.939993238869143],[-101.55999046087716,41.799993052138881],[-98.059990946521268,44.799992380103731],[-96.049991323660592,45.929992075031549],[-94.749991623067515,46.359991918759526],[-92.679992233859466,46.259991781761855],[-91.629992679619718,45.279991850196026],[-91.90999276346156,44.019992057950034],[-94.219992354391209,42.0299925168461]],[[-102.3999904091349,40.549993287619579],[-102.59999042899274,39.969993384761857],[-102.34999053439526,39.569993425820066],[-101.23999080440082,39.56999335255383],[-100.23999101463758,39.909993236136039],[-99.409991194034788,40.179993140459928],[-98.779991365324079,40.079993115310515],[-98.729991409996359,39.779993158318419],[-98.589991524804304,39.019993269025576],[-97.839991713560167,39.049993218539804],[-97.299991826095678,39.319993141961142],[-96.679991909290635,40.079992982028578],[-96.059991932792826,41.359992740564259],[-95.7799918570865,42.62999252747916],[-95.659991776094941,43.519992386508946],[-95.849991675689722,43.879992347367043],[-96.409991475115248,44.229992337366831],[-97.009991327849974,44.119992396630323],[-97.449991242483264,43.879992462065239],[-98.369991093696655,43.179992628317841],[-100.30999076760536,41.849992955700124],[-102.3999904091349,40.549993287619579]]]}},{"attributes":{"objectid":3,"dn":30,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_hail","idp_filedate":1778998516000,"idp_ingestdate":1778998538000,"st_area(shape)":308664192442.42316,"st_perimeter(shape)":2555483.5640391787,"issue":"202605170610","label":"0.30","label2":"30% Hail Risk","stroke":"#FF0000","fill":"#FF7F7F"},"geometry":{"rings":[[[-102.3999904091349,40.549993287619579],[-100.30999076760536,41.849992955700124],[-98.369991093696655,43.179992628317841],[-97.449991242483264,43.879992462065239],[-97.009991327849974,44.119992396630323],[-96.409991475115248,44.229992337366831],[-95.849991675689722,43.879992347367043],[-95.659991776094941,43.519992386508946],[-95.7799918570865,42.62999252747916],[-96.059991932792826,41.359992740564259],[-96.679991909290635,40.079992982028578],[-97.299991826095678,39.319993141961142],[-97.839991713560167,39.049993218539804],[-98.589991524804304,39.019993269025576],[-98.729991409996359,39.779993158318419],[-98.779991365324079,40.079993115310515],[-99.409991194034788,40.179993140459928],[-100.23999101463758,39.909993236136039],[-101.23999080440082,39.56999335255383],[-102.34999053439526,39.569993425820066],[-102.59999042899274,39.969993384761857],[-102.3999904091349,40.549993287619579]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_prob_hail.geojson b/tests/fixtures/arcgis_day1_prob_hail.geojson new file mode 100644 index 0000000..09a6f59 --- /dev/null +++ b/tests/fixtures/arcgis_day1_prob_hail.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","id":1,"geometry":{"type":"MultiPolygon","coordinates":[[[[-83.339999999897429,42.419999999686297],[-82.253508196547301,42.701683060222138],[-82.195999999605505,42.878999999873919],[-82.073000000212531,43.024999999687225],[-82.086999999573763,43.180000000321606],[-81.902000000442953,43.586000000221262],[-81.965000000263487,44.143999999867013],[-82.231999999887961,45.499000000178953],[-83.292000000419137,45.798999999789963],[-83.288000000088303,45.850999999918884],[-83.250999999723149,46.092999999958195],[-83.413999999729413,46.232000000062598],[-83.600999999923971,46.228999999904573],[-83.742999999990033,46.251999999867309],[-83.813999999573923,46.264000000156429],[-83.879999999642592,46.325999999886392],[-84.033999999802802,46.686999999859879],[-84.44399999957605,46.698999999764233],[-84.652999999793494,46.988999999717691],[-85.677000000042227,47.453000000290707],[-87.08000000019527,48.02699999973062],[-87.888944520676688,48.347570579593352],[-90.779999999879848,47.719999999932952],[-96.369999999570837,46.220000000084383],[-99.369999999752125,44.810000000223887],[-102.10999999998954,42.879999999854086],[-102.28999999960514,42.710000000102198],[-105.3800000000434,40.600000000055935],[-105.51999999994405,39.540000000101017],[-104.92999999965689,38.729999999964342],[-103.36999999999381,38.740000000301045],[-101.70000000021629,38.640000000181047],[-100.55000000032646,38.240000000263805],[-100.77999999958578,36.300000000312835],[-101.05000000035669,35.100000000139019],[-101.15999999957282,34.489999999920308],[-101.13999999971534,33.840000000071193],[-100.68000000029839,33.350000000174745],[-100.36999999981252,33.100000000111621],[-99.930000000253074,33.07000000033532],[-99.479999999866564,33.439999999691686],[-98.459999999948664,35.649999999780974],[-97.339999999845048,36.750000000050804],[-96.42000000011285,37.399999999812138],[-94.709999999722058,38.830000000038105],[-92.470000000413165,40.830000000139044],[-88.690000000400346,42.340000000110351],[-84.899999999560492,42.359999999929471],[-83.339999999897429,42.419999999686297]],[[-94.219999999620583,42.029999999927867],[-94.360000000419561,41.889999999801397],[-95.989999999583816,39.919999999922204],[-97.229999999730595,38.4400000002395],[-98.390000000447486,36.630000000229039],[-99.379999999680848,35.450000000124199],[-100.01999999961173,35.220000000366213],[-100.44000000021202,35.279999999854347],[-100.51999999964194,35.649999999780974],[-100.39999999959876,36.129999999702626],[-100.18000000026818,36.919999999914012],[-99.89999999956855,37.540000000108833],[-99.629999999695954,38.410000000283972],[-99.930000000253074,39.039999999770963],[-100.69000000022714,39.289999999965403],[-102.28999999960514,39.119999999676871],[-103.39999999978002,38.980000000347161],[-103.94000000042351,39.180000000009002],[-104.00999999992469,39.680000000210661],[-103.6399999998664,40.100000000259179],[-102.48999999997658,40.939999999840744],[-101.56000000031563,41.799999999732449],[-98.060000000104154,44.799999999825943],[-96.050000000054567,45.929999999981725],[-94.750000000335334,46.359999999779767],[-92.67999999981501,46.260000000150285],[-91.630000000110883,45.280000000253388],[-91.909999999912216,44.019999999888441],[-94.219999999620583,42.029999999927867]]],[[[-83.609999999769997,30.180000000321087],[-82.420000000165217,29.200000000262779],[-81.739999999621091,29.499999999755577],[-81.719999999763587,30.449999999631796],[-82.270000000335827,34.489999999920308],[-82.550000000137132,35.149999999797203],[-83.009999999554083,36.010000000157547],[-83.709999999955713,36.090000000189825],[-85.180000000260122,35.489999999736817],[-85.499999999776406,34.729999999774726],[-85.239999999832548,33.319999999867527],[-84.580000000044208,32.410000000275467],[-83.609999999769997,30.180000000321087]]]]},"properties":{"objectid":1,"dn":5,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_hail","idp_filedate":1778998516000,"idp_ingestdate":1778998538000,"st_area(shape)":1759525837836.439,"st_perimeter(shape)":14748063.920618078,"issue":"202605170610","label":"0.05","label2":"5% Hail Risk","stroke":"#8B4726","fill":"#C5A392"}},{"type":"Feature","id":2,"geometry":{"type":"Polygon","coordinates":[[[-94.219999999620583,42.029999999927867],[-91.909999999912216,44.019999999888441],[-91.630000000110883,45.280000000253388],[-92.67999999981501,46.260000000150285],[-94.750000000335334,46.359999999779767],[-96.050000000054567,45.929999999981725],[-98.060000000104154,44.799999999825943],[-101.56000000031563,41.799999999732449],[-102.48999999997658,40.939999999840744],[-103.6399999998664,40.100000000259179],[-104.00999999992469,39.680000000210661],[-103.94000000042351,39.180000000009002],[-103.39999999978002,38.980000000347161],[-102.28999999960514,39.119999999676871],[-100.69000000022714,39.289999999965403],[-99.930000000253074,39.039999999770963],[-99.629999999695954,38.410000000283972],[-99.89999999956855,37.540000000108833],[-100.18000000026818,36.919999999914012],[-100.39999999959876,36.129999999702626],[-100.51999999964194,35.649999999780974],[-100.44000000021202,35.279999999854347],[-100.01999999961173,35.220000000366213],[-99.379999999680848,35.450000000124199],[-98.390000000447486,36.630000000229039],[-97.229999999730595,38.4400000002395],[-95.989999999583816,39.919999999922204],[-94.360000000419561,41.889999999801397],[-94.219999999620583,42.029999999927867]],[[-102.39999999971961,40.549999999810503],[-100.31000000024011,41.84999999968236],[-98.369999999691686,43.180000000321606],[-97.449999999959502,43.87999999977265],[-97.010000000400012,44.120000000204818],[-96.410000000184112,44.229999999996593],[-95.849999999683149,43.87999999977265],[-95.660000000138794,43.51999999968826],[-95.780000000181971,42.629999999960411],[-96.05999999998329,41.36000000000066],[-96.680000000056694,40.08000000026999],[-97.300000000130083,39.320000000014204],[-97.839999999875246,39.050000000173412],[-98.589999999920579,39.019999999963822],[-98.729999999821231,39.780000000036935],[-98.780000000363245,40.08000000026999],[-99.410000000365386,40.17999999978651],[-100.23999999984061,39.91000000022828],[-101.23999999990103,39.570000000078899],[-102.35000000007591,39.570000000078899],[-102.60000000009101,39.970000000258793],[-102.39999999971961,40.549999999810503]]]},"properties":{"objectid":2,"dn":15,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_hail","idp_filedate":1778998516000,"idp_ingestdate":1778998538000,"st_area(shape)":618483922014.41943,"st_perimeter(shape)":7352922.0851441026,"issue":"202605170610","label":"0.15","label2":"15% Hail Risk","stroke":"#FF9600","fill":"#FFEB7F"}},{"type":"Feature","id":3,"geometry":{"type":"Polygon","coordinates":[[[-102.39999999971961,40.549999999810503],[-102.60000000009101,39.970000000258793],[-102.35000000007591,39.570000000078899],[-101.23999999990103,39.570000000078899],[-100.23999999984061,39.91000000022828],[-99.410000000365386,40.17999999978651],[-98.780000000363245,40.08000000026999],[-98.729999999821231,39.780000000036935],[-98.589999999920579,39.019999999963822],[-97.839999999875246,39.050000000173412],[-97.300000000130083,39.320000000014204],[-96.680000000056694,40.08000000026999],[-96.05999999998329,41.36000000000066],[-95.780000000181971,42.629999999960411],[-95.660000000138794,43.51999999968826],[-95.849999999683149,43.87999999977265],[-96.410000000184112,44.229999999996593],[-97.010000000400012,44.120000000204818],[-97.449999999959502,43.87999999977265],[-98.369999999691686,43.180000000321606],[-100.31000000024011,41.84999999968236],[-102.39999999971961,40.549999999810503]]]},"properties":{"objectid":3,"dn":30,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_hail","idp_filedate":1778998516000,"idp_ingestdate":1778998538000,"st_area(shape)":308664192442.42316,"st_perimeter(shape)":2555483.5640391787,"issue":"202605170610","label":"0.30","label2":"30% Hail Risk","stroke":"#FF0000","fill":"#FF7F7F"}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_prob_tornado.esri.json b/tests/fixtures/arcgis_day1_prob_tornado.esri.json new file mode 100644 index 0000000..9c3e792 --- /dev/null +++ b/tests/fixtures/arcgis_day1_prob_tornado.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"objectid":"Object Id","dn":"dn value","valid":"valid","expire":"expire","idp_source":"GIS Source","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)","issue":"issue","label":"label","label2":"label2","stroke":"stroke","fill":"fill"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4269,"latestWkid":4269},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"Object Id"},{"name":"dn","type":"esriFieldTypeInteger","alias":"dn value"},{"name":"valid","type":"esriFieldTypeString","alias":"valid","length":80},{"name":"expire","type":"esriFieldTypeString","alias":"expire","length":80},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"},{"name":"issue","type":"esriFieldTypeString","alias":"issue","length":80},{"name":"label","type":"esriFieldTypeString","alias":"label","length":80},{"name":"label2","type":"esriFieldTypeString","alias":"label2","length":80},{"name":"stroke","type":"esriFieldTypeString","alias":"stroke","length":80},{"name":"fill","type":"esriFieldTypeString","alias":"fill","length":80}],"features":[{"attributes":{"objectid":1,"dn":2,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_torn","idp_filedate":1778998516000,"idp_ingestdate":1778998542000,"st_area(shape)":911159670966.25464,"st_perimeter(shape)":9424264.3661453295,"issue":"202605170610","label":"0.02","label2":"2% Tornado Risk","stroke":"#1A731D","fill":"#79BA7A"},"geometry":{"rings":[[[-104.70999006832298,38.73999370237923],[-104.96998997009489,39.089993669964997],[-105.13998986486958,39.669993600676072],[-104.96998985624236,40.079993533198767],[-102.08999043921072,40.929993212107576],[-100.17999079548639,41.889992940901521],[-98.749991002112623,43.11999266402519],[-97.599991128413478,44.399992400382942],[-96.669991241109074,45.349992200503657],[-94.939991634935268,45.929991991958985],[-92.719992298757276,45.739991858247627],[-91.589992686132646,45.319991841383036],[-91.109992916240472,44.639991911137621],[-90.129993265401666,44.139991924974247],[-88.549993744892689,44.029991843560389],[-86.109994441855719,44.369991644102726],[-84.769994864937246,44.259991586018437],[-83.179995420786668,43.649991602955097],[-82.879995534987529,43.429991624957189],[-82.899995616203057,42.509991786377491],[-83.649995409915363,42.249991869764486],[-85.699994788124812,42.249991976815537],[-87.639994206437521,42.279992078590595],[-90.259993453889095,42.169992249068869],[-92.659992869831157,41.279992539654394],[-93.349992779460635,40.319992739896293],[-94.099992638081105,39.679992891250151],[-95.419992342153137,39.089993067240158],[-96.409992135960067,38.519993220113669],[-97.879991930150297,36.56999363239661],[-98.689991787086157,35.829993802439695],[-99.809991553024162,35.279993955442755],[-100.36999140640363,35.399993964731074],[-100.5399913425302,35.689993924832521],[-100.27999134630299,36.399993793031527],[-99.74999136595649,37.649993558377247],[-99.609991336153826,38.329993441165804],[-99.979991180809733,38.959993364713497],[-101.53999081901097,38.739993497205532],[-102.309990632658,38.749993544791835],[-104.08999021639222,38.699993666898393],[-104.70999006832298,38.73999370237923]],[[-100.18999096327525,40.479993147342796],[-99.82999111430037,39.93999320452221],[-99.269991270344534,39.799993189734387],[-98.889991414392028,39.349993235320696],[-98.689991517669895,38.839993304018556],[-98.129991661819687,38.81999327334298],[-97.219991861613224,39.16999316167221],[-95.889992147178774,39.799992978209133],[-95.089992277778578,40.589992801382913],[-94.319992408558022,41.30999263716069],[-93.569992437657277,42.849992347057906],[-93.469992237743,44.629992071617608],[-94.319991901981183,45.309992033131408],[-95.379991591284082,45.399992097670342],[-96.149991420207684,45.109992194655412],[-96.579991335435921,44.879992258659769],[-97.279991235086385,44.259992396345254],[-98.48999111281617,42.79999269084999],[-100.12999091464985,41.019993063446826],[-100.18999096327525,40.479993147342796]]]}},{"attributes":{"objectid":2,"dn":5,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_torn","idp_filedate":1778998516000,"idp_ingestdate":1778998542000,"st_area(shape)":249018758781.1904,"st_perimeter(shape)":4358012.670394144,"issue":"202605170610","label":"0.05","label2":"5% Tornado Risk","stroke":"#7F3F27","fill":"#BD998A"},"geometry":{"rings":[[[-100.18999096327525,40.479993147342796],[-100.12999091464985,41.019993063446826],[-98.48999111281617,42.79999269084999],[-97.279991235086385,44.259992396345254],[-96.579991335435921,44.879992258659769],[-96.149991420207684,45.109992194655412],[-95.379991591284082,45.399992097670342],[-94.319991901981183,45.309992033131408],[-93.469992237743,44.629992071617608],[-93.569992437657277,42.849992347057906],[-94.319992408558022,41.30999263716069],[-95.089992277778578,40.589992801382913],[-95.889992147178774,39.799992978209133],[-97.219991861613224,39.16999316167221],[-98.129991661819687,38.81999327334298],[-98.689991517669895,38.839993304018556],[-98.889991414392028,39.349993235320696],[-99.269991270344534,39.799993189734387],[-99.82999111430037,39.93999320452221],[-100.18999096327525,40.479993147342796]],[[-94.679992210954893,42.179992523228044],[-94.289992180683569,43.309992324171525],[-95.039991864090666,44.139992253093659],[-96.329991495216788,44.239992329943185],[-97.099991332172394,43.909992432461138],[-97.98999120327116,43.109992610598447],[-98.469991186609946,42.269992765914964],[-98.479991212862586,42.039992800475531],[-98.359991341010286,41.239992910571161],[-98.289991433338074,40.59999300334654],[-98.099991510919381,40.339993030939809],[-97.359991725640924,40.129993016296311],[-96.599991909806718,40.269992946243988],[-95.779992030595025,41.15999275403879],[-94.679992210954893,42.179992523228044]]]}},{"attributes":{"objectid":3,"dn":10,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_torn","idp_filedate":1778998516000,"idp_ingestdate":1778998542000,"st_area(shape)":118436942810.32417,"st_perimeter(shape)":2726098.764454369,"issue":"202605170610","label":"0.10","label2":"10% Tornado Risk","stroke":"#FD8A2B","fill":"#FFE481"},"geometry":{"rings":[[[-94.679992210954893,42.179992523228044],[-95.779992030595025,41.15999275403879],[-96.599991909806718,40.269992946243988],[-97.359991725640924,40.129993016296311],[-98.099991510919381,40.339993030939809],[-98.289991433338074,40.59999300334654],[-98.359991341010286,41.239992910571161],[-98.479991212862586,42.039992800475531],[-98.469991186609946,42.269992765914964],[-97.98999120327116,43.109992610598447],[-97.099991332172394,43.909992432461138],[-96.329991495216788,44.239992329943185],[-95.039991864090666,44.139992253093659],[-94.289992180683569,43.309992324171525],[-94.679992210954893,42.179992523228044]],[[-95.919991936959491,41.649992686352562],[-95.519991948600122,42.459992535887544],[-95.37999190969353,43.079992433024316],[-95.699991779279145,43.409992405764392],[-96.439991550248664,43.619992426664595],[-96.81999146363529,43.499992471138953],[-97.449991352035042,43.069992577750291],[-97.869991328346671,42.389992706385016],[-97.949991365014412,41.929992780054818],[-97.909991431335342,41.469992846269299],[-97.419991598079818,41.139992863686395],[-96.699991784115127,41.169992811997176],[-95.919991936959491,41.649992686352562]]]}},{"attributes":{"objectid":4,"dn":15,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_torn","idp_filedate":1778998516000,"idp_ingestdate":1778998542000,"st_area(shape)":76021875376.337814,"st_perimeter(shape)":1034525.2644980368,"issue":"202605170610","label":"0.15","label2":"15% Tornado Risk","stroke":"#FF0000","fill":"#FF8080"},"geometry":{"rings":[[[-95.919991936959491,41.649992686352562],[-96.699991784115127,41.169992811997176],[-97.419991598079818,41.139992863686395],[-97.909991431335342,41.469992846269299],[-97.949991365014412,41.929992780054818],[-97.869991328346671,42.389992706385016],[-97.449991352035042,43.069992577750291],[-96.81999146363529,43.499992471138953],[-96.439991550248664,43.619992426664595],[-95.699991779279145,43.409992405764392],[-95.37999190969353,43.079992433024316],[-95.519991948600122,42.459992535887544],[-95.919991936959491,41.649992686352562]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_prob_tornado.geojson b/tests/fixtures/arcgis_day1_prob_tornado.geojson new file mode 100644 index 0000000..44f7e6c --- /dev/null +++ b/tests/fixtures/arcgis_day1_prob_tornado.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","id":1,"geometry":{"type":"Polygon","coordinates":[[[-104.71000000032632,38.740000000301045],[-104.09000000025291,38.69999999982462],[-102.31000000036094,38.750000000322764],[-101.53999999955984,38.740000000301045],[-99.979999999896776,38.959999999935263],[-99.609999999838479,38.330000000067116],[-99.749999999739131,37.649999999919068],[-100.27999999955556,36.400000000203306],[-100.54000000039773,35.689999999929078],[-100.36999999981252,35.400000000194744],[-99.810000000209882,35.279999999854347],[-98.690000000106266,35.829999999754577],[-97.879999999590211,36.569999999940499],[-96.410000000184112,38.519999999948283],[-95.420000000052426,39.09000000004071],[-94.099999999577406,39.680000000210661],[-93.350000000430413,40.320000000092691],[-92.659999999957506,41.279999999930624],[-90.259999999992161,42.170000000236577],[-87.639999999797922,42.280000000146458],[-85.700000000147824,42.249999999955087],[-83.650000000383272,42.249999999955087],[-82.900000000337954,42.510000000279831],[-82.879999999582154,43.430000000125212],[-83.180000000139287,43.650000000231458],[-84.769999999588563,44.259999999860604],[-86.109999999921058,44.369999999909304],[-88.549999999601383,44.029999999728162],[-90.130000000020232,44.140000000317826],[-91.110000000223181,44.640000000127081],[-91.590000000395932,45.320000000059068],[-92.720000000428257,45.739999999900888],[-94.939999999879689,45.929999999981725],[-96.670000000127956,45.349999999925032],[-97.599999999788892,44.399999999769868],[-98.749999999678707,43.120000000073169],[-100.18000000026818,41.889999999801397],[-102.09000000013205,40.929999999822691],[-104.97000000027015,40.08000000026999],[-105.13999999995704,39.66999999971776],[-104.97000000027015,39.09000000004071],[-104.71000000032632,38.740000000301045]],[[-100.19000000019693,40.480000000109001],[-100.12999999972617,41.019999999978921],[-98.489999999734877,42.800000000061303],[-97.280000000272608,44.259999999860604],[-96.579999999870992,44.880000000127652],[-96.150000000240254,45.109999999820516],[-95.380000000337461,45.399999999874701],[-94.319999999806299,45.309999999695037],[-93.469999999575279,44.629999999892355],[-93.569999999760967,42.850000000122854],[-94.319999999806299,41.309999999780814],[-95.089999999709093,40.590000000320494],[-95.890000000296425,39.80000000000102],[-97.219999999801857,39.170000000344245],[-98.129999999605317,38.820000000330992],[-98.690000000106266,38.840000000150404],[-98.889999999579373,39.349999999762829],[-99.269999999566409,39.80000000000102],[-99.830000000067372,39.93999999994972],[-100.19000000019693,40.480000000109001]]]},"properties":{"objectid":1,"dn":2,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_torn","idp_filedate":1778998516000,"idp_ingestdate":1778998542000,"st_area(shape)":911159670966.25464,"st_perimeter(shape)":9424264.3661453295,"issue":"202605170610","label":"0.02","label2":"2% Tornado Risk","stroke":"#1A731D","fill":"#79BA7A"}},{"type":"Feature","id":2,"geometry":{"type":"Polygon","coordinates":[[[-100.19000000019693,40.480000000109001],[-99.830000000067372,39.93999999994972],[-99.269999999566409,39.80000000000102],[-98.889999999579373,39.349999999762829],[-98.690000000106266,38.840000000150404],[-98.129999999605317,38.820000000330992],[-97.219999999801857,39.170000000344245],[-95.890000000296425,39.80000000000102],[-95.089999999709093,40.590000000320494],[-94.319999999806299,41.309999999780814],[-93.569999999760967,42.850000000122854],[-93.469999999575279,44.629999999892355],[-94.319999999806299,45.309999999695037],[-95.380000000337461,45.399999999874701],[-96.150000000240254,45.109999999820516],[-96.579999999870992,44.880000000127652],[-97.280000000272608,44.259999999860604],[-98.489999999734877,42.800000000061303],[-100.12999999972617,41.019999999978921],[-100.19000000019693,40.480000000109001]],[[-94.679999999935845,42.179999999935056],[-95.780000000181971,41.160000000259153],[-96.599999999728468,40.269999999755107],[-97.359999999702524,40.129999999762028],[-98.099999999819104,40.339999999947196],[-98.29000000026177,40.600000000055935],[-98.359999999762948,41.23999999977373],[-98.479999999806125,42.040000000246266],[-98.469999999877402,42.269999999983831],[-97.989999999704651,43.109999999906542],[-97.09999999975868,43.909999999796085],[-96.329999999855886,44.239999999767448],[-95.04000000006539,44.140000000317826],[-94.290000000020086,43.309999999821471],[-94.679999999935845,42.179999999935056]]]},"properties":{"objectid":2,"dn":5,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_torn","idp_filedate":1778998516000,"idp_ingestdate":1778998542000,"st_area(shape)":249018758781.1904,"st_perimeter(shape)":4358012.670394144,"issue":"202605170610","label":"0.05","label2":"5% Tornado Risk","stroke":"#7F3F27","fill":"#BD998A"}},{"type":"Feature","id":3,"geometry":{"type":"Polygon","coordinates":[[[-94.679999999935845,42.179999999935056],[-94.290000000020086,43.309999999821471],[-95.04000000006539,44.140000000317826],[-96.329999999855886,44.239999999767448],[-97.09999999975868,43.909999999796085],[-97.989999999704651,43.109999999906542],[-98.469999999877402,42.269999999983831],[-98.479999999806125,42.040000000246266],[-98.359999999762948,41.23999999977373],[-98.29000000026177,40.600000000055935],[-98.099999999819104,40.339999999947196],[-97.359999999702524,40.129999999762028],[-96.599999999728468,40.269999999755107],[-95.780000000181971,41.160000000259153],[-94.679999999935845,42.179999999935056]],[[-95.920000000082638,41.64999999989908],[-96.699999999914183,41.170000000328116],[-97.420000000173275,41.14000000023217],[-97.910000000274735,41.470000000304232],[-97.9499999999897,41.930000000121048],[-97.869999999661459,42.389999999826351],[-97.449999999959502,43.069999999697266],[-96.819999999957361,43.499999999874056],[-96.439999999970325,43.619999999684104],[-95.699999999853745,43.409999999973834],[-95.380000000337461,43.080000000235572],[-95.520000000238127,42.460000000125952],[-95.920000000082638,41.64999999989908]]]},"properties":{"objectid":3,"dn":10,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_torn","idp_filedate":1778998516000,"idp_ingestdate":1778998542000,"st_area(shape)":118436942810.32417,"st_perimeter(shape)":2726098.764454369,"issue":"202605170610","label":"0.10","label2":"10% Tornado Risk","stroke":"#FD8A2B","fill":"#FFE481"}},{"type":"Feature","id":4,"geometry":{"type":"Polygon","coordinates":[[[-95.920000000082638,41.64999999989908],[-95.520000000238127,42.460000000125952],[-95.380000000337461,43.080000000235572],[-95.699999999853745,43.409999999973834],[-96.439999999970325,43.619999999684104],[-96.819999999957361,43.499999999874056],[-97.449999999959502,43.069999999697266],[-97.869999999661459,42.389999999826351],[-97.9499999999897,41.930000000121048],[-97.910000000274735,41.470000000304232],[-97.420000000173275,41.14000000023217],[-96.699999999914183,41.170000000328116],[-95.920000000082638,41.64999999989908]]]},"properties":{"objectid":4,"dn":15,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_torn","idp_filedate":1778998516000,"idp_ingestdate":1778998542000,"st_area(shape)":76021875376.337814,"st_perimeter(shape)":1034525.2644980368,"issue":"202605170610","label":"0.15","label2":"15% Tornado Risk","stroke":"#FF0000","fill":"#FF8080"}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_prob_wind.esri.json b/tests/fixtures/arcgis_day1_prob_wind.esri.json new file mode 100644 index 0000000..82d4e40 --- /dev/null +++ b/tests/fixtures/arcgis_day1_prob_wind.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"objectid":"Object Id","dn":"dn value","valid":"valid","expire":"expire","idp_source":"GIS Source","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)","issue":"issue","label":"label","label2":"label2","stroke":"stroke","fill":"fill"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4269,"latestWkid":4269},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"Object Id"},{"name":"dn","type":"esriFieldTypeInteger","alias":"dn value"},{"name":"valid","type":"esriFieldTypeString","alias":"valid","length":80},{"name":"expire","type":"esriFieldTypeString","alias":"expire","length":80},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"},{"name":"issue","type":"esriFieldTypeString","alias":"issue","length":80},{"name":"label","type":"esriFieldTypeString","alias":"label","length":80},{"name":"label2","type":"esriFieldTypeString","alias":"label2","length":80},{"name":"stroke","type":"esriFieldTypeString","alias":"stroke","length":80},{"name":"fill","type":"esriFieldTypeString","alias":"fill","length":80}],"features":[{"attributes":{"objectid":1,"dn":5,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998546000,"st_area(shape)":2370850438232.9106,"st_perimeter(shape)":16994630.161620613,"issue":"202605170610","label":"0.05","label2":"5% Wind Risk","stroke":"#8B4726","fill":"#C5A392"},"geometry":{"rings":[[[-83.3199954950055,42.419991822793342],[-85.029994993263571,42.219991946588046],[-88.039994094463367,42.219992111365137],[-90.109993571756988,41.459992358242182],[-91.889993262433777,39.489992796894164],[-92.799993235295659,36.899993307250668],[-93.919993031717738,35.62999359655587],[-95.939992549845144,34.979993814264198],[-98.27999204558337,33.68999416001995],[-99.349991849210653,32.619994403773596],[-100.27999164411438,32.269994507494083],[-101.24999138425568,32.719994470096061],[-101.02999124550171,35.409993998087671],[-100.34999117398769,38.109993520464627],[-101.1599908961926,38.889993449755188],[-103.43999036049429,38.779993612960133],[-106.78998963570881,38.37999389040472],[-109.92998903638119,37.669994193824522],[-111.1399887702858,37.839994253078089],[-111.39998862751612,38.649994171688732],[-110.15998873666389,39.869993934346695],[-107.4099891901418,40.969993593837565],[-103.12999000336968,42.339993094656755],[-101.52999027422824,43.229992855243516],[-99.02999070063882,44.719992465176993],[-96.649991138453998,46.04999210495825],[-87.942792997419673,48.368903581096234],[-87.079993672302692,48.026991146073549],[-85.676994196003378,47.452991140437014],[-84.652994581645927,46.988991146960437],[-84.443994684328487,46.698991178860304],[-84.033994816367851,46.686991156806343],[-83.879994908911286,46.325991203940887],[-83.81399493718429,46.263991210125468],[-83.742994961567035,46.251991207662293],[-83.600995009333261,46.228991203229683],[-83.413995068267894,46.231991192332636],[-83.250995136321222,46.092991204997766],[-83.287995152712767,45.850991245457294],[-83.291995157693989,45.798991253846019],[-82.23199552737681,45.498991244806071],[-81.964995752132523,44.143991455775129],[-81.901995826084487,43.585991548466403],[-82.086995805574816,43.179991628257916],[-82.072995824944087,43.024991654010357],[-82.195995799503223,42.878991685908964],[-82.276407887036939,42.631054457123334],[-83.3199954950055,42.419991822793342]],[[-96.619991279840875,45.179992219834403],[-97.699991047594153,44.769992357255681],[-102.54999030772574,41.089993222032184],[-103.27999021874639,40.369993374155051],[-103.10999035548258,39.539993480970601],[-102.32999053491727,39.609993418645075],[-101.39999076053395,39.609993357093181],[-100.13999112207053,39.139993346774297],[-99.479991361842011,38.399993421804623],[-99.719991375477107,37.629993559819106],[-100.14999135329045,36.689993737958162],[-100.35999133806649,36.269993818882554],[-100.38999137670309,35.70999391348721],[-100.00999149571695,35.379993949129286],[-99.19999167202073,35.679993855271732],[-99.039991708014767,35.729993838277188],[-97.749991960666662,36.599993619948926],[-96.139992259098705,37.949993300772682],[-95.749992316729873,38.439993195744115],[-95.069992439840462,39.039993054915669],[-94.089992632976418,39.759992876791856],[-93.599992732215725,40.109992789709679],[-92.979992847543798,40.649992662603765],[-92.209992950002913,41.699992443950968],[-91.479993077440227,42.419992281771762],[-91.149993106342734,42.989992170074039],[-90.779993070353314,44.179991959882429],[-90.879992953474371,44.869991860991284],[-92.109992511026903,45.489991852041364],[-94.099991924966375,45.579991979515299],[-96.619991279840875,45.179992219834403]],[[-85.129995476330564,35.599993206833432],[-83.639995877122587,36.139993035539923],[-82.979996073999516,36.099993016943515],[-82.289996362519418,34.619993301872306],[-81.999996531876832,32.949993655367088],[-81.809996660630347,31.329994013815604],[-81.65999675283949,30.129994287446607],[-81.089996976217137,28.519994654744703],[-80.679997152977961,26.669995098678797],[-80.999997083876153,25.799995324531263],[-81.659996887309276,25.979995293035376],[-82.619996575604517,27.169995020954019],[-82.969996455769035,27.789994879111596],[-83.089090625981513,28.416342135774855],[-83.013996420823275,28.464994718544155],[-82.989996424598743,28.550994697047411],[-83.025996407517994,28.752994649992175],[-83.160779986911606,28.793375161679389],[-83.239996329349282,29.209994548495583],[-84.289995974464333,30.599994257995554],[-84.639995823721037,31.739994012790245],[-85.649995447036702,33.509993663777365],[-85.649995379242483,34.719993409265676],[-85.129995476330564,35.599993206833432]]]}},{"attributes":{"objectid":2,"dn":15,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998546000,"st_area(shape)":824646254356.96594,"st_perimeter(shape)":6448665.3240879215,"issue":"202605170610","label":"0.15","label2":"15% Wind Risk","stroke":"#FF9600","fill":"#FFEB7F"},"geometry":{"rings":[[[-96.619991279840875,45.179992219834403],[-94.099991924966375,45.579991979515299],[-92.109992511026903,45.489991852041364],[-90.879992953474371,44.869991860991284],[-90.779993070353314,44.179991959882429],[-91.149993106342734,42.989992170074039],[-91.479993077440227,42.419992281771762],[-92.209992950002913,41.699992443950968],[-92.979992847543798,40.649992662603765],[-93.599992732215725,40.109992789709679],[-94.089992632976418,39.759992876791856],[-95.069992439840462,39.039993054915669],[-95.749992316729873,38.439993195744115],[-96.139992259098705,37.949993300772682],[-97.749991960666662,36.599993619948926],[-99.039991708014767,35.729993838277188],[-99.19999167202073,35.679993855271732],[-100.00999149571695,35.379993949129286],[-100.38999137670309,35.70999391348721],[-100.35999133806649,36.269993818882554],[-100.14999135329045,36.689993737958162],[-99.719991375477107,37.629993559819106],[-99.479991361842011,38.399993421804623],[-100.13999112207053,39.139993346774297],[-101.39999076053395,39.609993357093181],[-102.32999053491727,39.609993418645075],[-103.10999035548258,39.539993480970601],[-103.27999021874639,40.369993374155051],[-102.54999030772574,41.089993222032184],[-97.699991047594153,44.769992357255681],[-96.619991279840875,45.179992219834403]],[[-94.469992289239997,41.999992537397539],[-93.939992306516629,43.079992336152628],[-94.059992180598172,43.809992233829256],[-95.319991775481625,44.219992260764947],[-96.289991524474189,44.109992345989113],[-97.889991205008059,43.299992576519479],[-98.87999105022368,42.499992761422497],[-99.019991090181406,41.899992858322648],[-98.919991150002616,41.629992890999993],[-98.30999133418598,41.40999288177867],[-97.919991479022798,41.039992911708573],[-97.699991649340816,40.019993055524978],[-96.799991893623201,39.929993013036182],[-95.609992156322846,40.419992860792881],[-94.469992289239997,41.999992537397539]]]}},{"attributes":{"objectid":3,"dn":30,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998546000,"st_area(shape)":234447073149.53195,"st_perimeter(shape)":1878549.4816877588,"issue":"202605170610","label":"0.30","label2":"30% Wind Risk","stroke":"#FF0000","fill":"#FF7F7F"},"geometry":{"rings":[[[-94.469992289239997,41.999992537397539],[-95.609992156322846,40.419992860792881],[-96.799991893623201,39.929993013036182],[-97.699991649340816,40.019993055524978],[-97.919991479022798,41.039992911708573],[-98.30999133418598,41.40999288177867],[-98.919991150002616,41.629992890999993],[-99.019991090181406,41.899992858322648],[-98.87999105022368,42.499992761422497],[-97.889991205008059,43.299992576519479],[-96.289991524474189,44.109992345989113],[-95.319991775481625,44.219992260764947],[-94.059992180598172,43.809992233829256],[-93.939992306516629,43.079992336152628],[-94.469992289239997,41.999992537397539]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_prob_wind.geojson b/tests/fixtures/arcgis_day1_prob_wind.geojson new file mode 100644 index 0000000..37b2d2c --- /dev/null +++ b/tests/fixtures/arcgis_day1_prob_wind.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","id":1,"geometry":{"type":"MultiPolygon","coordinates":[[[[-83.320000000039926,42.419999999686297],[-82.276412089493917,42.631062723420918],[-82.195999999605505,42.878999999873919],[-82.073000000212531,43.024999999687225],[-82.086999999573763,43.180000000321606],[-81.902000000442953,43.586000000221262],[-81.965000000263487,44.143999999867013],[-82.231999999887961,45.499000000178953],[-83.292000000419137,45.798999999789963],[-83.288000000088303,45.850999999918884],[-83.250999999723149,46.092999999958195],[-83.413999999729413,46.232000000062598],[-83.600999999923971,46.228999999904573],[-83.742999999990033,46.251999999867309],[-83.813999999573923,46.264000000156429],[-83.879999999642592,46.325999999886392],[-84.033999999802802,46.686999999859879],[-84.44399999957605,46.698999999764233],[-84.652999999793494,46.988999999717691],[-85.677000000042227,47.453000000290707],[-87.08000000019527,48.02699999973062],[-87.942799647548696,48.368912425580994],[-96.650000000270481,46.05000000030256],[-99.030000000378351,44.720000000163111],[-101.5299999996311,43.230000000154995],[-103.12999999990744,42.340000000110351],[-107.40999999995046,40.96999999984466],[-110.16000000011663,39.869999999736493],[-111.40000000026342,38.65000000007791],[-111.14000000031956,37.839999999999698],[-109.92999999995899,37.670000000172969],[-106.78999999987707,38.380000000099315],[-103.4400000003933,38.779999999935605],[-101.15999999957282,38.889999999788053],[-100.34999999995507,38.109999999682309],[-101.02999999960089,35.410000000281535],[-101.24999999982977,32.720000000111824],[-100.27999999955556,32.269999999972583],[-99.349999999894635,32.620000000363454],[-98.280000000333033,33.689999999633876],[-95.939999999940113,34.980000000013646],[-93.919999999961789,35.630000000090433],[-92.799999999858173,36.900000000250735],[-91.890000000054712,39.490000000014028],[-90.110000000162771,41.4599999998551],[-88.039999999642419,42.220000000132394],[-85.030000000430732,42.220000000132394],[-83.320000000039926,42.419999999686297]],[[-96.619999999585943,45.179999999736282],[-94.099999999577406,45.580000000111639],[-92.110000000283605,45.490000000071824],[-90.880000000065564,44.869999999952164],[-90.779999999879848,44.179999999908837],[-91.149999999938132,42.989999999857574],[-91.480000000281478,42.419999999686297],[-92.209999999570996,41.700000000286636],[-92.980000000372115,40.649999999701848],[-93.600000000445519,40.110000000069839],[-94.089999999648654,39.759999999739058],[-95.069999999851618,39.039999999770963],[-95.750000000395758,38.4400000002395],[-96.140000000311545,37.950000000049691],[-97.749999999618296,36.599999999677095],[-99.040000000307103,35.72999999997154],[-99.200000000065231,35.679999999973546],[-100.00999999968299,35.380000000130906],[-100.38999999967002,35.709999999977569],[-100.35999999988381,36.270000000153722],[-100.14999999958366,36.690000000137992],[-99.719999999952918,37.6299999998907],[-99.479999999866564,38.399999999722155],[-100.13999999965492,39.139999999807927],[-101.39999999965917,39.610000000083751],[-102.33000000021843,39.610000000083751],[-103.11000000004995,39.540000000101017],[-103.27999999973684,40.369999999722125],[-102.55000000044731,41.089999999740783],[-97.69999999997458,44.770000000059156],[-96.619999999585943,45.179999999736282]]],[[[-85.129999999718109,35.599999999696266],[-85.649999999605797,34.719999999708776],[-85.649999999605797,33.509999999983911],[-84.639999999616649,31.740000000044066],[-84.290000000314166,30.600000000294752],[-83.239999999711713,29.210000000378717],[-83.160783619568761,28.793380517439932],[-83.025999999979049,28.752999999847599],[-82.989999999696607,28.550999999851761],[-83.013999999884902,28.465000000212459],[-83.089094224988074,28.416347403842607],[-82.969999999839132,27.790000000032393],[-82.61999999963831,27.170000000043181],[-81.660000000191175,25.979999999758341],[-81.000000000402807,25.800000000274313],[-80.679999999988226,26.669999999861933],[-81.08999999976146,28.520000000284245],[-81.660000000191175,30.130000000287176],[-81.810000000020551,31.329999999952555],[-81.999999999564906,32.950000000297358],[-82.290000000193302,34.620000000285216],[-82.97999999976787,36.099999999750025],[-83.63999999955621,36.139999999949268],[-85.129999999718109,35.599999999696266]]]]},"properties":{"objectid":1,"dn":5,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998546000,"st_area(shape)":2370850438232.9106,"st_perimeter(shape)":16994630.161620613,"issue":"202605170610","label":"0.05","label2":"5% Wind Risk","stroke":"#8B4726","fill":"#C5A392"}},{"type":"Feature","id":2,"geometry":{"type":"Polygon","coordinates":[[[-96.619999999585943,45.179999999736282],[-97.69999999997458,44.770000000059156],[-102.55000000044731,41.089999999740783],[-103.27999999973684,40.369999999722125],[-103.11000000004995,39.540000000101017],[-102.33000000021843,39.610000000083751],[-101.39999999965917,39.610000000083751],[-100.13999999965492,39.139999999807927],[-99.479999999866564,38.399999999722155],[-99.719999999952918,37.6299999998907],[-100.14999999958366,36.690000000137992],[-100.35999999988381,36.270000000153722],[-100.38999999967002,35.709999999977569],[-100.00999999968299,35.380000000130906],[-99.200000000065231,35.679999999973546],[-99.040000000307103,35.72999999997154],[-97.749999999618296,36.599999999677095],[-96.140000000311545,37.950000000049691],[-95.750000000395758,38.4400000002395],[-95.069999999851618,39.039999999770963],[-94.089999999648654,39.759999999739058],[-93.600000000445519,40.110000000069839],[-92.980000000372115,40.649999999701848],[-92.209999999570996,41.700000000286636],[-91.480000000281478,42.419999999686297],[-91.149999999938132,42.989999999857574],[-90.779999999879848,44.179999999908837],[-90.880000000065564,44.869999999952164],[-92.110000000283605,45.490000000071824],[-94.099999999577406,45.580000000111639],[-96.619999999585943,45.179999999736282]],[[-94.469999999635689,41.999999999667658],[-95.609999999596781,40.420000000103485],[-96.800000000099871,39.92999999984351],[-97.69999999997458,40.020000000167428],[-97.920000000203487,41.039999999975308],[-98.31000000011926,41.409999999851053],[-98.920000000263911,41.630000000159335],[-99.019999999551302,41.900000000115099],[-98.879999999650636,42.499999999861302],[-97.89000000041726,43.300000000142539],[-96.290000000140921,44.110000000161023],[-95.319999999866738,44.219999999869671],[-94.059999999862441,43.810000000161111],[-93.939999999819264,43.080000000235572],[-94.469999999635689,41.999999999667658]]]},"properties":{"objectid":2,"dn":15,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998546000,"st_area(shape)":824646254356.96594,"st_perimeter(shape)":6448665.3240879215,"issue":"202605170610","label":"0.15","label2":"15% Wind Risk","stroke":"#FF9600","fill":"#FFEB7F"}},{"type":"Feature","id":3,"geometry":{"type":"Polygon","coordinates":[[[-94.469999999635689,41.999999999667658],[-93.939999999819264,43.080000000235572],[-94.059999999862441,43.810000000161111],[-95.319999999866738,44.219999999869671],[-96.290000000140921,44.110000000161023],[-97.89000000041726,43.300000000142539],[-98.879999999650636,42.499999999861302],[-99.019999999551302,41.900000000115099],[-98.920000000263911,41.630000000159335],[-98.31000000011926,41.409999999851053],[-97.920000000203487,41.039999999975308],[-97.69999999997458,40.020000000167428],[-96.800000000099871,39.92999999984351],[-95.609999999596781,40.420000000103485],[-94.469999999635689,41.999999999667658]]]},"properties":{"objectid":3,"dn":30,"valid":"202605171200","expire":"202605181200","idp_source":"day1otlk_20260517_1200_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998546000,"st_area(shape)":234447073149.53195,"st_perimeter(shape)":1878549.4816877588,"issue":"202605170610","label":"0.30","label2":"30% Wind Risk","stroke":"#FF0000","fill":"#FF7F7F"}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day1_torn_conditional_intensity.esri.json b/tests/fixtures/arcgis_day1_torn_conditional_intensity.esri.json new file mode 100644 index 0000000..23a8d6d --- /dev/null +++ b/tests/fixtures/arcgis_day1_torn_conditional_intensity.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"dn","fieldAliases":{"valid":"valid","expire":"expire","issue":"issue","label":"label","label2":"label2","stroke":"stroke","fill":"fill","objectid":"objectid","dn":"dn value","idp_ingestdate":"GIS Ingest Date","idp_filedate":"GIS File Date","idp_source":"Source","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4269,"latestWkid":4269},"fields":[{"name":"valid","type":"esriFieldTypeString","alias":"valid","length":80},{"name":"expire","type":"esriFieldTypeString","alias":"expire","length":80},{"name":"issue","type":"esriFieldTypeString","alias":"issue","length":80},{"name":"label","type":"esriFieldTypeString","alias":"label","length":80},{"name":"label2","type":"esriFieldTypeString","alias":"label2","length":80},{"name":"stroke","type":"esriFieldTypeString","alias":"stroke","length":80},{"name":"fill","type":"esriFieldTypeString","alias":"fill","length":80},{"name":"objectid","type":"esriFieldTypeOID","alias":"objectid"},{"name":"dn","type":"esriFieldTypeInteger","alias":"dn value"},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_source","type":"esriFieldTypeString","alias":"Source","length":50},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"}],"features":[{"attributes":{"valid":"202605171200","expire":"202605181200","issue":"202605170610","label":"CIG1","label2":"Tornado Conditional Intensity Group 1 Risk","stroke":"#000000","fill":"#888888","objectid":5,"dn":2,"idp_ingestdate":1778998542000,"idp_filedate":1778998516000,"idp_source":"day1otlk_20260517_1200_torn","st_area(shape)":420868800061.21857,"st_perimeter(shape)":2605907.7203194601},"geometry":{"rings":[[[-97.459991766008471,39.499993122818729],[-98.639991418762875,39.909993132569127],[-99.719991147342142,39.889993205332992],[-100.15999104071095,39.859993237963707],[-100.54999090647854,40.189993214288755],[-100.61999083672954,40.639993152715235],[-100.41999082908862,41.129993067134734],[-98.609991061613812,42.949992678093707],[-97.829991109874072,44.099992459280983],[-96.539991339351786,44.929992248649015],[-95.429991575475967,45.409992099966445],[-94.309991904881812,45.309992032413518],[-93.449992243564267,44.629992070235403],[-93.589992410064724,43.029992320466597],[-94.559992302765252,41.669992595431431],[-95.579992144231511,40.609992828656395],[-96.319992018651519,39.939992981828155],[-97.459991766008471,39.499993122818729]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day2_categorical.esri.json b/tests/fixtures/arcgis_day2_categorical.esri.json new file mode 100644 index 0000000..76c52ec --- /dev/null +++ b/tests/fixtures/arcgis_day2_categorical.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"objectid":"Object Id","dn":"dn value","valid":"valid","expire":"expire","idp_source":"GIS Source","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)","issue":"issue","label":"label","label2":"label2","stroke":"stroke","fill":"fill"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4269,"latestWkid":4269},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"Object Id"},{"name":"dn","type":"esriFieldTypeInteger","alias":"dn value"},{"name":"valid","type":"esriFieldTypeString","alias":"valid","length":80},{"name":"expire","type":"esriFieldTypeString","alias":"expire","length":80},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"},{"name":"issue","type":"esriFieldTypeString","alias":"issue","length":80},{"name":"label","type":"esriFieldTypeString","alias":"label","length":80},{"name":"label2","type":"esriFieldTypeString","alias":"label2","length":80},{"name":"stroke","type":"esriFieldTypeString","alias":"stroke","length":80},{"name":"fill","type":"esriFieldTypeString","alias":"fill","length":80}],"features":[{"attributes":{"objectid":1,"dn":2,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":3772801853003.3506,"st_perimeter(shape)":25071668.461101905,"issue":"202605170600","label":"TSTM","label2":"General Thunderstorms Risk","stroke":"#55BB55","fill":"#C1E9C1"},"geometry":{"rings":[[[-82.155531641527844,42.008983600289618],[-81.763995996280158,42.177991789380748],[-81.76313700767264,42.178407594942172],[-83.8299955579933,39.879992310159281],[-86.689994884902987,37.689992860817384],[-88.889994479925022,34.439993599252333],[-88.789994576952395,33.249993838935801],[-87.779994858040666,33.259993797545746],[-84.919995501435594,36.179993080566575],[-81.519996253782026,39.919992196591643],[-80.219996532785416,41.489991843277018],[-78.539996939568368,43.009991491076086],[-77.459997289258837,42.949991455192233],[-76.859997549419006,42.059991593603513],[-76.309997835402001,40.43999188152587],[-75.409998232374363,38.569992222275701],[-74.852823172508764,38.078367073738768],[-75.085998383423956,37.665992398602945],[-75.262998334773883,37.547992429145118],[-75.355998316745541,37.333992477597761],[-75.53073645711936,37.067955171824615],[-78.019997490844688,37.389992559178232],[-81.039996628316501,36.479992862470795],[-82.669996232048234,34.959993243501998],[-83.119996195173343,33.149993649468435],[-82.459996458167055,31.629993966035574],[-81.028496358956332,30.367337301463188],[-80.988996949085504,30.127994267945862],[-80.764997037345779,29.49799441140949],[-80.348997182238833,28.8299945601687],[-80.196997236107407,28.551994623517075],[-80.27099722558566,28.231994703332386],[-79.7879974000749,27.147994958758293],[-79.69999743648286,26.776995050062681],[-79.765997432366717,26.227995189316779],[-79.811997436182352,25.575995356211045],[-79.964997401881817,25.157995465947511],[-80.142997356474552,24.858995546734743],[-80.33099730545544,24.704995590010164],[-80.634997221809826,24.486995651962911],[-81.053997103239283,24.360995692635541],[-81.781996895579539,24.207995745293054],[-82.815996597633443,24.16899577449481],[-83.287996461527968,24.220995770561327],[-83.279996457443914,24.512995696312753],[-83.237996462919412,24.797995623151692],[-83.162996478441343,25.011995568253734],[-82.312996723304849,25.016995549464372],[-82.367996704646075,25.133995520731695],[-82.509996659984765,25.287995485130953],[-82.631996620014291,25.452995446564753],[-81.933996817945598,25.609995391799281],[-82.142996744176671,26.089995276022265],[-82.323996690332706,26.170995260410187],[-82.534996620406758,26.479995188778918],[-82.718996555492083,26.891995091219155],[-83.104996425547,27.531994944916143],[-83.069996432786198,27.614994924244346],[-83.182996395403478,27.780994886772078],[-83.18499638352796,28.104994809203532],[-83.155996383180948,28.372994743991729],[-83.013996420823275,28.464994718544155],[-82.989996424598743,28.550994697047411],[-83.025996407517994,28.752994649992175],[-83.272996333644073,28.826994639353629],[-83.420996282175963,29.092994580665877],[-83.624996216221362,29.289994540009278],[-83.894996125468282,29.641994466193132],[-84.072996071473526,29.72999445084038],[-84.170996047464428,29.62599447760271],[-84.466995969447282,29.43799453001802],[-85.017995820607211,29.245994590493208],[-85.335995726461235,29.334994578858918],[-85.674995626936081,29.435994565911273],[-85.766995591247237,29.69599450859555],[-85.984995522641555,29.875994474247069],[-86.461995380526929,30.067994445592245],[-87.770995022386671,29.877994529008397],[-88.405994847668268,29.862994552282117],[-88.431994846096671,29.71399458664013],[-88.694994786798148,29.393994666169679],[-88.580994824355045,29.248994694914092],[-88.618994822279134,29.021994747386547],[-88.936994747785761,28.690994830887146],[-89.174994684836463,28.629994851876379],[-89.398994625294506,28.57699487013776],[-89.711994535522862,28.692994853165807],[-89.827994496081928,28.915994807080459],[-90.101994428094855,28.754994851059884],[-90.539994310725319,28.710994873160878],[-90.744994255357838,28.710994879239152],[-91.082994163807996,28.731994884604443],[-91.314994095703398,28.892994856598147],[-91.555994027877702,28.982994844109484],[-91.654993996042037,29.120994817126157],[-91.741993975367635,29.05799483402448],[-92.078993883446174,29.113994832307409],[-92.163993858001319,29.180994820342026],[-92.628993732562549,29.232994823272517],[-93.242993561800674,29.440994798635874],[-93.587993472576144,29.429994812834295],[-93.776993426055796,29.349994835413604],[-93.96099337814131,29.347994841997618],[-94.265993304251481,29.221994878108184],[-94.501993249520723,29.061994919183],[-94.899993157771263,28.807994985244225],[-95.133993105638325,28.596995036698502],[-95.488993022004422,28.427995082572714],[-96.043992889402929,28.181995150853382],[-96.14699286850599,28.054995180089577],[-96.42699280181327,27.939995212312198],[-96.795992721961397,27.578995298387735],[-97.016992683941453,27.080995408262094],[-96.875992734861811,26.594995507654072],[-96.748992786189604,25.947995642670325],[-97.074992708752646,25.798995682136177],[-97.229992673248319,25.658995715583409],[-97.679992556848674,25.836995687446606],[-98.217992420795909,25.933995679175865],[-98.508992347015607,26.038995664118385],[-99.102992195376999,26.253995633957562],[-99.356992125106714,26.51899558531127],[-99.488992084270436,26.80399553061892],[-99.611992047118633,27.038995486724374],[-99.69699201789301,27.290995438242785],[-99.723992004645041,27.495995397185457],[-99.916991952888793,27.636995375027436],[-100.22999186382417,28.007995310983599],[-100.40999181134134,28.264995265869754],[-100.59599175301065,28.592995208206489],[-100.75399170544274,28.843995164784392],[-100.91099165844508,29.05899512876185],[-101.16099159002691,29.267995097165311],[-101.19970597044397,29.301485050028532],[-101.28999136131969,32.939994432925573],[-101.11999127811622,34.709994119686719],[-100.67999109700524,38.069993547062765],[-100.75999098106973,39.019993404674672],[-101.2399908142103,39.479993365602496],[-102.14999060215889,39.389993438647551],[-104.36999016698437,38.549993707139961],[-106.92998968393023,37.619994004652149],[-107.87998950514407,37.339994104494984],[-109.40998917303523,37.399994194647263],[-110.72998880180373,38.309994166373578],[-111.39998850567976,39.669994049906357],[-112.31998803985927,41.739993890018717],[-112.15998788359136,42.979993747175754],[-111.10998797418262,43.759993576080618],[-109.79998821837398,43.979993438584899],[-108.85998852189877,43.379993423692532],[-108.53998874431159,42.379993511802773],[-107.18998908527456,42.099993437382125],[-103.60998989839007,42.259993141391817],[-100.74999054583371,42.689992869766222],[-98.859990973485878,43.119992671998325],[-96.329991402512945,44.889992238699321],[-93.289991866008023,47.479991658817895],[-91.543138015124512,48.364135420909953],[-91.4769922652833,48.337991409300862],[-90.776992458657602,48.452991342480601],[-90.512992570942089,48.26199134928536],[-90.295513151515252,48.263724237933694],[-92.519992258465777,46.409991748968757],[-95.209991836958892,43.98999228667536],[-96.909991535247173,42.769992584083838],[-99.609991167268475,39.959993187061251],[-100.58999118041261,37.419993645133857],[-101.18999138302567,32.969994423143412],[-100.87999154835886,31.439994683586431],[-99.739991839519959,31.129994695087159],[-99.439991900906151,31.349994642132703],[-96.00999266916574,32.899994206013922],[-91.049993758533503,36.28999333452974],[-87.719994640301238,36.989993043715117],[-84.179995452619096,39.889992325025986],[-82.155531641527844,42.008983600289618]],[[-113.98998652574761,48.069993461432539],[-116.43998627948888,47.00999379470381],[-119.02998573193396,47.319994044125878],[-120.8499852459652,48.03999419689228],[-121.49038861159721,49.181583528320594],[-120.44498501995692,49.20099408793957],[-119.22598523511702,49.202993950065839],[-117.70198551257162,49.216993779093123],[-116.06298582774347,49.222993597995369],[-114.52998613831235,49.219993432157196],[-113.00298645603259,49.226993267912825],[-112.12131349739251,49.218767653719453],[-113.98998652574761,48.069993461432539]]]}},{"attributes":{"objectid":2,"dn":3,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":999674574895.49451,"st_perimeter(shape)":12737962.531143812,"issue":"202605170600","label":"MRGL","label2":"Marginal Risk","stroke":"#005500","fill":"#66A366"},"geometry":{"rings":[[[-83.941819296767818,46.470917271879728],[-83.879994908911286,46.325991203940887],[-83.81399493718429,46.263991210125468],[-83.742994961567035,46.251991207662293],[-83.600995009333261,46.228991203229683],[-83.413995068267894,46.231991192332636],[-83.250995136321222,46.092991204997766],[-83.287995152712767,45.850991245457294],[-83.291995157693989,45.798991253846019],[-82.23199552737681,45.498991244806071],[-81.964995752132523,44.143991455775129],[-81.901995826084487,43.585991548466403],[-82.086995805574816,43.179991628257916],[-82.072995824944087,43.024991654010357],[-82.195995799503223,42.878991685908964],[-82.30399579623807,42.545991749849428],[-82.517995750489277,42.325991799709492],[-82.689995706451953,42.223991826314105],[-82.862995657015617,42.180991842438814],[-82.9029956549806,42.06299186568797],[-82.862995674907168,41.979991878502169],[-82.807995697810952,41.910991888184171],[-82.688995738576665,41.86299189071859],[-82.458995807776731,41.877991877037559],[-82.155531641527844,42.008983600289618],[-84.179995452619096,39.889992325025986],[-87.719994640301238,36.989993043715117],[-91.049993758533503,36.28999333452974],[-96.00999266916574,32.899994206013922],[-99.439991900906151,31.349994642132703],[-99.739991839519959,31.129994695087159],[-100.87999154835886,31.439994683586431],[-101.18999138302567,32.969994423143412],[-100.58999118041261,37.419993645133857],[-99.609991167268475,39.959993187061251],[-96.909991535247173,42.769992584083838],[-95.209991836958892,43.98999228667536],[-92.519992258465777,46.409991748968757],[-90.295513151515252,48.263724237933694],[-90.010992723830157,48.265991312996817],[-89.520992883824462,48.206991286811871],[-88.424993169290161,48.559991162013667],[-87.508870538752547,48.196947622617451],[-95.079991973584583,43.219992391359526],[-96.979991698402785,41.269992814582658],[-99.099991324489423,39.699993193991268],[-100.31999126144693,37.259993654780828],[-100.62999144746739,33.999994216878434],[-100.49999148517151,33.909994226707568],[-100.60999152922234,32.849994418178831],[-100.02999169030083,32.519994451675494],[-97.789992194593012,33.279994213195003],[-95.539992636310714,35.219993751277919],[-92.539993274756128,37.289993222445645],[-84.799995109318303,41.719992022122376],[-83.789995289325063,43.069991733700803],[-83.799995105193247,44.829991438626585],[-84.979994647860963,45.609991380214865],[-83.941819296767818,46.470917271879728]]]}},{"attributes":{"objectid":3,"dn":4,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":1492626195479.6914,"st_perimeter(shape)":9297033.2528151609,"issue":"202605170600","label":"SLGT","label2":"Slight Risk","stroke":"#DDAA00","fill":"#FFE066"},"geometry":{"rings":[[[-87.508870538752547,48.196947622617451],[-87.079993672302692,48.026991146073549],[-85.676994196003378,47.452991140437014],[-84.652994581645927,46.988991146960437],[-84.443994684328487,46.698991178860304],[-84.033994816367851,46.686991156806343],[-83.941819296767818,46.470917271879728],[-84.979994647860963,45.609991380214865],[-83.799995105193247,44.829991438626585],[-83.789995289325063,43.069991733700803],[-84.799995109318303,41.719992022122376],[-92.539993274756128,37.289993222445645],[-95.539992636310714,35.219993751277919],[-97.789992194593012,33.279994213195003],[-100.02999169030083,32.519994451675494],[-100.60999152922234,32.849994418178831],[-100.49999148517151,33.909994226707568],[-100.62999144746739,33.999994216878434],[-100.31999126144693,37.259993654780828],[-99.099991324489423,39.699993193991268],[-96.979991698402785,41.269992814582658],[-95.079991973584583,43.219992391359526],[-87.508870538752547,48.196947622617451]],[[-99.169991556336385,37.149993606928525],[-99.049991680555223,36.039993785678917],[-98.419991863487581,35.719993807760041],[-96.899992206100109,36.259993633614677],[-93.429992850260419,39.369992904966537],[-92.259993114352582,39.969992735473554],[-91.669993161473499,41.139992503709259],[-91.579993110220855,41.859992378864945],[-92.289992798789783,42.839992265902374],[-93.429992450171198,43.069992303484831],[-94.089992283113745,42.929992368919912],[-94.60999218530786,42.559992460210069],[-94.879992124386462,42.449992494846143],[-96.099991909182606,41.469992726386792],[-96.419991834578894,41.379992761098073],[-97.359991679905036,40.549992950514529],[-97.639991647034748,40.189993024736744],[-99.169991556336385,37.149993606928525]]]}},{"attributes":{"objectid":4,"dn":5,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":363102956659.49988,"st_perimeter(shape)":3978574.8344730427,"issue":"202605170600","label":"ENH","label2":"Enhanced Risk","stroke":"#FF6600","fill":"#FFA366"},"geometry":{"rings":[[[-99.169991556336385,37.149993606928525],[-97.639991647034748,40.189993024736744],[-97.359991679905036,40.549992950514529],[-96.419991834578894,41.379992761098073],[-96.099991909182606,41.469992726386792],[-94.879992124386462,42.449992494846143],[-94.60999218530786,42.559992460210069],[-94.089992283113745,42.929992368919912],[-93.429992450171198,43.069992303484831],[-92.289992798789783,42.839992265902374],[-91.579993110220855,41.859992378864945],[-91.669993161473499,41.139992503709259],[-92.259993114352582,39.969992735473554],[-93.429992850260419,39.369992904966537],[-96.899992206100109,36.259993633614677],[-98.419991863487581,35.719993807760041],[-99.049991680555223,36.039993785678917],[-99.169991556336385,37.149993606928525]],[[-97.849991795349794,38.179993360671077],[-97.169992017876169,37.659993408094095],[-96.5599921709169,37.709993365063106],[-95.069992444611586,38.989993063615003],[-95.069992376257275,39.689992946564111],[-95.279992278656508,40.099992892448007],[-95.679992135902253,40.439992862110465],[-96.369991942373559,40.529992890452903],[-97.199991824322183,39.589993092437737],[-97.849991795349794,38.179993360671077]]]}},{"attributes":{"objectid":5,"dn":6,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":80309303323.597763,"st_perimeter(shape)":1108237.2556502086,"issue":"202605170600","label":"MDT","label2":"Moderate Risk","stroke":"#CC0000","fill":"#E06666"},"geometry":{"rings":[[[-97.849991795349794,38.179993360671077],[-97.199991824322183,39.589993092437737],[-96.369991942373559,40.529992890452903],[-95.679992135902253,40.439992862110465],[-95.279992278656508,40.099992892448007],[-95.069992376257275,39.689992946564111],[-95.069992444611586,38.989993063615003],[-96.5599921709169,37.709993365063106],[-97.169992017876169,37.659993408094095],[-97.849991795349794,38.179993360671077]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day2_categorical.geojson b/tests/fixtures/arcgis_day2_categorical.geojson new file mode 100644 index 0000000..4f38833 --- /dev/null +++ b/tests/fixtures/arcgis_day2_categorical.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","id":1,"geometry":{"type":"MultiPolygon","coordinates":[[[[-82.155535751450032,42.008991761546042],[-84.180000000199698,39.890000000312121],[-87.720000000126134,36.990000000303304],[-91.049999999752444,36.290000000288288],[-96.010000000339616,32.899999999850358],[-99.440000000151613,31.350000000351866],[-99.739999999810408,31.130000000240585],[-100.87999999977148,31.440000000083867],[-101.19000000025733,32.96999999986356],[-100.59000000004143,37.420000000336906],[-99.609999999838479,39.959999999856464],[-96.910000000214339,42.77000000004292],[-95.209999999752284,43.99000000011138],[-92.520000000056868,46.409999999897067],[-90.295520514610246,48.263732904339285],[-90.513000000255388,48.261999999877837],[-90.776999999631741,48.452999999767087],[-91.477000000033357,48.338000000040466],[-91.54314577421475,48.364144010262272],[-93.289999999959662,47.480000000285081],[-96.329999999855886,44.890000000006687],[-98.85999999979316,43.120000000073169],[-100.74999999979957,42.68999999974266],[-103.61000000008018,42.260000000093974],[-107.18999999972156,42.099999999957944],[-108.53999999998281,42.380000000256466],[-108.86000000039741,43.379999999821841],[-109.79999999998708,43.979999999778585],[-111.10999999963506,43.760000000088212],[-112.16000000023749,42.980000000000054],[-112.31999999999562,41.739999999716972],[-111.40000000026342,39.66999999971776],[-110.72999999964802,38.309999999842326],[-109.41000000007132,37.399999999812138],[-107.88000000019447,37.340000000163528],[-106.92999999977773,37.619999999939296],[-104.37000000005425,38.55000000012447],[-102.14999999970449,39.389999999691966],[-101.23999999990103,39.47999999965964],[-100.75999999972831,39.019999999963822],[-100.68000000029839,38.069999999967898],[-101.11999999985787,34.709999999661491],[-101.29000000044304,32.939999999800804],[-101.19971439072296,29.301489957598037],[-101.1609999996555,29.267999999726591],[-100.9109999996404,29.059000000061793],[-100.75400000013039,28.844000000126155],[-100.59599999963933,28.593000000275865],[-100.4100000004258,28.265000000035887],[-100.22999999991188,28.00800000026225],[-99.917000000076214,27.637000000091135],[-99.724000000283752,27.495999999607282],[-99.696999999847336,27.291000000325209],[-99.612000000003903,27.039000000354402],[-99.48899999971259,26.803999999878517],[-99.356999999575265,26.518999999824846],[-99.103000000127636,26.25400000027668],[-98.509000000407951,26.038999999961614],[-98.217999999696886,25.933999999803319],[-97.680000000117118,25.836999999964341],[-97.229999999730595,25.659000000309668],[-97.075000000385998,25.799000000337355],[-96.749000000373471,25.948000000296993],[-96.876000000097292,26.595000000233807],[-97.017000000080643,27.080999999707789],[-96.795999999769052,27.579000000093259],[-96.426999999793466,27.939999999852898],[-96.146999999992147,28.054999999794394],[-96.043999999558309,28.182000000113582],[-95.489000000369202,28.427999999877631],[-95.133999999754877,28.597000000223602],[-94.900000000164738,28.808000000246768],[-94.501999999587326,29.061999999968823],[-94.265999999831777,29.221999999997553],[-93.960999999759451,29.348000000174853],[-93.776999999813015,29.349999999955184],[-93.588000000351357,29.430000000354035],[-93.242999999665756,29.440999999652337],[-92.629000000088595,29.232999999617103],[-92.164000000258127,29.181000000137491],[-92.07900000041468,29.114000000296844],[-91.742000000390732,29.058000000326938],[-91.655000000381875,29.120999999795966],[-91.556000000278885,28.982999999816883],[-91.315000000109805,28.892999999995599],[-91.082999999786779,28.731999999653791],[-90.744999999680104,28.710999999717089],[-90.53999999979348,28.710999999717089],[-90.102000000399443,28.755000000345362],[-89.828000000196042,28.916000000310095],[-89.711999999585345,28.693000000119145],[-89.398999999749705,28.577000000217446],[-89.175000000088289,28.630000000363218],[-88.937000000167345,28.691000000019521],[-88.618999999918174,29.022000000354463],[-88.581000000368604,29.248999999949675],[-88.694999999915566,29.394000000151312],[-88.431999999723601,29.714000000047285],[-88.406000000268222,29.862999999612942],[-87.770999999852549,29.877999999637126],[-86.462000000287276,30.067999999727114],[-85.98500000036266,29.875999999662792],[-85.767000000299177,29.695999999639433],[-85.674999999876817,29.436000000193861],[-85.335999999687431,29.334999999855967],[-85.018000000336571,29.246000000153821],[-84.466999999681647,29.438000000111135],[-84.171000000353672,29.625999999889302],[-84.07300000033338,29.730000000081546],[-83.894999999984847,29.642000000249872],[-83.62500000011228,29.289999999788769],[-83.421000000308339,29.092999999968058],[-83.272999999746048,28.82700000000521],[-83.025999999979049,28.752999999847599],[-82.989999999696607,28.550999999851761],[-83.013999999884902,28.465000000212459],[-83.155999999950978,28.372999999943726],[-83.184999999654494,28.105000000322374],[-83.183000000387395,27.781000000113178],[-83.070000000024834,27.615000000386566],[-83.105000000224578,27.532000000110262],[-82.718999999741328,26.891999999910425],[-82.534999999794877,26.480000000350312],[-82.324000000310335,26.171000000156749],[-82.142999999713695,26.089999999620844],[-81.934000000394576,25.609999999746137],[-82.631999999732471,25.45300000034019],[-82.510000000422181,25.287999999999982],[-82.368000000356119,25.133999999702585],[-82.313000000298899,25.016999999980946],[-83.162999999631595,25.012000000332282],[-83.238000000444615,24.797999999849537],[-83.280000000324975,24.513000000204464],[-83.288000000088303,24.221000000253113],[-82.815999999678894,24.168999999757567],[-81.782000000399762,24.207999999851278],[-81.054000000377329,24.361000000288929],[-80.63499999985973,24.487000000098494],[-80.330999999870116,24.705000000229205],[-80.14299999959286,24.859000000304832],[-79.965000000142638,25.157999999906814],[-79.812000000065126,25.576000000267165],[-79.765999999853932,26.227999999949329],[-79.699999999785277,26.7770000003825],[-79.787999999876831,27.147999999773489],[-80.271000000297676,28.231999999937326],[-80.196999999567367,28.551999999931745],[-80.348999999562167,28.82999999997439],[-80.764999999831659,29.498000000270107],[-80.989000000391371,30.127999999644274],[-81.028499430982237,30.367343088196929],[-82.459999999880182,31.629999999992204],[-83.119999999668522,33.149999999846159],[-82.670000000180323,34.960000000099143],[-81.040000000117772,36.480000000200121],[-78.020000000079023,37.389999999714149],[-75.53073818055995,37.067962632067989],[-75.355999999838986,37.333999999945654],[-75.263000000232225,37.547999999653982],[-75.085999999966418,37.665999999819981],[-74.852824738248728,38.078374768888672],[-75.409999999813508,38.569999999804722],[-76.30999999968823,40.440000000283227],[-76.860000000260456,42.059999999769111],[-77.459999999578059,42.950000000137152],[-78.53999999996671,43.010000000010848],[-80.219999999672964,41.489999999853978],[-81.520000000290509,39.919999999922204],[-84.920000000316278,36.180000000213631],[-87.779999999698575,33.259999999817772],[-88.789999999687737,33.249999999800252],[-88.889999999873439,34.439999999667748],[-86.690000000279511,37.690000000290432],[-83.82999999999889,39.880000000172508],[-81.763141010971765,42.178415805550017],[-81.763999999809371,42.177999999872661],[-82.155535751450032,42.008991761546042]]],[[[-113.98999999977313,48.070000000286242],[-112.12132684902811,49.218774478162665],[-113.00299999988957,49.226999999862301],[-114.53000000041662,49.220000000236112],[-116.06299999964328,49.222999999796336],[-117.70199999955187,49.216999999871717],[-119.22599999983079,49.202999999772011],[-120.44500000003741,49.200999999874803],[-121.49040376509875,49.181589320198171],[-120.85000000029545,48.039999999839594],[-119.02999999979021,47.32000000024135],[-116.44000000028051,47.009999999810866],[-113.98999999977313,48.070000000286242]]]]},"properties":{"objectid":1,"dn":2,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":3772801853003.3506,"st_perimeter(shape)":25071668.461101905,"issue":"202605170600","label":"TSTM","label2":"General Thunderstorms Risk","stroke":"#55BB55","fill":"#C1E9C1"}},{"type":"Feature","id":2,"geometry":{"type":"Polygon","coordinates":[[[-83.941824424556458,46.470926086840052],[-84.979999999888719,45.610000000156113],[-83.800000000212677,44.82999999980612],[-83.790000000283939,43.069999999697266],[-84.800000000273101,41.719999999754215],[-92.539999999914329,37.289999999803356],[-95.540000000095603,35.220000000366213],[-97.790000000231558,33.280000000181985],[-100.03000000043879,32.520000000265789],[-100.60999999989889,32.850000000098461],[-100.49999999978445,33.91000000024804],[-100.62999999975638,33.999999999743771],[-100.32000000016886,37.260000000045359],[-99.099999999879529,39.699999999704353],[-96.979999999715488,41.270000000021234],[-95.079999999780355,43.219999999969779],[-87.508877026669097,48.19695647207211],[-88.425000000042985,48.560000000124433],[-89.520999999958278,48.207000000246516],[-90.011000000059752,48.265999999971491],[-90.295520514610246,48.263732904339285],[-92.520000000056868,46.409999999897067],[-95.209999999752284,43.99000000011138],[-96.910000000214339,42.77000000004292],[-99.609999999838479,39.959999999856464],[-100.59000000004143,37.420000000336906],[-101.19000000025733,32.96999999986356],[-100.87999999977148,31.440000000083867],[-99.739999999810408,31.130000000240585],[-99.440000000151613,31.350000000351866],[-96.010000000339616,32.899999999850358],[-91.049999999752444,36.290000000288288],[-87.720000000126134,36.990000000303304],[-84.180000000199698,39.890000000312121],[-82.155535751450032,42.008991761546042],[-82.45899999979747,41.878000000022119],[-82.688999999955101,41.862999999808778],[-82.80799999991558,41.911000000073038],[-82.8629999999728,41.980000000054332],[-82.902999999687765,42.063000000106207],[-82.8629999999728,42.18099999987669],[-82.690000000037799,42.223999999966061],[-82.518000000185509,42.325999999999745],[-82.303999999554549,42.545999999735535],[-82.195999999605505,42.878999999873919],[-82.073000000212531,43.024999999687225],[-82.086999999573763,43.180000000321606],[-81.902000000442953,43.586000000221262],[-81.965000000263487,44.143999999867013],[-82.231999999887961,45.499000000178953],[-83.292000000419137,45.798999999789963],[-83.288000000088303,45.850999999918884],[-83.250999999723149,46.092999999958195],[-83.413999999729413,46.232000000062598],[-83.600999999923971,46.228999999904573],[-83.742999999990033,46.251999999867309],[-83.813999999573923,46.264000000156429],[-83.879999999642592,46.325999999886392],[-83.941824424556458,46.470926086840052]]]},"properties":{"objectid":2,"dn":3,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":999674574895.49451,"st_perimeter(shape)":12737962.531143812,"issue":"202605170600","label":"MRGL","label2":"Marginal Risk","stroke":"#005500","fill":"#66A366"}},{"type":"Feature","id":3,"geometry":{"type":"Polygon","coordinates":[[[-87.508877026669097,48.19695647207211],[-95.079999999780355,43.219999999969779],[-96.979999999715488,41.270000000021234],[-99.099999999879529,39.699999999704353],[-100.32000000016886,37.260000000045359],[-100.62999999975638,33.999999999743771],[-100.49999999978445,33.91000000024804],[-100.60999999989889,32.850000000098461],[-100.03000000043879,32.520000000265789],[-97.790000000231558,33.280000000181985],[-95.540000000095603,35.220000000366213],[-92.539999999914329,37.289999999803356],[-84.800000000273101,41.719999999754215],[-83.790000000283939,43.069999999697266],[-83.800000000212677,44.82999999980612],[-84.979999999888719,45.610000000156113],[-83.941824424556458,46.470926086840052],[-84.033999999802802,46.686999999859879],[-84.44399999957605,46.698999999764233],[-84.652999999793494,46.988999999717691],[-85.677000000042227,47.453000000290707],[-87.08000000019527,48.02699999973062],[-87.508877026669097,48.19695647207211]],[[-99.170000000279018,37.150000000336462],[-97.640000000402168,40.189999999867467],[-97.359999999702524,40.549999999810503],[-96.42000000011285,41.380000000192126],[-96.099999999698241,41.470000000304232],[-94.880000000307248,42.450000000116589],[-94.610000000434667,42.560000000218466],[-94.089999999648654,42.930000000099142],[-93.429999999860328,43.069999999697266],[-92.289999999899223,42.839999999993807],[-91.579999999568869,41.859999999692349],[-91.669999999825848,41.14000000023217],[-92.26000000011301,39.970000000258793],[-93.429999999860328,39.370000000334528],[-96.900000000285587,36.259999999861058],[-98.420000000233699,35.720000000291087],[-99.050000000235841,36.039999999725403],[-99.170000000279018,37.150000000336462]]]},"properties":{"objectid":3,"dn":4,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":1492626195479.6914,"st_perimeter(shape)":9297033.2528151609,"issue":"202605170600","label":"SLGT","label2":"Slight Risk","stroke":"#DDAA00","fill":"#FFE066"}},{"type":"Feature","id":4,"geometry":{"type":"Polygon","coordinates":[[[-99.170000000279018,37.150000000336462],[-99.050000000235841,36.039999999725403],[-98.420000000233699,35.720000000291087],[-96.900000000285587,36.259999999861058],[-93.429999999860328,39.370000000334528],[-92.26000000011301,39.970000000258793],[-91.669999999825848,41.14000000023217],[-91.579999999568869,41.859999999692349],[-92.289999999899223,42.839999999993807],[-93.429999999860328,43.069999999697266],[-94.089999999648654,42.930000000099142],[-94.610000000434667,42.560000000218466],[-94.880000000307248,42.450000000116589],[-96.099999999698241,41.470000000304232],[-96.42000000011285,41.380000000192126],[-97.359999999702524,40.549999999810503],[-97.640000000402168,40.189999999867467],[-99.170000000279018,37.150000000336462]],[[-97.849999999804012,38.180000000113516],[-97.199999999944382,39.590000000039517],[-96.369999999570837,40.529999999713176],[-95.679999999996269,40.440000000283227],[-95.280000000151773,40.100000000259179],[-95.069999999851618,39.689999999756196],[-95.069999999851618,38.99000000006135],[-96.560000000013503,37.709999999904205],[-97.170000000158154,37.660000000084793],[-97.849999999804012,38.180000000113516]]]},"properties":{"objectid":4,"dn":5,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":363102956659.49988,"st_perimeter(shape)":3978574.8344730427,"issue":"202605170600","label":"ENH","label2":"Enhanced Risk","stroke":"#FF6600","fill":"#FFA366"}},{"type":"Feature","id":5,"geometry":{"type":"Polygon","coordinates":[[[-97.849999999804012,38.180000000113516],[-97.170000000158154,37.660000000084793],[-96.560000000013503,37.709999999904205],[-95.069999999851618,38.99000000006135],[-95.069999999851618,39.689999999756196],[-95.280000000151773,40.100000000259179],[-95.679999999996269,40.440000000283227],[-96.369999999570837,40.529999999713176],[-97.199999999944382,39.590000000039517],[-97.849999999804012,38.180000000113516]]]},"properties":{"objectid":5,"dn":6,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_cat","idp_filedate":1778998516000,"idp_ingestdate":1778998525000,"st_area(shape)":80309303323.597763,"st_perimeter(shape)":1108237.2556502086,"issue":"202605170600","label":"MDT","label2":"Moderate Risk","stroke":"#CC0000","fill":"#E06666"}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day2_fire_weather.esri.json b/tests/fixtures/arcgis_day2_fire_weather.esri.json new file mode 100644 index 0000000..f268b41 --- /dev/null +++ b/tests/fixtures/arcgis_day2_fire_weather.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"objectid":"FID","dn":"Outlook","valid":"Valid Date Time","expire":"Expiration Date","idp_source":"GIS Source","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":102100,"latestWkid":3857},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"FID"},{"name":"dn","type":"esriFieldTypeInteger","alias":"Outlook"},{"name":"valid","type":"esriFieldTypeString","alias":"Valid Date Time","length":12},{"name":"expire","type":"esriFieldTypeString","alias":"Expiration Date","length":12},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"}],"features":[{"attributes":{"objectid":1,"dn":5,"valid":"202605181200","expire":"202605191200","idp_source":"firewx_day2_20260517_1200","idp_filedate":1779001815000,"idp_ingestdate":1779001825000,"st_area(shape)":334565257540.77625,"st_perimeter(shape)":6843575.742746341},"geometry":{"rings":[[[-11108571.986300001,3904598.9827999994],[-11208759.528000001,3743636.8615999967],[-11315626.2391,3560234.0530000031],[-11493737.4244,3475302.1246000007],[-11638631.0945,3439578.8712000027],[-11648026.238600001,3446348.565700002],[-11675076.8749,3485951.8982999995],[-11680308.890999999,3530700.8616999984],[-11701348.274700001,3564883.121799998],[-11755894.825199999,3609653.9668999985],[-11806990.4715,3657969.4482999966],[-11855222.3994,3685241.3993000016],[-11856747.972100001,3686697.8765999973],[-11863095.494899999,3707389.8320000023],[-11926835.4998,3710918.1819999963],[-11855525.7695,3710918.1819999963],[-11789847.2699,3648343.2533000037],[-11715263.211100001,3669166.1112999991],[-11408021.4165,3731847.9636999965],[-11253287.3243,3802755.0319000036],[-11134175.4691,3937856.0471000001],[-11114137.9608,4074547.6001000032],[-11109685.1812,4398761.246799998],[-11111911.571,4482405.3276999965],[-11144194.223300001,4556847.7707000002],[-11249947.739600001,4585078.0134000033],[-11410247.806299999,4566719.621299997],[-11543831.1953,4521667.378200002],[-11758677.8125,4307503.4777999967],[-11932336.2181,4019406.6048000008],[-12025844.590399999,3838366.7578999996],[-12052561.268199999,3764623.3540999964],[-12059240.4376,3723995.0672999993],[-12028070.9802,3710918.1819999963],[-12022973.7193,3710918.1819999963],[-12027403.063299999,3656928.4160000011],[-12144288.5286,3648733.3583000004],[-12240913.8466,3649773.6987000033],[-12263007.133299999,3650314.7400999963],[-12305256.5123,3746258.1779000014],[-12285219.003899999,3874085.8454999998],[-12185031.462200001,3948518.4271000028],[-12158314.784400001,3979227.6114000008],[-11961279.285700001,4199270.4807000011],[-11703018.0671,4471214.4941999987],[-11559415.924000001,4578013.244599998],[-11418040.170700001,4617638.2861000001],[-11262192.8836,4637508.072300002],[-11108571.986300001,4607717.7590999976],[-11056251.8256,4486604.9592999965],[-11036214.317199999,4286870.2360000014],[-11065157.3849,4065114.3047000021],[-11108571.986300001,3904598.9827999994]]]}},{"attributes":{"objectid":2,"dn":8,"valid":"202605181200","expire":"202605191200","idp_source":"firewx_day2_20260517_1200","idp_filedate":1779001815000,"idp_ingestdate":1779001825000,"st_area(shape)":441955446788.94684,"st_perimeter(shape)":4527077.6695856256},"geometry":{"rings":[[[-11253287.3243,3802755.0319000036],[-11408021.4165,3731847.9636999965],[-11715263.211100001,3669166.1112999991],[-11789847.2699,3648343.2533000037],[-11855525.7695,3710918.1819999963],[-11926835.4998,3710918.1819999963],[-11931556.981699999,3711179.5820000023],[-11994118.535500001,3713532.4341999963],[-12022727.6447,3713924.6203999966],[-12022973.7193,3710918.1819999963],[-12028070.9802,3710918.1819999963],[-12059240.4376,3723995.0672999993],[-12052561.268199999,3764623.3540999964],[-12025844.590399999,3838366.7578999996],[-11932336.2181,4019406.6048000008],[-11758677.8125,4307503.4777999967],[-11543831.1953,4521667.378200002],[-11410247.806299999,4566719.621299997],[-11249947.739600001,4585078.0134000033],[-11144194.223300001,4556847.7707000002],[-11111911.571,4482405.3276999965],[-11109685.1812,4398761.246799998],[-11114137.9608,4074547.6001000032],[-11134175.4691,3937856.0471000001],[-11253287.3243,3802755.0319000036]],[[-11499303.3989,4167958.7719999999],[-11464794.356799999,4054343.0059999973],[-11408021.4165,3984576.6942000017],[-11327871.383099999,3972544.749499999],[-11258853.298800001,3992604.9855000004],[-11219891.4771,4058381.0441000015],[-11204306.748299999,4165240.1872000024],[-11169797.7062,4343361.1622999981],[-11185382.434900001,4453054.6789000034],[-11227683.841399999,4516049.5012999997],[-11282230.391899999,4542761.3632000014],[-11366833.2049,4527288.2752000019],[-11420266.5605,4492207.0785000026],[-11468133.941500001,4436319.4117000028],[-11531586.0513,4281374.6479000002],[-11499303.3989,4167958.7719999999]]]}},{"attributes":{"objectid":3,"dn":10,"valid":"202605181200","expire":"202605191200","idp_source":"firewx_day2_20260517_1200","idp_filedate":1779001815000,"idp_ingestdate":1779001825000,"st_area(shape)":152291439968.41193,"st_perimeter(shape)":1483759.3807355901},"geometry":{"rings":[[[-11420266.5605,4492207.0785000026],[-11366833.2049,4527288.2752000019],[-11282230.391899999,4542761.3632000014],[-11227683.841399999,4516049.5012999997],[-11185382.434900001,4453054.6789000034],[-11169797.7062,4343361.1622999981],[-11204306.748299999,4165240.1872000024],[-11219891.4771,4058381.0441000015],[-11258853.298800001,3992604.9855000004],[-11327871.383099999,3972544.749499999],[-11408021.4165,3984576.6942000017],[-11464794.356799999,4054343.0059999973],[-11499303.3989,4167958.7719999999],[-11531586.0513,4281374.6479000002],[-11468133.941500001,4436319.4117000028],[-11420266.5605,4492207.0785000026]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day2_prob_any.esri.json b/tests/fixtures/arcgis_day2_prob_any.esri.json new file mode 100644 index 0000000..3b307b8 --- /dev/null +++ b/tests/fixtures/arcgis_day2_prob_any.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"objectid":"Object Id","dn":"dn value","valid":"valid","expire":"expire","idp_source":"GIS Source","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)","issue":"issue","label":"label","label2":"label2","stroke":"stroke","fill":"fill"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4269,"latestWkid":4269},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"Object Id"},{"name":"dn","type":"esriFieldTypeInteger","alias":"dn value"},{"name":"valid","type":"esriFieldTypeString","alias":"valid","length":80},{"name":"expire","type":"esriFieldTypeString","alias":"expire","length":80},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"},{"name":"issue","type":"esriFieldTypeString","alias":"issue","length":80},{"name":"label","type":"esriFieldTypeString","alias":"label","length":80},{"name":"label2","type":"esriFieldTypeString","alias":"label2","length":80},{"name":"stroke","type":"esriFieldTypeString","alias":"stroke","length":80},{"name":"fill","type":"esriFieldTypeString","alias":"fill","length":80}],"features":[{"attributes":{"objectid":1,"dn":5,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998553000,"st_area(shape)":1047342476844.863,"st_perimeter(shape)":13141754.254178412,"issue":"202605170600","label":"0.05","label2":"5% Wind Risk","stroke":"#8B4726","fill":"#C5A392"},"geometry":{"rings":[[[-84.179995452619096,39.889992325025986],[-87.719994640301238,36.989993043715117],[-91.049993758533503,36.28999333452974],[-96.00999266916574,32.899994206013922],[-99.779991826684238,31.199994683495014],[-100.87999154835886,31.439994683586431],[-101.08999141311837,32.869994436659049],[-100.48999119361606,37.539993619824095],[-99.559991190085228,39.869993197434979],[-88.351314855038851,48.53079372110615],[-87.079993672302692,48.026991146073549],[-85.676994196003378,47.452991140437014],[-84.652994581645927,46.988991146960437],[-84.443994684328487,46.698991178860304],[-84.033994816367851,46.686991156806343],[-83.879994908911286,46.325991203940887],[-83.81399493718429,46.263991210125468],[-83.742994961567035,46.251991207662293],[-83.600995009333261,46.228991203229683],[-83.413995068267894,46.231991192332636],[-83.250995136321222,46.092991204997766],[-83.287995152712767,45.850991245457294],[-83.291995157693989,45.798991253846019],[-82.23199552737681,45.498991244806071],[-81.964995752132523,44.143991455775129],[-81.901995826084487,43.585991548466403],[-82.086995805574816,43.179991628257916],[-82.072995824944087,43.024991654010357],[-82.195995799503223,42.878991685908964],[-82.30399579623807,42.545991749849428],[-82.517995750489277,42.325991799709492],[-82.689995706451953,42.223991826314105],[-82.862995657015617,42.180991842438814],[-82.9029956549806,42.06299186568797],[-82.862995674907168,41.979991878502169],[-82.807995697810952,41.910991888184171],[-82.688995738576665,41.86299189071859],[-82.458995807776731,41.877991877037559],[-82.165736010807819,42.004578837552302],[-84.179995452619096,39.889992325025986]],[[-100.31999126144693,37.259993654780828],[-100.50999150192587,33.629994275708427],[-100.60999152922234,32.849994418178831],[-100.02999169030083,32.519994451675494],[-97.789992194593012,33.279994213195003],[-95.539992636310714,35.219993751277919],[-92.539993274756128,37.289993222445645],[-84.799995109318303,41.719992022122376],[-83.789995289325063,43.069991733700803],[-83.799995105193247,44.829991438626585],[-86.039994230752811,46.319991332568414],[-88.159993553783963,46.479991442000447],[-90.229993031095404,45.729991688932138],[-93.059992416867388,44.159992113220312],[-99.099991324489423,39.699993193991268],[-100.31999126144693,37.259993654780828]]]}},{"attributes":{"objectid":2,"dn":15,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998553000,"st_area(shape)":1026551937907.1277,"st_perimeter(shape)":10024585.383885166,"issue":"202605170600","label":"0.15","label2":"15% Wind Risk","stroke":"#FF9600","fill":"#FFEB7F"},"geometry":{"rings":[[[-100.31999126144693,37.259993654780828],[-99.099991324489423,39.699993193991268],[-93.059992416867388,44.159992113220312],[-90.229993031095404,45.729991688932138],[-88.159993553783963,46.479991442000447],[-86.039994230752811,46.319991332568414],[-83.799995105193247,44.829991438626585],[-83.789995289325063,43.069991733700803],[-84.799995109318303,41.719992022122376],[-92.539993274756128,37.289993222445645],[-95.539992636310714,35.219993751277919],[-97.789992194593012,33.279994213195003],[-100.02999169030083,32.519994451675494],[-100.60999152922234,32.849994418178831],[-100.50999150192587,33.629994275708427],[-100.31999126144693,37.259993654780828]],[[-99.169991556336385,37.149993606928525],[-99.049991680555223,36.039993785678917],[-98.419991863487581,35.719993807760041],[-96.899992206100109,36.259993633614677],[-93.429992850260419,39.369992904966537],[-91.219993353180897,40.499992585257964],[-89.409993699341598,42.169992198854573],[-87.609993919153766,44.939991642503706],[-87.57999386567478,45.44999156106914],[-88.389993565165256,45.869991548178312],[-89.149993320517481,45.979991580823651],[-91.979992686081474,44.46999199462465],[-97.359991679905036,40.549992950514529],[-97.639991647034748,40.189993024736744],[-99.169991556336385,37.149993606928525]]]}},{"attributes":{"objectid":3,"dn":30,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998553000,"st_area(shape)":714357353491.42786,"st_perimeter(shape)":4135479.6203955067,"issue":"202605170600","label":"0.30","label2":"30% Wind Risk","stroke":"#FF0000","fill":"#FF7F7F"},"geometry":{"rings":[[[-99.169991556336385,37.149993606928525],[-97.639991647034748,40.189993024736744],[-97.359991679905036,40.549992950514529],[-91.979992686081474,44.46999199462465],[-89.149993320517481,45.979991580823651],[-88.389993565165256,45.869991548178312],[-87.57999386567478,45.44999156106914],[-87.609993919153766,44.939991642503706],[-89.409993699341598,42.169992198854573],[-91.219993353180897,40.499992585257964],[-93.429992850260419,39.369992904966537],[-96.899992206100109,36.259993633614677],[-98.419991863487581,35.719993807760041],[-99.049991680555223,36.039993785678917],[-99.169991556336385,37.149993606928525]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day2_prob_any.geojson b/tests/fixtures/arcgis_day2_prob_any.geojson new file mode 100644 index 0000000..4afd764 --- /dev/null +++ b/tests/fixtures/arcgis_day2_prob_any.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","id":1,"geometry":{"type":"Polygon","coordinates":[[[-84.180000000199698,39.890000000312121],[-82.165740123495794,42.004586997523326],[-82.45899999979747,41.878000000022119],[-82.688999999955101,41.862999999808778],[-82.80799999991558,41.911000000073038],[-82.8629999999728,41.980000000054332],[-82.902999999687765,42.063000000106207],[-82.8629999999728,42.18099999987669],[-82.690000000037799,42.223999999966061],[-82.518000000185509,42.325999999999745],[-82.303999999554549,42.545999999735535],[-82.195999999605505,42.878999999873919],[-82.073000000212531,43.024999999687225],[-82.086999999573763,43.180000000321606],[-81.902000000442953,43.586000000221262],[-81.965000000263487,44.143999999867013],[-82.231999999887961,45.499000000178953],[-83.292000000419137,45.798999999789963],[-83.288000000088303,45.850999999918884],[-83.250999999723149,46.092999999958195],[-83.413999999729413,46.232000000062598],[-83.600999999923971,46.228999999904573],[-83.742999999990033,46.251999999867309],[-83.813999999573923,46.264000000156429],[-83.879999999642592,46.325999999886392],[-84.033999999802802,46.686999999859879],[-84.44399999957605,46.698999999764233],[-84.652999999793494,46.988999999717691],[-85.677000000042227,47.453000000290707],[-87.08000000019527,48.02699999973062],[-88.351321658168146,48.530802560248993],[-99.560000000194776,39.869999999736493],[-100.48999999985571,37.540000000108833],[-101.09000000007164,32.870000000358338],[-100.87999999977148,31.440000000083867],[-99.780000000423669,31.200000000130661],[-96.010000000339616,32.899999999850358],[-91.049999999752444,36.290000000288288],[-87.720000000126134,36.990000000303304],[-84.180000000199698,39.890000000312121]],[[-100.32000000016886,37.260000000045359],[-99.099999999879529,39.699999999704353],[-93.059999999802031,44.159999999769397],[-90.230000000205948,45.729999999714686],[-88.15999999968561,46.480000000065992],[-86.04000000041988,46.319999999764391],[-83.800000000212677,44.82999999980612],[-83.790000000283939,43.069999999697266],[-84.800000000273101,41.719999999754215],[-92.539999999914329,37.289999999803356],[-95.540000000095603,35.220000000366213],[-97.790000000231558,33.280000000181985],[-100.03000000043879,32.520000000265789],[-100.60999999989889,32.850000000098461],[-100.5099999997132,33.629999999885804],[-100.32000000016886,37.260000000045359]]]},"properties":{"objectid":1,"dn":5,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998553000,"st_area(shape)":1047342476844.863,"st_perimeter(shape)":13141754.254178412,"issue":"202605170600","label":"0.05","label2":"5% Wind Risk","stroke":"#8B4726","fill":"#C5A392"}},{"type":"Feature","id":2,"geometry":{"type":"Polygon","coordinates":[[[-100.32000000016886,37.260000000045359],[-100.5099999997132,33.629999999885804],[-100.60999999989889,32.850000000098461],[-100.03000000043879,32.520000000265789],[-97.790000000231558,33.280000000181985],[-95.540000000095603,35.220000000366213],[-92.539999999914329,37.289999999803356],[-84.800000000273101,41.719999999754215],[-83.790000000283939,43.069999999697266],[-83.800000000212677,44.82999999980612],[-86.04000000041988,46.319999999764391],[-88.15999999968561,46.480000000065992],[-90.230000000205948,45.729999999714686],[-93.059999999802031,44.159999999769397],[-99.099999999879529,39.699999999704353],[-100.32000000016886,37.260000000045359]],[[-99.170000000279018,37.150000000336462],[-97.640000000402168,40.189999999867467],[-97.359999999702524,40.549999999810503],[-91.980000000311691,44.470000000272321],[-89.149999999817297,45.980000000074938],[-88.389999999843241,45.870000000096006],[-87.580000000225468,45.449999999853489],[-87.610000000011709,44.940000000036271],[-89.409999999761155,42.170000000236577],[-91.220000000337635,40.500000000093628],[-93.429999999860328,39.370000000334528],[-96.900000000285587,36.259999999861058],[-98.420000000233699,35.720000000291087],[-99.050000000235841,36.039999999725403],[-99.170000000279018,37.150000000336462]]]},"properties":{"objectid":2,"dn":15,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998553000,"st_area(shape)":1026551937907.1277,"st_perimeter(shape)":10024585.383885166,"issue":"202605170600","label":"0.15","label2":"15% Wind Risk","stroke":"#FF9600","fill":"#FFEB7F"}},{"type":"Feature","id":3,"geometry":{"type":"Polygon","coordinates":[[[-99.170000000279018,37.150000000336462],[-99.050000000235841,36.039999999725403],[-98.420000000233699,35.720000000291087],[-96.900000000285587,36.259999999861058],[-93.429999999860328,39.370000000334528],[-91.220000000337635,40.500000000093628],[-89.409999999761155,42.170000000236577],[-87.610000000011709,44.940000000036271],[-87.580000000225468,45.449999999853489],[-88.389999999843241,45.870000000096006],[-89.149999999817297,45.980000000074938],[-91.980000000311691,44.470000000272321],[-97.359999999702524,40.549999999810503],[-97.640000000402168,40.189999999867467],[-99.170000000279018,37.150000000336462]]]},"properties":{"objectid":3,"dn":30,"valid":"202605181200","expire":"202605191200","idp_source":"day2otlk_20260517_0600_wind","idp_filedate":1778998516000,"idp_ingestdate":1778998553000,"st_area(shape)":714357353491.42786,"st_perimeter(shape)":4135479.6203955067,"issue":"202605170600","label":"0.30","label2":"30% Wind Risk","stroke":"#FF0000","fill":"#FF7F7F"}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day3_categorical.esri.json b/tests/fixtures/arcgis_day3_categorical.esri.json new file mode 100644 index 0000000..d15f37f --- /dev/null +++ b/tests/fixtures/arcgis_day3_categorical.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"valid","fieldAliases":{"objectid":"Object Id","dn":"dn value","valid":"valid","expire":"expire","idp_source":"GIS Source","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)","issue":"issue","label":"label","label2":"label2","stroke":"stroke","fill":"fill"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4269,"latestWkid":4269},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"Object Id"},{"name":"dn","type":"esriFieldTypeInteger","alias":"dn value"},{"name":"valid","type":"esriFieldTypeString","alias":"valid","length":80},{"name":"expire","type":"esriFieldTypeString","alias":"expire","length":80},{"name":"idp_source","type":"esriFieldTypeString","alias":"GIS Source","length":50},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"},{"name":"issue","type":"esriFieldTypeString","alias":"issue","length":80},{"name":"label","type":"esriFieldTypeString","alias":"label","length":80},{"name":"label2","type":"esriFieldTypeString","alias":"label2","length":80},{"name":"stroke","type":"esriFieldTypeString","alias":"stroke","length":80},{"name":"fill","type":"esriFieldTypeString","alias":"fill","length":80}],"features":[{"attributes":{"objectid":1,"dn":2,"valid":"202605191200","expire":"202605201200","idp_source":"day3otlk_20260517_0730_cat","idp_filedate":1779003315000,"idp_ingestdate":1779003323000,"st_area(shape)":1555731059191.0715,"st_perimeter(shape)":19421448.708731875,"issue":"202605170730","label":"TSTM","label2":"General Thunderstorms Risk","stroke":"#55BB55","fill":"#C1E9C1"},"geometry":{"rings":[[[-100.45483617349565,28.344075657035596],[-96.109992698967361,31.929994397208528],[-88.539994601862475,34.029993668810782],[-83.649995708142711,38.61999254174502],[-77.549997303437237,42.399991559261807],[-74.320978251207748,45.185812008459777],[-71.709999014100532,45.170990835017918],[-71.570999041213298,45.455990780277745],[-70.992999230282052,45.546990744506552],[-70.610999331931382,45.955990660994239],[-70.552999334125559,46.206990616005811],[-70.213999409577667,46.803990503825894],[-69.337999654006893,47.645990336534538],[-68.818999839753843,47.58399032995937],[-68.686999890212519,47.516990336962039],[-68.508999954663395,47.490990336288434],[-68.217000048586684,47.604990308316083],[-67.636000278588696,47.182990361334703],[-67.47100037181167,46.577990458713316],[-67.502000405976275,45.791990595109894],[-67.23600050677544,45.628990616245417],[-67.178000537056946,45.431990649101387],[-66.953000616644815,45.388990651057739],[-66.83800066898884,45.130990693235951],[-66.773000696570946,45.026990710380197],[-66.760000705938182,44.94499072467859],[-66.714247335250661,44.868064707890468],[-76.949997617994896,40.669991861319744],[-86.129995221575911,35.059993358463636],[-90.499994255848591,30.3099945227078],[-91.468236696474079,28.950222392255263],[-91.555994027877702,28.982994844109484],[-91.654993996042037,29.120994817126157],[-91.741993975367635,29.05799483402448],[-92.078993883446174,29.113994832307409],[-92.163993858001319,29.180994820342026],[-92.628993732562549,29.232994823272517],[-93.242993561800674,29.440994798635874],[-93.587993472576144,29.429994812834295],[-93.776993426055796,29.349994835413604],[-93.905147464367943,29.348601860841043],[-93.899993393020637,29.379994833504231],[-94.349993222915032,30.549994605551049],[-95.509992881685264,31.399994477460321],[-96.159992717527416,31.359994510327674],[-98.989992139494035,28.61999515174373],[-98.129992413322213,26.889995477994031],[-96.803732267393869,26.226865335156308],[-96.748992786189604,25.947995642670325],[-97.074992708752646,25.798995682136177],[-97.229992673248319,25.658995715583409],[-97.679992556848674,25.836995687446606],[-98.217992420795909,25.933995679175865],[-98.508992347015607,26.038995664118385],[-99.102992195376999,26.253995633957562],[-99.356992125106714,26.51899558531127],[-99.488992084270436,26.80399553061892],[-99.611992047118633,27.038995486724374],[-99.69699201789301,27.290995438242785],[-99.723992004645041,27.495995397185457],[-99.916991952888793,27.636995375027436],[-100.22999186382417,28.007995310983599],[-100.40999181134134,28.264995265869754],[-100.45483617349565,28.344075657035596]],[[-103.06145188073567,28.861736343806935],[-103.41899108227048,28.867995247722089],[-103.92089643328292,29.132600824061122],[-101.38999135464496,32.659994486525527],[-96.619992224954117,36.899993507656305],[-91.43999322814156,41.119992493527775],[-84.398737283790851,46.697666569246657],[-84.033994816367851,46.686991156806343],[-83.988598604917811,46.580575312408463],[-91.2999933330711,40.469992594562584],[-96.409992311975586,36.509993564020839],[-99.769991698703237,33.36999428710611],[-101.69999136325616,31.279994746036685],[-103.06145188073567,28.861736343806935]],[[-82.529996617201945,26.659995144109303],[-80.909997058592594,27.599994873810697],[-80.060063571575384,27.758594888337552],[-79.7879974000749,27.147994958758293],[-79.69999743648286,26.776995050062681],[-79.765997432366717,26.227995189316779],[-79.811997436182352,25.575995356211045],[-79.964997401881817,25.157995465947511],[-80.142997356474552,24.858995546734743],[-80.33099730545544,24.704995590010164],[-80.634997221809826,24.486995651962911],[-81.053997103239283,24.360995692635541],[-81.781996895579539,24.207995745293054],[-82.815996597633443,24.16899577449481],[-83.287996461527968,24.220995770561327],[-83.279996457443914,24.512995696312753],[-83.237996462919412,24.797995623151692],[-83.162996478441343,25.011995568253734],[-82.312996723304849,25.016995549464372],[-82.367996704646075,25.133995520731695],[-82.509996659984765,25.287995485130953],[-82.631996620014291,25.452995446564753],[-81.933996817945598,25.609995391799281],[-82.142996744176671,26.089995276022265],[-82.323996690332706,26.170995260410187],[-82.534996620406758,26.479995188778918],[-82.597668395102076,26.620325481355188],[-82.529996617201945,26.659995144109303]]]}},{"attributes":{"objectid":2,"dn":3,"valid":"202605191200","expire":"202605201200","idp_source":"day3otlk_20260517_0730_cat","idp_filedate":1779003315000,"idp_ingestdate":1779003323000,"st_area(shape)":847688488091.60596,"st_perimeter(shape)":14009874.192503771,"issue":"202605170730","label":"MRGL","label2":"Marginal Risk","stroke":"#005500","fill":"#66A366"},"geometry":{"rings":[[[-79.355554593780852,42.898402228915529],[-79.251996716407319,42.965991530845223],[-79.253085615676341,42.971274041615217],[-78.099072225555844,43.791961915319682],[-77.318997267100343,43.788991298613468],[-76.954997385192527,43.790991282214428],[-76.556997476906119,44.255991183392702],[-75.976997637786653,44.603991097684442],[-75.602997738342125,44.87399103515402],[-74.880997952120111,45.188990951487298],[-74.320978251207748,45.185812008459777],[-77.549997303437237,42.399991559261807],[-83.649995708142711,38.61999254174502],[-88.539994601862475,34.029993668810782],[-96.109992698967361,31.929994397208528],[-100.45483617349565,28.344075657035596],[-100.59599175301065,28.592995208206489],[-100.75399170544274,28.843995164784392],[-100.91099165844508,29.05899512876185],[-101.16099159002691,29.267995097165311],[-101.44999151103831,29.517995060204395],[-101.61599146781376,29.593995051936389],[-101.85199141214015,29.613995056227765],[-102.12499134669909,29.650995059485549],[-102.29999130629749,29.644995066850107],[-102.4859912654094,29.57799508552581],[-102.61299125007173,29.282995144852073],[-102.73299123059186,29.097995182988207],[-102.9619911882062,28.85999523444946],[-103.06145188073567,28.861736343806935],[-101.69999136325616,31.279994746036685],[-99.769991698703237,33.36999428710611],[-96.409992311975586,36.509993564020839],[-91.2999933330711,40.469992594562584],[-83.988598604917811,46.580575312408463],[-83.879994908911286,46.325991203940887],[-83.81399493718429,46.263991210125468],[-83.742994961567035,46.251991207662293],[-83.622549916515013,46.23248249296774],[-87.679994159013788,42.629992021642671],[-93.74999290742663,37.779993198188585],[-97.629992117077464,34.989993895136372],[-98.599991950038941,33.91999413360189],[-100.03999168780705,32.51999445211446],[-100.24999167450488,31.87999457674287],[-99.709991816833082,31.679994591423146],[-91.349993799697273,34.499993692900013],[-89.849994170776839,35.119993505442487],[-82.249995958663177,40.839992057103316],[-79.355554593780852,42.898402228915529]]]}},{"attributes":{"objectid":3,"dn":4,"valid":"202605191200","expire":"202605201200","idp_source":"day3otlk_20260517_0730_cat","idp_filedate":1779003315000,"idp_ingestdate":1779003323000,"st_area(shape)":1341230501022.1575,"st_perimeter(shape)":7330484.9268075051,"issue":"202605170730","label":"SLGT","label2":"Slight Risk","stroke":"#DDAA00","fill":"#FFE066"},"geometry":{"rings":[[[-83.622549916515013,46.23248249296774],[-83.600995009333261,46.228991203229683],[-83.413995068267894,46.231991192332636],[-83.250995136321222,46.092991204997766],[-83.287995152712767,45.850991245457294],[-83.291995157693989,45.798991253846019],[-82.23199552737681,45.498991244806071],[-81.964995752132523,44.143991455775129],[-81.901995826084487,43.585991548466403],[-82.086995805574816,43.179991628257916],[-82.072995824944087,43.024991654010357],[-82.195995799503223,42.878991685908964],[-82.30399579623807,42.545991749849428],[-82.517995750489277,42.325991799709492],[-82.689995706451953,42.223991826314105],[-82.862995657015617,42.180991842438814],[-82.9029956549806,42.06299186568797],[-82.862995674907168,41.979991878502169],[-82.807995697810952,41.910991888184171],[-82.688995738576665,41.86299189071859],[-82.458995807776731,41.877991877037559],[-81.763995996280158,42.177991789380748],[-81.261996130989445,42.420991721698293],[-80.315996412356355,42.599991645468428],[-79.513996647881854,42.794991573444712],[-79.355554593780852,42.898402228915529],[-82.249995958663177,40.839992057103316],[-89.849994170776839,35.119993505442487],[-91.349993799697273,34.499993692900013],[-99.709991816833082,31.679994591423146],[-100.24999167450488,31.87999457674287],[-100.03999168780705,32.51999445211446],[-98.599991950038941,33.91999413360189],[-97.629992117077464,34.989993895136372],[-93.74999290742663,37.779993198188585],[-87.679994159013788,42.629992021642671],[-83.622549916515013,46.23248249296774]],[[-79.253085615676341,42.971274041615217],[-79.372996627778804,43.552991431905362],[-78.631996844512472,43.793991355754599],[-78.099072225555844,43.791961915319682],[-79.253085615676341,42.971274041615217]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day3_categorical.geojson b/tests/fixtures/arcgis_day3_categorical.geojson new file mode 100644 index 0000000..dc85421 --- /dev/null +++ b/tests/fixtures/arcgis_day3_categorical.geojson @@ -0,0 +1 @@ +{"type":"FeatureCollection","features":[{"type":"Feature","id":1,"geometry":{"type":"MultiPolygon","coordinates":[[[[-100.45484437641447,28.344080405233242],[-100.4100000004258,28.265000000035887],[-100.22999999991188,28.00800000026225],[-99.917000000076214,27.637000000091135],[-99.724000000283752,27.495999999607282],[-99.696999999847336,27.291000000325209],[-99.612000000003903,27.039000000354402],[-99.48899999971259,26.803999999878517],[-99.356999999575265,26.518999999824846],[-99.103000000127636,26.25400000027668],[-98.509000000407951,26.038999999961614],[-98.217999999696886,25.933999999803319],[-97.680000000117118,25.836999999964341],[-97.229999999730595,25.659000000309668],[-97.075000000385998,25.799000000337355],[-96.749000000373471,25.948000000296993],[-96.803739503371347,26.22686975119078],[-98.129999999605317,26.890000000292428],[-98.989999999765089,28.62000000003038],[-96.160000000168992,31.359999999707753],[-95.51000000030939,31.399999999831106],[-94.349999999592512,30.549999999794863],[-93.900000000104313,29.380000000382992],[-93.905154071470534,29.348607020950869],[-93.776999999813015,29.349999999955184],[-93.588000000351357,29.430000000354035],[-93.242999999665756,29.440999999652337],[-92.629000000088595,29.232999999617103],[-92.164000000258127,29.181000000137491],[-92.07900000041468,29.114000000296844],[-91.742000000390732,29.058000000326938],[-91.655000000381875,29.120999999795966],[-91.556000000278885,28.982999999816883],[-91.468242644128722,28.950227543498439],[-90.500000000078529,30.309999999714613],[-86.129999999778548,35.059999999639643],[-76.949999999619109,40.669999999999703],[-66.714246610160998,44.86807397063491],[-66.760000000368805,44.945000000015234],[-66.772999999647354,45.027000000026511],[-66.837999999633325,45.130999999717716],[-66.953000000161296,45.38900000022835],[-67.177999999905381,45.431999999877519],[-67.236000000210737,45.629000000060039],[-67.501999999752499,45.792000000145606],[-67.47099999988356,46.577999999855074],[-67.636000000055233,47.182999999722171],[-68.216999999598073,47.604999999747157],[-68.50900000039185,47.491000000253443],[-68.686999999842058,47.516999999817358],[-68.818999999979397,47.58399999978429],[-69.337999999784387,47.646000000281177],[-70.214000000369126,46.803999999723722],[-70.552999999660173,46.20699999970747],[-70.6109999999655,45.955999999796113],[-70.993000000117931,45.546999999814645],[-71.57100000031096,45.455999999939039],[-71.710000000128929,45.171000000097784],[-74.320980112675059,45.185821079015568],[-77.549999999835009,42.399999999908516],[-83.650000000383272,38.619999999960946],[-88.539999999672645,34.030000000329807],[-96.109999999626979,31.929999999981234],[-100.45484437641447,28.344080405233242]]],[[[-103.06146071585546,28.861741106470237],[-101.70000000021629,31.280000000047238],[-99.769999999596621,33.370000000051235],[-96.410000000184112,36.509999999905297],[-91.29999999976755,40.469999999695695],[-83.988603760887344,46.580584141664545],[-84.033999999802802,46.686999999859879],[-84.398742584507971,46.697675392610428],[-91.439999999668203,41.120000000299008],[-96.619999999585943,36.900000000250735],[-101.38999999973043,32.659999999665807],[-103.92090547632128,29.132605607130792],[-103.41899999955479,28.867999999646045],[-103.06146071585546,28.861741106470237]]],[[[-82.530000000279671,26.660000000209173],[-82.59767179653312,26.620330326111397],[-82.534999999794877,26.480000000350312],[-82.324000000310335,26.171000000156749],[-82.142999999713695,26.089999999620844],[-81.934000000394576,25.609999999746137],[-82.631999999732471,25.45300000034019],[-82.510000000422181,25.287999999999982],[-82.368000000356119,25.133999999702585],[-82.313000000298899,25.016999999980946],[-83.162999999631595,25.012000000332282],[-83.238000000444615,24.797999999849537],[-83.280000000324975,24.513000000204464],[-83.288000000088303,24.221000000253113],[-82.815999999678894,24.168999999757567],[-81.782000000399762,24.207999999851278],[-81.054000000377329,24.361000000288929],[-80.63499999985973,24.487000000098494],[-80.330999999870116,24.705000000229205],[-80.14299999959286,24.859000000304832],[-79.965000000142638,25.157999999906814],[-79.812000000065126,25.576000000267165],[-79.765999999853932,26.227999999949329],[-79.699999999785277,26.7770000003825],[-79.787999999876831,27.147999999773489],[-80.06006626953166,27.758600074107957],[-80.910000000145843,27.599999999795656],[-82.530000000279671,26.660000000209173]]]]},"properties":{"objectid":1,"dn":2,"valid":"202605191200","expire":"202605201200","idp_source":"day3otlk_20260517_0730_cat","idp_filedate":1779003315000,"idp_ingestdate":1779003323000,"st_area(shape)":1555731059191.0715,"st_perimeter(shape)":19421448.708731875,"issue":"202605170730","label":"TSTM","label2":"General Thunderstorms Risk","stroke":"#55BB55","fill":"#C1E9C1"}},{"type":"Feature","id":2,"geometry":{"type":"Polygon","coordinates":[[[-79.355557904095079,42.898410681259293],[-82.249999999580027,40.840000000316813],[-89.850000000218913,35.120000000262259],[-91.350000000309549,34.499999999650292],[-99.710000000024181,31.680000000031818],[-100.24999999976936,31.879999999621617],[-100.04000000036751,32.520000000265789],[-98.599999999849302,33.919999999752385],[-97.629999999575105,34.989999999753834],[-93.750000000274909,37.779999999678573],[-87.680000000411184,42.629999999960411],[-83.622554914367967,46.232491288967132],[-83.742999999990033,46.251999999867309],[-83.813999999573923,46.264000000156429],[-83.879999999642592,46.325999999886392],[-83.988603760887344,46.580584141664545],[-91.29999999976755,40.469999999695695],[-96.410000000184112,36.509999999905297],[-99.769999999596621,33.370000000051235],[-101.70000000021629,31.280000000047238],[-103.06146071585546,28.861741106470237],[-102.96200000038598,28.860000000093098],[-102.73300000031105,29.098000000267003],[-102.61300000026787,29.283000000372152],[-102.48599999964574,29.577999999792219],[-102.30000000043221,29.645000000054655],[-102.12500000033181,29.65100000003175],[-101.85200000021111,29.613999999618542],[-101.61599999955725,29.593999999949791],[-101.45000000020119,29.517999999844371],[-101.1609999996555,29.267999999726591],[-100.9109999996404,29.059000000061793],[-100.75400000013039,28.844000000126155],[-100.59599999963933,28.593000000275865],[-100.45484437641447,28.344080405233242],[-96.109999999626979,31.929999999981234],[-88.539999999672645,34.030000000329807],[-83.650000000383272,38.619999999960946],[-77.549999999835009,42.399999999908516],[-74.320980112675059,45.185821079015568],[-74.881000000079794,45.189000000194817],[-75.602999999605984,44.873999999745138],[-75.976999999995087,44.603999999692988],[-76.557000000353526,44.255999999985036],[-76.955000000032641,43.790999999677865],[-77.318999999594681,43.789000000101701],[-78.099075209975069,43.791970583136575],[-79.253088899622341,42.97128251166982],[-79.251999999564163,42.966000000002566],[-79.355557904095079,42.898410681259293]]]},"properties":{"objectid":2,"dn":3,"valid":"202605191200","expire":"202605201200","idp_source":"day3otlk_20260517_0730_cat","idp_filedate":1779003315000,"idp_ingestdate":1779003323000,"st_area(shape)":847688488091.60596,"st_perimeter(shape)":14009874.192503771,"issue":"202605170730","label":"MRGL","label2":"Marginal Risk","stroke":"#005500","fill":"#66A366"}},{"type":"Feature","id":3,"geometry":{"type":"MultiPolygon","coordinates":[[[[-83.622554914367967,46.232491288967132],[-87.680000000411184,42.629999999960411],[-93.750000000274909,37.779999999678573],[-97.629999999575105,34.989999999753834],[-98.599999999849302,33.919999999752385],[-100.04000000036751,32.520000000265789],[-100.24999999976936,31.879999999621617],[-99.710000000024181,31.680000000031818],[-91.350000000309549,34.499999999650292],[-89.850000000218913,35.120000000262259],[-82.249999999580027,40.840000000316813],[-79.355557904095079,42.898410681259293],[-79.51399999967343,42.795000000022547],[-80.316000000426158,42.600000000149521],[-81.261999999613749,42.420999999785671],[-81.763999999809371,42.177999999872661],[-82.45899999979747,41.878000000022119],[-82.688999999955101,41.862999999808778],[-82.80799999991558,41.911000000073038],[-82.8629999999728,41.980000000054332],[-82.902999999687765,42.063000000106207],[-82.8629999999728,42.18099999987669],[-82.690000000037799,42.223999999966061],[-82.518000000185509,42.325999999999745],[-82.303999999554549,42.545999999735535],[-82.195999999605505,42.878999999873919],[-82.073000000212531,43.024999999687225],[-82.086999999573763,43.180000000321606],[-81.902000000442953,43.586000000221262],[-81.965000000263487,44.143999999867013],[-82.231999999887961,45.499000000178953],[-83.292000000419137,45.798999999789963],[-83.288000000088303,45.850999999918884],[-83.250999999723149,46.092999999958195],[-83.413999999729413,46.232000000062598],[-83.600999999923971,46.228999999904573],[-83.622554914367967,46.232491288967132]]],[[[-79.253088899622341,42.97128251166982],[-78.099075209975069,43.791970583136575],[-78.63200000038907,43.794000000002001],[-79.372999999690052,43.552999999821935],[-79.253088899622341,42.97128251166982]]]]},"properties":{"objectid":3,"dn":4,"valid":"202605191200","expire":"202605201200","idp_source":"day3otlk_20260517_0730_cat","idp_filedate":1779003315000,"idp_ingestdate":1779003323000,"st_area(shape)":1341230501022.1575,"st_perimeter(shape)":7330484.9268075051,"issue":"202605170730","label":"SLGT","label2":"Slight Risk","stroke":"#DDAA00","fill":"#FFE066"}}]} \ No newline at end of file diff --git a/tests/fixtures/arcgis_day4_8_convective.esri.json b/tests/fixtures/arcgis_day4_8_convective.esri.json new file mode 100644 index 0000000..d22dece --- /dev/null +++ b/tests/fixtures/arcgis_day4_8_convective.esri.json @@ -0,0 +1 @@ +{"error":{"code":400,"message":"Invalid or missing input parameters.","details":[]}} \ No newline at end of file diff --git a/tests/fixtures/arcgis_mesoscale_discussion.esri.json b/tests/fixtures/arcgis_mesoscale_discussion.esri.json new file mode 100644 index 0000000..52bf337 --- /dev/null +++ b/tests/fixtures/arcgis_mesoscale_discussion.esri.json @@ -0,0 +1 @@ +{"displayFieldName":"name","fieldAliases":{"objectid":"objectid","name":"Discussion Number","folderpath":"Discussion Info","popupinfo":"Discussion Link","idp_filedate":"GIS File Date","idp_ingestdate":"GIS Ingest Date","st_area(shape)":"st_area(shape)","st_perimeter(shape)":"st_perimeter(shape)"},"geometryType":"esriGeometryPolygon","spatialReference":{"wkid":4326,"latestWkid":4326,"vcsWkid":5773,"latestVcsWkid":5773},"fields":[{"name":"objectid","type":"esriFieldTypeOID","alias":"objectid"},{"name":"name","type":"esriFieldTypeString","alias":"Discussion Number","length":320},{"name":"folderpath","type":"esriFieldTypeString","alias":"Discussion Info","length":320},{"name":"popupinfo","type":"esriFieldTypeString","alias":"Discussion Link","length":1073741822},{"name":"idp_filedate","type":"esriFieldTypeDate","alias":"GIS File Date","length":8},{"name":"idp_ingestdate","type":"esriFieldTypeDate","alias":"GIS Ingest Date","length":8},{"name":"st_area(shape)","type":"esriFieldTypeDouble","alias":"st_area(shape)"},{"name":"st_perimeter(shape)","type":"esriFieldTypeDouble","alias":"st_perimeter(shape)"}],"features":[{"attributes":{"objectid":1,"name":"MD 0746","folderpath":"MD 0746 Active Till 0945 UTC","popupinfo":"http://www.spc.noaa.gov/products/md/md0746.html","idp_filedate":1779005564000,"idp_ingestdate":1779005574000,"st_area(shape)":2.9986499999999494,"st_perimeter(shape)":8.0986634414120999},"geometry":{"rings":[[[-101.12999999999994,41.03000000000003],[-100.82999999999998,41.590000000000032],[-99.489999999999952,41.770000000000039],[-98.069999999999936,41.770000000000039],[-97.619999999999948,41.420000000000073],[-97.569999999999936,41.020000000000039],[-98.229999999999961,40.82000000000005],[-100.00999999999999,40.790000000000077],[-100.92999999999995,40.770000000000039],[-101.12999999999994,41.03000000000003]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/day1otlk_cat.nolyr.geojson b/tests/fixtures/day1otlk_cat.nolyr.geojson new file mode 100644 index 0000000..cfa9cd8 --- /dev/null +++ b/tests/fixtures/day1otlk_cat.nolyr.geojson @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"type": "Feature", "geometry": {"type": "MultiPolygon", "coordinates": [[[[-90.78, 47.72], [-96.37, 46.22], [-99.37, 44.81], [-101.93, 43.01], [-103.13, 42.34], [-107.41, 40.97], [-110.16, 39.87], [-111.4, 38.65], [-111.14, 37.84], [-109.93, 37.67], [-106.79, 38.38], [-104.1, 38.7], [-101.7, 38.64], [-100.55, 38.24], [-100.76, 36.49], [-101.03, 35.41], [-101.16, 34.49], [-101.25, 32.72], [-100.28, 32.27], [-99.35, 32.62], [-98.28, 33.69], [-95.94, 34.98], [-93.92, 35.63], [-92.8, 36.9], [-91.89, 39.49], [-90.11, 41.46], [-88.04, 42.22], [-83.65, 42.25], [-82.94, 42.5], [-82.27583815028902, 42.6328323699422], [-82.304, 42.546], [-82.518, 42.326], [-82.69, 42.224], [-82.863, 42.181], [-82.903, 42.063], [-82.863, 41.98], [-82.808, 41.911], [-82.689, 41.863], [-82.459, 41.878], [-81.764, 42.178], [-81.262, 42.421], [-80.316, 42.6], [-79.514, 42.795], [-79.252, 42.966], [-79.373, 43.553], [-78.632, 43.794], [-77.319, 43.789], [-76.955, 43.791], [-76.69489339513326, 44.094893395133255], [-76.4, 43.8], [-75.46, 43.1], [-74.79, 42.2], [-74.45, 40.84], [-74.25, 39.57], [-74.06426034486014, 39.22624302630834], [-74.085, 39.198], [-74.372, 38.982], [-74.504, 38.814], [-74.716, 38.67], [-74.701, 38.442], [-74.762, 38.239], [-75.086, 37.666], [-75.263, 37.548], [-75.356, 37.334], [-75.645, 36.894], [-75.4903870226456, 36.50182474722152], [-76.96, 36.76], [-78.5, 36.52], [-79.27, 35.96], [-79.73, 35.24], [-80.08, 34.3], [-80.14, 33.12], [-80.34503106261141, 32.00786181189563], [-80.436, 31.966], [-80.764, 31.633], [-81.09, 30.74], [-80.989, 30.128], [-80.765, 29.498], [-80.349, 28.83], [-80.197, 28.552], [-80.271, 28.232], [-79.788, 27.148], [-79.7, 26.777], [-79.766, 26.228], [-79.812, 25.576], [-79.965, 25.158], [-80.143, 24.859], [-80.331, 24.705], [-80.635, 24.487], [-81.054, 24.361], [-81.782, 24.208], [-82.816, 24.169], [-83.288, 24.221], [-83.28, 24.513], [-83.238, 24.798], [-83.163, 25.012], [-82.313, 25.017], [-82.368, 25.134], [-82.51, 25.288], [-82.632, 25.453], [-81.934, 25.61], [-82.143, 26.09], [-82.324, 26.171], [-82.535, 26.48], [-82.719, 26.892], [-83.105, 27.532], [-83.07, 27.615], [-83.183, 27.781], [-83.185, 28.105], [-83.156, 28.373], [-83.0890942246556, 28.416347403744265], [-82.97, 27.79], [-82.62, 27.17], [-81.66, 25.98], [-81.0, 25.8], [-80.68, 26.67], [-81.09, 28.52], [-81.66, 30.13], [-82.0, 32.95], [-82.29, 34.62], [-82.98, 36.1], [-83.64, 36.14], [-85.13, 35.6], [-85.65, 34.72], [-85.65, 33.51], [-84.64, 31.74], [-84.29, 30.6], [-83.24, 29.21], [-83.16078361954287, 28.793380517595843], [-83.273, 28.827], [-83.421, 29.093], [-83.625, 29.29], [-83.895, 29.642], [-84.073, 29.73], [-84.171, 29.626], [-84.467, 29.438], [-84.92610196689516, 29.278022545110943], [-86.22, 32.63], [-86.79, 33.76], [-86.94, 34.61], [-86.68, 35.64], [-86.29, 36.59], [-85.61, 37.46], [-85.0, 38.13], [-84.96, 38.82], [-85.53, 39.78], [-86.29, 40.4], [-86.95, 40.69], [-87.33, 40.74], [-88.01, 40.59], [-88.77, 40.24], [-89.43, 39.71], [-90.0, 38.27], [-90.86, 36.49], [-90.56, 34.69], [-88.94, 32.25], [-88.32643638168156, 29.864879455550827], [-88.406, 29.863], [-88.432, 29.714], [-88.695, 29.394], [-88.581, 29.249], [-88.619, 29.022], [-88.937, 28.691], [-89.175, 28.63], [-89.399, 28.577], [-89.712, 28.693], [-89.828, 28.916], [-90.102, 28.755], [-90.54, 28.711], [-90.745, 28.711], [-91.083, 28.732], [-91.315, 28.893], [-91.556, 28.983], [-91.655, 29.121], [-91.742, 29.058], [-92.079, 29.114], [-92.164, 29.181], [-92.629, 29.233], [-93.243, 29.441], [-93.588, 29.43], [-93.777, 29.35], [-93.961, 29.348], [-94.266, 29.222], [-94.502, 29.062], [-94.9, 28.808], [-95.134, 28.597], [-95.489, 28.428], [-96.044, 28.182], [-96.147, 28.055], [-96.427, 27.94], [-96.796, 27.579], [-97.017, 27.081], [-96.876, 26.595], [-96.749, 25.948], [-97.075, 25.799], [-97.23, 25.659], [-97.68, 25.837], [-98.218, 25.934], [-98.509, 26.039], [-99.103, 26.254], [-99.357, 26.519], [-99.489, 26.804], [-99.612, 27.039], [-99.697, 27.291], [-99.724, 27.496], [-99.917, 27.637], [-100.23, 28.008], [-100.41, 28.265], [-100.596, 28.593], [-100.754, 28.844], [-100.911, 29.059], [-101.161, 29.268], [-101.45, 29.518], [-101.616, 29.594], [-101.852, 29.614], [-102.125, 29.651], [-102.18349535424451, 29.64899444499733], [-101.29, 35.38], [-100.74, 37.44], [-101.18, 37.98], [-101.62, 38.1], [-102.2, 38.08], [-102.96, 37.83], [-106.24, 37.2], [-107.74, 36.87], [-111.23, 36.51], [-113.64, 36.52], [-114.75, 36.77], [-116.02, 37.23], [-117.5, 38.0], [-118.45, 38.78], [-118.78, 39.5], [-118.78, 40.27], [-118.69, 40.55], [-117.28999999999999, 41.36], [-116.38, 41.51], [-115.36, 41.43], [-114.42, 40.84], [-113.82, 40.23], [-113.2, 40.04], [-112.35, 40.28], [-111.81, 40.75], [-111.34, 41.44], [-110.37, 42.16], [-108.82, 42.65], [-107.25, 42.88], [-106.41, 42.93], [-105.47, 42.92], [-104.83, 42.95], [-104.08, 43.29], [-102.86, 45.3], [-100.78700669111467, 49.19420605393842], [-99.664, 49.183], [-98.264, 49.18], [-96.747, 49.197], [-95.911, 49.174], [-95.453, 49.167], [-95.49, 49.561], [-94.579, 49.541], [-94.395, 48.962], [-93.805, 48.857], [-93.513, 48.786], [-93.223, 48.834], [-92.5, 48.697], [-91.94, 48.521], [-91.477, 48.338], [-90.777, 48.453], [-90.513, 48.262], [-90.011, 48.266], [-89.521, 48.207], [-88.425, 48.56], [-87.97077512009251, 48.37999861636381], [-90.78, 47.72]]], [[[-111.07, 47.45], [-110.96000000000001, 46.66], [-111.14, 46.04], [-112.17, 45.36], [-113.38, 44.87], [-114.31, 44.49], [-115.18, 44.29], [-116.17, 44.27], [-116.7, 44.35], [-117.94, 44.78], [-119.69, 46.0], [-122.67778609238137, 49.27357432730481], [-122.534, 49.247], [-121.576, 49.18], [-120.445, 49.201], [-119.226, 49.203], [-117.702, 49.217], [-116.063, 49.223], [-114.53, 49.22], [-113.003, 49.227], [-111.41689025091418, 49.212202474644094], [-111.07, 47.45]]]]}, "properties": {"DN": 2, "VALID": "202605171200", "EXPIRE": "202605181200", "ISSUE": "202605170610", "VALID_ISO": "2026-05-17T12:00:00+00:00", "EXPIRE_ISO": "2026-05-18T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:10:00+00:00", "FORECASTER": "Guyer/Squitieri", "LABEL": "TSTM", "LABEL2": "General Thunderstorms Risk", "stroke": "#55BB55", "fill": "#C1E9C1"}}, {"type": "Feature", "geometry": {"type": "MultiPolygon", "coordinates": [[[[-82.94, 42.5], [-83.65, 42.25], [-88.04, 42.22], [-90.11, 41.46], [-91.89, 39.49], [-92.8, 36.9], [-93.92, 35.63], [-95.94, 34.98], [-98.28, 33.69], [-99.35, 32.62], [-100.28, 32.27], [-101.25, 32.72], [-101.16, 34.49], [-101.03, 35.41], [-100.76, 36.49], [-100.55, 38.24], [-101.7, 38.64], [-104.1, 38.7], [-106.79, 38.38], [-109.93, 37.67], [-111.14, 37.84], [-111.4, 38.65], [-110.16, 39.87], [-107.41, 40.97], [-103.13, 42.34], [-101.93, 43.01], [-99.37, 44.81], [-96.37, 46.22], [-90.78, 47.72], [-87.97077512009251, 48.37999861636381], [-87.08, 48.027], [-85.677, 47.453], [-84.653, 46.989], [-84.444, 46.699], [-84.034, 46.687], [-83.88, 46.326], [-83.814, 46.264], [-83.743, 46.252], [-83.601, 46.229], [-83.414, 46.232], [-83.251, 46.093], [-83.288, 45.851], [-83.292, 45.799], [-82.232, 45.499], [-81.965, 44.144], [-81.902, 43.586], [-82.087, 43.18], [-82.073, 43.025], [-82.196, 42.879], [-82.27583815028902, 42.6328323699422], [-82.94, 42.5]], [[-104.01, 39.68], [-103.94, 39.18], [-103.4, 38.98], [-100.69, 39.29], [-100.1, 39.1], [-99.79, 38.75], [-99.63, 38.41], [-100.18, 36.92], [-100.52, 35.65], [-100.44, 35.28], [-100.02, 35.22], [-99.38, 35.45], [-99.18, 35.69], [-97.75, 36.6], [-96.14, 37.95], [-95.75, 38.44], [-95.07, 39.04], [-92.98, 40.65], [-92.21, 41.7], [-91.48, 42.42], [-91.15, 42.99], [-90.78, 44.18], [-90.88, 44.87], [-91.64, 45.25], [-92.68, 46.26], [-94.75, 46.36], [-96.05, 45.93], [-98.06, 44.8], [-101.14, 42.16], [-102.55, 41.09], [-104.01, 39.68]]], [[[-82.98, 36.1], [-82.29, 34.62], [-82.0, 32.95], [-81.66, 30.13], [-81.09, 28.52], [-80.68, 26.67], [-81.0, 25.8], [-81.66, 25.98], [-82.62, 27.17], [-82.97, 27.79], [-83.0890942246556, 28.416347403744265], [-83.014, 28.465], [-82.99, 28.551], [-83.026, 28.753], [-83.16078361954287, 28.793380517595843], [-83.24, 29.21], [-84.29, 30.6], [-84.64, 31.74], [-85.65, 33.51], [-85.65, 34.72], [-85.13, 35.6], [-83.64, 36.14], [-82.98, 36.1]]]]}, "properties": {"DN": 3, "VALID": "202605171200", "EXPIRE": "202605181200", "ISSUE": "202605170610", "VALID_ISO": "2026-05-17T12:00:00+00:00", "EXPIRE_ISO": "2026-05-18T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:10:00+00:00", "FORECASTER": "Guyer/Squitieri", "LABEL": "MRGL", "LABEL2": "Marginal Risk", "stroke": "#005500", "fill": "#66A366"}}, {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-96.05, 45.93], [-94.75, 46.36], [-92.68, 46.26], [-91.64, 45.25], [-90.88, 44.87], [-90.78, 44.18], [-91.15, 42.99], [-91.48, 42.42], [-92.21, 41.7], [-92.98, 40.65], [-95.07, 39.04], [-95.75, 38.44], [-96.14, 37.95], [-97.75, 36.6], [-99.18, 35.69], [-99.38, 35.45], [-100.02, 35.22], [-100.44, 35.28], [-100.52, 35.65], [-100.18, 36.92], [-99.63, 38.41], [-99.79, 38.75], [-100.1, 39.1], [-100.69, 39.29], [-103.4, 38.98], [-103.94, 39.18], [-104.01, 39.68], [-102.55, 41.09], [-101.14, 42.16], [-98.06, 44.8], [-96.05, 45.93]], [[-102.6, 39.97], [-102.35, 39.57], [-101.24, 39.57], [-99.41, 40.18], [-98.78, 40.08], [-98.59, 39.02], [-97.84, 39.05], [-97.3, 39.32], [-96.8, 39.93], [-95.63, 40.41], [-94.48, 42.02], [-93.95, 43.13], [-94.06, 43.5], [-94.72, 43.79], [-95.04, 44.14], [-96.33, 44.24], [-97.01, 44.12], [-97.45, 43.88], [-100.31, 41.85], [-102.4, 40.55], [-102.6, 39.97]]]}, "properties": {"DN": 4, "VALID": "202605171200", "EXPIRE": "202605181200", "ISSUE": "202605170610", "VALID_ISO": "2026-05-17T12:00:00+00:00", "EXPIRE_ISO": "2026-05-18T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:10:00+00:00", "FORECASTER": "Guyer/Squitieri", "LABEL": "SLGT", "LABEL2": "Slight Risk", "stroke": "#DDAA00", "fill": "#FFE066"}}, {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-97.45, 43.88], [-97.01, 44.12], [-96.33, 44.24], [-95.04, 44.14], [-94.72, 43.79], [-94.06, 43.5], [-93.95, 43.13], [-94.48, 42.02], [-95.63, 40.41], [-96.8, 39.93], [-97.3, 39.32], [-97.84, 39.05], [-98.59, 39.02], [-98.78, 40.08], [-99.41, 40.18], [-101.24, 39.57], [-102.35, 39.57], [-102.6, 39.97], [-102.4, 40.55], [-100.31, 41.85], [-97.45, 43.88]]]}, "properties": {"DN": 5, "VALID": "202605171200", "EXPIRE": "202605181200", "ISSUE": "202605170610", "VALID_ISO": "2026-05-17T12:00:00+00:00", "EXPIRE_ISO": "2026-05-18T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:10:00+00:00", "FORECASTER": "Guyer/Squitieri", "LABEL": "ENH", "LABEL2": "Enhanced Risk", "stroke": "#FF6600", "fill": "#FFA366"}}]} \ No newline at end of file diff --git a/tests/fixtures/day2otlk_cat.nolyr.geojson b/tests/fixtures/day2otlk_cat.nolyr.geojson new file mode 100644 index 0000000..9cd0f5f --- /dev/null +++ b/tests/fixtures/day2otlk_cat.nolyr.geojson @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"type": "Feature", "geometry": {"type": "MultiPolygon", "coordinates": [[[[-92.52, 46.41], [-95.21, 43.99], [-96.91, 42.77], [-99.61, 39.96], [-100.59, 37.42], [-101.19, 32.97], [-100.88, 31.44], [-99.74, 31.13], [-99.44, 31.35], [-96.01, 32.9], [-91.05, 36.29], [-87.72, 36.99], [-84.18, 39.89], [-82.15553575167267, 42.00899176186791], [-81.764, 42.178], [-81.76314101062219, 42.178415805615145], [-83.83, 39.88], [-86.69, 37.69], [-88.89, 34.44], [-88.79, 33.25], [-87.78, 33.26], [-84.92, 36.18], [-81.52, 39.92], [-80.22, 41.49], [-78.54, 43.01], [-77.46, 42.95], [-76.86, 42.06], [-76.31, 40.44], [-75.41, 38.57], [-74.85282473803164, 38.07837476885145], [-75.086, 37.666], [-75.263, 37.548], [-75.356, 37.334], [-75.53073818051313, 37.067962631744706], [-78.02, 37.39], [-81.04, 36.48], [-82.67, 34.96], [-83.12, 33.15], [-82.46, 31.63], [-81.0284994311941, 30.367343088027617], [-80.989, 30.128], [-80.765, 29.498], [-80.349, 28.83], [-80.197, 28.552], [-80.271, 28.232], [-79.788, 27.148], [-79.7, 26.777], [-79.766, 26.228], [-79.812, 25.576], [-79.965, 25.158], [-80.143, 24.859], [-80.331, 24.705], [-80.635, 24.487], [-81.054, 24.361], [-81.782, 24.208], [-82.816, 24.169], [-83.288, 24.221], [-83.28, 24.513], [-83.238, 24.798], [-83.163, 25.012], [-82.313, 25.017], [-82.368, 25.134], [-82.51, 25.288], [-82.632, 25.453], [-81.934, 25.61], [-82.143, 26.09], [-82.324, 26.171], [-82.535, 26.48], [-82.719, 26.892], [-83.105, 27.532], [-83.07, 27.615], [-83.183, 27.781], [-83.185, 28.105], [-83.156, 28.373], [-83.014, 28.465], [-82.99, 28.551], [-83.026, 28.753], [-83.273, 28.827], [-83.421, 29.093], [-83.625, 29.29], [-83.895, 29.642], [-84.073, 29.73], [-84.171, 29.626], [-84.467, 29.438], [-85.018, 29.246], [-85.336, 29.335], [-85.675, 29.436], [-85.767, 29.696], [-85.985, 29.876], [-86.462, 30.068], [-87.771, 29.878], [-88.406, 29.863], [-88.432, 29.714], [-88.695, 29.394], [-88.581, 29.249], [-88.619, 29.022], [-88.937, 28.691], [-89.175, 28.63], [-89.399, 28.577], [-89.712, 28.693], [-89.828, 28.916], [-90.102, 28.755], [-90.54, 28.711], [-90.745, 28.711], [-91.083, 28.732], [-91.315, 28.893], [-91.556, 28.983], [-91.655, 29.121], [-91.742, 29.058], [-92.079, 29.114], [-92.164, 29.181], [-92.629, 29.233], [-93.243, 29.441], [-93.588, 29.43], [-93.777, 29.35], [-93.961, 29.348], [-94.266, 29.222], [-94.502, 29.062], [-94.9, 28.808], [-95.134, 28.597], [-95.489, 28.428], [-96.044, 28.182], [-96.147, 28.055], [-96.427, 27.94], [-96.796, 27.579], [-97.017, 27.081], [-96.876, 26.595], [-96.749, 25.948], [-97.075, 25.799], [-97.23, 25.659], [-97.68, 25.837], [-98.218, 25.934], [-98.509, 26.039], [-99.103, 26.254], [-99.357, 26.519], [-99.489, 26.804], [-99.612, 27.039], [-99.697, 27.291], [-99.724, 27.496], [-99.917, 27.637], [-100.23, 28.008], [-100.41, 28.265], [-100.596, 28.593], [-100.754, 28.844], [-100.911, 29.059], [-101.161, 29.268], [-101.19971439100793, 29.301489957619314], [-101.29, 32.94], [-101.12, 34.71], [-100.68, 38.07], [-100.76, 39.02], [-101.24, 39.48], [-102.15, 39.39], [-104.37, 38.55], [-106.93, 37.62], [-107.88, 37.34], [-109.41, 37.4], [-110.73, 38.31], [-111.4, 39.67], [-112.32, 41.74], [-112.16, 42.98], [-111.11, 43.76], [-109.8, 43.98], [-108.86, 43.38], [-108.53999999999999, 42.38], [-107.19, 42.1], [-103.61, 42.26], [-100.75, 42.69], [-98.86, 43.12], [-96.33, 44.89], [-93.29, 47.48], [-91.54314577407334, 48.36414401005491], [-91.477, 48.338], [-90.777, 48.453], [-90.513, 48.262], [-90.29552051488335, 48.263732904263875], [-92.52, 46.41]]], [[[-113.99, 48.07], [-116.44, 47.01], [-119.03, 47.32], [-120.85, 48.04], [-121.49040376488666, 49.18158932001537], [-120.445, 49.201], [-119.226, 49.203], [-117.702, 49.217], [-116.063, 49.223], [-114.53, 49.22], [-113.003, 49.227], [-112.12132684929199, 49.218774477894264], [-113.99, 48.07]]]]}, "properties": {"DN": 2, "VALID": "202605181200", "EXPIRE": "202605191200", "ISSUE": "202605170600", "VALID_ISO": "2026-05-18T12:00:00+00:00", "EXPIRE_ISO": "2026-05-19T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:00:00+00:00", "FORECASTER": "Thornton", "LABEL": "TSTM", "LABEL2": "General Thunderstorms Risk", "stroke": "#55BB55", "fill": "#C1E9C1"}}, {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-95.08, 43.22], [-96.98, 41.27], [-99.1, 39.7], [-100.32, 37.26], [-100.63, 34.0], [-100.5, 33.91], [-100.61, 32.85], [-100.03, 32.52], [-97.79, 33.28], [-95.54, 35.22], [-92.54, 37.29], [-84.8, 41.72], [-83.79, 43.07], [-83.8, 44.83], [-84.98, 45.61], [-83.9418244248141, 46.47092608673953], [-83.88, 46.326], [-83.814, 46.264], [-83.743, 46.252], [-83.601, 46.229], [-83.414, 46.232], [-83.251, 46.093], [-83.288, 45.851], [-83.292, 45.799], [-82.232, 45.499], [-81.965, 44.144], [-81.902, 43.586], [-82.087, 43.18], [-82.073, 43.025], [-82.196, 42.879], [-82.304, 42.546], [-82.518, 42.326], [-82.69, 42.224], [-82.863, 42.181], [-82.903, 42.063], [-82.863, 41.98], [-82.808, 41.911], [-82.689, 41.863], [-82.459, 41.878], [-82.15553575167267, 42.00899176186791], [-84.18, 39.89], [-87.72, 36.99], [-91.05, 36.29], [-96.01, 32.9], [-99.44, 31.35], [-99.74, 31.13], [-100.88, 31.44], [-101.19, 32.97], [-100.59, 37.42], [-99.61, 39.96], [-96.91, 42.77], [-95.21, 43.99], [-92.52, 46.41], [-90.29552051488335, 48.263732904263875], [-90.011, 48.266], [-89.521, 48.207], [-88.425, 48.56], [-87.50887702670514, 48.19695647229282], [-95.08, 43.22]]]}, "properties": {"DN": 3, "VALID": "202605181200", "EXPIRE": "202605191200", "ISSUE": "202605170600", "VALID_ISO": "2026-05-18T12:00:00+00:00", "EXPIRE_ISO": "2026-05-19T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:00:00+00:00", "FORECASTER": "Thornton", "LABEL": "MRGL", "LABEL2": "Marginal Risk", "stroke": "#005500", "fill": "#66A366"}}, {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-84.98, 45.61], [-83.8, 44.83], [-83.79, 43.07], [-84.8, 41.72], [-92.54, 37.29], [-95.54, 35.22], [-97.79, 33.28], [-100.03, 32.52], [-100.61, 32.85], [-100.5, 33.91], [-100.63, 34.0], [-100.32, 37.26], [-99.1, 39.7], [-96.98, 41.27], [-95.08, 43.22], [-87.50887702670514, 48.19695647229282], [-87.08, 48.027], [-85.677, 47.453], [-84.653, 46.989], [-84.444, 46.699], [-84.034, 46.687], [-83.9418244248141, 46.47092608673953], [-84.98, 45.61]], [[-99.17, 37.15], [-99.05, 36.04], [-98.42, 35.72], [-96.9, 36.26], [-93.43, 39.37], [-92.26, 39.97], [-91.67, 41.14], [-91.58, 41.86], [-92.29, 42.84], [-93.43, 43.07], [-94.09, 42.93], [-94.61, 42.56], [-94.88, 42.45], [-96.1, 41.47], [-96.42, 41.38], [-97.36, 40.55], [-97.64, 40.19], [-99.17, 37.15]]]}, "properties": {"DN": 4, "VALID": "202605181200", "EXPIRE": "202605191200", "ISSUE": "202605170600", "VALID_ISO": "2026-05-18T12:00:00+00:00", "EXPIRE_ISO": "2026-05-19T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:00:00+00:00", "FORECASTER": "Thornton", "LABEL": "SLGT", "LABEL2": "Slight Risk", "stroke": "#DDAA00", "fill": "#FFE066"}}, {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-96.1, 41.47], [-94.88, 42.45], [-94.61, 42.56], [-94.09, 42.93], [-93.43, 43.07], [-92.29, 42.84], [-91.58, 41.86], [-91.67, 41.14], [-92.26, 39.97], [-93.43, 39.37], [-96.9, 36.26], [-98.42, 35.72], [-99.05, 36.04], [-99.17, 37.15], [-97.64, 40.19], [-97.36, 40.55], [-96.42, 41.38], [-96.1, 41.47]], [[-97.85, 38.18], [-97.17, 37.66], [-96.56, 37.71], [-95.07, 38.99], [-95.07, 39.69], [-95.28, 40.1], [-95.68, 40.44], [-96.37, 40.53], [-97.2, 39.59], [-97.85, 38.18]]]}, "properties": {"DN": 5, "VALID": "202605181200", "EXPIRE": "202605191200", "ISSUE": "202605170600", "VALID_ISO": "2026-05-18T12:00:00+00:00", "EXPIRE_ISO": "2026-05-19T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:00:00+00:00", "FORECASTER": "Thornton", "LABEL": "ENH", "LABEL2": "Enhanced Risk", "stroke": "#FF6600", "fill": "#FFA366"}}, {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-95.68, 40.44], [-95.28, 40.1], [-95.07, 39.69], [-95.07, 38.99], [-96.56, 37.71], [-97.17, 37.66], [-97.85, 38.18], [-97.2, 39.59], [-96.37, 40.53], [-95.68, 40.44]]]}, "properties": {"DN": 6, "VALID": "202605181200", "EXPIRE": "202605191200", "ISSUE": "202605170600", "VALID_ISO": "2026-05-18T12:00:00+00:00", "EXPIRE_ISO": "2026-05-19T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T06:00:00+00:00", "FORECASTER": "Thornton", "LABEL": "MDT", "LABEL2": "Moderate Risk", "stroke": "#CC0000", "fill": "#E06666"}}]} \ No newline at end of file diff --git a/tests/fixtures/day3otlk_cat.nolyr.geojson b/tests/fixtures/day3otlk_cat.nolyr.geojson new file mode 100644 index 0000000..f742589 --- /dev/null +++ b/tests/fixtures/day3otlk_cat.nolyr.geojson @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"type": "Feature", "geometry": {"type": "MultiPolygon", "coordinates": [[[[-91.3, 40.47], [-96.41, 36.51], [-99.77, 33.37], [-101.7, 31.28], [-103.06146071556533, 28.86174110661821], [-103.419, 28.868], [-103.9209054766229, 29.132605607494202], [-101.39, 32.66], [-96.62, 36.9], [-91.44, 41.12], [-84.39874258424345, 46.69767539270956], [-84.034, 46.687], [-83.98860376113316, 46.58058414135758], [-91.3, 40.47]]], [[[-76.95, 40.67], [-86.13, 35.06], [-90.5, 30.31], [-91.46824264415167, 28.95022754345913], [-91.556, 28.983], [-91.655, 29.121], [-91.742, 29.058], [-92.079, 29.114], [-92.164, 29.181], [-92.629, 29.233], [-93.243, 29.441], [-93.588, 29.43], [-93.777, 29.35], [-93.9051540711848, 29.34860702096538], [-93.9, 29.38], [-94.35, 30.55], [-95.51, 31.4], [-96.16, 31.36], [-98.99, 28.62], [-98.13, 26.89], [-96.80373950299915, 26.226869751499574], [-96.749, 25.948], [-97.075, 25.799], [-97.23, 25.659], [-97.68, 25.837], [-98.218, 25.934], [-98.509, 26.039], [-99.103, 26.254], [-99.357, 26.519], [-99.489, 26.804], [-99.612, 27.039], [-99.697, 27.291], [-99.724, 27.496], [-99.917, 27.637], [-100.23, 28.008], [-100.41, 28.265], [-100.45484437632634, 28.344080405564725], [-96.11, 31.93], [-88.54, 34.03], [-83.65, 38.62], [-77.55, 42.4], [-74.32098011278677, 45.185821079164356], [-71.71, 45.171], [-71.571, 45.456], [-70.993, 45.547], [-70.611, 45.956], [-70.553, 46.207], [-70.214, 46.804], [-69.338, 47.646], [-68.819, 47.584], [-68.687, 47.517], [-68.509, 47.491], [-68.217, 47.605], [-67.636, 47.183], [-67.471, 46.578], [-67.502, 45.792], [-67.236, 45.629], [-67.178, 45.432], [-66.953, 45.389], [-66.838, 45.131], [-66.773, 45.027], [-66.76, 44.945], [-66.71424661016948, 44.8680739709443], [-76.95, 40.67]]], [[[-82.53, 26.66], [-80.91, 27.6], [-80.06006626920899, 27.758600074166743], [-79.788, 27.148], [-79.7, 26.777], [-79.766, 26.228], [-79.812, 25.576], [-79.965, 25.158], [-80.143, 24.859], [-80.331, 24.705], [-80.635, 24.487], [-81.054, 24.361], [-81.782, 24.208], [-82.816, 24.169], [-83.288, 24.221], [-83.28, 24.513], [-83.238, 24.798], [-83.163, 25.012], [-82.313, 25.017], [-82.368, 25.134], [-82.51, 25.288], [-82.632, 25.453], [-81.934, 25.61], [-82.143, 26.09], [-82.324, 26.171], [-82.535, 26.48], [-82.59767179623242, 26.62033032634651], [-82.53, 26.66]]]]}, "properties": {"DN": 2, "VALID": "202605191200", "EXPIRE": "202605201200", "ISSUE": "202605170730", "VALID_ISO": "2026-05-19T12:00:00+00:00", "EXPIRE_ISO": "2026-05-20T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T07:30:00+00:00", "FORECASTER": "Thornton", "LABEL": "TSTM", "LABEL2": "General Thunderstorms Risk", "stroke": "#55BB55", "fill": "#C1E9C1"}}, {"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-87.68, 42.63], [-93.75, 37.78], [-97.63, 34.99], [-98.6, 33.92], [-100.04, 32.52], [-100.25, 31.88], [-99.71, 31.68], [-91.35, 34.5], [-89.85, 35.12], [-82.25, 40.84], [-79.35555790375577, 42.898410681136504], [-79.252, 42.966], [-79.25308889929255, 42.971282511444045], [-78.09907521036808, 43.79197058343628], [-77.319, 43.789], [-76.955, 43.791], [-76.557, 44.256], [-75.977, 44.604], [-75.603, 44.874], [-74.881, 45.189], [-74.32098011278677, 45.185821079164356], [-77.55, 42.4], [-83.65, 38.62], [-88.54, 34.03], [-96.11, 31.93], [-100.45484437632634, 28.344080405564725], [-100.596, 28.593], [-100.754, 28.844], [-100.911, 29.059], [-101.161, 29.268], [-101.45, 29.518], [-101.616, 29.594], [-101.852, 29.614], [-102.125, 29.651], [-102.3, 29.645], [-102.486, 29.578], [-102.613, 29.283], [-102.733, 29.098], [-102.962, 28.86], [-103.06146071556533, 28.86174110661821], [-101.7, 31.28], [-99.77, 33.37], [-96.41, 36.51], [-91.3, 40.47], [-83.98860376113316, 46.58058414135758], [-83.88, 46.326], [-83.814, 46.264], [-83.743, 46.252], [-83.62255491427081, 46.232491288931186], [-87.68, 42.63]]]}, "properties": {"DN": 3, "VALID": "202605191200", "EXPIRE": "202605201200", "ISSUE": "202605170730", "VALID_ISO": "2026-05-19T12:00:00+00:00", "EXPIRE_ISO": "2026-05-20T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T07:30:00+00:00", "FORECASTER": "Thornton", "LABEL": "MRGL", "LABEL2": "Marginal Risk", "stroke": "#005500", "fill": "#66A366"}}, {"type": "Feature", "geometry": {"type": "MultiPolygon", "coordinates": [[[[-79.25308889929255, 42.971282511444045], [-79.373, 43.553], [-78.632, 43.794], [-78.09907521036808, 43.79197058343628], [-79.25308889929255, 42.971282511444045]]], [[[-82.25, 40.84], [-89.85, 35.12], [-91.35, 34.5], [-99.71, 31.68], [-100.25, 31.88], [-100.04, 32.52], [-98.6, 33.92], [-97.63, 34.99], [-93.75, 37.78], [-87.68, 42.63], [-83.62255491427081, 46.232491288931186], [-83.601, 46.229], [-83.414, 46.232], [-83.251, 46.093], [-83.288, 45.851], [-83.292, 45.799], [-82.232, 45.499], [-81.965, 44.144], [-81.902, 43.586], [-82.087, 43.18], [-82.073, 43.025], [-82.196, 42.879], [-82.304, 42.546], [-82.518, 42.326], [-82.69, 42.224], [-82.863, 42.181], [-82.903, 42.063], [-82.863, 41.98], [-82.808, 41.911], [-82.689, 41.863], [-82.459, 41.878], [-81.764, 42.178], [-81.262, 42.421], [-80.316, 42.6], [-79.514, 42.795], [-79.35555790375577, 42.898410681136504], [-82.25, 40.84]]]]}, "properties": {"DN": 4, "VALID": "202605191200", "EXPIRE": "202605201200", "ISSUE": "202605170730", "VALID_ISO": "2026-05-19T12:00:00+00:00", "EXPIRE_ISO": "2026-05-20T12:00:00+00:00", "ISSUE_ISO": "2026-05-17T07:30:00+00:00", "FORECASTER": "Thornton", "LABEL": "SLGT", "LABEL2": "Slight Risk", "stroke": "#DDAA00", "fill": "#FFE066"}}]} \ No newline at end of file diff --git a/tests/fixtures/day4prob.nolyr.geojson b/tests/fixtures/day4prob.nolyr.geojson new file mode 100644 index 0000000..5282117 --- /dev/null +++ b/tests/fixtures/day4prob.nolyr.geojson @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"type": "Feature", "geometry": {"type": "Polygon", "coordinates": [[[-82.61, 42.4], [-82.85873607578283, 42.18205981931409], [-82.863, 42.181], [-82.8642904707233, 42.17719311136624], [-83.66, 41.48], [-85.71, 39.94], [-89.83, 36.6], [-92.38, 35.13], [-93.47, 34.85], [-96.31, 34.43], [-97.79, 34.79], [-97.8, 35.05], [-97.59, 36.21], [-94.79, 37.89], [-91.99, 39.37], [-89.33, 41.04], [-87.67, 42.26], [-85.6, 43.08], [-83.79, 43.65], [-82.02166771186918, 44.43158333177053], [-81.965, 44.144], [-81.902, 43.586], [-82.087, 43.18], [-82.073, 43.025], [-82.196, 42.879], [-82.24923920493488, 42.7148457847841], [-82.61, 42.4]]]}, "properties": {"DN": 15, "VALID": "202605191200", "EXPIRE": "202605201200", "ISSUE": "202605160858", "VALID_ISO": "2026-05-19T12:00:00+00:00", "EXPIRE_ISO": "2026-05-20T12:00:00+00:00", "ISSUE_ISO": "2026-05-16T08:58:00+00:00", "FORECASTER": "THORNTON", "LABEL": "0.15", "LABEL2": "15% Any Severe Risk", "stroke": "#FF9600", "fill": "#FFEB7F"}}]} \ No newline at end of file diff --git a/tests/fixtures/iem_spc_watch.json b/tests/fixtures/iem_spc_watch.json new file mode 100644 index 0000000..e577a26 --- /dev/null +++ b/tests/fixtures/iem_spc_watch.json @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"id": "0", "type": "Feature", "properties": {"sel": "SEL9", "type": "TOR", "number": 139, "max_hail_size": 2.5, "max_wind_gust_knots": 60.0, "is_pds": false, "year": 2024, "spcurl": "https://www.spc.noaa.gov/products/watch/2024/ww0139.html", "issue": "2024-04-26T15:10:00Z", "expire": "2024-04-26T23:00:00Z"}, "geometry": {"type": "MultiPolygon", "coordinates": [[[[-98.27, 32.02], [-94.29, 34.12], [-94.29, 32.38], [-98.27, 30.28], [-98.27, 32.02]]]]}}, {"id": "1", "type": "Feature", "properties": {"sel": "SEL0", "type": "TOR", "number": 140, "max_hail_size": 3.0, "max_wind_gust_knots": 60.0, "is_pds": false, "year": 2024, "spcurl": "https://www.spc.noaa.gov/products/watch/2024/ww0140.html", "issue": "2024-04-26T17:55:00Z", "expire": "2024-04-27T00:03:00Z"}, "geometry": {"type": "MultiPolygon", "coordinates": [[[[-99.22, 42.89], [-95.07, 42.02], [-95.07, 39.7], [-99.22, 40.57], [-99.22, 42.89]]]]}}, {"id": "2", "type": "Feature", "properties": {"sel": "SEL1", "type": "TOR", "number": 141, "max_hail_size": 3.0, "max_wind_gust_knots": 60.0, "is_pds": false, "year": 2024, "spcurl": "https://www.spc.noaa.gov/products/watch/2024/ww0141.html", "issue": "2024-04-26T19:10:00Z", "expire": "2024-04-27T01:07:00Z"}, "geometry": {"type": "MultiPolygon", "coordinates": [[[[-94.11, 38.0], [-94.92, 33.93], [-97.19, 33.93], [-96.5, 38.0], [-94.11, 38.0]]]]}}]} \ No newline at end of file diff --git a/tests/fixtures/iem_spcoutlook_torn.json b/tests/fixtures/iem_spcoutlook_torn.json new file mode 100644 index 0000000..06295f3 --- /dev/null +++ b/tests/fixtures/iem_spcoutlook_torn.json @@ -0,0 +1 @@ +{"outlooks": [{"day": 1, "utc_issue": "2026-05-17T12:00:00Z", "utc_expire": "2026-05-18T12:00:00Z", "utc_product_issue": "2026-05-17T06:10:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2026-05-16T12:00:00Z", "utc_expire": "2026-05-17T12:00:00Z", "utc_product_issue": "2026-05-16T05:35:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2026-05-15T12:00:00Z", "utc_expire": "2026-05-16T12:00:00Z", "utc_product_issue": "2026-05-15T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2026-04-26T13:00:00Z", "utc_expire": "2026-04-27T12:00:00Z", "utc_product_issue": "2026-04-26T13:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2026-04-23T12:00:00Z", "utc_expire": "2026-04-24T12:00:00Z", "utc_product_issue": "2026-04-23T05:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2026-04-17T12:00:00Z", "utc_expire": "2026-04-18T12:00:00Z", "utc_product_issue": "2026-04-17T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2026-04-15T12:00:00Z", "utc_expire": "2026-04-16T12:00:00Z", "utc_product_issue": "2026-04-15T05:53:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2026-04-14T12:00:00Z", "utc_expire": "2026-04-15T12:00:00Z", "utc_product_issue": "2026-04-14T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-09-22T12:00:00Z", "utc_expire": "2025-09-23T12:00:00Z", "utc_product_issue": "2025-09-22T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-08-09T12:00:00Z", "utc_expire": "2025-08-10T12:00:00Z", "utc_product_issue": "2025-08-09T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-07-22T12:00:00Z", "utc_expire": "2025-07-23T12:00:00Z", "utc_product_issue": "2025-07-22T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-07-19T13:00:00Z", "utc_expire": "2025-07-20T12:00:00Z", "utc_product_issue": "2025-07-19T12:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-07-18T12:00:00Z", "utc_expire": "2025-07-19T12:00:00Z", "utc_product_issue": "2025-07-18T05:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-07-10T16:30:00Z", "utc_expire": "2025-07-11T12:00:00Z", "utc_product_issue": "2025-07-10T16:33:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-06-26T13:00:00Z", "utc_expire": "2025-06-27T12:00:00Z", "utc_product_issue": "2025-06-26T12:33:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-06-25T12:00:00Z", "utc_expire": "2025-06-26T12:00:00Z", "utc_product_issue": "2025-06-25T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-06-23T12:00:00Z", "utc_expire": "2025-06-24T12:00:00Z", "utc_product_issue": "2025-06-23T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-06-16T13:00:00Z", "utc_expire": "2025-06-17T12:00:00Z", "utc_product_issue": "2025-06-16T12:54:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-05-19T12:00:00Z", "utc_expire": "2025-05-20T12:00:00Z", "utc_product_issue": "2025-05-19T05:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-05-14T12:00:00Z", "utc_expire": "2025-05-15T12:00:00Z", "utc_product_issue": "2025-05-14T05:49:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-04-28T12:00:00Z", "utc_expire": "2025-04-29T12:00:00Z", "utc_product_issue": "2025-04-28T05:59:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-04-17T13:00:00Z", "utc_expire": "2025-04-18T12:00:00Z", "utc_product_issue": "2025-04-17T12:41:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2025-03-14T12:00:00Z", "utc_expire": "2025-03-15T12:00:00Z", "utc_product_issue": "2025-03-14T05:38:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-10-30T12:00:00Z", "utc_expire": "2024-10-31T12:00:00Z", "utc_product_issue": "2024-10-30T06:15:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-09-19T12:00:00Z", "utc_expire": "2024-09-20T12:00:00Z", "utc_product_issue": "2024-09-19T05:29:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-08-29T12:00:00Z", "utc_expire": "2024-08-30T12:00:00Z", "utc_product_issue": "2024-08-29T05:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-08-14T13:00:00Z", "utc_expire": "2024-08-15T12:00:00Z", "utc_product_issue": "2024-08-14T12:29:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-07-31T12:00:00Z", "utc_expire": "2024-08-01T12:00:00Z", "utc_product_issue": "2024-07-31T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-07-30T12:00:00Z", "utc_expire": "2024-07-31T12:00:00Z", "utc_product_issue": "2024-07-30T06:08:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-07-28T16:30:00Z", "utc_expire": "2024-07-29T12:00:00Z", "utc_product_issue": "2024-07-28T16:28:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-07-15T12:00:00Z", "utc_expire": "2024-07-16T12:00:00Z", "utc_product_issue": "2024-07-15T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-07-04T12:00:00Z", "utc_expire": "2024-07-05T12:00:00Z", "utc_product_issue": "2024-07-04T05:53:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-07-01T12:00:00Z", "utc_expire": "2024-07-02T12:00:00Z", "utc_product_issue": "2024-07-01T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-06-28T12:00:00Z", "utc_expire": "2024-06-29T12:00:00Z", "utc_product_issue": "2024-06-28T06:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-06-25T16:30:00Z", "utc_expire": "2024-06-26T12:00:00Z", "utc_product_issue": "2024-06-25T16:25:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-06-22T01:00:00Z", "utc_expire": "2024-06-22T12:00:00Z", "utc_product_issue": "2024-06-22T00:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-06-18T12:00:00Z", "utc_expire": "2024-06-19T12:00:00Z", "utc_product_issue": "2024-06-18T05:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-06-16T12:00:00Z", "utc_expire": "2024-06-17T12:00:00Z", "utc_product_issue": "2024-06-16T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-06-15T12:00:00Z", "utc_expire": "2024-06-16T12:00:00Z", "utc_product_issue": "2024-06-15T05:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-06-13T01:00:00Z", "utc_expire": "2024-06-13T12:00:00Z", "utc_product_issue": "2024-06-13T01:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-05-23T13:00:00Z", "utc_expire": "2024-05-24T12:00:00Z", "utc_product_issue": "2024-05-23T12:57:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-05-21T12:00:00Z", "utc_expire": "2024-05-22T12:00:00Z", "utc_product_issue": "2024-05-21T05:54:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-05-20T12:00:00Z", "utc_expire": "2024-05-21T12:00:00Z", "utc_product_issue": "2024-05-20T05:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-05-08T12:00:00Z", "utc_expire": "2024-05-09T12:00:00Z", "utc_product_issue": "2024-05-08T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-05-06T12:00:00Z", "utc_expire": "2024-05-07T12:00:00Z", "utc_product_issue": "2024-05-06T05:55:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-04-30T12:00:00Z", "utc_expire": "2024-05-01T12:00:00Z", "utc_product_issue": "2024-04-30T05:57:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-04-27T12:00:00Z", "utc_expire": "2024-04-28T12:00:00Z", "utc_product_issue": "2024-04-27T07:53:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-04-26T12:00:00Z", "utc_expire": "2024-04-27T12:00:00Z", "utc_product_issue": "2024-04-26T05:25:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-04-16T12:00:00Z", "utc_expire": "2024-04-17T12:00:00Z", "utc_product_issue": "2024-04-16T05:38:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2024-03-25T12:00:00Z", "utc_expire": "2024-03-26T12:00:00Z", "utc_product_issue": "2024-03-25T05:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-09-23T12:00:00Z", "utc_expire": "2023-09-24T12:00:00Z", "utc_product_issue": "2023-09-23T05:57:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-08-13T12:00:00Z", "utc_expire": "2023-08-14T12:00:00Z", "utc_product_issue": "2023-08-13T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-07-28T13:00:00Z", "utc_expire": "2023-07-29T12:00:00Z", "utc_product_issue": "2023-07-28T12:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-06-24T12:00:00Z", "utc_expire": "2023-06-25T12:00:00Z", "utc_product_issue": "2023-06-24T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-05-13T20:00:00Z", "utc_expire": "2023-05-14T12:00:00Z", "utc_product_issue": "2023-05-13T20:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-05-12T12:00:00Z", "utc_expire": "2023-05-13T12:00:00Z", "utc_product_issue": "2023-05-12T05:55:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-05-07T12:00:00Z", "utc_expire": "2023-05-08T12:00:00Z", "utc_product_issue": "2023-05-07T05:53:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-04-19T16:30:00Z", "utc_expire": "2023-04-20T12:00:00Z", "utc_product_issue": "2023-04-19T16:39:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2023-04-04T12:00:00Z", "utc_expire": "2023-04-05T12:00:00Z", "utc_product_issue": "2023-04-04T06:04:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-10-23T12:00:00Z", "utc_expire": "2022-10-24T12:00:00Z", "utc_product_issue": "2022-10-23T05:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-09-17T12:00:00Z", "utc_expire": "2022-09-18T12:00:00Z", "utc_product_issue": "2022-09-17T05:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-08-07T20:00:00Z", "utc_expire": "2022-08-08T12:00:00Z", "utc_product_issue": "2022-08-07T20:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-07-24T01:00:00Z", "utc_expire": "2022-07-24T12:00:00Z", "utc_product_issue": "2022-07-24T00:47:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-06-24T12:00:00Z", "utc_expire": "2022-06-25T12:00:00Z", "utc_product_issue": "2022-06-24T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-06-14T12:00:00Z", "utc_expire": "2022-06-15T12:00:00Z", "utc_product_issue": "2022-06-14T05:42:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-06-11T13:00:00Z", "utc_expire": "2022-06-12T12:00:00Z", "utc_product_issue": "2022-06-11T13:30:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-06-05T12:00:00Z", "utc_expire": "2022-06-06T12:00:00Z", "utc_product_issue": "2022-06-05T05:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-05-30T13:00:00Z", "utc_expire": "2022-05-31T12:00:00Z", "utc_product_issue": "2022-05-30T12:50:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-05-19T12:00:00Z", "utc_expire": "2022-05-20T12:00:00Z", "utc_product_issue": "2022-05-19T06:03:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-05-17T12:00:00Z", "utc_expire": "2022-05-18T12:00:00Z", "utc_product_issue": "2022-05-17T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-05-12T12:00:00Z", "utc_expire": "2022-05-13T12:00:00Z", "utc_product_issue": "2022-05-12T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-05-11T12:00:00Z", "utc_expire": "2022-05-12T12:00:00Z", "utc_product_issue": "2022-05-11T05:43:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-04-29T12:00:00Z", "utc_expire": "2022-04-30T12:00:00Z", "utc_product_issue": "2022-04-29T05:49:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-04-23T12:00:00Z", "utc_expire": "2022-04-24T12:00:00Z", "utc_product_issue": "2022-04-23T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-04-12T13:00:00Z", "utc_expire": "2022-04-13T12:00:00Z", "utc_product_issue": "2022-04-12T13:00:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-03-29T16:30:00Z", "utc_expire": "2022-03-30T12:00:00Z", "utc_product_issue": "2022-03-29T16:24:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2022-03-05T12:00:00Z", "utc_expire": "2022-03-06T12:00:00Z", "utc_product_issue": "2022-03-05T05:52:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-12-15T12:00:00Z", "utc_expire": "2021-12-16T12:00:00Z", "utc_product_issue": "2021-12-15T05:59:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-08-27T12:00:00Z", "utc_expire": "2021-08-28T12:00:00Z", "utc_product_issue": "2021-08-27T04:54:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-08-26T16:30:00Z", "utc_expire": "2021-08-27T12:00:00Z", "utc_product_issue": "2021-08-26T16:28:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-08-24T12:00:00Z", "utc_expire": "2021-08-25T12:00:00Z", "utc_product_issue": "2021-08-24T05:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-08-22T12:00:00Z", "utc_expire": "2021-08-23T12:00:00Z", "utc_product_issue": "2021-08-22T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-08-20T12:00:00Z", "utc_expire": "2021-08-21T12:00:00Z", "utc_product_issue": "2021-08-20T05:42:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-08-07T12:00:00Z", "utc_expire": "2021-08-08T12:00:00Z", "utc_product_issue": "2021-08-07T05:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-07-14T20:00:00Z", "utc_expire": "2021-07-15T12:00:00Z", "utc_product_issue": "2021-07-14T19:48:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-07-09T16:30:00Z", "utc_expire": "2021-07-10T12:00:00Z", "utc_product_issue": "2021-07-09T16:34:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-06-24T12:00:00Z", "utc_expire": "2021-06-25T12:00:00Z", "utc_product_issue": "2021-06-24T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-06-20T12:00:00Z", "utc_expire": "2021-06-21T12:00:00Z", "utc_product_issue": "2021-06-20T05:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-06-17T13:00:00Z", "utc_expire": "2021-06-18T12:00:00Z", "utc_product_issue": "2021-06-17T12:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-05-25T12:00:00Z", "utc_expire": "2021-05-26T12:00:00Z", "utc_product_issue": "2021-05-25T05:36:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2021-05-20T16:30:00Z", "utc_expire": "2021-05-21T12:00:00Z", "utc_product_issue": "2021-05-20T16:27:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-10-11T12:00:00Z", "utc_expire": "2020-10-12T12:00:00Z", "utc_product_issue": "2020-10-11T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-08-28T12:00:00Z", "utc_expire": "2020-08-29T12:00:00Z", "utc_product_issue": "2020-08-28T05:37:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-08-14T12:00:00Z", "utc_expire": "2020-08-15T12:00:00Z", "utc_product_issue": "2020-08-14T05:42:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-07-14T12:00:00Z", "utc_expire": "2020-07-15T12:00:00Z", "utc_product_issue": "2020-07-14T05:37:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-06-28T12:00:00Z", "utc_expire": "2020-06-29T12:00:00Z", "utc_product_issue": "2020-06-28T05:57:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-06-21T12:00:00Z", "utc_expire": "2020-06-22T12:00:00Z", "utc_product_issue": "2020-06-21T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-06-09T13:00:00Z", "utc_expire": "2020-06-10T12:00:00Z", "utc_product_issue": "2020-06-09T13:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-06-04T12:00:00Z", "utc_expire": "2020-06-05T12:00:00Z", "utc_product_issue": "2020-06-04T05:41:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-05-26T12:00:00Z", "utc_expire": "2020-05-27T12:00:00Z", "utc_product_issue": "2020-05-26T05:38:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-05-25T16:30:00Z", "utc_expire": "2020-05-26T12:00:00Z", "utc_product_issue": "2020-05-25T16:09:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-05-24T20:00:00Z", "utc_expire": "2020-05-25T12:00:00Z", "utc_product_issue": "2020-05-24T19:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-05-16T12:00:00Z", "utc_expire": "2020-05-17T12:00:00Z", "utc_product_issue": "2020-05-16T05:37:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-03-28T13:00:00Z", "utc_expire": "2020-03-29T12:00:00Z", "utc_product_issue": "2020-03-28T12:49:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2020-03-19T12:00:00Z", "utc_expire": "2020-03-20T12:00:00Z", "utc_product_issue": "2020-03-19T05:49:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-09-24T12:00:00Z", "utc_expire": "2019-09-25T12:00:00Z", "utc_product_issue": "2019-09-24T05:35:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-09-21T12:00:00Z", "utc_expire": "2019-09-22T12:00:00Z", "utc_product_issue": "2019-09-21T05:35:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-09-09T20:00:00Z", "utc_expire": "2019-09-10T12:00:00Z", "utc_product_issue": "2019-09-09T19:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-08-19T12:00:00Z", "utc_expire": "2019-08-20T12:00:00Z", "utc_product_issue": "2019-08-19T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-08-17T12:00:00Z", "utc_expire": "2019-08-18T12:00:00Z", "utc_product_issue": "2019-08-17T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-08-12T12:00:00Z", "utc_expire": "2019-08-13T12:00:00Z", "utc_product_issue": "2019-08-12T05:35:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-08-10T16:30:00Z", "utc_expire": "2019-08-11T12:00:00Z", "utc_product_issue": "2019-08-10T16:30:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-08-05T12:00:00Z", "utc_expire": "2019-08-06T12:00:00Z", "utc_product_issue": "2019-08-05T05:43:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-07-17T12:00:00Z", "utc_expire": "2019-07-18T12:00:00Z", "utc_product_issue": "2019-07-17T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-07-09T12:00:00Z", "utc_expire": "2019-07-10T12:00:00Z", "utc_product_issue": "2019-07-09T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-06-21T12:00:00Z", "utc_expire": "2019-06-22T12:00:00Z", "utc_product_issue": "2019-06-21T05:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-06-20T12:00:00Z", "utc_expire": "2019-06-21T12:00:00Z", "utc_product_issue": "2019-06-20T05:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-06-04T12:00:00Z", "utc_expire": "2019-06-05T12:00:00Z", "utc_product_issue": "2019-06-04T05:41:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2019-05-18T12:00:00Z", "utc_expire": "2019-05-19T12:00:00Z", "utc_product_issue": "2019-05-18T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-09-20T12:00:00Z", "utc_expire": "2018-09-21T12:00:00Z", "utc_product_issue": "2018-09-20T05:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-09-19T13:00:00Z", "utc_expire": "2018-09-20T12:00:00Z", "utc_product_issue": "2018-09-19T12:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-09-18T12:00:00Z", "utc_expire": "2018-09-19T12:00:00Z", "utc_product_issue": "2018-09-18T05:53:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-09-04T12:00:00Z", "utc_expire": "2018-09-05T12:00:00Z", "utc_product_issue": "2018-09-04T05:38:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-08-31T12:00:00Z", "utc_expire": "2018-09-01T12:00:00Z", "utc_product_issue": "2018-08-31T06:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-08-27T12:00:00Z", "utc_expire": "2018-08-28T12:00:00Z", "utc_product_issue": "2018-08-27T05:24:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-08-26T13:00:00Z", "utc_expire": "2018-08-27T12:00:00Z", "utc_product_issue": "2018-08-26T12:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-08-05T12:00:00Z", "utc_expire": "2018-08-06T12:00:00Z", "utc_product_issue": "2018-08-05T05:53:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-07-25T12:00:00Z", "utc_expire": "2018-07-26T12:00:00Z", "utc_product_issue": "2018-07-25T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-07-19T12:00:00Z", "utc_expire": "2018-07-20T12:00:00Z", "utc_product_issue": "2018-07-19T05:37:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-06-30T12:00:00Z", "utc_expire": "2018-07-01T12:00:00Z", "utc_product_issue": "2018-06-30T05:59:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-06-25T12:00:00Z", "utc_expire": "2018-06-26T12:00:00Z", "utc_product_issue": "2018-06-25T05:49:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-06-20T12:00:00Z", "utc_expire": "2018-06-21T12:00:00Z", "utc_product_issue": "2018-06-20T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-06-18T13:00:00Z", "utc_expire": "2018-06-19T12:00:00Z", "utc_product_issue": "2018-06-18T12:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-06-11T16:30:00Z", "utc_expire": "2018-06-12T12:00:00Z", "utc_product_issue": "2018-06-11T16:29:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-06-08T16:30:00Z", "utc_expire": "2018-06-09T12:00:00Z", "utc_product_issue": "2018-06-08T16:29:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-06-06T13:00:00Z", "utc_expire": "2018-06-07T12:00:00Z", "utc_product_issue": "2018-06-06T12:34:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-05-08T12:00:00Z", "utc_expire": "2018-05-09T12:00:00Z", "utc_product_issue": "2018-05-08T05:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-05-02T12:00:00Z", "utc_expire": "2018-05-03T12:00:00Z", "utc_product_issue": "2018-05-02T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2018-05-01T12:00:00Z", "utc_expire": "2018-05-02T12:00:00Z", "utc_product_issue": "2018-05-01T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-10-06T20:00:00Z", "utc_expire": "2017-10-07T12:00:00Z", "utc_product_issue": "2017-10-06T19:31:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-10-02T16:30:00Z", "utc_expire": "2017-10-03T12:00:00Z", "utc_product_issue": "2017-10-02T16:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-08-21T12:00:00Z", "utc_expire": "2017-08-22T12:00:00Z", "utc_product_issue": "2017-08-21T06:05:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-08-16T12:00:00Z", "utc_expire": "2017-08-17T12:00:00Z", "utc_product_issue": "2017-08-16T05:54:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-07-21T16:30:00Z", "utc_expire": "2017-07-22T12:00:00Z", "utc_product_issue": "2017-07-21T16:31:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-06-29T13:00:00Z", "utc_expire": "2017-06-30T12:00:00Z", "utc_product_issue": "2017-06-29T12:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-06-28T12:00:00Z", "utc_expire": "2017-06-29T12:00:00Z", "utc_product_issue": "2017-06-28T05:46:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-06-21T12:00:00Z", "utc_expire": "2017-06-22T12:00:00Z", "utc_product_issue": "2017-06-21T06:15:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-06-16T12:00:00Z", "utc_expire": "2017-06-17T12:00:00Z", "utc_product_issue": "2017-06-16T05:28:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-05-17T12:00:00Z", "utc_expire": "2017-05-18T12:00:00Z", "utc_product_issue": "2017-05-17T05:40:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-05-16T13:00:00Z", "utc_expire": "2017-05-17T12:00:00Z", "utc_product_issue": "2017-05-16T12:52:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-05-15T12:00:00Z", "utc_expire": "2017-05-16T12:00:00Z", "utc_product_issue": "2017-05-15T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-04-19T13:00:00Z", "utc_expire": "2017-04-20T12:00:00Z", "utc_product_issue": "2017-04-19T12:59:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-04-09T12:00:00Z", "utc_expire": "2017-04-10T12:00:00Z", "utc_product_issue": "2017-04-09T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2017-03-06T20:00:00Z", "utc_expire": "2017-03-07T12:00:00Z", "utc_product_issue": "2017-03-06T19:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-10-06T12:00:00Z", "utc_expire": "2016-10-07T12:00:00Z", "utc_product_issue": "2016-10-06T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-10-04T12:00:00Z", "utc_expire": "2016-10-05T12:00:00Z", "utc_product_issue": "2016-10-04T05:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-09-24T13:00:00Z", "utc_expire": "2016-09-25T12:00:00Z", "utc_product_issue": "2016-09-24T12:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-09-22T13:00:00Z", "utc_expire": "2016-09-23T12:00:00Z", "utc_product_issue": "2016-09-22T12:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-09-15T13:00:00Z", "utc_expire": "2016-09-16T12:00:00Z", "utc_product_issue": "2016-09-15T12:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-09-09T12:00:00Z", "utc_expire": "2016-09-10T12:00:00Z", "utc_product_issue": "2016-09-09T06:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-09-06T12:00:00Z", "utc_expire": "2016-09-07T12:00:00Z", "utc_product_issue": "2016-09-06T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-08-23T13:00:00Z", "utc_expire": "2016-08-24T12:00:00Z", "utc_product_issue": "2016-08-23T12:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-08-11T12:00:00Z", "utc_expire": "2016-08-12T12:00:00Z", "utc_product_issue": "2016-08-11T04:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-08-01T13:00:00Z", "utc_expire": "2016-08-02T12:00:00Z", "utc_product_issue": "2016-08-01T12:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-07-19T13:00:00Z", "utc_expire": "2016-07-20T12:00:00Z", "utc_product_issue": "2016-07-19T12:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-07-18T01:00:00Z", "utc_expire": "2016-07-18T12:00:00Z", "utc_product_issue": "2016-07-18T01:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-07-13T12:00:00Z", "utc_expire": "2016-07-14T12:00:00Z", "utc_product_issue": "2016-07-13T04:54:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-07-11T12:00:00Z", "utc_expire": "2016-07-12T12:00:00Z", "utc_product_issue": "2016-07-11T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-07-07T12:00:00Z", "utc_expire": "2016-07-08T12:00:00Z", "utc_product_issue": "2016-07-07T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-06-14T13:00:00Z", "utc_expire": "2016-06-15T12:00:00Z", "utc_product_issue": "2016-06-14T12:41:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-05-26T12:00:00Z", "utc_expire": "2016-05-27T12:00:00Z", "utc_product_issue": "2016-05-26T06:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-05-25T12:00:00Z", "utc_expire": "2016-05-26T12:00:00Z", "utc_product_issue": "2016-05-25T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-05-24T12:00:00Z", "utc_expire": "2016-05-25T12:00:00Z", "utc_product_issue": "2016-05-24T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-04-26T12:00:00Z", "utc_expire": "2016-04-27T12:00:00Z", "utc_product_issue": "2016-04-26T05:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2016-04-24T12:00:00Z", "utc_expire": "2016-04-25T12:00:00Z", "utc_product_issue": "2016-04-24T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-11-11T20:00:00Z", "utc_expire": "2015-11-12T12:00:00Z", "utc_product_issue": "2015-11-11T20:06:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-09-17T12:00:00Z", "utc_expire": "2015-09-18T12:00:00Z", "utc_product_issue": "2015-09-17T05:47:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-09-07T12:00:00Z", "utc_expire": "2015-09-08T12:00:00Z", "utc_product_issue": "2015-09-07T06:03:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-09-06T12:00:00Z", "utc_expire": "2015-09-07T12:00:00Z", "utc_product_issue": "2015-09-06T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-08-22T12:00:00Z", "utc_expire": "2015-08-23T12:00:00Z", "utc_product_issue": "2015-08-22T06:04:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-08-18T12:00:00Z", "utc_expire": "2015-08-19T12:00:00Z", "utc_product_issue": "2015-08-18T06:12:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-08-08T12:00:00Z", "utc_expire": "2015-08-09T12:00:00Z", "utc_product_issue": "2015-08-08T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-08-01T12:00:00Z", "utc_expire": "2015-08-02T12:00:00Z", "utc_product_issue": "2015-08-01T05:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-07-28T12:00:00Z", "utc_expire": "2015-07-29T12:00:00Z", "utc_product_issue": "2015-07-28T05:18:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-07-27T13:00:00Z", "utc_expire": "2015-07-28T12:00:00Z", "utc_product_issue": "2015-07-27T12:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-07-25T16:30:00Z", "utc_expire": "2015-07-26T12:00:00Z", "utc_product_issue": "2015-07-25T16:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-07-24T12:00:00Z", "utc_expire": "2015-07-25T12:00:00Z", "utc_product_issue": "2015-07-24T05:34:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-07-18T12:00:00Z", "utc_expire": "2015-07-19T12:00:00Z", "utc_product_issue": "2015-07-18T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-07-16T12:00:00Z", "utc_expire": "2015-07-17T12:00:00Z", "utc_product_issue": "2015-07-16T06:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-07-15T16:30:00Z", "utc_expire": "2015-07-16T12:00:00Z", "utc_product_issue": "2015-07-15T16:27:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-07-05T12:00:00Z", "utc_expire": "2015-07-06T12:00:00Z", "utc_product_issue": "2015-07-05T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-06-24T12:00:00Z", "utc_expire": "2015-06-25T12:00:00Z", "utc_product_issue": "2015-06-24T05:59:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-06-22T12:00:00Z", "utc_expire": "2015-06-23T12:00:00Z", "utc_product_issue": "2015-06-22T05:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-06-20T12:00:00Z", "utc_expire": "2015-06-21T12:00:00Z", "utc_product_issue": "2015-06-20T05:35:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-06-06T12:00:00Z", "utc_expire": "2015-06-07T12:00:00Z", "utc_product_issue": "2015-06-06T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-06-04T12:00:00Z", "utc_expire": "2015-06-05T12:00:00Z", "utc_product_issue": "2015-06-04T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-05-25T12:00:00Z", "utc_expire": "2015-05-26T12:00:00Z", "utc_product_issue": "2015-05-25T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-05-17T16:30:00Z", "utc_expire": "2015-05-18T12:00:00Z", "utc_product_issue": "2015-05-17T16:30:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-05-16T16:30:00Z", "utc_expire": "2015-05-17T12:00:00Z", "utc_product_issue": "2015-05-16T16:31:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-05-10T16:30:00Z", "utc_expire": "2015-05-11T12:00:00Z", "utc_product_issue": "2015-05-10T16:42:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-05-07T12:00:00Z", "utc_expire": "2015-05-08T12:00:00Z", "utc_product_issue": "2015-05-07T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-05-04T01:00:00Z", "utc_expire": "2015-05-04T12:00:00Z", "utc_product_issue": "2015-05-04T00:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-04-18T12:00:00Z", "utc_expire": "2015-04-19T12:00:00Z", "utc_product_issue": "2015-04-18T05:41:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2015-04-01T12:00:00Z", "utc_expire": "2015-04-02T12:00:00Z", "utc_product_issue": "2015-04-01T05:47:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-09-30T16:30:00Z", "utc_expire": "2014-10-01T12:00:00Z", "utc_product_issue": "2014-09-30T16:30:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-09-09T12:00:00Z", "utc_expire": "2014-09-10T12:00:00Z", "utc_product_issue": "2014-09-09T05:49:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-09-08T12:00:00Z", "utc_expire": "2014-09-09T12:00:00Z", "utc_product_issue": "2014-09-08T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-08-31T12:00:00Z", "utc_expire": "2014-09-01T12:00:00Z", "utc_product_issue": "2014-08-31T05:51:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-08-28T12:00:00Z", "utc_expire": "2014-08-29T12:00:00Z", "utc_product_issue": "2014-08-28T05:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-08-23T12:00:00Z", "utc_expire": "2014-08-24T12:00:00Z", "utc_product_issue": "2014-08-23T05:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-08-21T12:00:00Z", "utc_expire": "2014-08-22T12:00:00Z", "utc_product_issue": "2014-08-21T05:33:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-08-18T13:00:00Z", "utc_expire": "2014-08-19T12:00:00Z", "utc_product_issue": "2014-08-18T12:46:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-07-26T13:00:00Z", "utc_expire": "2014-07-27T12:00:00Z", "utc_product_issue": "2014-07-26T12:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-07-12T13:00:00Z", "utc_expire": "2014-07-13T12:00:00Z", "utc_product_issue": "2014-07-12T12:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-07-11T12:00:00Z", "utc_expire": "2014-07-12T12:00:00Z", "utc_product_issue": "2014-07-11T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-07-07T12:00:00Z", "utc_expire": "2014-07-08T12:00:00Z", "utc_product_issue": "2014-07-07T06:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-07-05T12:00:00Z", "utc_expire": "2014-07-06T12:00:00Z", "utc_product_issue": "2014-07-05T05:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-30T13:00:00Z", "utc_expire": "2014-07-01T12:00:00Z", "utc_product_issue": "2014-06-30T12:52:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-29T12:00:00Z", "utc_expire": "2014-06-30T12:00:00Z", "utc_product_issue": "2014-06-29T05:59:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-28T12:00:00Z", "utc_expire": "2014-06-29T12:00:00Z", "utc_product_issue": "2014-06-28T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-19T12:00:00Z", "utc_expire": "2014-06-20T12:00:00Z", "utc_product_issue": "2014-06-19T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-18T13:00:00Z", "utc_expire": "2014-06-19T12:00:00Z", "utc_product_issue": "2014-06-18T12:54:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-17T12:00:00Z", "utc_expire": "2014-06-18T12:00:00Z", "utc_product_issue": "2014-06-17T06:05:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-16T12:00:00Z", "utc_expire": "2014-06-17T12:00:00Z", "utc_product_issue": "2014-06-16T05:29:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-14T12:00:00Z", "utc_expire": "2014-06-15T12:00:00Z", "utc_product_issue": "2014-06-14T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-05T21:25:00Z", "utc_expire": "2014-06-06T12:00:00Z", "utc_product_issue": "2014-06-05T21:25:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-03T13:00:00Z", "utc_expire": "2014-06-04T12:00:00Z", "utc_product_issue": "2014-06-03T12:25:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-06-01T12:00:00Z", "utc_expire": "2014-06-02T12:00:00Z", "utc_product_issue": "2014-06-01T05:42:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-05-11T12:00:00Z", "utc_expire": "2014-05-12T12:00:00Z", "utc_product_issue": "2014-05-11T05:47:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-05-10T12:00:00Z", "utc_expire": "2014-05-11T12:00:00Z", "utc_product_issue": "2014-05-10T05:06:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-05-08T12:00:00Z", "utc_expire": "2014-05-09T12:00:00Z", "utc_product_issue": "2014-05-08T05:40:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-04-28T02:30:00Z", "utc_expire": "2014-04-29T12:00:00Z", "utc_product_issue": "2014-04-28T02:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2014-04-27T12:00:00Z", "utc_expire": "2014-04-28T12:00:00Z", "utc_product_issue": "2014-04-27T06:20:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-11-16T12:00:00Z", "utc_expire": "2013-11-17T12:00:00Z", "utc_product_issue": "2013-11-16T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-10-04T12:00:00Z", "utc_expire": "2013-10-05T12:00:00Z", "utc_product_issue": "2013-10-04T06:01:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-10-03T12:00:00Z", "utc_expire": "2013-10-04T12:00:00Z", "utc_product_issue": "2013-10-03T06:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-08-31T12:00:00Z", "utc_expire": "2013-09-01T12:00:00Z", "utc_product_issue": "2013-08-31T06:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-08-06T12:00:00Z", "utc_expire": "2013-08-07T12:00:00Z", "utc_product_issue": "2013-08-06T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-08-02T20:00:00Z", "utc_expire": "2013-08-03T12:00:00Z", "utc_product_issue": "2013-08-02T19:46:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-08-01T20:00:00Z", "utc_expire": "2013-08-02T12:00:00Z", "utc_product_issue": "2013-08-01T19:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-07-09T13:00:00Z", "utc_expire": "2013-07-10T12:00:00Z", "utc_product_issue": "2013-07-09T12:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-06-25T16:30:00Z", "utc_expire": "2013-06-26T12:00:00Z", "utc_product_issue": "2013-06-25T16:19:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-06-24T16:30:00Z", "utc_expire": "2013-06-25T12:00:00Z", "utc_product_issue": "2013-06-24T16:23:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-06-23T12:00:00Z", "utc_expire": "2013-06-24T12:00:00Z", "utc_product_issue": "2013-06-23T05:23:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-06-23T01:00:00Z", "utc_expire": "2013-06-23T12:00:00Z", "utc_product_issue": "2013-06-23T00:56:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-06-21T12:00:00Z", "utc_expire": "2013-06-22T12:00:00Z", "utc_product_issue": "2013-06-21T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-06-20T12:00:00Z", "utc_expire": "2013-06-21T12:00:00Z", "utc_product_issue": "2013-06-20T05:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-06-14T12:00:00Z", "utc_expire": "2013-06-15T12:00:00Z", "utc_product_issue": "2013-06-14T05:42:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-06-08T12:00:00Z", "utc_expire": "2013-06-09T12:00:00Z", "utc_product_issue": "2013-06-08T05:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-05-30T12:00:00Z", "utc_expire": "2013-05-31T12:00:00Z", "utc_product_issue": "2013-05-30T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-05-29T12:00:00Z", "utc_expire": "2013-05-30T12:00:00Z", "utc_product_issue": "2013-05-29T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-05-27T12:00:00Z", "utc_expire": "2013-05-28T12:00:00Z", "utc_product_issue": "2013-05-27T06:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-05-19T12:00:00Z", "utc_expire": "2013-05-20T12:00:00Z", "utc_product_issue": "2013-05-19T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2013-04-08T12:00:00Z", "utc_expire": "2013-04-09T12:00:00Z", "utc_product_issue": "2013-04-08T05:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-11-10T12:00:00Z", "utc_expire": "2012-11-11T12:00:00Z", "utc_product_issue": "2012-11-10T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-10-24T12:00:00Z", "utc_expire": "2012-10-25T12:00:00Z", "utc_product_issue": "2012-10-24T05:55:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-10-13T12:00:00Z", "utc_expire": "2012-10-14T12:00:00Z", "utc_product_issue": "2012-10-13T05:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-09-04T16:30:00Z", "utc_expire": "2012-09-05T12:00:00Z", "utc_product_issue": "2012-09-04T16:31:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-09-03T13:00:00Z", "utc_expire": "2012-09-04T12:00:00Z", "utc_product_issue": "2012-09-03T12:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-07-18T16:30:00Z", "utc_expire": "2012-07-19T12:00:00Z", "utc_product_issue": "2012-07-18T16:25:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-06-29T12:00:00Z", "utc_expire": "2012-06-30T12:00:00Z", "utc_product_issue": "2012-06-29T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-06-23T12:00:00Z", "utc_expire": "2012-06-24T12:00:00Z", "utc_product_issue": "2012-06-23T05:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-06-17T12:00:00Z", "utc_expire": "2012-06-18T12:00:00Z", "utc_product_issue": "2012-06-17T05:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-06-16T12:00:00Z", "utc_expire": "2012-06-17T12:00:00Z", "utc_product_issue": "2012-06-16T05:43:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-06-14T12:00:00Z", "utc_expire": "2012-06-15T12:00:00Z", "utc_product_issue": "2012-06-14T05:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-06-10T12:00:00Z", "utc_expire": "2012-06-11T12:00:00Z", "utc_product_issue": "2012-06-10T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-06-03T12:00:00Z", "utc_expire": "2012-06-04T12:00:00Z", "utc_product_issue": "2012-06-03T04:13:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-27T12:00:00Z", "utc_expire": "2012-05-28T12:00:00Z", "utc_product_issue": "2012-05-27T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-26T12:00:00Z", "utc_expire": "2012-05-27T12:00:00Z", "utc_product_issue": "2012-05-26T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-25T12:00:00Z", "utc_expire": "2012-05-26T12:00:00Z", "utc_product_issue": "2012-05-25T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-23T12:00:00Z", "utc_expire": "2012-05-24T12:00:00Z", "utc_product_issue": "2012-05-23T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-19T12:00:00Z", "utc_expire": "2012-05-20T12:00:00Z", "utc_product_issue": "2012-05-19T05:23:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-05T16:30:00Z", "utc_expire": "2012-05-06T12:00:00Z", "utc_product_issue": "2012-05-05T16:21:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-04T13:00:00Z", "utc_expire": "2012-05-05T12:00:00Z", "utc_product_issue": "2012-05-04T13:09:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-03T12:00:00Z", "utc_expire": "2012-05-04T12:00:00Z", "utc_product_issue": "2012-05-03T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-02T12:00:00Z", "utc_expire": "2012-05-03T12:00:00Z", "utc_product_issue": "2012-05-02T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-05-01T16:30:00Z", "utc_expire": "2012-05-02T12:00:00Z", "utc_product_issue": "2012-05-01T16:30:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-04-15T12:00:00Z", "utc_expire": "2012-04-16T12:00:00Z", "utc_product_issue": "2012-04-15T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-04-14T12:00:00Z", "utc_expire": "2012-04-15T12:00:00Z", "utc_product_issue": "2012-04-14T05:44:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-03-19T13:00:00Z", "utc_expire": "2012-03-20T12:00:00Z", "utc_product_issue": "2012-03-19T12:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2012-02-28T12:00:00Z", "utc_expire": "2012-02-29T12:00:00Z", "utc_product_issue": "2012-02-28T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-09-02T12:00:00Z", "utc_expire": "2011-09-03T12:00:00Z", "utc_product_issue": "2011-09-02T05:53:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-08-18T12:00:00Z", "utc_expire": "2011-08-19T12:00:00Z", "utc_product_issue": "2011-08-18T05:25:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-08-16T12:00:00Z", "utc_expire": "2011-08-17T12:00:00Z", "utc_product_issue": "2011-08-16T05:33:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-08-08T01:00:00Z", "utc_expire": "2011-08-08T12:00:00Z", "utc_product_issue": "2011-08-08T01:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-08-06T12:00:00Z", "utc_expire": "2011-08-07T12:00:00Z", "utc_product_issue": "2011-08-06T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-07-28T12:00:00Z", "utc_expire": "2011-07-29T12:00:00Z", "utc_product_issue": "2011-07-28T05:42:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-07-27T12:00:00Z", "utc_expire": "2011-07-28T12:00:00Z", "utc_product_issue": "2011-07-27T05:57:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-07-23T20:00:00Z", "utc_expire": "2011-07-24T12:00:00Z", "utc_product_issue": "2011-07-23T19:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-07-21T12:00:00Z", "utc_expire": "2011-07-22T12:00:00Z", "utc_product_issue": "2011-07-21T05:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-07-15T16:30:00Z", "utc_expire": "2011-07-16T12:00:00Z", "utc_product_issue": "2011-07-15T16:26:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-07-10T13:00:00Z", "utc_expire": "2011-07-11T12:00:00Z", "utc_product_issue": "2011-07-10T12:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-07-05T13:00:00Z", "utc_expire": "2011-07-06T12:00:00Z", "utc_product_issue": "2011-07-05T12:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-07-03T12:00:00Z", "utc_expire": "2011-07-04T12:00:00Z", "utc_product_issue": "2011-07-03T05:16:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-26T13:00:00Z", "utc_expire": "2011-06-27T12:00:00Z", "utc_product_issue": "2011-06-26T12:53:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-25T12:00:00Z", "utc_expire": "2011-06-26T12:00:00Z", "utc_product_issue": "2011-06-25T06:05:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-20T13:00:00Z", "utc_expire": "2011-06-21T12:00:00Z", "utc_product_issue": "2011-06-20T12:38:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-19T12:00:00Z", "utc_expire": "2011-06-20T12:00:00Z", "utc_product_issue": "2011-06-19T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-17T12:00:00Z", "utc_expire": "2011-06-18T12:00:00Z", "utc_product_issue": "2011-06-17T05:41:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-13T12:00:00Z", "utc_expire": "2011-06-14T12:00:00Z", "utc_product_issue": "2011-06-13T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-09T12:00:00Z", "utc_expire": "2011-06-10T12:00:00Z", "utc_product_issue": "2011-06-09T05:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-08T12:00:00Z", "utc_expire": "2011-06-09T12:00:00Z", "utc_product_issue": "2011-06-08T05:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-05T12:00:00Z", "utc_expire": "2011-06-06T12:00:00Z", "utc_product_issue": "2011-06-05T05:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-04T12:00:00Z", "utc_expire": "2011-06-05T12:00:00Z", "utc_product_issue": "2011-06-04T04:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-03T12:00:00Z", "utc_expire": "2011-06-04T12:00:00Z", "utc_product_issue": "2011-06-03T05:22:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-06-02T12:00:00Z", "utc_expire": "2011-06-03T12:00:00Z", "utc_product_issue": "2011-06-02T05:18:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-05-31T21:45:00Z", "utc_expire": "2011-06-01T21:45:00Z", "utc_product_issue": "2011-05-30T21:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-05-30T12:00:00Z", "utc_expire": "2011-05-31T12:00:00Z", "utc_product_issue": "2011-05-30T05:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-05-29T12:00:00Z", "utc_expire": "2011-05-30T12:00:00Z", "utc_product_issue": "2011-05-29T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-05-21T20:00:00Z", "utc_expire": "2011-05-22T12:00:00Z", "utc_product_issue": "2011-05-21T19:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-05-12T16:30:00Z", "utc_expire": "2011-05-13T12:00:00Z", "utc_product_issue": "2011-05-12T16:36:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-05-11T20:00:00Z", "utc_expire": "2011-05-12T12:00:00Z", "utc_product_issue": "2011-05-11T19:55:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-05-08T12:00:00Z", "utc_expire": "2011-05-09T12:00:00Z", "utc_product_issue": "2011-05-08T05:41:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-04-09T12:00:00Z", "utc_expire": "2011-04-10T12:00:00Z", "utc_product_issue": "2011-04-09T05:52:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2011-03-22T12:00:00Z", "utc_expire": "2011-03-23T12:00:00Z", "utc_product_issue": "2011-03-22T05:39:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-10-23T12:00:00Z", "utc_expire": "2010-10-24T12:00:00Z", "utc_product_issue": "2010-10-23T05:48:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-09-23T12:00:00Z", "utc_expire": "2010-09-24T12:00:00Z", "utc_product_issue": "2010-09-23T05:32:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-09-22T16:30:00Z", "utc_expire": "2010-09-23T12:00:00Z", "utc_product_issue": "2010-09-22T16:26:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-09-17T12:00:00Z", "utc_expire": "2010-09-18T12:00:00Z", "utc_product_issue": "2010-09-17T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-09-15T20:00:00Z", "utc_expire": "2010-09-16T12:00:00Z", "utc_product_issue": "2010-09-15T19:41:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-09-13T12:00:00Z", "utc_expire": "2010-09-14T12:00:00Z", "utc_product_issue": "2010-09-13T05:54:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-09-06T12:00:00Z", "utc_expire": "2010-09-07T12:00:00Z", "utc_product_issue": "2010-09-06T05:37:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-08-31T12:00:00Z", "utc_expire": "2010-09-01T12:00:00Z", "utc_product_issue": "2010-08-31T05:55:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-08-13T12:00:00Z", "utc_expire": "2010-08-14T12:00:00Z", "utc_product_issue": "2010-08-13T05:56:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-08-12T20:00:00Z", "utc_expire": "2010-08-13T12:00:00Z", "utc_product_issue": "2010-08-12T19:54:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-08-10T20:00:00Z", "utc_expire": "2010-08-11T12:00:00Z", "utc_product_issue": "2010-08-10T20:07:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-08-09T12:00:00Z", "utc_expire": "2010-08-10T12:00:00Z", "utc_product_issue": "2010-08-09T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-08-09T01:00:00Z", "utc_expire": "2010-08-09T12:00:00Z", "utc_product_issue": "2010-08-09T01:09:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-08-02T16:30:00Z", "utc_expire": "2010-08-03T12:00:00Z", "utc_product_issue": "2010-08-02T16:33:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-30T12:00:00Z", "utc_expire": "2010-07-31T12:00:00Z", "utc_product_issue": "2010-07-30T05:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-24T01:00:00Z", "utc_expire": "2010-07-24T12:00:00Z", "utc_product_issue": "2010-07-24T01:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-22T12:00:00Z", "utc_expire": "2010-07-23T12:00:00Z", "utc_product_issue": "2010-07-22T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-22T01:00:00Z", "utc_expire": "2010-07-22T12:00:00Z", "utc_product_issue": "2010-07-22T01:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-19T12:00:00Z", "utc_expire": "2010-07-20T12:00:00Z", "utc_product_issue": "2010-07-19T05:54:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-17T12:00:00Z", "utc_expire": "2010-07-18T12:00:00Z", "utc_product_issue": "2010-07-17T05:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-16T12:00:00Z", "utc_expire": "2010-07-17T12:00:00Z", "utc_product_issue": "2010-07-16T05:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-14T16:30:00Z", "utc_expire": "2010-07-15T12:00:00Z", "utc_product_issue": "2010-07-14T16:16:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-07-11T12:00:00Z", "utc_expire": "2010-07-12T12:00:00Z", "utc_product_issue": "2010-07-11T05:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-26T12:00:00Z", "utc_expire": "2010-06-27T12:00:00Z", "utc_product_issue": "2010-06-26T05:59:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-25T12:00:00Z", "utc_expire": "2010-06-26T12:00:00Z", "utc_product_issue": "2010-06-25T05:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-22T13:00:00Z", "utc_expire": "2010-06-23T12:00:00Z", "utc_product_issue": "2010-06-22T12:59:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-21T12:00:00Z", "utc_expire": "2010-06-22T12:00:00Z", "utc_product_issue": "2010-06-21T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-20T12:00:00Z", "utc_expire": "2010-06-21T12:00:00Z", "utc_product_issue": "2010-06-20T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-19T12:00:00Z", "utc_expire": "2010-06-20T12:00:00Z", "utc_product_issue": "2010-06-19T05:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-18T20:00:00Z", "utc_expire": "2010-06-19T12:00:00Z", "utc_product_issue": "2010-06-18T19:59:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-17T12:00:00Z", "utc_expire": "2010-06-18T12:00:00Z", "utc_product_issue": "2010-06-17T05:49:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-11T12:00:00Z", "utc_expire": "2010-06-12T12:00:00Z", "utc_product_issue": "2010-06-11T05:35:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-08T01:00:00Z", "utc_expire": "2010-06-08T12:00:00Z", "utc_product_issue": "2010-06-08T00:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-05T12:00:00Z", "utc_expire": "2010-06-06T12:00:00Z", "utc_product_issue": "2010-06-05T05:49:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-04T16:30:00Z", "utc_expire": "2010-06-05T12:00:00Z", "utc_product_issue": "2010-06-04T16:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-06-01T12:00:00Z", "utc_expire": "2010-06-02T12:00:00Z", "utc_product_issue": "2010-06-01T05:28:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-04-29T12:00:00Z", "utc_expire": "2010-04-30T12:00:00Z", "utc_product_issue": "2010-04-29T05:41:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-04-24T12:00:00Z", "utc_expire": "2010-04-25T12:00:00Z", "utc_product_issue": "2010-04-24T05:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-04-23T12:00:00Z", "utc_expire": "2010-04-24T12:00:00Z", "utc_product_issue": "2010-04-23T05:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2010-04-05T12:00:00Z", "utc_expire": "2010-04-06T12:00:00Z", "utc_product_issue": "2010-04-05T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-08-19T12:00:00Z", "utc_expire": "2009-08-20T12:00:00Z", "utc_product_issue": "2009-08-19T06:10:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-08-09T12:00:00Z", "utc_expire": "2009-08-10T12:00:00Z", "utc_product_issue": "2009-08-09T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-08-07T13:00:00Z", "utc_expire": "2009-08-08T12:00:00Z", "utc_product_issue": "2009-08-07T12:56:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-07-24T12:00:00Z", "utc_expire": "2009-07-25T12:00:00Z", "utc_product_issue": "2009-07-24T05:11:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-07-14T12:00:00Z", "utc_expire": "2009-07-15T12:00:00Z", "utc_product_issue": "2009-07-14T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-07-12T13:00:00Z", "utc_expire": "2009-07-13T12:00:00Z", "utc_product_issue": "2009-07-12T12:41:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-07-10T12:00:00Z", "utc_expire": "2009-07-11T12:00:00Z", "utc_product_issue": "2009-07-10T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-07-09T12:00:00Z", "utc_expire": "2009-07-10T12:00:00Z", "utc_product_issue": "2009-07-09T05:43:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-07-08T12:00:00Z", "utc_expire": "2009-07-09T12:00:00Z", "utc_product_issue": "2009-07-08T05:33:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-07-07T12:00:00Z", "utc_expire": "2009-07-08T12:00:00Z", "utc_product_issue": "2009-07-07T05:34:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-24T12:00:00Z", "utc_expire": "2009-06-25T12:00:00Z", "utc_product_issue": "2009-06-24T05:51:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-23T12:00:00Z", "utc_expire": "2009-06-24T12:00:00Z", "utc_product_issue": "2009-06-23T05:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-21T12:00:00Z", "utc_expire": "2009-06-22T12:00:00Z", "utc_product_issue": "2009-06-21T05:13:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-19T12:00:00Z", "utc_expire": "2009-06-20T12:00:00Z", "utc_product_issue": "2009-06-19T05:46:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-18T12:00:00Z", "utc_expire": "2009-06-19T12:00:00Z", "utc_product_issue": "2009-06-18T06:03:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-18T01:00:00Z", "utc_expire": "2009-06-18T12:00:00Z", "utc_product_issue": "2009-06-18T01:02:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-16T12:00:00Z", "utc_expire": "2009-06-17T12:00:00Z", "utc_product_issue": "2009-06-16T06:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-07T12:00:00Z", "utc_expire": "2009-06-08T12:00:00Z", "utc_product_issue": "2009-06-07T05:49:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-06T16:30:00Z", "utc_expire": "2009-06-07T12:00:00Z", "utc_product_issue": "2009-06-06T16:30:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-01T12:00:00Z", "utc_expire": "2009-06-02T12:00:00Z", "utc_product_issue": "2009-06-01T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-06-01T01:00:00Z", "utc_expire": "2009-06-01T12:00:00Z", "utc_product_issue": "2009-06-01T00:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-05-29T12:00:00Z", "utc_expire": "2009-05-30T12:00:00Z", "utc_product_issue": "2009-05-29T05:49:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-05-08T16:30:00Z", "utc_expire": "2009-05-09T12:00:00Z", "utc_product_issue": "2009-05-08T17:13:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-04-26T12:00:00Z", "utc_expire": "2009-04-27T12:00:00Z", "utc_product_issue": "2009-04-26T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-04-24T12:00:00Z", "utc_expire": "2009-04-25T12:00:00Z", "utc_product_issue": "2009-04-24T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-03-23T12:00:00Z", "utc_expire": "2009-03-24T12:00:00Z", "utc_product_issue": "2009-03-23T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2009-02-09T12:00:00Z", "utc_expire": "2009-02-10T12:00:00Z", "utc_product_issue": "2009-02-09T05:56:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-11-05T12:00:00Z", "utc_expire": "2008-11-06T12:00:00Z", "utc_product_issue": "2008-11-05T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-09-23T12:00:00Z", "utc_expire": "2008-09-24T12:00:00Z", "utc_product_issue": "2008-09-23T05:54:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-08-27T12:00:00Z", "utc_expire": "2008-08-28T12:00:00Z", "utc_product_issue": "2008-08-27T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-08-13T13:00:00Z", "utc_expire": "2008-08-14T12:00:00Z", "utc_product_issue": "2008-08-13T13:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-08-04T12:00:00Z", "utc_expire": "2008-08-05T12:00:00Z", "utc_product_issue": "2008-08-04T05:52:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-31T20:00:00Z", "utc_expire": "2008-08-01T12:00:00Z", "utc_product_issue": "2008-07-31T20:28:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-28T12:00:00Z", "utc_expire": "2008-07-29T12:00:00Z", "utc_product_issue": "2008-07-28T06:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-27T20:00:00Z", "utc_expire": "2008-07-28T12:00:00Z", "utc_product_issue": "2008-07-27T19:49:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-26T12:00:00Z", "utc_expire": "2008-07-27T12:00:00Z", "utc_product_issue": "2008-07-26T05:38:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-25T12:00:00Z", "utc_expire": "2008-07-26T12:00:00Z", "utc_product_issue": "2008-07-25T05:27:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-24T12:00:00Z", "utc_expire": "2008-07-25T12:00:00Z", "utc_product_issue": "2008-07-24T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-21T12:00:00Z", "utc_expire": "2008-07-22T12:00:00Z", "utc_product_issue": "2008-07-21T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-20T12:00:00Z", "utc_expire": "2008-07-21T12:00:00Z", "utc_product_issue": "2008-07-20T06:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-20T01:00:00Z", "utc_expire": "2008-07-20T12:00:00Z", "utc_product_issue": "2008-07-20T01:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-17T12:00:00Z", "utc_expire": "2008-07-18T12:00:00Z", "utc_product_issue": "2008-07-17T05:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-16T01:00:00Z", "utc_expire": "2008-07-16T12:00:00Z", "utc_product_issue": "2008-07-16T00:46:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-11T12:00:00Z", "utc_expire": "2008-07-12T12:00:00Z", "utc_product_issue": "2008-07-11T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-07T12:00:00Z", "utc_expire": "2008-07-08T12:00:00Z", "utc_product_issue": "2008-07-07T05:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-07-06T12:00:00Z", "utc_expire": "2008-07-07T12:00:00Z", "utc_product_issue": "2008-07-06T05:43:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-26T13:00:00Z", "utc_expire": "2008-06-27T12:00:00Z", "utc_product_issue": "2008-06-26T12:34:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-19T12:00:00Z", "utc_expire": "2008-06-20T12:00:00Z", "utc_product_issue": "2008-06-19T06:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-15T12:00:00Z", "utc_expire": "2008-06-16T12:00:00Z", "utc_product_issue": "2008-06-15T05:49:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-11T12:00:00Z", "utc_expire": "2008-06-12T12:00:00Z", "utc_product_issue": "2008-06-11T06:03:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-08T12:00:00Z", "utc_expire": "2008-06-09T12:00:00Z", "utc_product_issue": "2008-06-08T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-07T13:00:00Z", "utc_expire": "2008-06-08T12:00:00Z", "utc_product_issue": "2008-06-07T13:00:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-05T12:00:00Z", "utc_expire": "2008-06-06T12:00:00Z", "utc_product_issue": "2008-06-05T05:46:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-04T12:00:00Z", "utc_expire": "2008-06-05T12:00:00Z", "utc_product_issue": "2008-06-04T06:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-06-02T20:00:00Z", "utc_expire": "2008-06-03T12:00:00Z", "utc_product_issue": "2008-06-02T20:11:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-05-29T13:00:00Z", "utc_expire": "2008-05-30T12:00:00Z", "utc_product_issue": "2008-05-29T12:21:00Z", "threshold": "0.30", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-05-25T23:22:00Z", "utc_expire": "2008-05-26T23:22:00Z", "utc_product_issue": "2008-05-24T23:29:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-05-25T12:00:00Z", "utc_expire": "2008-05-26T12:00:00Z", "utc_product_issue": "2008-05-25T06:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-05-24T12:00:00Z", "utc_expire": "2008-05-25T12:00:00Z", "utc_product_issue": "2008-05-24T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-05-06T12:00:00Z", "utc_expire": "2008-05-07T12:00:00Z", "utc_product_issue": "2008-05-06T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-05-01T12:00:00Z", "utc_expire": "2008-05-02T12:00:00Z", "utc_product_issue": "2008-05-01T05:35:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2008-04-24T12:00:00Z", "utc_expire": "2008-04-25T12:00:00Z", "utc_product_issue": "2008-04-24T05:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-10-18T12:00:00Z", "utc_expire": "2007-10-19T12:00:00Z", "utc_product_issue": "2007-10-18T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-10-02T20:00:00Z", "utc_expire": "2007-10-03T12:00:00Z", "utc_product_issue": "2007-10-02T20:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-09-30T12:00:00Z", "utc_expire": "2007-10-01T12:00:00Z", "utc_product_issue": "2007-09-30T05:47:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-09-24T20:00:00Z", "utc_expire": "2007-09-25T12:00:00Z", "utc_product_issue": "2007-09-24T19:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-09-18T12:00:00Z", "utc_expire": "2007-09-19T12:00:00Z", "utc_product_issue": "2007-09-18T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-09-17T12:00:00Z", "utc_expire": "2007-09-18T12:00:00Z", "utc_product_issue": "2007-09-17T05:59:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-09-06T13:00:00Z", "utc_expire": "2007-09-07T12:00:00Z", "utc_product_issue": "2007-09-06T12:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-28T12:00:00Z", "utc_expire": "2007-08-29T12:00:00Z", "utc_product_issue": "2007-08-28T05:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-23T12:00:00Z", "utc_expire": "2007-08-24T12:00:00Z", "utc_product_issue": "2007-08-23T06:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-22T12:00:00Z", "utc_expire": "2007-08-23T12:00:00Z", "utc_product_issue": "2007-08-22T05:58:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-21T12:00:00Z", "utc_expire": "2007-08-22T12:00:00Z", "utc_product_issue": "2007-08-21T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-20T12:00:00Z", "utc_expire": "2007-08-21T12:00:00Z", "utc_product_issue": "2007-08-20T06:03:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-19T16:30:00Z", "utc_expire": "2007-08-20T12:00:00Z", "utc_product_issue": "2007-08-19T16:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-18T13:00:00Z", "utc_expire": "2007-08-19T12:00:00Z", "utc_product_issue": "2007-08-18T12:41:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-14T12:00:00Z", "utc_expire": "2007-08-15T12:00:00Z", "utc_product_issue": "2007-08-14T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-14T01:00:00Z", "utc_expire": "2007-08-14T12:00:00Z", "utc_product_issue": "2007-08-14T01:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-12T13:00:00Z", "utc_expire": "2007-08-13T12:00:00Z", "utc_product_issue": "2007-08-12T12:23:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-11T12:00:00Z", "utc_expire": "2007-08-12T12:00:00Z", "utc_product_issue": "2007-08-11T05:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-08T12:00:00Z", "utc_expire": "2007-08-09T12:00:00Z", "utc_product_issue": "2007-08-08T05:47:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-07T12:00:00Z", "utc_expire": "2007-08-08T12:00:00Z", "utc_product_issue": "2007-08-07T06:08:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-06T12:00:00Z", "utc_expire": "2007-08-07T12:00:00Z", "utc_product_issue": "2007-08-06T05:54:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-05T12:00:00Z", "utc_expire": "2007-08-06T12:00:00Z", "utc_product_issue": "2007-08-05T05:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-08-05T01:00:00Z", "utc_expire": "2007-08-05T12:00:00Z", "utc_product_issue": "2007-08-05T00:46:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-07-23T12:00:00Z", "utc_expire": "2007-07-24T12:00:00Z", "utc_product_issue": "2007-07-23T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-07-18T12:00:00Z", "utc_expire": "2007-07-19T12:00:00Z", "utc_product_issue": "2007-07-18T05:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-07-16T12:00:00Z", "utc_expire": "2007-07-17T12:00:00Z", "utc_product_issue": "2007-07-16T05:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-07-03T12:00:00Z", "utc_expire": "2007-07-04T12:00:00Z", "utc_product_issue": "2007-07-03T06:05:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-06-22T20:00:00Z", "utc_expire": "2007-06-23T12:00:00Z", "utc_product_issue": "2007-06-22T20:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-06-21T16:30:00Z", "utc_expire": "2007-06-22T12:00:00Z", "utc_product_issue": "2007-06-21T16:16:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-06-20T12:00:00Z", "utc_expire": "2007-06-21T12:00:00Z", "utc_product_issue": "2007-06-20T06:10:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-06-18T12:00:00Z", "utc_expire": "2007-06-19T12:00:00Z", "utc_product_issue": "2007-06-18T06:05:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-06-11T01:00:00Z", "utc_expire": "2007-06-11T12:00:00Z", "utc_product_issue": "2007-06-11T00:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-06-07T12:00:00Z", "utc_expire": "2007-06-08T12:00:00Z", "utc_product_issue": "2007-06-07T05:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-06-06T12:00:00Z", "utc_expire": "2007-06-07T12:00:00Z", "utc_product_issue": "2007-06-06T05:57:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-06-01T12:00:00Z", "utc_expire": "2007-06-02T12:00:00Z", "utc_product_issue": "2007-06-01T06:04:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-05-30T16:30:00Z", "utc_expire": "2007-05-31T12:00:00Z", "utc_product_issue": "2007-05-30T16:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-05-26T12:00:00Z", "utc_expire": "2007-05-27T12:00:00Z", "utc_product_issue": "2007-05-26T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-05-23T12:00:00Z", "utc_expire": "2007-05-24T12:00:00Z", "utc_product_issue": "2007-05-23T05:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-05-16T12:00:00Z", "utc_expire": "2007-05-17T12:00:00Z", "utc_product_issue": "2007-05-16T06:10:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-05-06T12:00:00Z", "utc_expire": "2007-05-07T12:00:00Z", "utc_product_issue": "2007-05-06T05:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-05-05T12:00:00Z", "utc_expire": "2007-05-06T12:00:00Z", "utc_product_issue": "2007-05-05T05:49:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-04-22T13:00:00Z", "utc_expire": "2007-04-23T12:00:00Z", "utc_product_issue": "2007-04-22T12:27:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-04-02T13:00:00Z", "utc_expire": "2007-04-03T12:00:00Z", "utc_product_issue": "2007-04-02T12:29:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-03-31T16:30:00Z", "utc_expire": "2007-04-01T12:00:00Z", "utc_product_issue": "2007-03-31T16:08:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-03-29T12:00:00Z", "utc_expire": "2007-03-30T12:00:00Z", "utc_product_issue": "2007-03-29T05:48:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-03-24T13:00:00Z", "utc_expire": "2007-03-25T12:00:00Z", "utc_product_issue": "2007-03-24T12:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2007-03-21T13:00:00Z", "utc_expire": "2007-03-22T12:00:00Z", "utc_product_issue": "2007-03-21T12:27:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-10-03T12:00:00Z", "utc_expire": "2006-10-04T12:00:00Z", "utc_product_issue": "2006-10-03T05:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-09-16T13:00:00Z", "utc_expire": "2006-09-17T12:00:00Z", "utc_product_issue": "2006-09-16T12:28:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-09-03T12:00:00Z", "utc_expire": "2006-09-04T12:00:00Z", "utc_product_issue": "2006-09-03T05:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-08-25T01:00:00Z", "utc_expire": "2006-08-25T12:00:00Z", "utc_product_issue": "2006-08-25T01:03:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-08-13T12:00:00Z", "utc_expire": "2006-08-14T12:00:00Z", "utc_product_issue": "2006-08-13T05:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-08-09T12:00:00Z", "utc_expire": "2006-08-10T12:00:00Z", "utc_product_issue": "2006-08-09T05:48:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-08-05T12:00:00Z", "utc_expire": "2006-08-06T12:00:00Z", "utc_product_issue": "2006-08-05T05:27:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-08-01T12:00:00Z", "utc_expire": "2006-08-02T12:00:00Z", "utc_product_issue": "2006-08-01T05:36:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-07-19T16:30:00Z", "utc_expire": "2006-07-20T12:00:00Z", "utc_product_issue": "2006-07-19T16:26:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-07-13T12:00:00Z", "utc_expire": "2006-07-14T12:00:00Z", "utc_product_issue": "2006-07-13T06:01:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-07-03T12:00:00Z", "utc_expire": "2006-07-04T12:00:00Z", "utc_product_issue": "2006-07-03T06:03:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-07-02T01:00:00Z", "utc_expire": "2006-07-02T12:00:00Z", "utc_product_issue": "2006-07-02T01:06:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-06-20T13:00:00Z", "utc_expire": "2006-06-21T12:00:00Z", "utc_product_issue": "2006-06-20T12:41:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-06-16T16:30:00Z", "utc_expire": "2006-06-17T12:00:00Z", "utc_product_issue": "2006-06-16T16:14:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-06-09T12:00:00Z", "utc_expire": "2006-06-10T12:00:00Z", "utc_product_issue": "2006-06-09T05:54:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-06-05T12:00:00Z", "utc_expire": "2006-06-06T12:00:00Z", "utc_product_issue": "2006-06-05T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-05-29T12:00:00Z", "utc_expire": "2006-05-30T12:00:00Z", "utc_product_issue": "2006-05-29T06:14:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-05-23T12:00:00Z", "utc_expire": "2006-05-24T12:00:00Z", "utc_product_issue": "2006-05-23T05:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-05-08T13:00:00Z", "utc_expire": "2006-05-09T12:00:00Z", "utc_product_issue": "2006-05-08T12:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-05-02T12:00:00Z", "utc_expire": "2006-05-03T12:00:00Z", "utc_product_issue": "2006-05-02T05:38:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-04-15T20:00:00Z", "utc_expire": "2006-04-16T12:00:00Z", "utc_product_issue": "2006-04-15T20:20:00Z", "threshold": "0.10", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-04-11T12:00:00Z", "utc_expire": "2006-04-12T12:00:00Z", "utc_product_issue": "2006-04-11T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-04-06T12:00:00Z", "utc_expire": "2006-04-07T12:00:00Z", "utc_product_issue": "2006-04-06T06:00:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-04-02T12:00:00Z", "utc_expire": "2006-04-03T12:00:00Z", "utc_product_issue": "2006-04-02T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-03-30T12:00:00Z", "utc_expire": "2006-03-31T12:00:00Z", "utc_product_issue": "2006-03-30T05:46:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2006-03-12T13:00:00Z", "utc_expire": "2006-03-13T12:00:00Z", "utc_product_issue": "2006-03-12T12:29:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-11-12T12:00:00Z", "utc_expire": "2005-11-13T12:00:00Z", "utc_product_issue": "2005-11-12T05:55:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-10-04T12:00:00Z", "utc_expire": "2005-10-05T12:00:00Z", "utc_product_issue": "2005-10-04T06:12:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-09-24T12:00:00Z", "utc_expire": "2005-09-25T12:00:00Z", "utc_product_issue": "2005-09-24T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-09-21T12:00:00Z", "utc_expire": "2005-09-22T12:00:00Z", "utc_product_issue": "2005-09-21T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-09-19T01:00:00Z", "utc_expire": "2005-09-19T12:00:00Z", "utc_product_issue": "2005-09-19T00:39:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-09-12T13:00:00Z", "utc_expire": "2005-09-13T12:00:00Z", "utc_product_issue": "2005-09-12T13:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-08-19T12:00:00Z", "utc_expire": "2005-08-20T12:00:00Z", "utc_product_issue": "2005-08-19T06:05:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-07-25T13:00:00Z", "utc_expire": "2005-07-26T12:00:00Z", "utc_product_issue": "2005-07-25T12:51:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-07-25T01:00:00Z", "utc_expire": "2005-07-25T12:00:00Z", "utc_product_issue": "2005-07-25T00:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-07-21T13:00:00Z", "utc_expire": "2005-07-22T12:00:00Z", "utc_product_issue": "2005-07-21T12:49:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-07-20T12:00:00Z", "utc_expire": "2005-07-21T12:00:00Z", "utc_product_issue": "2005-07-20T05:46:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-07-03T12:00:00Z", "utc_expire": "2005-07-04T12:00:00Z", "utc_product_issue": "2005-07-03T06:03:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-29T16:30:00Z", "utc_expire": "2005-06-30T12:00:00Z", "utc_product_issue": "2005-06-29T16:45:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-28T12:00:00Z", "utc_expire": "2005-06-29T12:00:00Z", "utc_product_issue": "2005-06-28T06:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-27T12:00:00Z", "utc_expire": "2005-06-28T12:00:00Z", "utc_product_issue": "2005-06-27T06:12:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-24T12:00:00Z", "utc_expire": "2005-06-25T12:00:00Z", "utc_product_issue": "2005-06-24T05:42:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-21T12:00:00Z", "utc_expire": "2005-06-22T12:00:00Z", "utc_product_issue": "2005-06-21T05:06:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-21T01:00:00Z", "utc_expire": "2005-06-21T12:00:00Z", "utc_product_issue": "2005-06-21T00:42:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-13T20:00:00Z", "utc_expire": "2005-06-14T12:00:00Z", "utc_product_issue": "2005-06-13T20:29:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-11T20:00:00Z", "utc_expire": "2005-06-12T12:00:00Z", "utc_product_issue": "2005-06-11T19:37:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-09T12:00:00Z", "utc_expire": "2005-06-10T12:00:00Z", "utc_product_issue": "2005-06-09T05:43:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-08T12:00:00Z", "utc_expire": "2005-06-09T12:00:00Z", "utc_product_issue": "2005-06-08T05:47:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-07T12:00:00Z", "utc_expire": "2005-06-08T12:00:00Z", "utc_product_issue": "2005-06-07T05:33:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-04T13:00:00Z", "utc_expire": "2005-06-05T12:00:00Z", "utc_product_issue": "2005-06-04T11:08:00Z", "threshold": "0.25", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-06-03T12:00:00Z", "utc_expire": "2005-06-04T12:00:00Z", "utc_product_issue": "2005-06-03T05:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-05-21T12:00:00Z", "utc_expire": "2005-05-22T12:00:00Z", "utc_product_issue": "2005-05-21T05:55:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-05-18T20:00:00Z", "utc_expire": "2005-05-19T12:00:00Z", "utc_product_issue": "2005-05-18T19:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-05-11T12:00:00Z", "utc_expire": "2005-05-12T12:00:00Z", "utc_product_issue": "2005-05-11T06:09:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-05-10T12:00:00Z", "utc_expire": "2005-05-11T12:00:00Z", "utc_product_issue": "2005-05-10T06:04:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-05-08T12:00:00Z", "utc_expire": "2005-05-09T12:00:00Z", "utc_product_issue": "2005-05-08T05:10:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-05-07T12:00:00Z", "utc_expire": "2005-05-08T12:00:00Z", "utc_product_issue": "2005-05-07T05:36:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-05-06T12:00:00Z", "utc_expire": "2005-05-07T12:00:00Z", "utc_product_issue": "2005-05-06T05:45:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-04-21T16:30:00Z", "utc_expire": "2005-04-22T12:00:00Z", "utc_product_issue": "2005-04-21T16:34:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-04-19T12:00:00Z", "utc_expire": "2005-04-20T12:00:00Z", "utc_product_issue": "2005-04-19T05:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-04-18T16:30:00Z", "utc_expire": "2005-04-19T12:00:00Z", "utc_product_issue": "2005-04-18T15:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-04-11T20:00:00Z", "utc_expire": "2005-04-12T12:00:00Z", "utc_product_issue": "2005-04-11T20:00:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-04-10T12:00:00Z", "utc_expire": "2005-04-11T12:00:00Z", "utc_product_issue": "2005-04-10T06:13:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-04-09T12:00:00Z", "utc_expire": "2005-04-10T12:00:00Z", "utc_product_issue": "2005-04-09T05:07:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2005-03-30T12:00:00Z", "utc_expire": "2005-03-31T12:00:00Z", "utc_product_issue": "2005-03-30T06:20:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-10-29T12:00:00Z", "utc_expire": "2004-10-30T12:00:00Z", "utc_product_issue": "2004-10-29T06:04:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-10-28T12:00:00Z", "utc_expire": "2004-10-29T12:00:00Z", "utc_product_issue": "2004-10-28T06:05:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-10-22T12:00:00Z", "utc_expire": "2004-10-23T12:00:00Z", "utc_product_issue": "2004-10-22T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-09-14T13:00:00Z", "utc_expire": "2004-09-15T12:00:00Z", "utc_product_issue": "2004-09-14T12:49:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-09-05T12:00:00Z", "utc_expire": "2004-09-06T12:00:00Z", "utc_product_issue": "2004-09-05T06:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-26T12:00:00Z", "utc_expire": "2004-08-27T12:00:00Z", "utc_product_issue": "2004-08-26T05:59:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-25T12:00:00Z", "utc_expire": "2004-08-26T12:00:00Z", "utc_product_issue": "2004-08-25T05:54:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-24T12:00:00Z", "utc_expire": "2004-08-25T12:00:00Z", "utc_product_issue": "2004-08-24T10:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-23T12:00:00Z", "utc_expire": "2004-08-24T12:00:00Z", "utc_product_issue": "2004-08-23T06:03:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-18T16:30:00Z", "utc_expire": "2004-08-19T12:00:00Z", "utc_product_issue": "2004-08-18T16:33:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-16T12:00:00Z", "utc_expire": "2004-08-17T12:00:00Z", "utc_product_issue": "2004-08-16T05:09:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-08T13:00:00Z", "utc_expire": "2004-08-09T12:00:00Z", "utc_product_issue": "2004-08-08T12:21:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-03T12:00:00Z", "utc_expire": "2004-08-04T12:00:00Z", "utc_product_issue": "2004-08-03T05:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-08-01T20:00:00Z", "utc_expire": "2004-08-02T12:00:00Z", "utc_product_issue": "2004-08-01T20:00:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-07-31T16:30:00Z", "utc_expire": "2004-08-01T12:00:00Z", "utc_product_issue": "2004-07-31T16:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-07-21T12:00:00Z", "utc_expire": "2004-07-22T12:00:00Z", "utc_product_issue": "2004-07-21T05:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-07-20T16:30:00Z", "utc_expire": "2004-07-21T12:00:00Z", "utc_product_issue": "2004-07-20T16:28:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-07-19T16:30:00Z", "utc_expire": "2004-07-20T12:00:00Z", "utc_product_issue": "2004-07-19T16:32:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-07-15T12:00:00Z", "utc_expire": "2004-07-16T12:00:00Z", "utc_product_issue": "2004-07-15T05:57:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-07-13T12:00:00Z", "utc_expire": "2004-07-14T12:00:00Z", "utc_product_issue": "2004-07-13T06:00:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-07-13T01:00:00Z", "utc_expire": "2004-07-13T12:00:00Z", "utc_product_issue": "2004-07-13T02:10:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-07-11T12:00:00Z", "utc_expire": "2004-07-12T12:00:00Z", "utc_product_issue": "2004-07-11T05:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-06-15T12:00:00Z", "utc_expire": "2004-06-16T12:00:00Z", "utc_product_issue": "2004-06-15T07:20:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-06-12T12:00:00Z", "utc_expire": "2004-06-13T12:00:00Z", "utc_product_issue": "2004-06-12T06:18:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-06-11T12:00:00Z", "utc_expire": "2004-06-12T12:00:00Z", "utc_product_issue": "2004-06-11T05:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-06-10T12:00:00Z", "utc_expire": "2004-06-11T12:00:00Z", "utc_product_issue": "2004-06-10T05:53:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-30T20:00:00Z", "utc_expire": "2004-05-31T12:00:00Z", "utc_product_issue": "2004-05-30T20:44:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-29T12:00:00Z", "utc_expire": "2004-05-30T12:00:00Z", "utc_product_issue": "2004-05-29T05:48:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-28T16:30:00Z", "utc_expire": "2004-05-29T12:00:00Z", "utc_product_issue": "2004-05-28T16:22:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-24T12:00:00Z", "utc_expire": "2004-05-25T12:00:00Z", "utc_product_issue": "2004-05-24T06:05:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-22T12:00:00Z", "utc_expire": "2004-05-23T12:00:00Z", "utc_product_issue": "2004-05-22T06:12:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-21T20:00:00Z", "utc_expire": "2004-05-22T12:00:00Z", "utc_product_issue": "2004-05-21T20:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-19T12:00:00Z", "utc_expire": "2004-05-20T12:00:00Z", "utc_product_issue": "2004-05-19T06:02:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-09T12:00:00Z", "utc_expire": "2004-05-10T12:00:00Z", "utc_product_issue": "2004-05-09T05:26:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-08T12:00:00Z", "utc_expire": "2004-05-09T12:00:00Z", "utc_product_issue": "2004-05-08T05:52:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-07T12:00:00Z", "utc_expire": "2004-05-08T12:00:00Z", "utc_product_issue": "2004-05-07T05:47:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-05-07T01:00:00Z", "utc_expire": "2004-05-07T12:00:00Z", "utc_product_issue": "2004-05-07T00:35:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-04-24T13:00:00Z", "utc_expire": "2004-04-25T12:00:00Z", "utc_product_issue": "2004-04-24T12:49:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-04-20T16:30:00Z", "utc_expire": "2004-04-21T12:00:00Z", "utc_product_issue": "2004-04-20T16:20:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-04-18T12:00:00Z", "utc_expire": "2004-04-19T12:00:00Z", "utc_product_issue": "2004-04-18T06:06:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2004-04-17T20:00:00Z", "utc_expire": "2004-04-18T12:00:00Z", "utc_product_issue": "2004-04-17T19:47:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-11-18T01:00:00Z", "utc_expire": "2003-11-18T12:00:00Z", "utc_product_issue": "2003-11-18T00:58:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-09-11T01:00:00Z", "utc_expire": "2003-09-11T12:00:00Z", "utc_product_issue": "2003-09-11T00:51:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-08-20T12:00:00Z", "utc_expire": "2003-08-21T12:00:00Z", "utc_product_issue": "2003-08-20T05:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-08-19T12:00:00Z", "utc_expire": "2003-08-20T12:00:00Z", "utc_product_issue": "2003-08-19T05:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-31T12:00:00Z", "utc_expire": "2003-08-01T12:00:00Z", "utc_product_issue": "2003-07-31T05:46:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-21T01:00:00Z", "utc_expire": "2003-07-21T12:00:00Z", "utc_product_issue": "2003-07-20T23:58:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-17T12:00:00Z", "utc_expire": "2003-07-18T12:00:00Z", "utc_product_issue": "2003-07-17T05:46:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-16T12:00:00Z", "utc_expire": "2003-07-17T12:00:00Z", "utc_product_issue": "2003-07-16T06:21:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-14T12:00:00Z", "utc_expire": "2003-07-15T12:00:00Z", "utc_product_issue": "2003-07-14T06:28:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-09T12:00:00Z", "utc_expire": "2003-07-10T12:00:00Z", "utc_product_issue": "2003-07-09T05:39:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-08T12:00:00Z", "utc_expire": "2003-07-09T12:00:00Z", "utc_product_issue": "2003-07-08T05:43:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-07T12:00:00Z", "utc_expire": "2003-07-08T12:00:00Z", "utc_product_issue": "2003-07-07T05:42:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-06T20:00:00Z", "utc_expire": "2003-07-07T12:00:00Z", "utc_product_issue": "2003-07-06T19:53:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-05T12:00:00Z", "utc_expire": "2003-07-06T12:00:00Z", "utc_product_issue": "2003-07-05T06:01:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-04T12:00:00Z", "utc_expire": "2003-07-05T12:00:00Z", "utc_product_issue": "2003-07-04T05:37:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-07-03T12:00:00Z", "utc_expire": "2003-07-04T12:00:00Z", "utc_product_issue": "2003-07-03T05:25:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-06-28T01:00:00Z", "utc_expire": "2003-06-28T12:00:00Z", "utc_product_issue": "2003-06-28T00:22:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-06-25T16:30:00Z", "utc_expire": "2003-06-26T12:00:00Z", "utc_product_issue": "2003-06-25T16:29:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-06-24T12:00:00Z", "utc_expire": "2003-06-25T12:00:00Z", "utc_product_issue": "2003-06-24T05:07:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-06-23T12:00:00Z", "utc_expire": "2003-06-24T12:00:00Z", "utc_product_issue": "2003-06-23T04:43:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-06-22T13:00:00Z", "utc_expire": "2003-06-23T12:00:00Z", "utc_product_issue": "2003-06-22T12:51:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-06-10T01:00:00Z", "utc_expire": "2003-06-10T12:00:00Z", "utc_product_issue": "2003-06-10T00:39:00Z", "threshold": "0.15", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-06-06T16:30:00Z", "utc_expire": "2003-06-07T12:00:00Z", "utc_product_issue": "2003-06-06T17:02:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-05-29T13:00:00Z", "utc_expire": "2003-05-30T12:00:00Z", "utc_product_issue": "2003-05-29T12:17:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-05-08T16:30:00Z", "utc_expire": "2003-05-09T12:00:00Z", "utc_product_issue": "2003-05-08T16:45:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2003-05-04T12:00:00Z", "utc_expire": "2003-05-05T12:00:00Z", "utc_product_issue": "2003-05-04T06:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-10-01T20:00:00Z", "utc_expire": "2002-10-02T12:00:00Z", "utc_product_issue": "2002-10-01T19:41:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-09-19T01:00:00Z", "utc_expire": "2002-09-19T12:00:00Z", "utc_product_issue": "2002-09-19T01:07:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-09-01T12:00:00Z", "utc_expire": "2002-09-02T12:00:00Z", "utc_product_issue": "2002-09-01T03:57:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-08-21T12:00:00Z", "utc_expire": "2002-08-22T12:00:00Z", "utc_product_issue": "2002-08-21T05:53:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-08-21T01:00:00Z", "utc_expire": "2002-08-21T12:00:00Z", "utc_product_issue": "2002-08-21T01:16:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-08-16T12:00:00Z", "utc_expire": "2002-08-17T12:00:00Z", "utc_product_issue": "2002-08-16T05:41:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-07-30T12:00:00Z", "utc_expire": "2002-07-31T12:00:00Z", "utc_product_issue": "2002-07-30T05:09:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-07-28T12:00:00Z", "utc_expire": "2002-07-29T12:00:00Z", "utc_product_issue": "2002-07-28T05:03:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-07-26T20:00:00Z", "utc_expire": "2002-07-27T12:00:00Z", "utc_product_issue": "2002-07-26T19:59:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-07-25T13:00:00Z", "utc_expire": "2002-07-26T12:00:00Z", "utc_product_issue": "2002-07-25T13:20:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-07-24T20:00:00Z", "utc_expire": "2002-07-25T12:00:00Z", "utc_product_issue": "2002-07-24T19:50:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-07-19T20:00:00Z", "utc_expire": "2002-07-20T12:00:00Z", "utc_product_issue": "2002-07-19T21:16:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-07-10T12:00:00Z", "utc_expire": "2002-07-11T12:00:00Z", "utc_product_issue": "2002-07-10T05:30:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-06-20T16:30:00Z", "utc_expire": "2002-06-21T12:00:00Z", "utc_product_issue": "2002-06-20T16:20:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-06-19T16:30:00Z", "utc_expire": "2002-06-20T12:00:00Z", "utc_product_issue": "2002-06-19T15:34:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-06-12T20:00:00Z", "utc_expire": "2002-06-13T12:00:00Z", "utc_product_issue": "2002-06-12T19:40:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-06-02T13:00:00Z", "utc_expire": "2002-06-03T12:00:00Z", "utc_product_issue": "2002-06-02T10:02:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-06-01T12:00:00Z", "utc_expire": "2002-06-02T12:00:00Z", "utc_product_issue": "2002-06-01T05:23:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-05-22T12:00:00Z", "utc_expire": "2002-05-23T12:00:00Z", "utc_product_issue": "2002-05-22T04:46:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-05-08T20:00:00Z", "utc_expire": "2002-05-09T12:00:00Z", "utc_product_issue": "2002-05-08T19:55:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-05-06T12:00:00Z", "utc_expire": "2002-05-07T12:00:00Z", "utc_product_issue": "2002-05-06T05:11:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-05-05T12:00:00Z", "utc_expire": "2002-05-06T12:00:00Z", "utc_product_issue": "2002-05-05T04:47:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-04-27T13:00:00Z", "utc_expire": "2002-04-28T12:00:00Z", "utc_product_issue": "2002-04-27T12:30:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-04-18T12:00:00Z", "utc_expire": "2002-04-19T12:00:00Z", "utc_product_issue": "2002-04-18T06:28:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-04-17T12:00:00Z", "utc_expire": "2002-04-18T12:00:00Z", "utc_product_issue": "2002-04-17T04:56:00Z", "threshold": "0.02", "category": "TORNADO"}, {"day": 1, "utc_issue": "2002-04-16T12:00:00Z", "utc_expire": "2002-04-17T12:00:00Z", "utc_product_issue": "2002-04-16T05:40:00Z", "threshold": "0.05", "category": "TORNADO"}, {"day": 1, "utc_issue": "2026-05-17T12:00:00Z", "utc_expire": "2026-05-18T12:00:00Z", "utc_product_issue": "2026-05-17T06:10:00Z", "threshold": "CIG1", "category": "TORNADO"}], "generated_at": "2026-05-17T08:31:09Z"} \ No newline at end of file diff --git a/tests/fixtures/iem_storm_reports.json b/tests/fixtures/iem_storm_reports.json new file mode 100644 index 0000000..3afb248 --- /dev/null +++ b/tests/fixtures/iem_storm_reports.json @@ -0,0 +1 @@ +{"type": "FeatureCollection", "features": [{"id": "0", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.68, "county": "Frontier", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station FRON007 Maywood.", "city": "Maywood", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.62, "lat": 40.66, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.68"}, "geometry": {"type": "Point", "coordinates": [-100.62, 40.66]}}, {"id": "1", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.89, "county": "Gosper", "typetext": "RAIN", "state": "NE", "remark": "CO-OP Observer station LEXN1 Canaday Steam Plant.", "city": "7 SSE Lexington", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -99.7, "lat": 40.68, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.89"}, "geometry": {"type": "Point", "coordinates": [-99.7, 40.68]}}, {"id": "2", "type": "Feature", "properties": {"wfo": "SGF", "type": "T", "magf": null, "county": "Vernon", "typetext": "TORNADO", "state": "MO", "remark": "An EF-1 tornado occurred, with a path length of 3.4 miles and a width of 95 yards. Maximum wind speeds of 95 mph destroyed two outbuildings, and caused a number of trees to be either uprooted or have large limbs snapped.", "city": "3 ENE Stotesbury", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T23:07:00Z", "lon": -94.51, "lat": 37.99, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.51, 37.99]}}, {"id": "3", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.43, "county": "Lincoln", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station LINC4333 Brady 6NNE.", "city": "11 NNE Brady", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.27, "lat": 41.16, "qualifier": "M", "product_id": "202404261507-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.43"}, "geometry": {"type": "Point", "coordinates": [-100.27, 41.16]}}, {"id": "4", "type": "Feature", "properties": {"wfo": "ICT", "type": "T", "magf": null, "county": "Woodson", "typetext": "TORNADO", "state": "KS", "remark": null, "city": "4 SSW Yates Center", "source": "Fire Dept/Rescue", "unit": null, "valid": "2024-04-26T20:52:00Z", "lon": -95.77, "lat": 37.82, "qualifier": null, "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.77, 37.82]}}, {"id": "5", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.52, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "2 ENE Wall", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T14:00:00Z", "lon": -102.21, "lat": 44.0, "qualifier": "M", "product_id": "202404261443-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.52"}, "geometry": {"type": "Point", "coordinates": [-102.21, 44.0]}}, {"id": "6", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.81, "county": "Tazewell", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-TZ-41 Morton.", "city": "1 ESE Morton", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -89.45, "lat": 40.61, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.81"}, "geometry": {"type": "Point", "coordinates": [-89.45, 40.61]}}, {"id": "7", "type": "Feature", "properties": {"wfo": "TFX", "type": "S", "magf": 12.0, "county": "Beaverhead", "typetext": "SNOW", "state": "MT", "remark": "24 hour snowfall of 12 inches at Darkhorse Lake SNOTEL (elevation 8701 feet).", "city": "16 SSW Jackson", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T03:30:00Z", "lon": -113.58, "lat": 45.17, "qualifier": "E", "product_id": "202404270549-KTFX-NWUS55-LSRTFX", "st": "MT", "magnitude": "12"}, "geometry": {"type": "Point", "coordinates": [-113.58, 45.17]}}, {"id": "8", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": "Very large tornado.", "city": "Minden", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:41:00Z", "lon": -95.54, "lat": 41.47, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.54, 41.47]}}, {"id": "9", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.5, "county": "Haakon", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "9 N Kirley", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T14:00:00Z", "lon": -101.33, "lat": 44.66, "qualifier": "M", "product_id": "202404261535-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.5"}, "geometry": {"type": "Point", "coordinates": [-101.33, 44.66]}}, {"id": "10", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Faulkner", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Trees reported blown down in Vilonia.", "city": "Vilonia", "source": "Public", "unit": null, "valid": "2024-04-27T00:30:00Z", "lon": -92.21, "lat": 35.09, "qualifier": null, "product_id": "202404270253-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.21, 35.09]}}, {"id": "11", "type": "Feature", "properties": {"wfo": "TOP", "type": "H", "magf": 1.75, "county": "Nemaha", "typetext": "HAIL", "state": "KS", "remark": "Emergency Manager reported golf ball size hail.", "city": "3 E Baileyville", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T21:11:00Z", "lon": -96.13, "lat": 39.84, "qualifier": "E", "product_id": "202404262115-KTOP-NWUS53-LSRTOP", "st": "KS", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-96.13, 39.84]}}, {"id": "12", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.04, "county": "Moultrie", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station SILI2 Sullivan 3S.", "city": "3 S Sullivan", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.61, "lat": 39.56, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.04"}, "geometry": {"type": "Point", "coordinates": [-88.61, 39.56]}}, {"id": "13", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.89, "county": "Schuyler", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station RIPI2 0.6 NE Ripley.", "city": "7 SSW Rushville", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T11:45:00Z", "lon": -90.63, "lat": 40.03, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.89"}, "geometry": {"type": "Point", "coordinates": [-90.63, 40.03]}}, {"id": "14", "type": "Feature", "properties": {"wfo": "EAX", "type": "T", "magf": null, "county": "Bates", "typetext": "TORNADO", "state": "MO", "remark": "NWS Damage Survey confirmed a brief EF-0 tornado southwest of Appleton City, MO the evening of the 26th of April, 2024. Minor damage to trees along the path.", "city": "7 N Rockville", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T23:42:00Z", "lon": -94.09, "lat": 38.17, "qualifier": null, "product_id": "202404292142-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.09, 38.17]}}, {"id": "15", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.77, "county": "Logan", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-LG-9 2 NW Chestnut.", "city": "4 SW Beason", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -89.24, "lat": 40.1, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.77"}, "geometry": {"type": "Point", "coordinates": [-89.24, 40.1]}}, {"id": "16", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 1.75, "county": "Tarrant", "typetext": "HAIL", "state": "TX", "remark": "Report from mPING: Golf Ball (1.75 in.).", "city": "2 NE Arlington", "source": "Public", "unit": "Inch", "valid": "2024-04-26T17:19:00Z", "lon": -97.11, "lat": 32.71, "qualifier": "E", "product_id": "202404261722-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-97.11, 32.71]}}, {"id": "17", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.55, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "ASOS station KGRI Grand Island Airport.", "city": "4 NE Grand Island", "source": "ASOS", "unit": "Inch", "valid": "2024-04-26T12:44:00Z", "lon": -98.32, "lat": 40.97, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.55"}, "geometry": {"type": "Point", "coordinates": [-98.32, 40.97]}}, {"id": "18", "type": "Feature", "properties": {"wfo": "LSX", "type": "R", "magf": 1.6, "county": "St. Louis City", "typetext": "RAIN", "state": "MO", "remark": "A 6-hour total between 3-9 pm, near the St. Louis Zoo.", "city": "2 E Richmond Heights", "source": "Public", "unit": "Inch", "valid": "2024-04-27T02:45:00Z", "lon": -90.29, "lat": 38.63, "qualifier": "M", "product_id": "202404270335-KLSX-NWUS53-LSRLSX", "st": "MO", "magnitude": "1.6"}, "geometry": {"type": "Point", "coordinates": [-90.29, 38.63]}}, {"id": "19", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 1.0, "county": "Bennett", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "8 E Martin", "source": "Co-Op Observer", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -101.57, "lat": 43.17, "qualifier": "M", "product_id": "202404261535-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-101.57, 43.17]}}, {"id": "20", "type": "Feature", "properties": {"wfo": "GLD", "type": "N", "magf": 51.0, "county": "Kit Carson", "typetext": "NON-TSTM WND GST", "state": "CO", "remark": "ASOS station KITR Burlington Co Airport. This is the peak wind gust reported from the ASOS so far.", "city": "5 S Burlington", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T17:53:00Z", "lon": -102.28, "lat": 39.23, "qualifier": "M", "product_id": "202404261822-KGLD-NWUS53-LSRGLD", "st": "CO", "magnitude": "51"}, "geometry": {"type": "Point", "coordinates": [-102.28, 39.23]}}, {"id": "21", "type": "Feature", "properties": {"wfo": "DVN", "type": "R", "magf": 1.66, "county": "Hancock", "typetext": "RAIN", "state": "IL", "remark": null, "city": "2 ENE Denver", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T16:30:00Z", "lon": -91.06, "lat": 40.29, "qualifier": "M", "product_id": "202404261636-KDVN-NWUS53-LSRDVN", "st": "IL", "magnitude": "1.66"}, "geometry": {"type": "Point", "coordinates": [-91.06, 40.29]}}, {"id": "22", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.5, "county": "Sarpy", "typetext": "HAIL", "state": "NE", "remark": null, "city": "1 SW Papillion", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:47:00Z", "lon": -96.06, "lat": 41.14, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-96.06, 41.14]}}, {"id": "23", "type": "Feature", "properties": {"wfo": "SGF", "type": "O", "magf": null, "county": "Dallas", "typetext": "NON-TSTM WND DMG", "state": "MO", "remark": "Non thunderstorm winds down a tree which fell on a telephone pole.", "city": "Buffalo", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T16:48:00Z", "lon": -93.09, "lat": 37.65, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.09, 37.65]}}, {"id": "24", "type": "Feature", "properties": {"wfo": "DMX", "type": "H", "magf": 3.0, "county": "Ringgold", "typetext": "HAIL", "state": "IA", "remark": "Corrects previous hail report from Mount Ayr.", "city": "Mount Ayr", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T00:45:00Z", "lon": -94.24, "lat": 40.71, "qualifier": "M", "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": "3"}, "geometry": {"type": "Point", "coordinates": [-94.24, 40.71]}}, {"id": "25", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Sarpy", "typetext": "HAIL", "state": "NE", "remark": "Report from mPING: Golf Ball (1.75 in.).", "city": "2 W Papillion", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:43:00Z", "lon": -96.08, "lat": 41.15, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-96.08, 41.15]}}, {"id": "26", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Clarke", "typetext": "TORNADO", "state": "IA", "remark": "Corrects previous tornado report from 4 S Osceola. Time estimated.", "city": "4 S Osceola", "source": "Public", "unit": null, "valid": "2024-04-27T01:29:00Z", "lon": -93.8, "lat": 40.97, "qualifier": null, "product_id": "202404270552-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.8, 40.97]}}, {"id": "27", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.33, "county": "Garfield", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station GARF010 Burwell 4.3 NW.", "city": "4 NW Burwell", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.19, "lat": 41.83, "qualifier": "M", "product_id": "202404261508-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.33"}, "geometry": {"type": "Point", "coordinates": [-99.19, 41.83]}}, {"id": "28", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "Navarro", "typetext": "TORNADO", "state": "TX", "remark": "A tornado formed approximately 2 miles southwest of Barry in open country, based on storm spotter video and eyewitness reports. This tornado moved north and northeast of Barry, impacting several residences and outbuildings along Navarro County roads 1210 and 1230. Most of the structural damage was confined to roofs and outbuilding sheet metal and was consistent with damage intensities of EF-0 and lower end EF-1 magnitude. However, one manufactured home along CR 1230 was totally destroyed, consistent with EF-1 winds of approximately 110 mph. The tornado traveled several additional miles to the east, passing north of Emhouse and producing EF-0 damage to trees and outbuildings. This tornado eventually dissipated in the Chambers Creek drainage west of Rice.", "city": "2 SW Barry", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T18:48:00Z", "lon": -96.67, "lat": 32.08, "qualifier": null, "product_id": "202404291623-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.67, 32.08]}}, {"id": "29", "type": "Feature", "properties": {"wfo": "SGX", "type": "N", "magf": 46.0, "county": "Riverside", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "ASOS station KPSP Palm Springs Airport - Northwest winds.", "city": "Palm Springs", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T20:47:00Z", "lon": -116.5, "lat": 33.82, "qualifier": "M", "product_id": "202404262141-KSGX-NWUS56-LSRSGX", "st": "CA", "magnitude": "46"}, "geometry": {"type": "Point", "coordinates": [-116.5, 33.82]}}, {"id": "30", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Laclede", "typetext": "FLOOD", "state": "MO", "remark": "State Highway J is closed due to flooding at the Osage Fork Gasconade and Parks Creek bridges.", "city": "3 ESE Morgan", "source": "Dept of Highways", "unit": null, "valid": "2024-04-27T03:40:00Z", "lon": -92.63, "lat": 37.5, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.63, 37.5]}}, {"id": "31", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "Multiple houses damaged.", "city": "1 W Shelby", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T22:49:00Z", "lon": -95.48, "lat": 41.51, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.48, 41.51]}}, {"id": "32", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Boone", "typetext": "TORNADO", "state": "NE", "remark": "Emergency Manager reported confirmed large tornado 4 to 5 miles west of Newman Grove.", "city": "5 W Newman Grove", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T20:47:00Z", "lon": -97.87, "lat": 41.75, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.87, 41.75]}}, {"id": "33", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.27, "county": "Garfield", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station NE-GD-1 Burwell.", "city": "Burwell", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.13, "lat": 41.78, "qualifier": "M", "product_id": "202404261508-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.27"}, "geometry": {"type": "Point", "coordinates": [-99.13, 41.78]}}, {"id": "34", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.93, "county": "Polk", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station POLK019 Gresham 6.9 NW.", "city": "6 E Stromsburg", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.48, "lat": 41.11, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.93"}, "geometry": {"type": "Point", "coordinates": [-97.48, 41.11]}}, {"id": "35", "type": "Feature", "properties": {"wfo": "ICT", "type": "H", "magf": 1.25, "county": "Allen", "typetext": "HAIL", "state": "KS", "remark": null, "city": "4 N Elsmore", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T22:17:00Z", "lon": -95.15, "lat": 37.85, "qualifier": "M", "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-95.15, 37.85]}}, {"id": "36", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.71, "county": "Lincoln", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station LINC5473 thenburg 6.8 W.", "city": "9 SSE Brady", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.28, "lat": 40.92, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.71"}, "geometry": {"type": "Point", "coordinates": [-100.28, 40.92]}}, {"id": "37", "type": "Feature", "properties": {"wfo": "FWD", "type": "D", "magf": null, "county": "Kaufman", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Reports of several trees down near Becker, including one that fell on a house. A construction light was also blown over. Time estimated from radar.", "city": "4 NNE Kemp", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T21:25:00Z", "lon": -96.21, "lat": 32.49, "qualifier": null, "product_id": "202404270014-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.21, 32.49]}}, {"id": "38", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Douglas", "typetext": "HAIL", "state": "NE", "remark": null, "city": "1 WNW Valley", "source": "Official NWS Obs", "unit": "Inch", "valid": "2024-04-26T20:33:00Z", "lon": -96.37, "lat": 41.32, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.37, 41.32]}}, {"id": "39", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "Navarro", "typetext": "TORNADO", "state": "TX", "remark": "Tornado reported near FM 477 near Brushie Prairie in western Navarro Co.", "city": "7 SSE Frost", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T18:37:00Z", "lon": -96.75, "lat": 32.0, "qualifier": null, "product_id": "202404261845-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.75, 32.0]}}, {"id": "40", "type": "Feature", "properties": {"wfo": "OUN", "type": "H", "magf": 0.88, "county": "Seminole", "typetext": "HAIL", "state": "OK", "remark": "Relayed by EM.", "city": "2 SSW Bowlegs", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T21:18:00Z", "lon": -96.68, "lat": 35.12, "qualifier": "E", "product_id": "202404262125-KOUN-NWUS54-LSROUN", "st": "OK", "magnitude": "0.88"}, "geometry": {"type": "Point", "coordinates": [-96.68, 35.12]}}, {"id": "41", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.44, "county": "Holt", "typetext": "RAIN", "state": "NE", "remark": null, "city": "2 SW Page", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -98.44, "lat": 42.38, "qualifier": "M", "product_id": "202404261511-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.44"}, "geometry": {"type": "Point", "coordinates": [-98.44, 42.38]}}, {"id": "42", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.91, "county": "Shelby", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station MQUI2 Moweaqua 2 S.", "city": "3 S Moweaqua", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -89.02, "lat": 39.59, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.91"}, "geometry": {"type": "Point", "coordinates": [-89.02, 39.59]}}, {"id": "43", "type": "Feature", "properties": {"wfo": "LOX", "type": "N", "magf": 59.0, "county": "Santa Barbara", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "Mesonet station SRIC1 Santa Rosa Island RAWS.", "city": "34 S Refugio State Beac", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-26T19:13:00Z", "lon": -120.08, "lat": 33.98, "qualifier": "M", "product_id": "202404261925-KLOX-NWUS56-LSRLOX", "st": "CA", "magnitude": "59"}, "geometry": {"type": "Point", "coordinates": [-120.08, 33.98]}}, {"id": "44", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Howard", "typetext": "TORNADO", "state": "NE", "remark": "This tornado touched down at 132 PM CDT 5 miles northeast of Elba, and lifted at 154 PM CDT 3 miles north of Wolbach. The rating was EF2, with an estimated peak wind of 135 MPH, based on metal power pole damage just west of the Highway 281 and 22 junction near Wolbach. The tornado had a path length of 9.59 miles, and was the widest of the day for the NWS Hastings forecast area with a width of 880 yards.", "city": "5 NE Elba", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T18:32:00Z", "lon": -98.51, "lat": 41.34, "qualifier": null, "product_id": "202404290108-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.51, 41.34]}}, {"id": "45", "type": "Feature", "properties": {"wfo": "GJT", "type": "H", "magf": 0.25, "county": "Delta", "typetext": "HAIL", "state": "CO", "remark": "Pea-sized hail observed accumulating on the ground.", "city": "1 W Eckert", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T21:55:00Z", "lon": -107.96, "lat": 38.84, "qualifier": "M", "product_id": "202404262156-KGJT-NWUS55-LSRGJT", "st": "CO", "magnitude": "0.25"}, "geometry": {"type": "Point", "coordinates": [-107.96, 38.84]}}, {"id": "46", "type": "Feature", "properties": {"wfo": "TOP", "type": "R", "magf": 1.75, "county": "Wabaunsee", "typetext": "RAIN", "state": "KS", "remark": null, "city": "6 SSE Saint George", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T14:54:00Z", "lon": -96.39, "lat": 39.11, "qualifier": "M", "product_id": "202404261455-KTOP-NWUS53-LSRTOP", "st": "KS", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-96.39, 39.11]}}, {"id": "47", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.89, "county": "Schuyler", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station RIPI2 0.6 NE Ripley.", "city": "7 SSW Rushville", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T10:45:00Z", "lon": -90.63, "lat": 40.03, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.89"}, "geometry": {"type": "Point", "coordinates": [-90.63, 40.03]}}, {"id": "48", "type": "Feature", "properties": {"wfo": "GJT", "type": "N", "magf": 46.0, "county": "Montrose", "typetext": "NON-TSTM WND GST", "state": "CO", "remark": "ASOS station KMTJ Montrose Rgnl Airport.", "city": "2 NW Montrose", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T21:09:00Z", "lon": -107.9, "lat": 38.5, "qualifier": "M", "product_id": "202404262346-KGJT-NWUS55-LSRGJT", "st": "CO", "magnitude": "46"}, "geometry": {"type": "Point", "coordinates": [-107.9, 38.5]}}, {"id": "49", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.83, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-CP-139 Mahomet 1.6 E.", "city": "1 SSW Lake of the Woods", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:45:00Z", "lon": -88.37, "lat": 40.2, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.83"}, "geometry": {"type": "Point", "coordinates": [-88.37, 40.2]}}, {"id": "50", "type": "Feature", "properties": {"wfo": "EAX", "type": "H", "magf": 0.75, "county": "Bates", "typetext": "HAIL", "state": "MO", "remark": "Report from mPING: Dime (0.75 in.). Time corrected from radar.", "city": "3 SE Butler", "source": "Public", "unit": "Inch", "valid": "2024-04-27T00:12:00Z", "lon": -94.3, "lat": 38.22, "qualifier": "M", "product_id": "202404270041-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-94.3, 38.22]}}, {"id": "51", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "5 NNE Lincoln", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T19:50:00Z", "lon": -96.64, "lat": 40.87, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.64, 40.87]}}, {"id": "52", "type": "Feature", "properties": {"wfo": "SGF", "type": "O", "magf": null, "county": "Lawrence", "typetext": "NON-TSTM WND DMG", "state": "MO", "remark": "Non thunderstorm winds uprooted a tree near Lawrenceburg.", "city": "4 SSW Ash Grove", "source": "Fire Dept/Rescue", "unit": null, "valid": "2024-04-26T17:15:00Z", "lon": -93.63, "lat": 37.27, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.63, 37.27]}}, {"id": "53", "type": "Feature", "properties": {"wfo": "SGF", "type": "F", "magf": null, "county": "Vernon", "typetext": "FLASH FLOOD", "state": "MO", "remark": "Report from mPING. Street, road flooding and road closed, vehicles stranded.", "city": "4 E Nevada", "source": "Public", "unit": null, "valid": "2024-04-26T16:36:00Z", "lon": -94.27, "lat": 37.84, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.27, 37.84]}}, {"id": "54", "type": "Feature", "properties": {"wfo": "TSA", "type": "H", "magf": 1.25, "county": "Tulsa", "typetext": "HAIL", "state": "OK", "remark": "pic from news media, time estimated via radar.", "city": "3 E Mannford", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-26T21:12:00Z", "lon": -96.3, "lat": 36.14, "qualifier": "E", "product_id": "202404270020-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-96.3, 36.14]}}, {"id": "55", "type": "Feature", "properties": {"wfo": "SLC", "type": "S", "magf": 1.0, "county": "Salt Lake", "typetext": "SNOW", "state": "UT", "remark": "Via_WFO_SLC.", "city": "Alta - Udot", "source": "Public", "unit": "Inch", "valid": "2024-04-26T22:37:00Z", "lon": -111.64, "lat": 40.59, "qualifier": "m", "product_id": "202404270237-KSLC-NWUS55-LSRSLC", "st": "UT", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-111.64, 40.59]}}, {"id": "56", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "3 SE Underwood", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:28:00Z", "lon": -95.65, "lat": 41.36, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.65, 41.36]}}, {"id": "57", "type": "Feature", "properties": {"wfo": "SGX", "type": "N", "magf": 75.0, "county": "Riverside", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "Mesonet station WWAC1 Whitewater RAWS - west winds.", "city": "7 ENE Cabazon", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-26T16:50:00Z", "lon": -116.66, "lat": 33.95, "qualifier": "M", "product_id": "202404261757-KSGX-NWUS56-LSRSGX", "st": "CA", "magnitude": "75"}, "geometry": {"type": "Point", "coordinates": [-116.66, 33.95]}}, {"id": "58", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.03, "county": "Douglas", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station CTVI2 1.5 NE Chesterville.", "city": "Chesterville", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -88.39, "lat": 39.7, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.03"}, "geometry": {"type": "Point", "coordinates": [-88.39, 39.7]}}, {"id": "59", "type": "Feature", "properties": {"wfo": "LZK", "type": "G", "magf": 53.0, "county": "Pulaski", "typetext": "TSTM WND GST", "state": "AR", "remark": "Two separate ARDOT weather stations on the Interstate 430 bridge recorded wind gusts of 53 mph.", "city": "Crystal Hill", "source": "Dept of Highways", "unit": "MPH", "valid": "2024-04-27T00:14:00Z", "lon": -92.32, "lat": 34.82, "qualifier": "M", "product_id": "202404270148-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": "53"}, "geometry": {"type": "Point", "coordinates": [-92.32, 34.82]}}, {"id": "60", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.85, "county": "Hamilton", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HAMI4152 Phillips 2.1 SW.", "city": "2 SW Phillips", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.25, "lat": 40.88, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.85"}, "geometry": {"type": "Point", "coordinates": [-98.25, 40.88]}}, {"id": "61", "type": "Feature", "properties": {"wfo": "BOU", "type": "H", "magf": 1.0, "county": "Douglas", "typetext": "HAIL", "state": "CO", "remark": null, "city": "3 SSE Chatfield Reservo", "source": "Public", "unit": "Inch", "valid": "2024-04-27T00:44:00Z", "lon": -105.04, "lat": 39.52, "qualifier": "E", "product_id": "202404271859-KBOU-NWUS55-LSRBOU", "st": "CO", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-105.04, 39.52]}}, {"id": "62", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Sherman", "typetext": "TORNADO", "state": "NE", "remark": "Tornado confirmed with some damage report. Will update pending damage survey.", "city": "Rockville", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T17:38:00Z", "lon": -98.82, "lat": 41.11, "qualifier": null, "product_id": "202404261752-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.82, 41.11]}}, {"id": "63", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Mills", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "2 NNW Pacific Junction", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T21:57:00Z", "lon": -95.82, "lat": 41.04, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.82, 41.04]}}, {"id": "64", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Pottawattamie", "typetext": "HAIL", "state": "IA", "remark": null, "city": "Carter Lake", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T21:55:00Z", "lon": -95.91, "lat": 41.29, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-95.91, 41.29]}}, {"id": "65", "type": "Feature", "properties": {"wfo": "EAX", "type": "H", "magf": 0.75, "county": "Holt", "typetext": "HAIL", "state": "MO", "remark": "Report from mPING: Dime (0.75 in.).", "city": "7 N Oregon", "source": "Public", "unit": "Inch", "valid": "2024-04-26T23:12:00Z", "lon": -95.11, "lat": 40.09, "qualifier": "E", "product_id": "202404270003-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-95.11, 40.09]}}, {"id": "66", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 2.75, "county": "Nemaha", "typetext": "HAIL", "state": "NE", "remark": null, "city": "Nemaha", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T22:02:00Z", "lon": -95.67, "lat": 40.34, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "2.75"}, "geometry": {"type": "Point", "coordinates": [-95.67, 40.34]}}, {"id": "67", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.01, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "ASOS station KCMI Willard Arpt.", "city": "Willard Airport", "source": "ASOS", "unit": "Inch", "valid": "2024-04-27T10:53:00Z", "lon": -88.28, "lat": 40.03, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.01"}, "geometry": {"type": "Point", "coordinates": [-88.28, 40.03]}}, {"id": "68", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "Vehicle and building damage.", "city": "2 S Waterloo", "source": "911 Call Center", "unit": null, "valid": "2024-04-26T20:37:00Z", "lon": -96.28, "lat": 41.26, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.28, 41.26]}}, {"id": "69", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Dent", "typetext": "FLOOD", "state": "MO", "remark": "Spring creek was out of its banks and flowing over county road 3220.", "city": "2 NW Salem", "source": "Cocorahs", "unit": null, "valid": "2024-04-26T23:45:00Z", "lon": -91.55, "lat": 37.66, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-91.55, 37.66]}}, {"id": "70", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "Very large tornado near 204th and Ida.", "city": "3 N Elkhorn", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T20:49:00Z", "lon": -96.23, "lat": 41.32, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.23, 41.32]}}, {"id": "71", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Jefferson", "typetext": "HAIL", "state": "NE", "remark": null, "city": "6 S Western", "source": "Public", "unit": "Inch", "valid": "2024-04-26T18:30:00Z", "lon": -97.18, "lat": 40.31, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-97.18, 40.31]}}, {"id": "72", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.63, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Report via Facebook.", "city": "2 SSE Wood River", "source": "Public", "unit": "Inch", "valid": "2024-04-26T14:30:00Z", "lon": -98.59, "lat": 40.79, "qualifier": "M", "product_id": "202404261430-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.63"}, "geometry": {"type": "Point", "coordinates": [-98.59, 40.79]}}, {"id": "73", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.34, "county": "Lyman", "typetext": "RAIN", "state": "SD", "remark": "Cocorahs station SD-LY-5 Vivian 7 NNE. 48-hour total.", "city": "8 N Vivian", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -100.27, "lat": 44.04, "qualifier": "M", "product_id": "202404271214-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.34"}, "geometry": {"type": "Point", "coordinates": [-100.27, 44.04]}}, {"id": "74", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.6, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "4 S New Underwood", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T15:00:00Z", "lon": -102.83, "lat": 44.04, "qualifier": "M", "product_id": "202404270350-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.6"}, "geometry": {"type": "Point", "coordinates": [-102.83, 44.04]}}, {"id": "75", "type": "Feature", "properties": {"wfo": "TFX", "type": "S", "magf": 6.0, "county": "Madison", "typetext": "SNOW", "state": "MT", "remark": null, "city": "5 W Big Sky", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -111.43, "lat": 45.27, "qualifier": "M", "product_id": "202404261518-KTFX-NWUS55-LSRTFX", "st": "MT", "magnitude": "6"}, "geometry": {"type": "Point", "coordinates": [-111.43, 45.27]}}, {"id": "76", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Hot Spring", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Large tree blown on top of a car causing considerable damage to the vehicle.", "city": "Malvern", "source": "Public", "unit": null, "valid": "2024-04-26T23:49:00Z", "lon": -92.82, "lat": 34.38, "qualifier": null, "product_id": "202404270213-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.82, 34.38]}}, {"id": "77", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "Delayed report. Video of tornado producing damage. One outbuilding destroyed.", "city": "1 S Defiance", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T23:51:00Z", "lon": -95.34, "lat": 41.82, "qualifier": null, "product_id": "202404282020-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.34, 41.82]}}, {"id": "78", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Douglas", "typetext": "HAIL", "state": "NE", "remark": null, "city": "1 NNE Omaha", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:55:00Z", "lon": -96.0, "lat": 41.28, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.0, 41.28]}}, {"id": "79", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": "This EF3 tornado damage path began near Aspen Road, just west of 240th Street. The tornado tracked toward the north northeast, snapping trees and electrical poles as it went. A home was impacted along Chestnut Road with substantial roof damage. Two additional homes were directly impacted where the tornado crossed Highway 92. One of these sustained major roof damage while the other home had most external walls collapse while interior walls remained standing. Numerous trees were snapped and a large shed was completely destroyed at this location, while a large steel horse trailer was thrown more than a quarter mile. The tornado continued to Cottonwood road where it damaged a home and an outbuilding. The most significant damage along the track occurred at Dogwood road where a home was completely destroyed, and only the basement remained. Tree damage here was substantial as well with numerous snapped trunks. Residents of this home survived by seeking shelter in the basement bathroom, which was one of the few locations in the home not directly impacted by major flying debris. The tornado crossed Elmtree Road and Highway 6, and appears to have been at its widest near Highway 6 where it was approximately 800 yards wide. Another home was damaged near 270th and Hickory Road. The tornado continued northeast, damaging electrical poles, trees, and outbuildings all the way to where it ended near 295th and Juniper Road. The ending location is based upon photo evidence of spotters located southeast of the storm. A second tornado paralleled this storms track near the end, eventually intensifying and moving off to the northeast.", "city": "7 WSW Treynor", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T22:08:00Z", "lon": -95.73, "lat": 41.19, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.73, 41.19]}}, {"id": "80", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Ringgold", "typetext": "TORNADO", "state": "IA", "remark": "Delayed report. Report of tornado between Mt Ayr and Kellerton. Exact location estimated from radar.", "city": "1 E Mount Ayr", "source": "Trained Spotter", "unit": null, "valid": "2024-04-27T00:47:00Z", "lon": -94.21, "lat": 40.71, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.21, 40.71]}}, {"id": "81", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.59, "county": "Lincoln", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station NE-LC-12 North Platte 1W.", "city": "1 W North Platte", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.8, "lat": 41.13, "qualifier": "M", "product_id": "202404261505-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.59"}, "geometry": {"type": "Point", "coordinates": [-100.8, 41.13]}}, {"id": "82", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 1.3, "county": "Mellette", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "12 NNW White River", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -100.87, "lat": 43.71, "qualifier": "M", "product_id": "202404261351-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "1.3"}, "geometry": {"type": "Point", "coordinates": [-100.87, 43.71]}}, {"id": "83", "type": "Feature", "properties": {"wfo": "PBZ", "type": "6", "magf": 32.0, "county": "Venango", "typetext": "EXTREME COLD", "state": "PA", "remark": null, "city": "1 E Franklin", "source": "Co-Op Observer", "unit": "F", "valid": "2024-04-26T12:05:00Z", "lon": -79.82, "lat": 41.39, "qualifier": "M", "product_id": "202405012134-KPBZ-NWUS51-LSRPBZ", "st": "PA", "magnitude": "32"}, "geometry": {"type": "Point", "coordinates": [-79.82, 41.39]}}, {"id": "84", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": "Very large tornado crossing Interstate 80.", "city": "1 WSW Shelby", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T22:50:00Z", "lon": -95.48, "lat": 41.5, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.48, 41.5]}}, {"id": "85", "type": "Feature", "properties": {"wfo": "BOU", "type": "H", "magf": 0.5, "county": "Denver", "typetext": "HAIL", "state": "CO", "remark": null, "city": "4 ENE Denver", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T22:18:00Z", "lon": -104.92, "lat": 39.75, "qualifier": "M", "product_id": "202404281442-KBOU-NWUS55-LSRBOU", "st": "CO", "magnitude": "0.5"}, "geometry": {"type": "Point", "coordinates": [-104.92, 39.75]}}, {"id": "86", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Adams", "typetext": "TORNADO", "state": "IA", "remark": "near 205th and Highway 25.", "city": "3 NE Lenox", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T00:10:00Z", "lon": -94.52, "lat": 40.91, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.52, 40.91]}}, {"id": "87", "type": "Feature", "properties": {"wfo": "ICT", "type": "H", "magf": 1.5, "county": "Greenwood", "typetext": "HAIL", "state": "KS", "remark": null, "city": "3 NW Fall River", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T20:12:00Z", "lon": -96.07, "lat": 37.64, "qualifier": "M", "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-96.07, 37.64]}}, {"id": "88", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.01, "county": "Peoria", "typetext": "RAIN", "state": "IL", "remark": "ASOS station KPIA Peoria Intl Arpt.", "city": "1 NNE Peoria Intl Airpo", "source": "ASOS", "unit": "Inch", "valid": "2024-04-27T10:54:00Z", "lon": -89.68, "lat": 40.67, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.01"}, "geometry": {"type": "Point", "coordinates": [-89.68, 40.67]}}, {"id": "89", "type": "Feature", "properties": {"wfo": "FSD", "type": "R", "magf": 1.1, "county": "Clay", "typetext": "RAIN", "state": "IA", "remark": "24 hour rainfall total.", "city": "4 NE Royal", "source": "Public", "unit": "Inch", "valid": "2024-04-27T08:23:00Z", "lon": -95.22, "lat": 43.09, "qualifier": "E", "product_id": "202404270823-KFSD-NWUS53-LSRFSD", "st": "IA", "magnitude": "1.1"}, "geometry": {"type": "Point", "coordinates": [-95.22, 43.09]}}, {"id": "90", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.25, "county": "Washington", "typetext": "HAIL", "state": "NE", "remark": null, "city": "Blair", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:08:00Z", "lon": -96.14, "lat": 41.55, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-96.14, 41.55]}}, {"id": "91", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "Very large tornado near Flanagan Lake.", "city": "3 N Elkhorn", "source": "Public", "unit": null, "valid": "2024-04-26T20:52:00Z", "lon": -96.23, "lat": 41.32, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.23, 41.32]}}, {"id": "92", "type": "Feature", "properties": {"wfo": "EAX", "type": "T", "magf": null, "county": "Bates", "typetext": "TORNADO", "state": "MO", "remark": "Downed trees blocking Highway 52 west of Appleton City near the St. Clair County line. Time estimated from radar.", "city": "6 SW Montrose", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T23:53:00Z", "lon": -94.06, "lat": 38.19, "qualifier": null, "product_id": "202404270141-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.06, 38.19]}}, {"id": "93", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Platte", "typetext": "TORNADO", "state": "NE", "remark": "Building and tree damage to an abandoned farmstead. Delayed report.", "city": "4 SE Creston", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T21:18:00Z", "lon": -97.31, "lat": 41.67, "qualifier": null, "product_id": "202404271718-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.31, 41.67]}}, {"id": "94", "type": "Feature", "properties": {"wfo": "ICT", "type": "H", "magf": 1.0, "county": "Elk", "typetext": "HAIL", "state": "KS", "remark": null, "city": "2 N Howard", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T19:51:00Z", "lon": -96.26, "lat": 37.5, "qualifier": "M", "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.26, 37.5]}}, {"id": "95", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.6, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "19 NNE Creighton", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -102.04, "lat": 44.5, "qualifier": "M", "product_id": "202404270103-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.6"}, "geometry": {"type": "Point", "coordinates": [-102.04, 44.5]}}, {"id": "96", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": "Building collapse.", "city": "4 SW Waverly", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T19:51:00Z", "lon": -96.59, "lat": 40.88, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.59, 40.88]}}, {"id": "97", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Bowie", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Trees and powerlines reported down on the Bowie County side of Texarkana.", "city": "Wake Village", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T23:30:00Z", "lon": -94.11, "lat": 33.42, "qualifier": null, "product_id": "202404270014-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.11, 33.42]}}, {"id": "98", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Douglas", "typetext": "FLOOD", "state": "MO", "remark": "State Highway U is closed due to flooding at Bryant Creek.", "city": "4 NNW Brushyknob", "source": "Dept of Highways", "unit": null, "valid": "2024-04-26T22:14:00Z", "lon": -92.52, "lat": 37.01, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.52, 37.01]}}, {"id": "99", "type": "Feature", "properties": {"wfo": "OAX", "type": "G", "magf": 61.0, "county": "Douglas", "typetext": "TSTM WND GST", "state": "NE", "remark": "Delayed report. ASOS at Eppley Airfield. Measured wind gust as tornado moved very nearby.", "city": "7 ENE Omaha", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T22:04:00Z", "lon": -95.89, "lat": 41.3, "qualifier": "M", "product_id": "202405011359-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "61"}, "geometry": {"type": "Point", "coordinates": [-95.89, 41.3]}}, {"id": "100", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Hempstead", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Trees and power lines down.", "city": "Hope", "source": "911 Call Center", "unit": null, "valid": "2024-04-26T22:50:00Z", "lon": -93.59, "lat": 33.67, "qualifier": null, "product_id": "202404270016-KSHV-NWUS54-LSRSHV", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.59, 33.67]}}, {"id": "101", "type": "Feature", "properties": {"wfo": "SHV", "type": "H", "magf": 0.75, "county": "Franklin", "typetext": "HAIL", "state": "TX", "remark": null, "city": "1 NW Mount Vernon", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T17:54:00Z", "lon": -95.23, "lat": 33.18, "qualifier": "E", "product_id": "202404261802-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-95.23, 33.18]}}, {"id": "102", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.3, "county": "Howard", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HOWA004 Dannebrog 3.1 ESE.", "city": "3 SE Dannebrog", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.5, "lat": 41.09, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.3"}, "geometry": {"type": "Point", "coordinates": [-98.5, 41.09]}}, {"id": "103", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.81, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Report via Facebook.", "city": "Shelton", "source": "Public", "unit": "Inch", "valid": "2024-04-26T12:17:00Z", "lon": -98.73, "lat": 40.78, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.81"}, "geometry": {"type": "Point", "coordinates": [-98.73, 40.78]}}, {"id": "104", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Pulaski", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Large tree blown over and resting on a powerline. Numerous people without power.", "city": "Autumnbrook", "source": "Public", "unit": null, "valid": "2024-04-27T00:28:00Z", "lon": -92.21, "lat": 34.84, "qualifier": null, "product_id": "202404270254-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.21, 34.84]}}, {"id": "105", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.96, "county": "Adams", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station ADAM034 Kenesaw 0.8 SE.", "city": "1 SE Kenesaw", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.65, "lat": 40.61, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.96"}, "geometry": {"type": "Point", "coordinates": [-98.65, 40.61]}}, {"id": "106", "type": "Feature", "properties": {"wfo": "ICT", "type": "R", "magf": 3.8, "county": "Labette", "typetext": "RAIN", "state": "KS", "remark": "24 hour total", "city": "2 NNW Parsons", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -95.29, "lat": 37.37, "qualifier": "M", "product_id": "202404261700-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "3.8"}, "geometry": {"type": "Point", "coordinates": [-95.29, 37.37]}}, {"id": "107", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.74, "county": "Custer", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station CUST010 Eddyville 11N.", "city": "8 ENE Oconto", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.61, "lat": 41.18, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.74"}, "geometry": {"type": "Point", "coordinates": [-99.61, 41.18]}}, {"id": "108", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Madison", "typetext": "TORNADO", "state": "IA", "remark": "Reported to the south of Patterson.", "city": "2 S Patterson", "source": "Trained Spotter", "unit": null, "valid": "2024-04-27T01:18:00Z", "lon": -93.88, "lat": 41.32, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.88, 41.32]}}, {"id": "109", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.24, "county": "Moultrie", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station WORI2 2.0 NW Lovington.", "city": "2 NW Lovington", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -88.66, "lat": 39.73, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.24"}, "geometry": {"type": "Point", "coordinates": [-88.66, 39.73]}}, {"id": "110", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "Navarro", "typetext": "TORNADO", "state": "TX", "remark": "A tornado formed just northwest of Navarro Mills Lake, just east of the Navarro/Hill County line. Damage near this initiation point was confined to split tree trunks consistent with EF-0 intensity windspeeds. The tornado tracked east-northeastward, causing tree damage and impacting multiple residences and outbuildings in areas between FM 744 and Navarro Mills Lake. Most of this damage was EF-0 to low end EF-1 in character, consistent with windspeeds of 75-95 mph. Damage was mainly associated with roof and fascia damage on the residences and significant sheet metal damage on outbuildings. However, one manufactured home was totally destroyed on Navarro County Road 3091, consistent with EF-1 winds estimated at around 110 mph. The tornado crossed FM 744, and dissipated just northwest of the Dresden community.", "city": "6 ENE Malone", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T18:30:00Z", "lon": -96.8, "lat": 31.95, "qualifier": null, "product_id": "202404291623-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.8, 31.95]}}, {"id": "111", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "McLennan", "typetext": "TORNADO", "state": "TX", "remark": "Tornado pictures and reports from north of Tours to Penelope.", "city": "4 E West", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T17:53:00Z", "lon": -97.02, "lat": 31.8, "qualifier": null, "product_id": "202404261820-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.02, 31.8]}}, {"id": "112", "type": "Feature", "properties": {"wfo": "GID", "type": "H", "magf": 1.75, "county": "Buffalo", "typetext": "HAIL", "state": "NE", "remark": "Also reports of dime to half-dollar size hail in Ravenna.", "city": "Ravenna", "source": "Public", "unit": "Inch", "valid": "2024-04-26T17:10:00Z", "lon": -98.91, "lat": 41.02, "qualifier": "M", "product_id": "202404261721-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-98.91, 41.02]}}, {"id": "113", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.91, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station GW3746 KEARNEY.", "city": "2 NNE Kearney", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T13:09:00Z", "lon": -99.06, "lat": 40.73, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.91"}, "geometry": {"type": "Point", "coordinates": [-99.06, 40.73]}}, {"id": "114", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Pulaski", "typetext": "TSTM WND DMG", "state": "AR", "remark": "1-inch tree limbs broken; Shingles blown off.", "city": "Allendale Manor", "source": "Public", "unit": null, "valid": "2024-04-27T00:18:00Z", "lon": -92.36, "lat": 34.67, "qualifier": null, "product_id": "202404270040-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.36, 34.67]}}, {"id": "115", "type": "Feature", "properties": {"wfo": "EAX", "type": "T", "magf": null, "county": "Holt", "typetext": "TORNADO", "state": "MO", "remark": "Fire dept. reported weak tornado.", "city": "2 SW Skidmore", "source": "Fire Dept/Rescue", "unit": null, "valid": "2024-04-26T23:14:00Z", "lon": -95.08, "lat": 40.25, "qualifier": null, "product_id": "202404262320-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.08, 40.25]}}, {"id": "116", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Pulaski", "typetext": "TSTM WND DMG", "state": "AR", "remark": "A tree was blown over at this location.", "city": "1 SW The Heights", "source": "Public", "unit": null, "valid": "2024-04-27T00:25:00Z", "lon": -92.34, "lat": 34.77, "qualifier": null, "product_id": "202404271450-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.34, 34.77]}}, {"id": "117", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 0.75, "county": "Tarrant", "typetext": "HAIL", "state": "TX", "remark": "Penny size hail in Blue Mound.", "city": "Blue Mound", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T15:36:00Z", "lon": -97.34, "lat": 32.85, "qualifier": "M", "product_id": "202404261545-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-97.34, 32.85]}}, {"id": "118", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.92, "county": "Douglas", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station TUSI2 Tuscola.", "city": "1 WSW Tuscola", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.29, "lat": 39.79, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.92"}, "geometry": {"type": "Point", "coordinates": [-88.29, 39.79]}}, {"id": "119", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.94, "county": "McLean", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station NRLI2 4 NE Normal.", "city": "3 WSW Towanda", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T10:00:00Z", "lon": -88.95, "lat": 40.55, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.94"}, "geometry": {"type": "Point", "coordinates": [-88.95, 40.55]}}, {"id": "120", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Howard", "typetext": "TORNADO", "state": "NE", "remark": "Reported by fireman. Moving north/northeast at the time.", "city": "1 S Farwell", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T17:58:00Z", "lon": -98.63, "lat": 41.21, "qualifier": null, "product_id": "202404261803-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.63, 41.21]}}, {"id": "121", "type": "Feature", "properties": {"wfo": "TSA", "type": "D", "magf": null, "county": "Ottawa", "typetext": "TSTM WND DMG", "state": "OK", "remark": "Numerous large tree limbs down. Time estimated by radar.", "city": "1 SSW Fairland", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T00:49:00Z", "lon": -94.85, "lat": 36.74, "qualifier": null, "product_id": "202404291753-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.85, 36.74]}}, {"id": "122", "type": "Feature", "properties": {"wfo": "TSA", "type": "H", "magf": 1.0, "county": "Rogers", "typetext": "HAIL", "state": "OK", "remark": "pic from social media, time estimated from radar.", "city": "10 N Claremore", "source": "Public", "unit": "Inch", "valid": "2024-04-26T22:20:00Z", "lon": -95.62, "lat": 36.46, "qualifier": "M", "product_id": "202404270055-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.62, 36.46]}}, {"id": "123", "type": "Feature", "properties": {"wfo": "FGZ", "type": "G", "magf": 60.0, "county": "Yavapai", "typetext": "TSTM WND GST", "state": "AZ", "remark": "Trained spotted estimated a 60 mph wind gust in Black Canyon City. Damage reported to digital weather station. Time estimated from radar.", "city": "1 N Black Canyon City", "source": "Trained Spotter", "unit": "MPH", "valid": "2024-04-27T01:00:00Z", "lon": -112.14, "lat": 34.08, "qualifier": "E", "product_id": "202404271922-KFGZ-NWUS55-LSRFGZ", "st": "AZ", "magnitude": "60"}, "geometry": {"type": "Point", "coordinates": [-112.14, 34.08]}}, {"id": "124", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Greene", "typetext": "FLOOD", "state": "MO", "remark": "Street flooding at Mount Vernon street near Fort. A few inches water over the road.", "city": "1 WNW Springfield", "source": "Amateur Radio", "unit": null, "valid": "2024-04-26T22:07:00Z", "lon": -93.31, "lat": 37.2, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.31, 37.2]}}, {"id": "125", "type": "Feature", "properties": {"wfo": "SGF", "type": "O", "magf": null, "county": "Polk", "typetext": "NON-TSTM WND DMG", "state": "MO", "remark": "Large tree limbs down by non thunderstorm winds near Morrisville.", "city": "1 E Morrisville", "source": "911 Call Center", "unit": null, "valid": "2024-04-26T17:30:00Z", "lon": -93.42, "lat": 37.48, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.42, 37.48]}}, {"id": "126", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.06, "county": "Stark", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-SK-8 Toulon 0.5 ESE, IL.", "city": "1 ESE Toulon", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:24:00Z", "lon": -89.85, "lat": 41.09, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.06"}, "geometry": {"type": "Point", "coordinates": [-89.85, 41.09]}}, {"id": "127", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.06, "county": "Shelby", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station SBYI2 1.5 E Shelbyville.", "city": "2 E Shelbyville", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -88.78, "lat": 39.41, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.06"}, "geometry": {"type": "Point", "coordinates": [-88.78, 39.41]}}, {"id": "128", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Union", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "2 NW Afton", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T00:31:00Z", "lon": -94.22, "lat": 41.05, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.22, 41.05]}}, {"id": "129", "type": "Feature", "properties": {"wfo": "OAX", "type": "C", "magf": null, "county": "Saline", "typetext": "FUNNEL CLOUD", "state": "NE", "remark": null, "city": "4 NNE Wilber", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T19:05:00Z", "lon": -96.94, "lat": 40.54, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.94, 40.54]}}, {"id": "130", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.8, "county": "Mellette", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "7 N Wood", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.5, "lat": 43.6, "qualifier": "M", "product_id": "202404261228-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.8"}, "geometry": {"type": "Point", "coordinates": [-100.5, 43.6]}}, {"id": "131", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Sarpy", "typetext": "HAIL", "state": "NE", "remark": null, "city": "2 WSW La Vista", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:30:00Z", "lon": -96.07, "lat": 41.18, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.07, 41.18]}}, {"id": "132", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.71, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station DW1352 Kearney.", "city": "1 NNE Kearney", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T13:02:00Z", "lon": -99.08, "lat": 40.72, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.71"}, "geometry": {"type": "Point", "coordinates": [-99.08, 40.72]}}, {"id": "133", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.03, "county": "Knox", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-KX-22 Altona 4.7 ESE.", "city": "4 N Victoria", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -90.08, "lat": 41.09, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.03"}, "geometry": {"type": "Point", "coordinates": [-90.08, 41.09]}}, {"id": "134", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.37, "county": "Shelby", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-SH-1 Shelbyville 0.5 NE.", "city": "1 ENE Shelbyville", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.8, "lat": 39.41, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.37"}, "geometry": {"type": "Point", "coordinates": [-88.8, 39.41]}}, {"id": "135", "type": "Feature", "properties": {"wfo": "FGZ", "type": "D", "magf": null, "county": "Yavapai", "typetext": "TSTM WND DMG", "state": "AZ", "remark": "Wind from 315 degrees measured at 57 mph. Damage estimate $75,000+ Some rain.", "city": "3 S Paulden", "source": "Trained Spotter", "unit": null, "valid": "2024-04-27T00:00:00Z", "lon": -112.48, "lat": 34.84, "qualifier": null, "product_id": "202404291449-KFGZ-NWUS55-LSRFGZ", "st": "AZ", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-112.48, 34.84]}}, {"id": "136", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.2, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Report via Facebook from just east of Ravenna.", "city": "1 E Ravenna", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -98.9, "lat": 41.03, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.2"}, "geometry": {"type": "Point", "coordinates": [-98.9, 41.03]}}, {"id": "137", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Washington", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "4 SSE Blair", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T21:10:00Z", "lon": -96.11, "lat": 41.49, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.11, 41.49]}}, {"id": "138", "type": "Feature", "properties": {"wfo": "ICT", "type": "H", "magf": 1.0, "county": "Elk", "typetext": "HAIL", "state": "KS", "remark": "May have had a wall cloud initially.", "city": "1 W New Albany", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T20:41:00Z", "lon": -95.96, "lat": 37.57, "qualifier": "E", "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.96, 37.57]}}, {"id": "139", "type": "Feature", "properties": {"wfo": "FWD", "type": "F", "magf": null, "county": "Kaufman", "typetext": "FLASH FLOOD", "state": "TX", "remark": "1 lane of Highway 175 closed at Highway 34. High water rescues ongoing.", "city": "1 SSE Kaufman", "source": "Broadcast Media", "unit": null, "valid": "2024-04-26T22:05:00Z", "lon": -96.3, "lat": 32.57, "qualifier": null, "product_id": "202404262208-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.3, 32.57]}}, {"id": "140", "type": "Feature", "properties": {"wfo": "MFR", "type": "R", "magf": 1.68, "county": "Curry", "typetext": "RAIN", "state": "OR", "remark": "24 hour total ending at 8AM.", "city": "2 SSE Pistol River", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T15:00:00Z", "lon": -124.39, "lat": 42.26, "qualifier": "M", "product_id": "202404261614-KMFR-NWUS56-LSRMFR", "st": "OR", "magnitude": "1.68"}, "geometry": {"type": "Point", "coordinates": [-124.39, 42.26]}}, {"id": "141", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Webster", "typetext": "FLOOD", "state": "MO", "remark": "State Highway Z is closed due to flooding along the Finley Creek.", "city": "4 SSE Fordland", "source": "Dept of Highways", "unit": null, "valid": "2024-04-26T21:23:00Z", "lon": -92.92, "lat": 37.1, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.92, 37.1]}}, {"id": "142", "type": "Feature", "properties": {"wfo": "MQT", "type": "N", "magf": 44.0, "county": "Keweenaw", "typetext": "NON-TSTM WND GST", "state": "MI", "remark": "ASOS station KP59 Copper Harbor.", "city": "Copper Harbor", "source": "ASOS", "unit": "MPH", "valid": "2024-04-27T07:22:00Z", "lon": -87.88, "lat": 47.47, "qualifier": "M", "product_id": "202404271818-KMQT-NWUS53-LSRMQT", "st": "MI", "magnitude": "44"}, "geometry": {"type": "Point", "coordinates": [-87.88, 47.47]}}, {"id": "143", "type": "Feature", "properties": {"wfo": "SJT", "type": "F", "magf": null, "county": "San Saba", "typetext": "FLASH FLOOD", "state": "TX", "remark": "Arroyos out of banks, Stock tanks overflowing. 3.5 inches rainfall.", "city": "9.7 SE San Saba", "source": "Public", "unit": null, "valid": "2024-04-26T23:40:00Z", "lon": -98.6, "lat": 31.1, "qualifier": null, "product_id": "202404270006-KSJT-NWUS54-LSRSJT", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.6, 31.1]}}, {"id": "144", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.06, "county": "Adams", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station NE-AD-3 Hastings 3.2 NNE.", "city": "3 NNE Hastings", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.38, "lat": 40.63, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.06"}, "geometry": {"type": "Point", "coordinates": [-98.38, 40.63]}}, {"id": "145", "type": "Feature", "properties": {"wfo": "SGX", "type": "N", "magf": 48.0, "county": "San Bernardino", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "AWOS station KVCV Victorville Airport - west wind.", "city": "2 E Adelanto", "source": "AWOS", "unit": "MPH", "valid": "2024-04-26T18:35:00Z", "lon": -117.38, "lat": 34.58, "qualifier": "M", "product_id": "202404261924-KSGX-NWUS56-LSRSGX", "st": "CA", "magnitude": "48"}, "geometry": {"type": "Point", "coordinates": [-117.38, 34.58]}}, {"id": "146", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Richardson", "typetext": "TORNADO", "state": "NE", "remark": "DELAYED REPORT. Emergency Management reported a tornado on the ground 2 miles north of Salem, Nebraska.", "city": "2 N Salem", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:10:00Z", "lon": -95.73, "lat": 40.11, "qualifier": null, "product_id": "202404271730-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.73, 40.11]}}, {"id": "147", "type": "Feature", "properties": {"wfo": "LSX", "type": "R", "magf": 1.6, "county": "Madison", "typetext": "RAIN", "state": "IL", "remark": "CoCoRaHS report of the past 9 hours.", "city": "1 ENE Maryville", "source": "Public", "unit": "Inch", "valid": "2024-04-27T03:42:00Z", "lon": -89.94, "lat": 38.73, "qualifier": "M", "product_id": "202404270347-KLSX-NWUS53-LSRLSX", "st": "IL", "magnitude": "1.6"}, "geometry": {"type": "Point", "coordinates": [-89.94, 38.73]}}, {"id": "148", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Union", "typetext": "TORNADO", "state": "IA", "remark": "Tornado on the ground, heading northeast.", "city": "2 WSW Creston", "source": "Trained Spotter", "unit": null, "valid": "2024-04-27T00:04:00Z", "lon": -94.4, "lat": 41.05, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.4, 41.05]}}, {"id": "149", "type": "Feature", "properties": {"wfo": "TFX", "type": "S", "magf": 1.3, "county": "Gallatin", "typetext": "SNOW", "state": "MT", "remark": null, "city": "West Yellowstone", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T13:18:00Z", "lon": -111.11, "lat": 44.66, "qualifier": "M", "product_id": "202404261435-KTFX-NWUS55-LSRTFX", "st": "MT", "magnitude": "1.3"}, "geometry": {"type": "Point", "coordinates": [-111.11, 44.66]}}, {"id": "150", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": "Brief tornado touchdown near the Kawasaki Plant.", "city": "5 NW Lincoln", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T19:43:00Z", "lon": -96.75, "lat": 40.88, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.75, 40.88]}}, {"id": "151", "type": "Feature", "properties": {"wfo": "SGF", "type": "H", "magf": 1.25, "county": "Bourbon", "typetext": "HAIL", "state": "KS", "remark": null, "city": "Fulton", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T23:12:00Z", "lon": -94.72, "lat": 38.01, "qualifier": "E", "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "KS", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-94.72, 38.01]}}, {"id": "152", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Bowie", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Several trees downed in and around the city of Maud, Texas.", "city": "Maud", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T23:10:00Z", "lon": -94.35, "lat": 33.33, "qualifier": null, "product_id": "202404270001-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.35, 33.33]}}, {"id": "153", "type": "Feature", "properties": {"wfo": "TSA", "type": "H", "magf": 1.5, "county": "Rogers", "typetext": "HAIL", "state": "OK", "remark": "relayed via media...time estimated from radar.", "city": "1 N Chelsea", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-26T22:40:00Z", "lon": -95.43, "lat": 36.55, "qualifier": "E", "product_id": "202404270045-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-95.43, 36.55]}}, {"id": "154", "type": "Feature", "properties": {"wfo": "SGX", "type": "N", "magf": 59.0, "county": "Riverside", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "Palm Springs Airport ASOS.", "city": "Palm Springs", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T23:27:00Z", "lon": -116.5, "lat": 33.82, "qualifier": "M", "product_id": "202404262345-KSGX-NWUS56-LSRSGX", "st": "CA", "magnitude": "59"}, "geometry": {"type": "Point", "coordinates": [-116.5, 33.82]}}, {"id": "155", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Sherman", "typetext": "TORNADO", "state": "NE", "remark": "Location approximate. May be adjusted. Estimated on the ground for 4 to 5 minutes. Video confirmed.", "city": "2 NNE Ravenna", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T17:28:00Z", "lon": -98.9, "lat": 41.06, "qualifier": null, "product_id": "202404261740-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.9, 41.06]}}, {"id": "156", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.37, "county": "Fulton", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station LNMI2 0.7 W London Mills.", "city": "1 WSW London Mills", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T10:45:00Z", "lon": -90.28, "lat": 40.71, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.37"}, "geometry": {"type": "Point", "coordinates": [-90.28, 40.71]}}, {"id": "157", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Greene", "typetext": "FLOOD", "state": "MO", "remark": "Street flooding on Oak Grove with multiple spots of 2-4 inches of water over the road. Some backyard flooding.", "city": "2 E Springfield", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:02:00Z", "lon": -93.24, "lat": 37.19, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.24, 37.19]}}, {"id": "158", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.76, "county": "Logan", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-LG-50 Hartsburg 3.2 E.", "city": "3 E Hartsburg", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -89.38, "lat": 40.25, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.76"}, "geometry": {"type": "Point", "coordinates": [-89.38, 40.25]}}, {"id": "159", "type": "Feature", "properties": {"wfo": "SGF", "type": "T", "magf": null, "county": "St. Clair", "typetext": "TORNADO", "state": "MO", "remark": "An NWS storm survey determined that a tornado briefly touched down Friday evening on Highway 52 at the Bates and St Clair county line, downing trees and power lines.", "city": "1 W Appleton City", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T23:56:00Z", "lon": -94.05, "lat": 38.19, "qualifier": null, "product_id": "202405011752-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.05, 38.19]}}, {"id": "160", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 1.1, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "1 E Dwtn Rapid City", "source": "Official NWS Obs", "unit": "inch", "valid": "2024-04-26T12:00:00Z", "lon": -103.21, "lat": 44.07, "qualifier": "M", "product_id": "202404261205-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "1.1"}, "geometry": {"type": "Point", "coordinates": [-103.21, 44.07]}}, {"id": "161", "type": "Feature", "properties": {"wfo": "SHV", "type": "H", "magf": 1.75, "county": "Camp", "typetext": "HAIL", "state": "TX", "remark": "Golfball sized hail reported near the dam of Lake Bob Sandlin.", "city": "3 NNE Rocky Mound", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-27T01:24:00Z", "lon": -95.01, "lat": 33.06, "qualifier": "M", "product_id": "202404270125-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-95.01, 33.06]}}, {"id": "162", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 2.15, "county": "Garden", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station GARD003 Oshkosh 11WSW.", "city": "11 WSW Oshkosh", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -102.53, "lat": 41.33, "qualifier": "M", "product_id": "202404261503-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "2.15"}, "geometry": {"type": "Point", "coordinates": [-102.53, 41.33]}}, {"id": "163", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.3, "county": "Frontier", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station FRON019 Curtis 9S.", "city": "7 WSW Stockville", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.5, "lat": 40.5, "qualifier": "M", "product_id": "202404261508-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.3"}, "geometry": {"type": "Point", "coordinates": [-100.5, 40.5]}}, {"id": "164", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Richardson", "typetext": "TORNADO", "state": "NE", "remark": "Emergency Manager reported a tornado and no damage was found. This tornado is rated an EF Unknown.", "city": "2 SSW Verdon", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T22:10:00Z", "lon": -95.72, "lat": 40.12, "qualifier": null, "product_id": "202405081802-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.72, 40.12]}}, {"id": "165", "type": "Feature", "properties": {"wfo": "EAX", "type": "H", "magf": 1.5, "county": "Bates", "typetext": "HAIL", "state": "MO", "remark": "Photo of approximately ping pong ball size hail in Hume relayed to NWS employee. Time estimated from radar.", "city": "Hume", "source": "Public", "unit": "Inch", "valid": "2024-04-26T23:03:00Z", "lon": -94.58, "lat": 38.09, "qualifier": "E", "product_id": "202404270115-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-94.58, 38.09]}}, {"id": "166", "type": "Feature", "properties": {"wfo": "ICT", "type": "T", "magf": null, "county": "Allen", "typetext": "TORNADO", "state": "KS", "remark": "Storm chaser video showed brief tornado.", "city": "8 E Humboldt", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T22:02:00Z", "lon": -95.3, "lat": 37.79, "qualifier": null, "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.3, 37.79]}}, {"id": "167", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "240th and Dodge.", "city": "4 SSW Waterloo", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T20:40:00Z", "lon": -96.3, "lat": 41.23, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.3, 41.23]}}, {"id": "168", "type": "Feature", "properties": {"wfo": "DMX", "type": "H", "magf": 0.88, "county": "Carroll", "typetext": "HAIL", "state": "IA", "remark": "Large quantity of dime to nickel sized hail.", "city": "3 E Dedham", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T17:55:00Z", "lon": -94.76, "lat": 41.9, "qualifier": "M", "product_id": "202404261802-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": "0.88"}, "geometry": {"type": "Point", "coordinates": [-94.76, 41.9]}}, {"id": "169", "type": "Feature", "properties": {"wfo": "FGZ", "type": "S", "magf": 2.0, "county": "Coconino", "typetext": "SNOW", "state": "AZ", "remark": "Two to three inches of snow/graupel at Grand Canyon Village.", "city": "Grand Canyon Village", "source": "Public", "unit": "Inch", "valid": "2024-04-27T00:10:00Z", "lon": -112.14, "lat": 36.06, "qualifier": "M", "product_id": "202404270025-KFGZ-NWUS55-LSRFGZ", "st": "AZ", "magnitude": "2"}, "geometry": {"type": "Point", "coordinates": [-112.14, 36.06]}}, {"id": "170", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "DELAYED REPORT. Media relayed photo of tornado approximately 1 mile northeast of Defiance, Iowa.", "city": "1 NE Defiance", "source": "Broadcast Media", "unit": null, "valid": "2024-04-26T23:55:00Z", "lon": -95.33, "lat": 41.84, "qualifier": null, "product_id": "202404271751-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.33, 41.84]}}, {"id": "171", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 0.75, "county": "Tarrant", "typetext": "HAIL", "state": "TX", "remark": "Penny size hail in Saginaw.", "city": "Saginaw", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T15:39:00Z", "lon": -97.37, "lat": 32.87, "qualifier": "M", "product_id": "202404261545-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-97.37, 32.87]}}, {"id": "172", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Washington", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "4 SE Blair", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T21:18:00Z", "lon": -96.07, "lat": 41.51, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.07, 41.51]}}, {"id": "173", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": "An EF-0 tornado tracked mainly through open fields, with time and location identified by a storm chaser video. The damage survey team did find evidence of some minor tree damage at a few locations sufficient to rate this as an EF-0 tornado.", "city": "3 NNW Waverly", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T20:03:00Z", "lon": -96.56, "lat": 40.96, "qualifier": null, "product_id": "202405041718-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.56, 40.96]}}, {"id": "174", "type": "Feature", "properties": {"wfo": "GID", "type": "H", "magf": 0.88, "county": "Sherman", "typetext": "HAIL", "state": "NE", "remark": "Dense fog as well.", "city": "2 NNE Ravenna", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T17:01:00Z", "lon": -98.9, "lat": 41.05, "qualifier": "E", "product_id": "202404261705-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "0.88"}, "geometry": {"type": "Point", "coordinates": [-98.9, 41.05]}}, {"id": "175", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Howard", "typetext": "TORNADO", "state": "NE", "remark": "This tornado touched down at 1258 PM CDT 1 mile south southeast of Farwell, and lifted at 121 PM CDT 3 miles north of Elba. This was the strongest tornado of the day for the NWS Hastings forecast area, rated an EF3. The estimated peak wind gust was 145 MPH, based on heavy damage to a farmstead just west of Elba. The tornado had a path length of 9.54 miles and a width of 600 yards.", "city": "1 SSE Farwell", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T17:58:00Z", "lon": -98.62, "lat": 41.2, "qualifier": null, "product_id": "202404290108-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.62, 41.2]}}, {"id": "176", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.85, "county": "York", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station YORK042 Bradshaw 4.1 NW.", "city": "4 NW Bradshaw", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.8, "lat": 40.93, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.85"}, "geometry": {"type": "Point", "coordinates": [-97.8, 40.93]}}, {"id": "177", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Sarpy", "typetext": "HAIL", "state": "NE", "remark": null, "city": "1 ENE Papillion", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T21:56:00Z", "lon": -96.02, "lat": 41.16, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.02, 41.16]}}, {"id": "178", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Lancaster", "typetext": "HAIL", "state": "NE", "remark": "Report of hail ranging from half an inch to an inch in Denton, NE.", "city": "Denton", "source": "Public", "unit": "Inch", "valid": "2024-04-26T19:24:00Z", "lon": -96.85, "lat": 40.74, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.85, 40.74]}}, {"id": "179", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.3, "county": "Merrick", "typetext": "RAIN", "state": "NE", "remark": "Report via social media.", "city": "Central City", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -98.01, "lat": 41.12, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.3"}, "geometry": {"type": "Point", "coordinates": [-98.01, 41.12]}}, {"id": "180", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Monona", "typetext": "TORNADO", "state": "IA", "remark": "An EF1 tornado developed near the intersection of 260th and 270th Streets. It produced damage to outbuildings at a farmstead near the intersection, and tossed some fiberglass boats. The tornado moved across agricultural fields generally northeast paralleling State Highway 183 to the west. It produced damage to trees along Redwood Avenue and snapped a power pole near the intersection of State Highway 37 and Redwood Avenue. The tornado moved just west of the community of Soldier, producing no discernable damage to any homes in businesses on the west side of Soldier. Radar signatures indicate the tornado continued to move northeast across agricultural lands, moving north of 245th Street, damaging trees and outbuildings, before dissipating just east of Spruce Avenue. This tornado was on the ground for 3.3 miles.", "city": "2 WSW Soldier", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T22:23:00Z", "lon": -95.81, "lat": 41.97, "qualifier": null, "product_id": "202405081752-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.81, 41.97]}}, {"id": "181", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.98, "county": "Knox", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-KX-24 Galesburg 2.5 N.", "city": "3 N Galesburg", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -90.38, "lat": 40.99, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.98"}, "geometry": {"type": "Point", "coordinates": [-90.38, 40.99]}}, {"id": "182", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.68, "county": "Custer", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "7 WSW Fairburn", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T14:50:00Z", "lon": -103.34, "lat": 43.65, "qualifier": "M", "product_id": "202404261535-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.68"}, "geometry": {"type": "Point", "coordinates": [-103.34, 43.65]}}, {"id": "183", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Douglas", "typetext": "HAIL", "state": "NE", "remark": null, "city": "5 NE Omaha", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:55:00Z", "lon": -95.93, "lat": 41.3, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-95.93, 41.3]}}, {"id": "184", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.09, "county": "Shelby", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station CWDI2 1.6 SE Cowden.", "city": "2 SE Cowden", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -88.84, "lat": 39.23, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.09"}, "geometry": {"type": "Point", "coordinates": [-88.84, 39.23]}}, {"id": "185", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Webster", "typetext": "FLOOD", "state": "MO", "remark": "The Pomme De Terre River was out of its banks and flooding at Greenwood Road. Water was at least a 6 inches over the road.", "city": "1 N Northview", "source": "NWS Employee", "unit": null, "valid": "2024-04-26T23:00:00Z", "lon": -92.99, "lat": 37.3, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.99, 37.3]}}, {"id": "186", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.69, "county": "Mellette", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "2 SSW Norris", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -101.22, "lat": 43.45, "qualifier": "M", "product_id": "202404261351-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.69"}, "geometry": {"type": "Point", "coordinates": [-101.22, 43.45]}}, {"id": "187", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 0.95, "county": "Grant", "typetext": "RAIN", "state": "SD", "remark": "Cocorahs station SD-GT-10 Milbank 2.3 WSW.", "city": "2 WSW Milbank", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -96.68, "lat": 45.21, "qualifier": "M", "product_id": "202404271613-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "0.95"}, "geometry": {"type": "Point", "coordinates": [-96.68, 45.21]}}, {"id": "188", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.89, "county": "McLean", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-MCL-64 Normal 1.2 ESE.", "city": "Normal", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.98, "lat": 40.51, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.89"}, "geometry": {"type": "Point", "coordinates": [-88.98, 40.51]}}, {"id": "189", "type": "Feature", "properties": {"wfo": "TSA", "type": "H", "magf": 0.88, "county": "Tulsa", "typetext": "HAIL", "state": "OK", "remark": "Report from mPING.", "city": "1 E Collinsville", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:55:00Z", "lon": -95.81, "lat": 36.37, "qualifier": "E", "product_id": "202404262156-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": "0.88"}, "geometry": {"type": "Point", "coordinates": [-95.81, 36.37]}}, {"id": "190", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Howard", "typetext": "TORNADO", "state": "NE", "remark": "Several reports of confirmed tornado west and north of Elba. Time and location approximate pending damage survey.", "city": "2 NNW Elba", "source": "NWS Employee", "unit": null, "valid": "2024-04-26T18:14:00Z", "lon": -98.58, "lat": 41.31, "qualifier": null, "product_id": "202404261829-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.58, 41.31]}}, {"id": "191", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Greene", "typetext": "FLOOD", "state": "MO", "remark": "State Highway CC is closed west of Fair Grove due to flooding.", "city": "3 W Fair Grove", "source": "Dept of Highways", "unit": null, "valid": "2024-04-27T01:04:00Z", "lon": -93.21, "lat": 37.39, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.21, 37.39]}}, {"id": "192", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.08, "county": "Mason", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station HAVI2 0.7 W Havana.", "city": "1 SW Havana", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T10:45:00Z", "lon": -90.07, "lat": 40.29, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.08"}, "geometry": {"type": "Point", "coordinates": [-90.07, 40.29]}}, {"id": "193", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 1.0, "county": "Johnson", "typetext": "HAIL", "state": "TX", "remark": "Quarter hail reported.", "city": "3 SE Burleson", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T17:03:00Z", "lon": -97.29, "lat": 32.5, "qualifier": "M", "product_id": "202404261716-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-97.29, 32.5]}}, {"id": "194", "type": "Feature", "properties": {"wfo": "FGZ", "type": "D", "magf": null, "county": "Yavapai", "typetext": "TSTM WND DMG", "state": "AZ", "remark": "Large tree limbs and branches broken in Black Canyon City. Time estimated from radar.", "city": "1 NNW Black Canyon City", "source": "Trained Spotter", "unit": null, "valid": "2024-04-27T01:00:00Z", "lon": -112.14, "lat": 34.08, "qualifier": null, "product_id": "202404271919-KFGZ-NWUS55-LSRFGZ", "st": "AZ", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-112.14, 34.08]}}, {"id": "195", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": "Very large multi vortex tornado. At least 1/3 mile wide.", "city": "2 ENE Minden", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:47:00Z", "lon": -95.5, "lat": 41.48, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.5, 41.48]}}, {"id": "196", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Sarpy", "typetext": "HAIL", "state": "NE", "remark": null, "city": "2 SSW Papillion", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T21:40:00Z", "lon": -96.06, "lat": 41.13, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.06, 41.13]}}, {"id": "197", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Dent", "typetext": "FLOOD", "state": "MO", "remark": "State Highway TT is closed due to flooding at Crooked Creek.", "city": "Sligo", "source": "Dept of Highways", "unit": null, "valid": "2024-04-27T01:03:00Z", "lon": -91.37, "lat": 37.78, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-91.37, 37.78]}}, {"id": "198", "type": "Feature", "properties": {"wfo": "BIS", "type": "R", "magf": 1.7, "county": "Pierce", "typetext": "RAIN", "state": "ND", "remark": "Still raining. Relayed via broadcast media.", "city": "3 NNW Rugby", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-27T02:21:00Z", "lon": -100.03, "lat": 48.41, "qualifier": "M", "product_id": "202404270413-KBIS-NWUS53-LSRBIS", "st": "ND", "magnitude": "1.7"}, "geometry": {"type": "Point", "coordinates": [-100.03, 48.41]}}, {"id": "199", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Platte", "typetext": "TORNADO", "state": "NE", "remark": "An EF1 tornado touched down northwest of 370th St and 175th Ave. It tracked north-northeast, flipping a center-pivot irrigation system, snapping trees, blowing windows out of a house, and causing significant damage to a barn roof. The tornado continued north causing additional minor damage before ending just southwest of 160th Ave and 445th St.", "city": "7 S Creston", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T21:07:00Z", "lon": -97.36, "lat": 41.6, "qualifier": null, "product_id": "202405041718-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.36, 41.6]}}, {"id": "200", "type": "Feature", "properties": {"wfo": "BOU", "type": "H", "magf": 1.0, "county": "Douglas", "typetext": "HAIL", "state": "CO", "remark": null, "city": "1 WNW Highlands Ranch", "source": "Public", "unit": "Inch", "valid": "2024-04-27T01:03:00Z", "lon": -104.98, "lat": 39.56, "qualifier": "E", "product_id": "202404271859-KBOU-NWUS55-LSRBOU", "st": "CO", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-104.98, 39.56]}}, {"id": "201", "type": "Feature", "properties": {"wfo": "ICT", "type": "H", "magf": 1.0, "county": "Wilson", "typetext": "HAIL", "state": "KS", "remark": null, "city": "1 W New Albany", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T21:00:00Z", "lon": -95.95, "lat": 37.57, "qualifier": "M", "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.95, 37.57]}}, {"id": "202", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.41, "county": "York", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station YORK008 3 W Benedict.", "city": "3 WNW Benedict", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.67, "lat": 41.02, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.41"}, "geometry": {"type": "Point", "coordinates": [-97.67, 41.02]}}, {"id": "203", "type": "Feature", "properties": {"wfo": "DVN", "type": "R", "magf": 1.1, "county": "Van Buren", "typetext": "RAIN", "state": "IA", "remark": null, "city": "Birmingham", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T20:56:00Z", "lon": -91.95, "lat": 40.88, "qualifier": "M", "product_id": "202404262057-KDVN-NWUS53-LSRDVN", "st": "IA", "magnitude": "1.1"}, "geometry": {"type": "Point", "coordinates": [-91.95, 40.88]}}, {"id": "204", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Lancaster", "typetext": "HAIL", "state": "NE", "remark": "Report from mPING: Golf Ball (1.75 in.).", "city": "5 NW Lincoln", "source": "Public", "unit": "Inch", "valid": "2024-04-26T19:48:00Z", "lon": -96.74, "lat": 40.87, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-96.74, 40.87]}}, {"id": "205", "type": "Feature", "properties": {"wfo": "EAX", "type": "T", "magf": null, "county": "Bates", "typetext": "TORNADO", "state": "MO", "remark": "Damage to a structure near Appleton City Lake. Time estimated from radar.", "city": "7 SW Montrose", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T23:53:00Z", "lon": -94.06, "lat": 38.18, "qualifier": null, "product_id": "202404270141-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.06, 38.18]}}, {"id": "206", "type": "Feature", "properties": {"wfo": "EAX", "type": "T", "magf": null, "county": "Worth", "typetext": "TORNADO", "state": "MO", "remark": "Tornado developed near Highway E west of U.S. Highway 169, causing minor damage to a residence. Tornado tracked northeastward into Iowa. Time estimated from radar.", "city": "5 N Grant City", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T00:23:00Z", "lon": -94.43, "lat": 40.56, "qualifier": null, "product_id": "202404270226-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.43, 40.56]}}, {"id": "207", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.25, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HALL002 Grand Island 2.3 W.", "city": "1 WSW Grand Island", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.39, "lat": 40.92, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.25"}, "geometry": {"type": "Point", "coordinates": [-98.39, 40.92]}}, {"id": "208", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Polk", "typetext": "TORNADO", "state": "IA", "remark": "Power flashes reported near Pleasant Hill. TDS also noted on radar.", "city": "Pleasant Hill", "source": "Trained Spotter", "unit": null, "valid": "2024-04-27T01:59:00Z", "lon": -93.51, "lat": 41.59, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.51, 41.59]}}, {"id": "209", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Lancaster", "typetext": "HAIL", "state": "NE", "remark": "ground covered with hail.", "city": "1 SE Denton", "source": "Amateur Radio", "unit": "Inch", "valid": "2024-04-26T19:27:00Z", "lon": -96.84, "lat": 40.73, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.84, 40.73]}}, {"id": "210", "type": "Feature", "properties": {"wfo": "GJT", "type": "G", "magf": 46.0, "county": "Montrose", "typetext": "TSTM WND GST", "state": "CO", "remark": "Corrects previous non-tstm wnd gst report from 2 NW Montrose. ASOS station KMTJ Montrose Rgnl Airport.", "city": "2 NW Montrose", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T21:09:00Z", "lon": -107.9, "lat": 38.5, "qualifier": "M", "product_id": "202404262353-KGJT-NWUS55-LSRGJT", "st": "CO", "magnitude": "46"}, "geometry": {"type": "Point", "coordinates": [-107.9, 38.5]}}, {"id": "211", "type": "Feature", "properties": {"wfo": "LSX", "type": "R", "magf": 2.2, "county": "Madison", "typetext": "RAIN", "state": "IL", "remark": "Total since midnight last night, or a 21-hour total.", "city": "5 SSE Troy", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-27T02:33:00Z", "lon": -89.88, "lat": 38.66, "qualifier": "M", "product_id": "202404270334-KLSX-NWUS53-LSRLSX", "st": "IL", "magnitude": "2.2"}, "geometry": {"type": "Point", "coordinates": [-89.88, 38.66]}}, {"id": "212", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "2 NNW Bennington", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T20:59:00Z", "lon": -96.17, "lat": 41.39, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.17, 41.39]}}, {"id": "213", "type": "Feature", "properties": {"wfo": "FWD", "type": "F", "magf": null, "county": "Kaufman", "typetext": "FLASH FLOOD", "state": "TX", "remark": "8 inches of water into 4 homes in Kaufman.", "city": "Kaufman", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:20:00Z", "lon": -96.31, "lat": 32.59, "qualifier": null, "product_id": "202404262226-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.31, 32.59]}}, {"id": "214", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.75, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "2 SSE Dwtn Rapid City", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -103.21, "lat": 44.05, "qualifier": "M", "product_id": "202404261351-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-103.21, 44.05]}}, {"id": "215", "type": "Feature", "properties": {"wfo": "ICT", "type": "R", "magf": 0.8, "county": "Labette", "typetext": "RAIN", "state": "KS", "remark": "Cocorahs station KS-LB-9 Chetopa 2.4 WNW.", "city": "2 WNW Chetopa", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -95.13, "lat": 37.05, "qualifier": "M", "product_id": "202404271240-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "0.8"}, "geometry": {"type": "Point", "coordinates": [-95.13, 37.05]}}, {"id": "216", "type": "Feature", "properties": {"wfo": "GRR", "type": "N", "magf": 46.0, "county": "LMZ844", "typetext": "NON-TSTM WND GST", "state": "MI", "remark": "Mesonet station XSTJ St. Joseph Pier.", "city": "17 W Keeler", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-27T00:09:00Z", "lon": -86.49, "lat": 42.12, "qualifier": "M", "product_id": "202404272059-KGRR-NWUS53-LSRGRR", "st": "MI", "magnitude": "46"}, "geometry": {"type": "Point", "coordinates": [-86.49, 42.12]}}, {"id": "217", "type": "Feature", "properties": {"wfo": "ICT", "type": "H", "magf": 1.0, "county": "Greenwood", "typetext": "HAIL", "state": "KS", "remark": null, "city": "2 NW Severy", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T20:01:00Z", "lon": -96.25, "lat": 37.64, "qualifier": "M", "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.25, 37.64]}}, {"id": "218", "type": "Feature", "properties": {"wfo": "VEF", "type": "N", "magf": 64.0, "county": "San Bernardino", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": null, "city": "4 SSE Yermo", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-26T15:05:00Z", "lon": -116.79, "lat": 34.85, "qualifier": "M", "product_id": "202404270607-KVEF-NWUS55-LSRVEF", "st": "CA", "magnitude": "64"}, "geometry": {"type": "Point", "coordinates": [-116.79, 34.85]}}, {"id": "219", "type": "Feature", "properties": {"wfo": "LSX", "type": "R", "magf": 1.99, "county": "Madison", "typetext": "RAIN", "state": "IL", "remark": "Since midnight last night.", "city": "1 ESE Troy", "source": "Public", "unit": "Inch", "valid": "2024-04-27T03:47:00Z", "lon": -89.88, "lat": 38.73, "qualifier": "E", "product_id": "202404270347-KLSX-NWUS53-LSRLSX", "st": "IL", "magnitude": "1.99"}, "geometry": {"type": "Point", "coordinates": [-89.88, 38.73]}}, {"id": "220", "type": "Feature", "properties": {"wfo": "SHV", "type": "H", "magf": 1.0, "county": "Titus", "typetext": "HAIL", "state": "TX", "remark": null, "city": "1 SSE Mount Pleasant", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-27T01:30:00Z", "lon": -94.97, "lat": 33.15, "qualifier": "M", "product_id": "202404270229-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-94.97, 33.15]}}, {"id": "221", "type": "Feature", "properties": {"wfo": "OAX", "type": "C", "magf": null, "county": "Butler", "typetext": "FUNNEL CLOUD", "state": "NE", "remark": "Two seminars flipped over Hwy 15.", "city": "3 WSW Brainard", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T20:01:00Z", "lon": -97.06, "lat": 41.16, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.06, 41.16]}}, {"id": "222", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 2.06, "county": "Deuel", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station DEUE018 Lodgepole 4.0 ENE.", "city": "8 NW Chappell", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -102.57, "lat": 41.18, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "2.06"}, "geometry": {"type": "Point", "coordinates": [-102.57, 41.18]}}, {"id": "223", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Washington", "typetext": "TORNADO", "state": "NE", "remark": "Homes damaged.", "city": "2 SE Kennard", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T21:05:00Z", "lon": -96.18, "lat": 41.46, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.18, 41.46]}}, {"id": "224", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.75, "county": "Marshall", "typetext": "RAIN", "state": "IL", "remark": "AWOS station KC75 Lacon Arpt.", "city": "Marshall County Airport", "source": "AWOS", "unit": "Inch", "valid": "2024-04-27T11:15:00Z", "lon": -89.39, "lat": 41.02, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-89.39, 41.02]}}, {"id": "225", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.83, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station SSEI2 0.7 SE Champaign.", "city": "1 SE Champaign", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -88.25, "lat": 40.11, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.83"}, "geometry": {"type": "Point", "coordinates": [-88.25, 40.11]}}, {"id": "226", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.08, "county": "Sully", "typetext": "RAIN", "state": "SD", "remark": "Cocorahs station SD-SL-23 Agar 15 WNW. 48-hour total.", "city": "1 NNW Sutton Bay Rec Ar", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -100.37, "lat": 44.9, "qualifier": "M", "product_id": "202404271154-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.08"}, "geometry": {"type": "Point", "coordinates": [-100.37, 44.9]}}, {"id": "227", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Webster", "typetext": "FLOOD", "state": "MO", "remark": "Flooding at Tower road and highway CC north of Niangua.", "city": "2 NNW Niangua", "source": "Amateur Radio", "unit": null, "valid": "2024-04-26T21:23:00Z", "lon": -92.84, "lat": 37.41, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.84, 37.41]}}, {"id": "228", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Harrison", "typetext": "TORNADO", "state": "IA", "remark": "Tornado near Modale looks like it roped out.", "city": "Modale", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T21:35:00Z", "lon": -96.01, "lat": 41.62, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.01, 41.62]}}, {"id": "229", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": "Train derailment Hwy 6. Additional train derailment Hwy 6 and I-480. Semi-rolled over.", "city": "4 SW Waverly", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T19:57:00Z", "lon": -96.59, "lat": 40.89, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.59, 40.89]}}, {"id": "230", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Washington", "typetext": "TORNADO", "state": "NE", "remark": "Destroyed homes.", "city": "4 E Kennard", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T21:08:00Z", "lon": -96.13, "lat": 41.47, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.13, 41.47]}}, {"id": "231", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "McLennan", "typetext": "TORNADO", "state": "TX", "remark": "A second tornado from the same supercell occurred west of Waco damaging neighborhoods on either side of Wortham Bend Road near China Spring Rd. Damage in these neighborhoods consisted of damaged trees, downed fences, broken windows, and mostly minor roof damage. One home lost most of the front part of its roof, and a few homes were impaled with flying fence panels. This tornado was rated an EF-1 with maximum estimated winds of 95 mph.", "city": "6 S Gholson", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T17:26:00Z", "lon": -97.25, "lat": 31.63, "qualifier": null, "product_id": "202404281643-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.25, 31.63]}}, {"id": "232", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.1, "county": "Codington", "typetext": "RAIN", "state": "SD", "remark": "Cocorahs station SD-CD-40 Watertown 6.6 SSW. 48-hour total.", "city": "4 N Thomas", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -97.2, "lat": 44.82, "qualifier": "M", "product_id": "202404271244-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.1"}, "geometry": {"type": "Point", "coordinates": [-97.2, 44.82]}}, {"id": "233", "type": "Feature", "properties": {"wfo": "OAX", "type": "D", "magf": null, "county": "Stanton", "typetext": "TSTM WND DMG", "state": "NE", "remark": "delayed report Roof taken off athletic training center.", "city": "4 SE Norfolk", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:20:00Z", "lon": -97.36, "lat": 42.0, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.36, 42.0]}}, {"id": "234", "type": "Feature", "properties": {"wfo": "GID", "type": "H", "magf": 0.7, "county": "Buffalo", "typetext": "HAIL", "state": "NE", "remark": null, "city": "2 E Ravenna", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T19:40:00Z", "lon": -98.88, "lat": 41.03, "qualifier": "E", "product_id": "202404261945-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "0.7"}, "geometry": {"type": "Point", "coordinates": [-98.88, 41.03]}}, {"id": "235", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "Multi vortex tornado.", "city": "3 W Harlan", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T23:05:00Z", "lon": -95.38, "lat": 41.65, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.38, 41.65]}}, {"id": "236", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "4 E Omaha", "source": "NWS Employee", "unit": null, "valid": "2024-04-26T21:56:00Z", "lon": -95.93, "lat": 41.27, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.93, 41.27]}}, {"id": "237", "type": "Feature", "properties": {"wfo": "GID", "type": "H", "magf": 1.25, "county": "Sherman", "typetext": "HAIL", "state": "NE", "remark": "Started to cover the ground with quarter to half-dollar size hail.", "city": "2 N Ravenna", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T17:25:00Z", "lon": -98.91, "lat": 41.06, "qualifier": "E", "product_id": "202404261726-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-98.91, 41.06]}}, {"id": "238", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 1.31, "county": "Todd", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "4 NW Parmelee", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -101.09, "lat": 43.36, "qualifier": "M", "product_id": "202404261310-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "1.31"}, "geometry": {"type": "Point", "coordinates": [-101.09, 43.36]}}, {"id": "239", "type": "Feature", "properties": {"wfo": "MQT", "type": "N", "magf": 39.0, "county": "LSZ263", "typetext": "NON-TSTM WND GST", "state": "MI", "remark": "C-MAN station ROAM4, 2 W Rock of Ages.", "city": "Rock of Ages Lighthouse", "source": "C-MAN Station", "unit": "MPH", "valid": "2024-04-27T01:00:00Z", "lon": -89.31, "lat": 47.87, "qualifier": "M", "product_id": "202404271818-KMQT-NWUS53-LSRMQT", "st": "MI", "magnitude": "39"}, "geometry": {"type": "Point", "coordinates": [-89.31, 47.87]}}, {"id": "240", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "A second round of storms moved across Shelby and Crawford counties. An EF1 tornado developed just a few blocks outside of Defiance, near the track that the first tornado took only one hour prior. This tornado moved quickly northeast, impacting several farms, damaging outbuildings and trees along its 12.3 mile long track. The tornado reached a maximum width of approximately 200 yards along highway 141, and crossed the other tornado track that had come north from Manilla in a previous storm. The tornado damage path ended near 340th Street and QQ Avenue.", "city": "1 NNE Defiance", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T23:51:00Z", "lon": -95.33, "lat": 41.83, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.33, 41.83]}}, {"id": "241", "type": "Feature", "properties": {"wfo": "FWD", "type": "G", "magf": 75.0, "county": "Kaufman", "typetext": "TSTM WND GST", "state": "TX", "remark": "Gust measured by home weather station. Damage to trees on property. Chicken coop blown away. Time estimated from radar.", "city": "4 NNW Kemp", "source": "Public", "unit": "MPH", "valid": "2024-04-26T21:20:00Z", "lon": -96.25, "lat": 32.49, "qualifier": "M", "product_id": "202404270244-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "75"}, "geometry": {"type": "Point", "coordinates": [-96.25, 32.49]}}, {"id": "242", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Dent", "typetext": "FLOOD", "state": "MO", "remark": "State Highway EE is closed due to flooding at the Meramec River.", "city": "3 WNW Stone Hill", "source": "Dept of Highways", "unit": null, "valid": "2024-04-27T02:44:00Z", "lon": -91.4, "lat": 37.61, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-91.4, 37.61]}}, {"id": "243", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.6, "county": "Bennett", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "5 NW Swett", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T14:00:00Z", "lon": -102.03, "lat": 43.22, "qualifier": "M", "product_id": "202404261443-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.6"}, "geometry": {"type": "Point", "coordinates": [-102.03, 43.22]}}, {"id": "244", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.13, "county": "Grant", "typetext": "RAIN", "state": "SD", "remark": "Cocorahs station SD-GT-10 Milbank 2.3 WSW. 48-hour total.", "city": "2 WSW Milbank", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -96.68, "lat": 45.21, "qualifier": "M", "product_id": "202404271242-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.13"}, "geometry": {"type": "Point", "coordinates": [-96.68, 45.21]}}, {"id": "245", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.85, "county": "Polk", "typetext": "RAIN", "state": "NE", "remark": "Report via Facebook.", "city": "3 N Osceola", "source": "Public", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.54, "lat": 41.22, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.85"}, "geometry": {"type": "Point", "coordinates": [-97.54, 41.22]}}, {"id": "246", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.56, "county": "Hamilton", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HAMI011 Giltner 1.1 NW.", "city": "1 NW Giltner", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:30:00Z", "lon": -98.17, "lat": 40.78, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.56"}, "geometry": {"type": "Point", "coordinates": [-98.17, 40.78]}}, {"id": "247", "type": "Feature", "properties": {"wfo": "TSA", "type": "H", "magf": 1.0, "county": "Tulsa", "typetext": "HAIL", "state": "OK", "remark": "Report from mPING: Quarter (1.00 in.).", "city": "4 SW Vera", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:32:00Z", "lon": -95.93, "lat": 36.41, "qualifier": "M", "product_id": "202404262137-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.93, 36.41]}}, {"id": "248", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Boone", "typetext": "TORNADO", "state": "NE", "remark": "A EF-2 tornado started in Greeley County and crossed into Boone County south of Primrose along Highway 56. It travelled north-northeast over 27.5 miles, doing its most extensive damage 2 miles southwest of Primrose. Strongest winds were estimated to be 130 mph, and at its widest it was estimated to be 500 yards wide. It likely dissipated in open country as it approached the Beaver Creek southwest of Petersburg.", "city": "6 SSW Primrose", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T19:04:00Z", "lon": -98.29, "lat": 41.54, "qualifier": null, "product_id": "202405041718-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.29, 41.54]}}, {"id": "249", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.67, "county": "Mellette", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "9 N Cedar Butte", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T12:00:00Z", "lon": -101.03, "lat": 43.71, "qualifier": "M", "product_id": "202404261256-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.67"}, "geometry": {"type": "Point", "coordinates": [-101.03, 43.71]}}, {"id": "250", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.53, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "12 S Quinn", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T14:00:00Z", "lon": -102.13, "lat": 43.82, "qualifier": "M", "product_id": "202404261443-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.53"}, "geometry": {"type": "Point", "coordinates": [-102.13, 43.82]}}, {"id": "251", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Boone", "typetext": "HAIL", "state": "NE", "remark": "Report from mPING: Golf Ball (1.75 in.).", "city": "6 W Cedar Rapids", "source": "Public", "unit": "Inch", "valid": "2024-04-26T19:15:00Z", "lon": -98.26, "lat": 41.54, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-98.26, 41.54]}}, {"id": "252", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 4.77, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station 3277D 1 WSW Wood River.", "city": "2 WSW Wood River", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T12:40:00Z", "lon": -98.63, "lat": 40.81, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "4.77"}, "geometry": {"type": "Point", "coordinates": [-98.63, 40.81]}}, {"id": "253", "type": "Feature", "properties": {"wfo": "DVN", "type": "R", "magf": 2.5, "county": "Hancock", "typetext": "RAIN", "state": "IL", "remark": null, "city": "La Harpe", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T20:23:00Z", "lon": -90.98, "lat": 40.58, "qualifier": "M", "product_id": "202404262024-KDVN-NWUS53-LSRDVN", "st": "IL", "magnitude": "2.5"}, "geometry": {"type": "Point", "coordinates": [-90.98, 40.58]}}, {"id": "254", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "McLennan", "typetext": "TORNADO", "state": "TX", "remark": "A brief EF-0 tornado occurred along Wisdom Ct west of Waco. Fences were damaged and large tree limbs were broken. Maximum estimated winds were 80 mph.", "city": "6 SSW Gholson", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T17:23:00Z", "lon": -97.26, "lat": 31.63, "qualifier": null, "product_id": "202404281643-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.26, 31.63]}}, {"id": "255", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.57, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station DNON1 3.7 E Doniphan.", "city": "4 ESE Doniphan", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T12:30:00Z", "lon": -98.31, "lat": 40.76, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.57"}, "geometry": {"type": "Point", "coordinates": [-98.31, 40.76]}}, {"id": "256", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Jasper", "typetext": "TORNADO", "state": "IA", "remark": "Reports of damage in Monroe. Time estimated from radar.", "city": "Monroe", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T02:41:00Z", "lon": -93.1, "lat": 41.52, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.1, 41.52]}}, {"id": "257", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.52, "county": "Holt", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station AR970 Inman.", "city": "5 SSW Page", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T14:45:00Z", "lon": -98.46, "lat": 42.34, "qualifier": "M", "product_id": "202404261505-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.52"}, "geometry": {"type": "Point", "coordinates": [-98.46, 42.34]}}, {"id": "258", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Richardson", "typetext": "TORNADO", "state": "NE", "remark": "DELAYED REPORT. Emergency Manager relayed report of a tornado near Rulo over NAWAS.", "city": "1 SSW Rulo", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:45:00Z", "lon": -95.44, "lat": 40.03, "qualifier": null, "product_id": "202404271735-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.44, 40.03]}}, {"id": "259", "type": "Feature", "properties": {"wfo": "GID", "type": "H", "magf": 0.7, "county": "Buffalo", "typetext": "HAIL", "state": "NE", "remark": null, "city": "Ravenna", "source": "Public", "unit": "Inch", "valid": "2024-04-26T16:59:00Z", "lon": -98.91, "lat": 41.03, "qualifier": "E", "product_id": "202404261706-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "0.7"}, "geometry": {"type": "Point", "coordinates": [-98.91, 41.03]}}, {"id": "260", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Lonoke", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Trees reported down in the Magness Creek area of Cabot. Numerous power outages reported as well.", "city": "Cabot", "source": "Public", "unit": null, "valid": "2024-04-27T00:45:00Z", "lon": -92.02, "lat": 34.97, "qualifier": null, "product_id": "202404270300-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.02, 34.97]}}, {"id": "261", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "The EF3 tornado developed about one quarter mile west of the West Q Road and 255th St intersection in Western Douglas county where trees were knocked down and a farmstead sustained outbuilding damage. The tornado continued northeast crossing agricultural fields and flipping numerous center pivots, eventually crossing 252nd Street. The tornado caused EF-2 damage as it approached Highway 92, damaging numerous homes and striking an acreage northwest of the Highway 92(West Center street) and Highway 275 Intersection where EF-2 damage was indicated. Several center pivots along Highway 275 were overturned as the tornado continued northeast crossing east of Highway 275 damaging several acreages, homes, and outbuildings along Highway 275/240th Street where EF-2 damage was sustained. Continuing its northeast path, the tornado crossed 234th Street near Harney Street where it damaged a horse farm and an acreage as well as a home along Dodge Street/Highway 6 before crossing Dodge Street causing roof and outbuilding damage at the Junkstock Farm. The tornado crossed the Elkhorn River, damaging trees and flipping center pivots in acreage along Blondo Street just south of the railroad tracks. The tornado continued into the western part of Elkhorn approximately one-half mile south southwest of the intersection of West Maple Road and 216th Street. Several homes sustained high- end EF-2 damage with homes losing large sections of their roofs and one home being shifted off its foundation. The tornado moved across Prospect Hills Cemetery damaging headstones, moving across West Maple Avenue severely damaging a landscape business before moving into the Ramblewood subdivision. Numerous homes in the subdivision were left with only small interior rooms standing sustaining EF-3 damage. The tornado continued northward across damaging homes between 212th Street and Kestrel Parkway, again leaving only interior rooms standing, with EF-3 damage sustained. The tornado crossed Fort Street about one-third of a mile east of 216th Street, causing the collapse of new development homes, with EF-3 damage being sustained. It veered to the northeast across mainly rural areas of Douglas County, between Fort Street and Military Road, becoming about one- mile wide as it crossed Highway 31, snapping power poles and large trees, producing EF-1 damage. The tornado narrowed to about one-half mile wide and moved into residential development just northwest of the intersection of 180th Street and Military Road, where EF-1 damage due to loss of roofs, was sustained. The tornado moved into Bennington\u00e2\u0080\u0099s Newport Landing neighborhood, removing large sections of several homes roofs and collapsing outside walls, sustaining EF-2 damage. The tornado moved across Newport Landing Lake, crossing near the intersection of Highway 36 and 168th Street, snapping the tops off of numerous trees. It then moved across agricultural land, damaging farm outbuildings southeast of the intersection of 168th Street and Dutch Hall Road, before crossing into Washington County. The tornado damaged homes and farm outbuildings east of County Road 29 and west of County Road 31 from Dutch Hall Road to County Road 36, ranging in width from one-third to one-half mile wide. The most significant damage was sustained to a home, machine shop and horse barn, one-third of a mile southeast of the intersection of County Road 40 and County Road 29, with high-end EF-3 damage occurring. Trees were snapped and debarked, the house was moved from its foundation, flat-bed and horse-trailers rolled or lofted, and the machine shop and horse barns destroyed. At least one horse was killed, and several others were injured. The tornado crossed the intersection of County Road 36 and County Road 31, producing EF-0 to EF-1 damage in the form of partial roof and siding loss to farm buildings and manufactured homes, plus snapping large tree limbs. As it approached State Highway 133, several homes and farm outbuildings sustained EF-2 damage due to the loss of roofs or exterior walls. Crossing Highway 133, the tornado was just less than one-half mile wide, and moved into residential areas generally between County Road 32 and US Highway 75. The most significant damage occurred near the intersections of County Road P30 and County Road 33 with nearly the complete destruction of several homes, with high-end EF-3 damage being sustained. The tornado crossed US75 about 2 miles southeast of Blair moving across the very southern portion of the Cargill plant. The tornado weakened and narrowed, but snapped power poles and derailed several empty rail container cars from the tracks, producing EF-1 damage. The tornado then moved across the Missouri River crossing into Iowa, crossing Highway 30 and Union Pacific Rail line about one- mile east of the Iowa-Nebraska state line. Several trees were snapped and broken, producing EF-0 damage. The tornado then moved across bottom-land/agricultural areas, snapping or uprooting several trees and tipping center pivots, producing EF-0 to EF-1 damage. The tornado dissipated approximately 2 miles southwest of Modale, Iowa at 4:29 pm CT.", "city": "5 SE Yutan", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T20:30:00Z", "lon": -96.32, "lat": 41.19, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.32, 41.19]}}, {"id": "262", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Wright", "typetext": "FLOOD", "state": "MO", "remark": "State Highway E is closed due to flooding along the Gasconade River.", "city": "5 SSW Manes", "source": "Dept of Highways", "unit": null, "valid": "2024-04-27T00:48:00Z", "lon": -92.4, "lat": 37.31, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.4, 37.31]}}, {"id": "263", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Titus", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Numerous trees and powerlines downed in and around the Mount Pleasant area. Three vehicles were impacted by falling trees with rescues ongoing attm. Worst damage was reported in the Dellwood Park area and south of the Central Fire Station.", "city": "Mount Pleasant", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T22:26:00Z", "lon": -94.98, "lat": 33.16, "qualifier": null, "product_id": "202404262337-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.98, 33.16]}}, {"id": "264", "type": "Feature", "properties": {"wfo": "BIS", "type": "R", "magf": 0.7, "county": "Ward", "typetext": "RAIN", "state": "ND", "remark": "Rain total for yesterday (04/26/24). Relayed via social media.", "city": "1 S Minot", "source": "Public", "unit": "Inch", "valid": "2024-04-27T09:50:00Z", "lon": -101.3, "lat": 48.22, "qualifier": "M", "product_id": "202404271112-KBIS-NWUS53-LSRBIS", "st": "ND", "magnitude": "0.7"}, "geometry": {"type": "Point", "coordinates": [-101.3, 48.22]}}, {"id": "265", "type": "Feature", "properties": {"wfo": "SLC", "type": "S", "magf": 3.0, "county": "Salt Lake", "typetext": "SNOW", "state": "UT", "remark": "Via_WFO_SLC.", "city": "Alta - Collins", "source": "Public", "unit": "Inch", "valid": "2024-04-26T22:16:00Z", "lon": -111.64, "lat": 40.58, "qualifier": "m", "product_id": "202404270237-KSLC-NWUS55-LSRSLC", "st": "UT", "magnitude": "3"}, "geometry": {"type": "Point", "coordinates": [-111.64, 40.58]}}, {"id": "266", "type": "Feature", "properties": {"wfo": "DMX", "type": "C", "magf": null, "county": "Polk", "typetext": "FUNNEL CLOUD", "state": "IA", "remark": "Location estimated from radar based on time of report.", "city": "3 NNW Bondurant", "source": "Trained Spotter", "unit": null, "valid": "2024-04-27T04:18:00Z", "lon": -93.49, "lat": 41.73, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.49, 41.73]}}, {"id": "267", "type": "Feature", "properties": {"wfo": "SHV", "type": "F", "magf": null, "county": "Titus", "typetext": "FLASH FLOOD", "state": "TX", "remark": "Many roads impassable due to very high water.", "city": "1 SSE Mount Pleasant", "source": "Broadcast Media", "unit": null, "valid": "2024-04-27T01:30:00Z", "lon": -94.97, "lat": 33.15, "qualifier": null, "product_id": "202404270226-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.97, 33.15]}}, {"id": "268", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Madison", "typetext": "TORNADO", "state": "IA", "remark": "Tornado near Word of Life Church.", "city": "5 W East Peru", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T00:58:00Z", "lon": -94.02, "lat": 41.24, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.02, 41.24]}}, {"id": "269", "type": "Feature", "properties": {"wfo": "OAX", "type": "G", "magf": 58.0, "county": "Richardson", "typetext": "TSTM WND GST", "state": "NE", "remark": null, "city": "1 NNE Falls City", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T22:18:00Z", "lon": -95.59, "lat": 40.08, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "58"}, "geometry": {"type": "Point", "coordinates": [-95.59, 40.08]}}, {"id": "270", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "2 SE Underwood", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:33:00Z", "lon": -95.65, "lat": 41.37, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.65, 41.37]}}, {"id": "271", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Harrison", "typetext": "TORNADO", "state": "IA", "remark": "Based on eyewitness observation of two simultaneous tornadoes passing east and west of a farmstead, with 5NNW Magnolia being the western tornado observed. Little damage was noted and rated an EF0 and was on the ground for approximately 2.6 miles.", "city": "3 SE Pisgah", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T21:59:00Z", "lon": -95.89, "lat": 41.8, "qualifier": null, "product_id": "202405081652-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.89, 41.8]}}, {"id": "272", "type": "Feature", "properties": {"wfo": "TFX", "type": "S", "magf": 2.0, "county": "Beaverhead", "typetext": "SNOW", "state": "MT", "remark": "SNOTEL - Beagle Springs (Elev 8852 ft).", "city": "22 SW Dell", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T03:30:00Z", "lon": -112.98, "lat": 44.47, "qualifier": "E", "product_id": "202404270559-KTFX-NWUS55-LSRTFX", "st": "MT", "magnitude": "2"}, "geometry": {"type": "Point", "coordinates": [-112.98, 44.47]}}, {"id": "273", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.12, "county": "Dawson", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station NE-DN-3 Lexington 6.0 SW.", "city": "3 NNE Johnson Lake", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.83, "lat": 40.72, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.12"}, "geometry": {"type": "Point", "coordinates": [-99.83, 40.72]}}, {"id": "274", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Crawford", "typetext": "TORNADO", "state": "IA", "remark": "Storm chaser shared a picture of a tornado just west of Manilla.", "city": "2 W Manilla", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T23:58:00Z", "lon": -95.27, "lat": 41.89, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.27, 41.89]}}, {"id": "275", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "6 WSW Treynor", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:14:00Z", "lon": -95.7, "lat": 41.19, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.7, 41.19]}}, {"id": "276", "type": "Feature", "properties": {"wfo": "ICT", "type": "T", "magf": null, "county": "Wilson", "typetext": "TORNADO", "state": "KS", "remark": "Video confirmation of a tornado.", "city": "3 S New Albany", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T20:43:00Z", "lon": -95.94, "lat": 37.53, "qualifier": null, "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.94, 37.53]}}, {"id": "277", "type": "Feature", "properties": {"wfo": "SGX", "type": "N", "magf": 43.0, "county": "Riverside", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "ASOS station KPSP Palm Springs Airport - Northwest winds.", "city": "Palm Springs", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T19:22:00Z", "lon": -116.5, "lat": 33.82, "qualifier": "M", "product_id": "202404262003-KSGX-NWUS56-LSRSGX", "st": "CA", "magnitude": "43"}, "geometry": {"type": "Point", "coordinates": [-116.5, 33.82]}}, {"id": "278", "type": "Feature", "properties": {"wfo": "SHV", "type": "H", "magf": 1.0, "county": "Bowie", "typetext": "HAIL", "state": "TX", "remark": "One inch hail was reported in the Malta community.", "city": "6 ESE De Kalb", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-27T02:33:00Z", "lon": -94.52, "lat": 33.49, "qualifier": "E", "product_id": "202404270254-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-94.52, 33.49]}}, {"id": "279", "type": "Feature", "properties": {"wfo": "TFX", "type": "S", "magf": 2.0, "county": "Gallatin", "typetext": "SNOW", "state": "MT", "remark": "SNOTEL - Carrot Basin (Elev 9000 ft).", "city": "19 NNE Raynolds Pass", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T03:30:00Z", "lon": -111.29, "lat": 44.96, "qualifier": "E", "product_id": "202404270559-KTFX-NWUS55-LSRTFX", "st": "MT", "magnitude": "2"}, "geometry": {"type": "Point", "coordinates": [-111.29, 44.96]}}, {"id": "280", "type": "Feature", "properties": {"wfo": "FSD", "type": "H", "magf": 1.0, "county": "O'Brien", "typetext": "HAIL", "state": "IA", "remark": "Quarter sized hail and heavy rain.", "city": "5 SSW Paullina", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T17:55:00Z", "lon": -95.73, "lat": 42.91, "qualifier": "E", "product_id": "202404261811-KFSD-NWUS53-LSRFSD", "st": "IA", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.73, 42.91]}}, {"id": "281", "type": "Feature", "properties": {"wfo": "LZK", "type": "G", "magf": 55.0, "county": "Pulaski", "typetext": "TSTM WND GST", "state": "AR", "remark": "Power out at Highway 107 and Kiehl Avenue.", "city": "Sherwood", "source": "Emergency Mngr", "unit": "MPH", "valid": "2024-04-27T00:28:00Z", "lon": -92.21, "lat": 34.84, "qualifier": "M", "product_id": "202404270047-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": "55"}, "geometry": {"type": "Point", "coordinates": [-92.21, 34.84]}}, {"id": "282", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.7, "county": "Sherman", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station SHEM003 Rockville 2.2 NW.", "city": "2 NW Rockville", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.86, "lat": 41.14, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.7"}, "geometry": {"type": "Point", "coordinates": [-98.86, 41.14]}}, {"id": "283", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.8, "county": "Macon", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-MA-34 Illiopolis 4.4 NNE.", "city": "4 NNE Illiopolis", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -89.22, "lat": 39.91, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.8"}, "geometry": {"type": "Point", "coordinates": [-89.22, 39.91]}}, {"id": "284", "type": "Feature", "properties": {"wfo": "GLD", "type": "R", "magf": 2.1, "county": "Norton", "typetext": "RAIN", "state": "KS", "remark": "Public report of 2.1 inches of rain in Norton as a 24 hour total.", "city": "Norton", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:41:00Z", "lon": -99.89, "lat": 39.84, "qualifier": "M", "product_id": "202404261341-KGLD-NWUS53-LSRGLD", "st": "KS", "magnitude": "2.1"}, "geometry": {"type": "Point", "coordinates": [-99.89, 39.84]}}, {"id": "285", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.01, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-CP-109 Savoy 0.6 SSE.", "city": "1 SSE Savoy", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.25, "lat": 40.06, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.01"}, "geometry": {"type": "Point", "coordinates": [-88.25, 40.06]}}, {"id": "286", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "1 S Crescent", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:07:00Z", "lon": -95.86, "lat": 41.36, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.86, 41.36]}}, {"id": "287", "type": "Feature", "properties": {"wfo": "GJT", "type": "G", "magf": 47.0, "county": "Garfield", "typetext": "TSTM WND GST", "state": "CO", "remark": "Corrects previous non-tstm wnd gst report from 2 E Rifle. ASOS station KRIL Garfield County Rgnl AP.", "city": "2 E Rifle", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T21:27:00Z", "lon": -107.73, "lat": 39.53, "qualifier": "M", "product_id": "202404262352-KGJT-NWUS55-LSRGJT", "st": "CO", "magnitude": "47"}, "geometry": {"type": "Point", "coordinates": [-107.73, 39.53]}}, {"id": "288", "type": "Feature", "properties": {"wfo": "DVN", "type": "R", "magf": 2.1, "county": "Hancock", "typetext": "RAIN", "state": "IL", "remark": null, "city": "Carthage", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T20:22:00Z", "lon": -91.14, "lat": 40.41, "qualifier": "M", "product_id": "202404262024-KDVN-NWUS53-LSRDVN", "st": "IL", "magnitude": "2.1"}, "geometry": {"type": "Point", "coordinates": [-91.14, 40.41]}}, {"id": "289", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "2 WNW Waverly", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T19:59:00Z", "lon": -96.57, "lat": 40.93, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.57, 40.93]}}, {"id": "290", "type": "Feature", "properties": {"wfo": "BOU", "type": "H", "magf": 1.0, "county": "Douglas", "typetext": "HAIL", "state": "CO", "remark": ".", "city": "3 SSE Chatfield Reservo", "source": "Public", "unit": "Inch", "valid": "2024-04-27T00:44:00Z", "lon": -105.04, "lat": 39.52, "qualifier": "E", "product_id": "202404271859-KBOU-NWUS55-LSRBOU", "st": "CO", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-105.04, 39.52]}}, {"id": "291", "type": "Feature", "properties": {"wfo": "FWD", "type": "F", "magf": null, "county": "Van Zandt", "typetext": "FLASH FLOOD", "state": "TX", "remark": "Report of water covering Highway 80 in Grand Saline. Flooding also occurring at some businesses in downtown Grand Saline.", "city": "Grand Saline", "source": "Amateur Radio", "unit": null, "valid": "2024-04-26T23:20:00Z", "lon": -95.71, "lat": 32.67, "qualifier": null, "product_id": "202404262339-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.71, 32.67]}}, {"id": "292", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 1.51, "county": "Jackson", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "11 SE Potato Creek", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -101.84, "lat": 43.42, "qualifier": "M", "product_id": "202404261443-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "1.51"}, "geometry": {"type": "Point", "coordinates": [-101.84, 43.42]}}, {"id": "293", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.66, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station 7872D Riverdale 1S.", "city": "2 S Riverdale", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T13:05:00Z", "lon": -99.16, "lat": 40.76, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.66"}, "geometry": {"type": "Point", "coordinates": [-99.16, 40.76]}}, {"id": "294", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.1, "county": "Marshall", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-MH-5 Henry 1.4 SW.", "city": "2 WSW Henry", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:45:00Z", "lon": -89.38, "lat": 41.1, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.1"}, "geometry": {"type": "Point", "coordinates": [-89.38, 41.1]}}, {"id": "295", "type": "Feature", "properties": {"wfo": "PUB", "type": "S", "magf": 1.8, "county": "Lake", "typetext": "SNOW", "state": "CO", "remark": "SWE: 0.12 inches.", "city": "2 NE Leadville", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-27T06:23:00Z", "lon": -106.27, "lat": 39.27, "qualifier": "M", "product_id": "202404272235-KPUB-NWUS55-LSRPUB", "st": "CO", "magnitude": "1.8"}, "geometry": {"type": "Point", "coordinates": [-106.27, 39.27]}}, {"id": "296", "type": "Feature", "properties": {"wfo": "LZK", "type": "H", "magf": 0.75, "county": "Hot Spring", "typetext": "HAIL", "state": "AR", "remark": null, "city": "Friendship", "source": "Public", "unit": "Inch", "valid": "2024-04-26T23:33:00Z", "lon": -93.0, "lat": 34.22, "qualifier": "M", "product_id": "202404270039-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-93.0, 34.22]}}, {"id": "297", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "5 ESE Yutan", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T20:36:00Z", "lon": -96.31, "lat": 41.22, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.31, 41.22]}}, {"id": "298", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 2.75, "county": "Saunders", "typetext": "HAIL", "state": "NE", "remark": "Corrects previous hail report from 3 ESE Ceresco. Corrects previous hail report from 3 ESE Ceresco for wrong date. Delayed report from 4/26.", "city": "3 ESE Ceresco", "source": "Public", "unit": "Inch", "valid": "2024-04-26T20:02:00Z", "lon": -96.59, "lat": 41.05, "qualifier": "E", "product_id": "202404280218-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "2.75"}, "geometry": {"type": "Point", "coordinates": [-96.59, 41.05]}}, {"id": "299", "type": "Feature", "properties": {"wfo": "OAX", "type": "C", "magf": null, "county": "Lancaster", "typetext": "FUNNEL CLOUD", "state": "NE", "remark": "Over downtown Lincoln.", "city": "1 WSW Lincoln", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T19:42:00Z", "lon": -96.71, "lat": 40.81, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.71, 40.81]}}, {"id": "300", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Douglas", "typetext": "FLOOD", "state": "MO", "remark": "State Highway FF is closed due to flooding at Hunter Creek.", "city": "2 E Ava", "source": "Dept of Highways", "unit": null, "valid": "2024-04-26T22:10:00Z", "lon": -92.62, "lat": 36.96, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.62, 36.96]}}, {"id": "301", "type": "Feature", "properties": {"wfo": "ILX", "type": "O", "magf": null, "county": "Mason", "typetext": "NON-TSTM WND DMG", "state": "IL", "remark": "Tree blown down in Sherwood Forest subdivision. Gusty winds on back edge of decaying showers.", "city": "2 E Havana", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T19:50:00Z", "lon": -90.02, "lat": 40.3, "qualifier": null, "product_id": "202404262225-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-90.02, 40.3]}}, {"id": "302", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "2 E Westphalia", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T23:17:00Z", "lon": -95.35, "lat": 41.72, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.35, 41.72]}}, {"id": "303", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "7 SE Council Bluffs", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T22:09:00Z", "lon": -95.75, "lat": 41.17, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.75, 41.17]}}, {"id": "304", "type": "Feature", "properties": {"wfo": "FSD", "type": "H", "magf": 1.0, "county": "Lake", "typetext": "HAIL", "state": "SD", "remark": "Mostly pea to dime sized hail, but a few as big as a quarter. No damage to anything, since crops are not up yet.", "city": "5 SW Ramona", "source": "Public", "unit": "Inch", "valid": "2024-04-26T20:31:00Z", "lon": -97.29, "lat": 44.07, "qualifier": "E", "product_id": "202404262116-KFSD-NWUS53-LSRFSD", "st": "SD", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-97.29, 44.07]}}, {"id": "305", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.96, "county": "Schuyler", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station BEAI2 Illinois River.", "city": "1 NNW Beardstown", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T10:45:00Z", "lon": -90.44, "lat": 40.02, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.96"}, "geometry": {"type": "Point", "coordinates": [-90.44, 40.02]}}, {"id": "306", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Butler", "typetext": "HAIL", "state": "NE", "remark": "Butler County Emergency Manager reported golf ball sized hail in downtown Ulysses.", "city": "Ulysses", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T19:35:00Z", "lon": -97.2, "lat": 41.08, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-97.2, 41.08]}}, {"id": "307", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.2, "county": "Cass", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-CS-3 3 SE Bluff Springs.", "city": "3 SSE Bluff Springs", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:30:00Z", "lon": -90.33, "lat": 39.95, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.2"}, "geometry": {"type": "Point", "coordinates": [-90.33, 39.95]}}, {"id": "308", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.53, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "4 WNW Rapid City Arpt", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -103.14, "lat": 44.06, "qualifier": "M", "product_id": "202404262138-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.53"}, "geometry": {"type": "Point", "coordinates": [-103.14, 44.06]}}, {"id": "309", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.9, "county": "Sangamon", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station BUFI2 Buffalo.", "city": "1 NW Buffalo", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -89.42, "lat": 39.86, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.9"}, "geometry": {"type": "Point", "coordinates": [-89.42, 39.86]}}, {"id": "310", "type": "Feature", "properties": {"wfo": "ABQ", "type": "N", "magf": 61.0, "county": "McKinley", "typetext": "NON-TSTM WND GST", "state": "NM", "remark": "ASOS station KGUP Gallup Airport.", "city": "1 WSW Allison", "source": "ASOS", "unit": "MPH", "valid": "2024-04-27T01:53:00Z", "lon": -108.8, "lat": 35.52, "qualifier": "M", "product_id": "202404270228-KABQ-NWUS55-LSRABQ", "st": "NM", "magnitude": "61"}, "geometry": {"type": "Point", "coordinates": [-108.8, 35.52]}}, {"id": "311", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Saline", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Large tree and numerous powerlines are down on Highway 35 South. A tree was also on fire.", "city": "Benton", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T00:00:00Z", "lon": -92.58, "lat": 34.57, "qualifier": null, "product_id": "202404270049-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.58, 34.57]}}, {"id": "312", "type": "Feature", "properties": {"wfo": "FSD", "type": "H", "magf": 1.0, "county": "Woodbury", "typetext": "HAIL", "state": "IA", "remark": "Report via social media.", "city": "Anthon", "source": "Public", "unit": "Inch", "valid": "2024-04-26T17:06:00Z", "lon": -95.87, "lat": 42.39, "qualifier": "M", "product_id": "202404271326-KFSD-NWUS53-LSRFSD", "st": "IA", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.87, 42.39]}}, {"id": "313", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Boone", "typetext": "TORNADO", "state": "NE", "remark": "Small rope tornado.", "city": "2 WNW Saint Edward", "source": "Broadcast Media", "unit": null, "valid": "2024-04-26T20:06:00Z", "lon": -97.89, "lat": 41.58, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.89, 41.58]}}, {"id": "314", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Camp", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Extensive trees and powerlines downed across the entire county.", "city": "Pittsburg", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T22:25:00Z", "lon": -94.96, "lat": 33.0, "qualifier": null, "product_id": "202404262348-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.96, 33.0]}}, {"id": "315", "type": "Feature", "properties": {"wfo": "TSA", "type": "G", "magf": 65.0, "county": "Pittsburg", "typetext": "TSTM WND GST", "state": "OK", "remark": null, "city": "4 N Dow", "source": "Trained Spotter", "unit": "MPH", "valid": "2024-04-26T12:51:00Z", "lon": -95.59, "lat": 34.94, "qualifier": "M", "product_id": "202404261307-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": "65"}, "geometry": {"type": "Point", "coordinates": [-95.59, 34.94]}}, {"id": "316", "type": "Feature", "properties": {"wfo": "EAX", "type": "T", "magf": null, "county": "Bates", "typetext": "TORNADO", "state": "MO", "remark": "Fire department reported a tornado east of Rich Hill. Time and location estimated from radar.", "city": "8 ENE Rich Hill", "source": "Fire Dept/Rescue", "unit": null, "valid": "2024-04-26T23:36:00Z", "lon": -94.22, "lat": 38.12, "qualifier": null, "product_id": "202404270111-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.22, 38.12]}}, {"id": "317", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "Hill", "typetext": "TORNADO", "state": "TX", "remark": "The same supercell produced another brief, EF-1 tornado, based on eye witness accounts, on either side of FM 339 southwest of Penelope. The tornado formed in the field just east of the road, hitting a residence and dissipating soon afterwards. Two houses were damaged: One had metal panels peeled off the roof, and the home shifted off its cinder blocks about 8 inches. Winds got in the garage of the uninhabited second house and lifted the roof off, then it collapsed back on the house and the walls buckled. The tornado lifted just east of property; could see a few small tree limbs broken to the east. Maximum estimated winds were 105 mph.", "city": "3 SW Penelope", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T18:06:00Z", "lon": -96.97, "lat": 31.83, "qualifier": null, "product_id": "202404281643-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.97, 31.83]}}, {"id": "318", "type": "Feature", "properties": {"wfo": "DVN", "type": "R", "magf": 1.75, "county": "McDonough", "typetext": "RAIN", "state": "IL", "remark": "Total rainfall between 7 am to 4 pm today.", "city": "2 NNW Macomb", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T21:14:00Z", "lon": -90.69, "lat": 40.5, "qualifier": "M", "product_id": "202404262119-KDVN-NWUS53-LSRDVN", "st": "IL", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-90.69, 40.5]}}, {"id": "319", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Camden", "typetext": "FLOOD", "state": "MO", "remark": "State Highway H is closed near Stoutland due to flooding.", "city": "1 NW Stoutland", "source": "Dept of Highways", "unit": null, "valid": "2024-04-27T01:06:00Z", "lon": -92.52, "lat": 37.82, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.52, 37.82]}}, {"id": "320", "type": "Feature", "properties": {"wfo": "ICT", "type": "R", "magf": 2.2, "county": "Wilson", "typetext": "RAIN", "state": "KS", "remark": "In the past 24 hours", "city": "1 SW Neodesha", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -95.69, "lat": 37.42, "qualifier": "M", "product_id": "202404261700-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "2.2"}, "geometry": {"type": "Point", "coordinates": [-95.69, 37.42]}}, {"id": "321", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.21, "county": "Knox", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station YATI2 Yates City.", "city": "Yates City", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T11:40:00Z", "lon": -90.02, "lat": 40.78, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.21"}, "geometry": {"type": "Point", "coordinates": [-90.02, 40.78]}}, {"id": "322", "type": "Feature", "properties": {"wfo": "BIS", "type": "R", "magf": 1.75, "county": "Bottineau", "typetext": "RAIN", "state": "ND", "remark": "broadcast media relayed. Still raining.", "city": "7 W Dunseith", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-27T02:30:00Z", "lon": -100.21, "lat": 48.81, "qualifier": "M", "product_id": "202404270331-KBIS-NWUS53-LSRBIS", "st": "ND", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-100.21, 48.81]}}, {"id": "323", "type": "Feature", "properties": {"wfo": "FSD", "type": "H", "magf": 0.25, "county": "Cherokee", "typetext": "HAIL", "state": "IA", "remark": "Quarter inch hail at Washta Fire Department, along with heavy rain.", "city": "Washta", "source": "Fire Dept/Rescue", "unit": "Inch", "valid": "2024-04-26T17:24:00Z", "lon": -95.72, "lat": 42.58, "qualifier": "E", "product_id": "202404261758-KFSD-NWUS53-LSRFSD", "st": "IA", "magnitude": "0.25"}, "geometry": {"type": "Point", "coordinates": [-95.72, 42.58]}}, {"id": "324", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 2.47, "county": "Frontier", "typetext": "RAIN", "state": "NE", "remark": "CO-OP Observer station EUSN1 Eustis 2NW.", "city": "2 NW Eustis", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -100.05, "lat": 40.69, "qualifier": "M", "product_id": "202404261503-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "2.47"}, "geometry": {"type": "Point", "coordinates": [-100.05, 40.69]}}, {"id": "325", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "McLennan", "typetext": "TORNADO", "state": "TX", "remark": "Tornado pictures and damage reports from the China Springs area. Time estimated.", "city": "5 S Gholson", "source": "Public", "unit": null, "valid": "2024-04-26T17:26:00Z", "lon": -97.25, "lat": 31.64, "qualifier": null, "product_id": "202404261805-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.25, 31.64]}}, {"id": "326", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.61, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station NE-BF-1 Kearney 1.9 NNE.", "city": "2 NNE Kearney", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -99.07, "lat": 40.73, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.61"}, "geometry": {"type": "Point", "coordinates": [-99.07, 40.73]}}, {"id": "327", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Pike", "typetext": "TSTM WND DMG", "state": "AR", "remark": "A few trees were blown down in this area.", "city": "5 NW Pike City", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:30:00Z", "lon": -93.63, "lat": 34.17, "qualifier": null, "product_id": "202404262301-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.63, 34.17]}}, {"id": "328", "type": "Feature", "properties": {"wfo": "LOX", "type": "A", "magf": 40.0, "county": "Santa Barbara", "typetext": "HIGH SUST WINDS", "state": "CA", "remark": "Mesonet station SRIC1 Santa Rosa Island RAWS.", "city": "34 S Refugio State Beac", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-26T18:13:00Z", "lon": -120.08, "lat": 33.98, "qualifier": "M", "product_id": "202404261847-KLOX-NWUS56-LSRLOX", "st": "CA", "magnitude": "40"}, "geometry": {"type": "Point", "coordinates": [-120.08, 33.98]}}, {"id": "329", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.91, "county": "Woodford", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station CNGI2 Mackinaw River at Congerville.", "city": "2 ESE Goodfield", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T10:45:00Z", "lon": -89.24, "lat": 40.62, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.91"}, "geometry": {"type": "Point", "coordinates": [-89.24, 40.62]}}, {"id": "330", "type": "Feature", "properties": {"wfo": "SGF", "type": "T", "magf": null, "county": "Bourbon", "typetext": "TORNADO", "state": "KS", "remark": "A weak EF-0 tornado occurred, with a path length of 3.12 miles and a width of 75 yards. Maximum wind speeds of 85 mph led to siding damage on a home, five outbuildings damaged or destroyed, and a number of trees either uprooted or having large limbs snapped.", "city": "3 NNE Uniontown", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T22:29:00Z", "lon": -94.96, "lat": 37.89, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "KS", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.96, 37.89]}}, {"id": "331", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.0, "county": "Moultrie", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-MU-8 Lovington 4.1 NNW.", "city": "4 WSW Hammond", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:56:00Z", "lon": -88.65, "lat": 39.77, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-88.65, 39.77]}}, {"id": "332", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Page", "typetext": "HAIL", "state": "IA", "remark": null, "city": "1 SE Clarinda", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T23:08:00Z", "lon": -95.02, "lat": 40.72, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.02, 40.72]}}, {"id": "333", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Howard", "typetext": "TORNADO", "state": "NE", "remark": "This tornado touched down at 1252 PM CDT 3 miles SSW of Farwell, and lifted at 1258 PM CDT just outside the south side of Farwell. The rating was EF0, with an estimated peak wind of 75 MPH due to damage to irrigation pivots and trees. Scouring of the ground was easily visible. The tornado had a path length of 2.69 miles with a width of 50 yards.", "city": "3 SSW Farwell", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T17:52:00Z", "lon": -98.65, "lat": 41.18, "qualifier": null, "product_id": "202405052048-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.65, 41.18]}}, {"id": "334", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.24, "county": "Stanley", "typetext": "RAIN", "state": "SD", "remark": "CO-OP Observer station AYES2 Hayes 6 E. 48-hour total.", "city": "7 E Hayes", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -100.89, "lat": 44.37, "qualifier": "M", "product_id": "202404271200-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.24"}, "geometry": {"type": "Point", "coordinates": [-100.89, 44.37]}}, {"id": "335", "type": "Feature", "properties": {"wfo": "APX", "type": "N", "magf": 40.0, "county": "LMZ346", "typetext": "NON-TSTM WND GST", "state": "MI", "remark": "Mesonet station XFLT Frankfort Light.", "city": "1 SW Frankfort", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-27T06:31:00Z", "lon": -86.25, "lat": 44.63, "qualifier": "M", "product_id": "202404271731-KAPX-NWUS53-LSRAPX", "st": "MI", "magnitude": "40"}, "geometry": {"type": "Point", "coordinates": [-86.25, 44.63]}}, {"id": "336", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.77, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "2 WNW Dwtn Rapid City", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -103.26, "lat": 44.1, "qualifier": "M", "product_id": "202404261351-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.77"}, "geometry": {"type": "Point", "coordinates": [-103.26, 44.1]}}, {"id": "337", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.33, "county": "Garden", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station GARD020 Lewellen 3ENE.", "city": "3 ENE Lewellen", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -102.08, "lat": 41.35, "qualifier": "M", "product_id": "202404261507-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.33"}, "geometry": {"type": "Point", "coordinates": [-102.08, 41.35]}}, {"id": "338", "type": "Feature", "properties": {"wfo": "BOU", "type": "R", "magf": 1.3, "county": "Logan", "typetext": "RAIN", "state": "CO", "remark": null, "city": "1 SSW Sterling", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T12:44:00Z", "lon": -103.22, "lat": 40.62, "qualifier": "M", "product_id": "202404261245-KBOU-NWUS55-LSRBOU", "st": "CO", "magnitude": "1.3"}, "geometry": {"type": "Point", "coordinates": [-103.22, 40.62]}}, {"id": "339", "type": "Feature", "properties": {"wfo": "TFX", "type": "S", "magf": 3.0, "county": "Madison", "typetext": "SNOW", "state": "MT", "remark": "SNOTEL - Albro Lake (Elev 8300 ft).", "city": "5 SW Pony", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T03:30:00Z", "lon": -111.96, "lat": 45.6, "qualifier": "E", "product_id": "202404270559-KTFX-NWUS55-LSRTFX", "st": "MT", "magnitude": "3"}, "geometry": {"type": "Point", "coordinates": [-111.96, 45.6]}}, {"id": "340", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.25, "county": "Custer", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station CUST039 Callaway.", "city": "Callaway", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.92, "lat": 41.29, "qualifier": "M", "product_id": "202404261508-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-99.92, 41.29]}}, {"id": "341", "type": "Feature", "properties": {"wfo": "ICT", "type": "R", "magf": 1.67, "county": "Labette", "typetext": "RAIN", "state": "KS", "remark": "24 hour value", "city": "1 NE Oswego", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -95.1, "lat": 37.18, "qualifier": "M", "product_id": "202404261700-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1.67"}, "geometry": {"type": "Point", "coordinates": [-95.1, 37.18]}}, {"id": "342", "type": "Feature", "properties": {"wfo": "SGF", "type": "D", "magf": null, "county": "Bourbon", "typetext": "TSTM WND DMG", "state": "KS", "remark": "Large trees down.", "city": "3 NE Hammond", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T23:01:00Z", "lon": -94.66, "lat": 37.96, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "KS", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.66, 37.96]}}, {"id": "343", "type": "Feature", "properties": {"wfo": "OAX", "type": "C", "magf": null, "county": "Richardson", "typetext": "FUNNEL CLOUD", "state": "NE", "remark": "Relay from NWS TOP.", "city": "8 E Du Bois", "source": "NWS Employee", "unit": null, "valid": "2024-04-26T21:32:00Z", "lon": -95.89, "lat": 40.02, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.89, 40.02]}}, {"id": "344", "type": "Feature", "properties": {"wfo": "SGF", "type": "F", "magf": null, "county": "Vernon", "typetext": "FLASH FLOOD", "state": "MO", "remark": "Report from mPING. Street/road flooding, Street, road closed, Vehicles stranded.", "city": "5 S Walker", "source": "Public", "unit": null, "valid": "2024-04-26T16:30:00Z", "lon": -94.24, "lat": 37.83, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.24, 37.83]}}, {"id": "345", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.35, "county": "Adams", "typetext": "RAIN", "state": "NE", "remark": "CO-OP Observer station HSTN1 Hastings 4 N.", "city": "3 SSW Hansen", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T12:20:00Z", "lon": -98.38, "lat": 40.65, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.35"}, "geometry": {"type": "Point", "coordinates": [-98.38, 40.65]}}, {"id": "346", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.92, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-CP-130 Mahomet 1.8 ENE.", "city": "Lake of the Woods", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.37, "lat": 40.2, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.92"}, "geometry": {"type": "Point", "coordinates": [-88.37, 40.2]}}, {"id": "347", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Butler", "typetext": "TORNADO", "state": "NE", "remark": "Trained spotter reported a tornado just southwest of Brainard, Nebraska. Tornado has since lifted but there are two additional funnel clouds currently.", "city": "3 WSW Brainard", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T20:07:00Z", "lon": -97.06, "lat": 41.17, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.06, 41.17]}}, {"id": "348", "type": "Feature", "properties": {"wfo": "GLD", "type": "J", "magf": 0.25, "county": "Norton", "typetext": "FOG", "state": "KS", "remark": "KNRN reports quarter mile visibility in fog.", "city": "1 N Norton", "source": "AWOS", "unit": "Mi", "valid": "2024-04-26T12:31:00Z", "lon": -99.89, "lat": 39.85, "qualifier": "M", "product_id": "202404261233-KGLD-NWUS53-LSRGLD", "st": "KS", "magnitude": "0.25"}, "geometry": {"type": "Point", "coordinates": [-99.89, 39.85]}}, {"id": "349", "type": "Feature", "properties": {"wfo": "EAX", "type": "H", "magf": 1.0, "county": "Atchison", "typetext": "HAIL", "state": "MO", "remark": "Social media report of quarter size hail. Time estimated from radar.", "city": "3 NNW Corning", "source": "Public", "unit": "Inch", "valid": "2024-04-26T22:30:00Z", "lon": -95.48, "lat": 40.29, "qualifier": "E", "product_id": "202404262346-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.48, 40.29]}}, {"id": "350", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 4.58, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": null, "city": "1 ESE Doniphan", "source": "NWS Employee", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -98.36, "lat": 40.77, "qualifier": "M", "product_id": "202404261338-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "4.58"}, "geometry": {"type": "Point", "coordinates": [-98.36, 40.77]}}, {"id": "351", "type": "Feature", "properties": {"wfo": "OAX", "type": "D", "magf": null, "county": "Lancaster", "typetext": "TSTM WND DMG", "state": "NE", "remark": "Numerous reports of damage near Waverly, including trains blown off tracks, semis overturned.", "city": "1 NE Waverly", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T19:55:00Z", "lon": -96.52, "lat": 40.92, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.52, 40.92]}}, {"id": "352", "type": "Feature", "properties": {"wfo": "DMX", "type": "H", "magf": 1.0, "county": "Taylor", "typetext": "HAIL", "state": "IA", "remark": "Delayed report.", "city": "5 N New Market", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T23:16:00Z", "lon": -94.91, "lat": 40.8, "qualifier": "E", "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-94.91, 40.8]}}, {"id": "353", "type": "Feature", "properties": {"wfo": "GLD", "type": "R", "magf": 1.41, "county": "Red Willow", "typetext": "RAIN", "state": "NE", "remark": "24 hour rainfall report of 1.41 inches.", "city": "4 S Bartley", "source": "Public", "unit": "Inch", "valid": "2024-04-26T12:20:00Z", "lon": -100.31, "lat": 40.19, "qualifier": "M", "product_id": "202404261225-KGLD-NWUS53-LSRGLD", "st": "NE", "magnitude": "1.41"}, "geometry": {"type": "Point", "coordinates": [-100.31, 40.19]}}, {"id": "354", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.67, "county": "Frontier", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station FRON4324 Farnam 4SW.", "city": "8 ESE Moorefield", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.26, "lat": 40.66, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.67"}, "geometry": {"type": "Point", "coordinates": [-100.26, 40.66]}}, {"id": "355", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": "EM relayed report from 911 call center of confirmed tornado to the west of Ashland, Nebraska.", "city": "4 NNW Greenwood", "source": "911 Call Center", "unit": null, "valid": "2024-04-26T20:15:00Z", "lon": -96.48, "lat": 41.01, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.48, 41.01]}}, {"id": "356", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.88, "county": "Menard", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station OKFI2 1.9 NW Oakford.", "city": "2 NW Oakford", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T10:45:00Z", "lon": -89.98, "lat": 40.12, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.88"}, "geometry": {"type": "Point", "coordinates": [-89.98, 40.12]}}, {"id": "357", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.6, "county": "York", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station YORK5448 Lushton 1.76 WNW.", "city": "2 NW Lushton", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.75, "lat": 40.74, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.6"}, "geometry": {"type": "Point", "coordinates": [-97.75, 40.74]}}, {"id": "358", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.63, "county": "Hughes", "typetext": "RAIN", "state": "SD", "remark": "Cocorahs station SD-HG-39 Pierre 1.8 NNW. 48-hour total.", "city": "2 N Pierre", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -100.34, "lat": 44.39, "qualifier": "M", "product_id": "202404271213-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.63"}, "geometry": {"type": "Point", "coordinates": [-100.34, 44.39]}}, {"id": "359", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Harrison", "typetext": "TORNADO", "state": "IA", "remark": "An EF-1 tornado touched down south of 174th Trl tracking north-northeast snapping power poles, trees, and doing damage to several agricultural out-buildings.", "city": "5 NNW Magnolia", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T21:52:00Z", "lon": -95.91, "lat": 41.75, "qualifier": null, "product_id": "202405041718-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.91, 41.75]}}, {"id": "360", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Union", "typetext": "TORNADO", "state": "IA", "remark": "Power poles with debris on US Highway 34 between Creston and Afton. Highway is closed.", "city": "4 WNW Afton", "source": "Dept of Highways", "unit": null, "valid": "2024-04-27T00:25:00Z", "lon": -94.27, "lat": 41.05, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.27, 41.05]}}, {"id": "361", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Madison", "typetext": "TORNADO", "state": "IA", "remark": "Tornadic debris signature noted on radar.", "city": "4 W Cumming", "source": "Mesonet", "unit": null, "valid": "2024-04-27T01:19:00Z", "lon": -93.84, "lat": 41.48, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.84, 41.48]}}, {"id": "362", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.5, "county": "Haakon", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "12 WNW Philip", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T14:00:00Z", "lon": -101.91, "lat": 44.08, "qualifier": "M", "product_id": "202404261535-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.5"}, "geometry": {"type": "Point", "coordinates": [-101.91, 44.08]}}, {"id": "363", "type": "Feature", "properties": {"wfo": "ABQ", "type": "S", "magf": 1.5, "county": "Catron", "typetext": "SNOW", "state": "NM", "remark": null, "city": "1 NW Red Hill", "source": "Public", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -108.89, "lat": 34.23, "qualifier": "M", "product_id": "202404272055-KABQ-NWUS55-LSRABQ", "st": "NM", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-108.89, 34.23]}}, {"id": "364", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.86, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HALL4175 Grand Island 5.35 N.", "city": "5 N Grand Island", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.36, "lat": 41.0, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.86"}, "geometry": {"type": "Point", "coordinates": [-98.36, 41.0]}}, {"id": "365", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "White", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Trees down on houses, powerlines blown over and billboards damaged in town.", "city": "Beebe", "source": "Law Enforcement", "unit": null, "valid": "2024-04-27T00:55:00Z", "lon": -91.89, "lat": 35.08, "qualifier": null, "product_id": "202404270109-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-91.89, 35.08]}}, {"id": "366", "type": "Feature", "properties": {"wfo": "SGF", "type": "F", "magf": null, "county": "Jasper", "typetext": "FLASH FLOOD", "state": "MO", "remark": "Road closed due to flooding Route O Northbound (JASPER County).", "city": "Alba", "source": "Dept of Highways", "unit": null, "valid": "2024-04-26T12:57:00Z", "lon": -94.42, "lat": 37.23, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.42, 37.23]}}, {"id": "367", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.14, "county": "Fulton", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station CANI2 Canton.", "city": "1 SSW Canton", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -90.04, "lat": 40.54, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.14"}, "geometry": {"type": "Point", "coordinates": [-90.04, 40.54]}}, {"id": "368", "type": "Feature", "properties": {"wfo": "FWD", "type": "F", "magf": null, "county": "Navarro", "typetext": "FLASH FLOOD", "state": "TX", "remark": "DELAYED REPORT multiple roadways closed due to flooding including Hwy 22 west and east of Frost, CR 180 west of Frost, CR 1250 near the Hill County border, and FM 3194 near Chambers Creek.", "city": "1 W Frost", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T21:00:00Z", "lon": -96.83, "lat": 32.08, "qualifier": null, "product_id": "202404292004-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.83, 32.08]}}, {"id": "369", "type": "Feature", "properties": {"wfo": "DVN", "type": "R", "magf": 1.06, "county": "Van Buren", "typetext": "RAIN", "state": "IA", "remark": null, "city": "Farmington", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T20:24:00Z", "lon": -91.74, "lat": 40.63, "qualifier": "M", "product_id": "202404262024-KDVN-NWUS53-LSRDVN", "st": "IA", "magnitude": "1.06"}, "geometry": {"type": "Point", "coordinates": [-91.74, 40.63]}}, {"id": "370", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "6 W Treynor", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T22:13:00Z", "lon": -95.73, "lat": 41.23, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.73, 41.23]}}, {"id": "371", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.96, "county": "Tazewell", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station FDCI2 1.0 E East Peoria.", "city": "3 ENE East Peoria", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T10:45:00Z", "lon": -89.53, "lat": 40.68, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.96"}, "geometry": {"type": "Point", "coordinates": [-89.53, 40.68]}}, {"id": "372", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Butler", "typetext": "TORNADO", "state": "NE", "remark": "Relayed from emergency management.", "city": "5 W Dwight", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T19:54:00Z", "lon": -97.11, "lat": 41.08, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.11, 41.08]}}, {"id": "373", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Woodruff", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Multiple large tree branches were blown across Highway 64.", "city": "Augusta", "source": "Public", "unit": null, "valid": "2024-04-27T01:38:00Z", "lon": -91.36, "lat": 35.29, "qualifier": null, "product_id": "202404270151-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-91.36, 35.29]}}, {"id": "374", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Douglas", "typetext": "HAIL", "state": "NE", "remark": null, "city": "1 WNW Ralston", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:40:00Z", "lon": -96.05, "lat": 41.21, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.05, 41.21]}}, {"id": "375", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.48, "county": "Phelps", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station GW3828 LOOMIS.", "city": "Loomis", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T12:39:00Z", "lon": -99.51, "lat": 40.48, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.48"}, "geometry": {"type": "Point", "coordinates": [-99.51, 40.48]}}, {"id": "376", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.78, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station BUFF036 Riverdale 0.2 WNW.", "city": "Riverdale", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.17, "lat": 40.79, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.78"}, "geometry": {"type": "Point", "coordinates": [-99.17, 40.79]}}, {"id": "377", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 1.75, "county": "Tarrant", "typetext": "HAIL", "state": "TX", "remark": "Golf ball hail reported at Little Rd and I20 in SE Fort Worth.", "city": "2 NE Kennedale", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T17:10:00Z", "lon": -97.31, "lat": 32.77, "qualifier": "M", "product_id": "202404261720-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-97.31, 32.77]}}, {"id": "378", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "5 ESE Yutan", "source": "Park/Forest Srvc", "unit": null, "valid": "2024-04-26T20:30:00Z", "lon": -96.31, "lat": 41.2, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.31, 41.2]}}, {"id": "379", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 2.49, "county": "Garden", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station GARD016 Chappell 10NNE.", "city": "10 NNE Chappell", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -102.42, "lat": 41.24, "qualifier": "M", "product_id": "202404261503-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "2.49"}, "geometry": {"type": "Point", "coordinates": [-102.42, 41.24]}}, {"id": "380", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "3 ENE Carter Lake", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:01:00Z", "lon": -95.87, "lat": 41.3, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.87, 41.3]}}, {"id": "381", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Platte", "typetext": "TORNADO", "state": "NE", "remark": "Tornado on the ground south on 18th ave.", "city": "1 SSE Creston", "source": "Public", "unit": null, "valid": "2024-04-26T21:16:00Z", "lon": -97.36, "lat": 41.7, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.36, 41.7]}}, {"id": "382", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.57, "county": "Custer", "typetext": "RAIN", "state": "NE", "remark": "ASOS station KBBW Broken Bow Airport.", "city": "2 NNW Broken Bow", "source": "ASOS", "unit": "Inch", "valid": "2024-04-26T14:53:00Z", "lon": -99.65, "lat": 41.43, "qualifier": "M", "product_id": "202404261505-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.57"}, "geometry": {"type": "Point", "coordinates": [-99.65, 41.43]}}, {"id": "383", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 2.75, "county": "Saunders", "typetext": "HAIL", "state": "NE", "remark": "Corrects previous hail report from 3 ESE Ceresco for wrong date. Delayed report from 4/26.", "city": "3 ESE Ceresco", "source": "Public", "unit": "Inch", "valid": "2024-04-26T20:02:00Z", "lon": -96.59, "lat": 41.05, "qualifier": "E", "product_id": "202404280215-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "2.75"}, "geometry": {"type": "Point", "coordinates": [-96.59, 41.05]}}, {"id": "384", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.89, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-CP-62 Champaign 2.5 S.", "city": "1 NW Savoy", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.27, "lat": 40.08, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.89"}, "geometry": {"type": "Point", "coordinates": [-88.27, 40.08]}}, {"id": "385", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Platte", "typetext": "TORNADO", "state": "NE", "remark": "Multiple vortex tornado.", "city": "2 SE Creston", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T21:23:00Z", "lon": -97.33, "lat": 41.69, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.33, 41.69]}}, {"id": "386", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.95, "county": "Frontier", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station FRON017 Cambridge 7N.", "city": "15 SE Stockville", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.17, "lat": 40.39, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.95"}, "geometry": {"type": "Point", "coordinates": [-100.17, 40.39]}}, {"id": "387", "type": "Feature", "properties": {"wfo": "LOT", "type": "N", "magf": 46.0, "county": "LMZ741", "typetext": "NON-TSTM WND GST", "state": "IL", "remark": "Mesonet station CHII2 Harrison-Dever Crib.", "city": "3 NE Navy Pier", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-26T22:28:00Z", "lon": -87.57, "lat": 41.92, "qualifier": "M", "product_id": "202404270112-KLOT-NWUS53-LSRLOT", "st": "IL", "magnitude": "46"}, "geometry": {"type": "Point", "coordinates": [-87.57, 41.92]}}, {"id": "388", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.89, "county": "Schuyler", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station RIPI2 0.6 NE Ripley.", "city": "7 SSW Rushville", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -90.63, "lat": 40.03, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.89"}, "geometry": {"type": "Point", "coordinates": [-90.63, 40.03]}}, {"id": "389", "type": "Feature", "properties": {"wfo": "ABQ", "type": "N", "magf": 66.0, "county": "Socorro", "typetext": "NON-TSTM WND GST", "state": "NM", "remark": "Mesonet station WSM34 Stallion WIT (WSMR).", "city": "21 SE Bosque del Apache", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-26T22:50:00Z", "lon": -106.6, "lat": 33.62, "qualifier": "M", "product_id": "202404270227-KABQ-NWUS55-LSRABQ", "st": "NM", "magnitude": "66"}, "geometry": {"type": "Point", "coordinates": [-106.6, 33.62]}}, {"id": "390", "type": "Feature", "properties": {"wfo": "SGF", "type": "H", "magf": 0.88, "county": "Bourbon", "typetext": "HAIL", "state": "KS", "remark": null, "city": "1 E Bronson", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T22:24:00Z", "lon": -95.06, "lat": 37.9, "qualifier": "E", "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "KS", "magnitude": "0.88"}, "geometry": {"type": "Point", "coordinates": [-95.06, 37.9]}}, {"id": "391", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "Major structural damage to at least 10 homes.", "city": "2 WSW Bennington", "source": "Amateur Radio", "unit": null, "valid": "2024-04-26T20:55:00Z", "lon": -96.2, "lat": 41.35, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.2, 41.35]}}, {"id": "392", "type": "Feature", "properties": {"wfo": "LOT", "type": "N", "magf": 44.0, "county": "La Salle", "typetext": "NON-TSTM WND GST", "state": "IL", "remark": "AWOS station KVYS Peru Airport.", "city": "2 NW Peru", "source": "AWOS", "unit": "MPH", "valid": "2024-04-26T20:15:00Z", "lon": -89.15, "lat": 41.35, "qualifier": "M", "product_id": "202404270112-KLOT-NWUS53-LSRLOT", "st": "IL", "magnitude": "44"}, "geometry": {"type": "Point", "coordinates": [-89.15, 41.35]}}, {"id": "393", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Douglas", "typetext": "HAIL", "state": "NE", "remark": null, "city": "1 WNW Valley", "source": "Official NWS Obs", "unit": "Inch", "valid": "2024-04-26T21:25:00Z", "lon": -96.37, "lat": 41.32, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.37, 41.32]}}, {"id": "394", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.76, "county": "Hayes", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HAYE003 Hayes Center.", "city": "Hayes Center", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -101.02, "lat": 40.51, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.76"}, "geometry": {"type": "Point", "coordinates": [-101.02, 40.51]}}, {"id": "395", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.9, "county": "Bennett", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "8 NW Vetal", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T12:00:00Z", "lon": -101.49, "lat": 43.29, "qualifier": "M", "product_id": "202404261351-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.9"}, "geometry": {"type": "Point", "coordinates": [-101.49, 43.29]}}, {"id": "396", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.29, "county": "Phelps", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station PHEL014 Loomis 0.2 SW.", "city": "Loomis", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.51, "lat": 40.48, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.29"}, "geometry": {"type": "Point", "coordinates": [-99.51, 40.48]}}, {"id": "397", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.99, "county": "Knox", "typetext": "RAIN", "state": "IL", "remark": "AWOS station KGBG Galesburg Arpt.", "city": "Galesburg Airport", "source": "AWOS", "unit": "Inch", "valid": "2024-04-27T11:15:00Z", "lon": -90.43, "lat": 40.93, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.99"}, "geometry": {"type": "Point", "coordinates": [-90.43, 40.93]}}, {"id": "398", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "Significant damage between Portsmith and Harlan. Destroyed home, cars flipped.", "city": "2 W Harlan", "source": "Public", "unit": null, "valid": "2024-04-26T23:05:00Z", "lon": -95.37, "lat": 41.65, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.37, 41.65]}}, {"id": "399", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 1.35, "county": "Bennett", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "2 WSW Swett", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -101.99, "lat": 43.16, "qualifier": "M", "product_id": "202404262138-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "1.35"}, "geometry": {"type": "Point", "coordinates": [-101.99, 43.16]}}, {"id": "400", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 4.2, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Report via Facebook.", "city": "Riverdale", "source": "Public", "unit": "Inch", "valid": "2024-04-26T14:28:00Z", "lon": -99.16, "lat": 40.78, "qualifier": "M", "product_id": "202404261430-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "4.2"}, "geometry": {"type": "Point", "coordinates": [-99.16, 40.78]}}, {"id": "401", "type": "Feature", "properties": {"wfo": "BIS", "type": "R", "magf": 1.6, "county": "Rolette", "typetext": "RAIN", "state": "ND", "remark": "Broadcast media relayed. Still raining.", "city": "Dunseith", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-26T21:15:00Z", "lon": -100.06, "lat": 48.81, "qualifier": "M", "product_id": "202404262218-KBIS-NWUS53-LSRBIS", "st": "ND", "magnitude": "1.6"}, "geometry": {"type": "Point", "coordinates": [-100.06, 48.81]}}, {"id": "402", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Sarpy", "typetext": "HAIL", "state": "NE", "remark": "Report from mPING: Golf Ball (1.75 in.).", "city": "3 NE Cedar Creek", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:42:00Z", "lon": -96.07, "lat": 41.09, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-96.07, 41.09]}}, {"id": "403", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.45, "county": "Garden", "typetext": "RAIN", "state": "NE", "remark": "CO-OP Observer station OKSN1 Oshkosh 10NE.", "city": "10 NE Oshkosh", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T13:30:00Z", "lon": -102.19, "lat": 41.49, "qualifier": "M", "product_id": "202404261507-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.45"}, "geometry": {"type": "Point", "coordinates": [-102.19, 41.49]}}, {"id": "404", "type": "Feature", "properties": {"wfo": "ICT", "type": "H", "magf": 0.7, "county": "Allen", "typetext": "HAIL", "state": "KS", "remark": null, "city": "1 SW Humboldt", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T21:37:00Z", "lon": -95.44, "lat": 37.81, "qualifier": "E", "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "0.7"}, "geometry": {"type": "Point", "coordinates": [-95.44, 37.81]}}, {"id": "405", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.3, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HALL007 Grand Island 6.7 NNE.", "city": "5 SSE Saint Libory", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.3, "lat": 41.02, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.3"}, "geometry": {"type": "Point", "coordinates": [-98.3, 41.02]}}, {"id": "406", "type": "Feature", "properties": {"wfo": "ICT", "type": "R", "magf": 1.89, "county": "Neosho", "typetext": "RAIN", "state": "KS", "remark": "In the previous 24 hours", "city": "1 NNE Galesburg", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T14:00:00Z", "lon": -95.35, "lat": 37.49, "qualifier": "M", "product_id": "202404261700-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1.89"}, "geometry": {"type": "Point", "coordinates": [-95.35, 37.49]}}, {"id": "407", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Wright", "typetext": "FLOOD", "state": "MO", "remark": "State Highway Z is closed due to flooding at Elk Creek.", "city": "2 SSW Competition", "source": "Dept of Highways", "unit": null, "valid": "2024-04-27T00:53:00Z", "lon": -92.45, "lat": 37.45, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.45, 37.45]}}, {"id": "408", "type": "Feature", "properties": {"wfo": "LZK", "type": "G", "magf": 53.0, "county": "Pulaski", "typetext": "TSTM WND GST", "state": "AR", "remark": "Corrects previous tstm wnd gst report from Crystal Hill. Two separate ARDOT weather stations on the Interstate 430 bridge recorded wind gusts of 53 mph.", "city": "Crystal Hill", "source": "Dept of Highways", "unit": "MPH", "valid": "2024-04-27T00:25:00Z", "lon": -92.32, "lat": 34.82, "qualifier": "M", "product_id": "202404270225-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": "53"}, "geometry": {"type": "Point", "coordinates": [-92.32, 34.82]}}, {"id": "409", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.06, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station AU085 Grand Island.", "city": "1 N Grand Island", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T12:31:00Z", "lon": -98.37, "lat": 40.93, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.06"}, "geometry": {"type": "Point", "coordinates": [-98.37, 40.93]}}, {"id": "410", "type": "Feature", "properties": {"wfo": "LOT", "type": "N", "magf": 46.0, "county": "Kane", "typetext": "NON-TSTM WND GST", "state": "IL", "remark": "ASOS station KARR 2 WNW Sugar Grove.", "city": "2 WNW Sugar Grove", "source": "AWOS", "unit": "MPH", "valid": "2024-04-26T21:06:00Z", "lon": -88.48, "lat": 41.77, "qualifier": "M", "product_id": "202404270112-KLOT-NWUS53-LSRLOT", "st": "IL", "magnitude": "46"}, "geometry": {"type": "Point", "coordinates": [-88.48, 41.77]}}, {"id": "411", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.95, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "4 W Dwtn Rapid City", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -103.3, "lat": 44.09, "qualifier": "M", "product_id": "202404261351-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.95"}, "geometry": {"type": "Point", "coordinates": [-103.3, 44.09]}}, {"id": "412", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.96, "county": "De Witt", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-DW-7 Clinton 0.4 WSW.", "city": "1 SW Clinton", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.97, "lat": 40.15, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.96"}, "geometry": {"type": "Point", "coordinates": [-88.97, 40.15]}}, {"id": "413", "type": "Feature", "properties": {"wfo": "GJT", "type": "N", "magf": 47.0, "county": "Garfield", "typetext": "NON-TSTM WND GST", "state": "CO", "remark": "ASOS station KRIL Garfield County Rgnl AP.", "city": "2 E Rifle", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T21:27:00Z", "lon": -107.73, "lat": 39.53, "qualifier": "M", "product_id": "202404262346-KGJT-NWUS55-LSRGJT", "st": "CO", "magnitude": "47"}, "geometry": {"type": "Point", "coordinates": [-107.73, 39.53]}}, {"id": "414", "type": "Feature", "properties": {"wfo": "SHV", "type": "F", "magf": null, "county": "Franklin", "typetext": "FLASH FLOOD", "state": "TX", "remark": "High water reported on several County Roads across the southern half of Franklin County.", "city": "2 NNE Winnsboro", "source": "Law Enforcement", "unit": null, "valid": "2024-04-27T00:37:00Z", "lon": -95.27, "lat": 32.98, "qualifier": null, "product_id": "202404270038-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.27, 32.98]}}, {"id": "415", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Polk", "typetext": "TORNADO", "state": "IA", "remark": "Structure damage to a home with possible injury.", "city": "4 NW Pleasant Hill", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T01:54:00Z", "lon": -93.56, "lat": 41.63, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.56, 41.63]}}, {"id": "416", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "Multiple homes destroyed.", "city": "2 WSW Bennington", "source": "Public", "unit": null, "valid": "2024-04-26T21:00:00Z", "lon": -96.18, "lat": 41.36, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.18, 41.36]}}, {"id": "417", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 2.89, "county": "Frontier", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station FRON011 Eustis 8SW.", "city": "8 SW Eustis", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.12, "lat": 40.57, "qualifier": "M", "product_id": "202404261503-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "2.89"}, "geometry": {"type": "Point", "coordinates": [-100.12, 40.57]}}, {"id": "418", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.95, "county": "Logan", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-LG-49 Lincoln 2.0 ENE.", "city": "1 NNE Logan County Airp", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:50:00Z", "lon": -89.33, "lat": 40.17, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.95"}, "geometry": {"type": "Point", "coordinates": [-89.33, 40.17]}}, {"id": "419", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Morris", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Numerous trees down in and around the Rocky Branch community. Traffic stuck on highways because of all the downed trees across roadways.", "city": "5 SSE Omaha", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T22:40:00Z", "lon": -94.7, "lat": 33.12, "qualifier": null, "product_id": "202404262341-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.7, 33.12]}}, {"id": "420", "type": "Feature", "properties": {"wfo": "ILX", "type": "O", "magf": null, "county": "Mason", "typetext": "NON-TSTM WND DMG", "state": "IL", "remark": "Tree down on road, several large tree limbs down, part of siding pulled away from house on Winfield Drive. Gusty winds on back edge of decaying showers.", "city": "Manito", "source": "Public", "unit": null, "valid": "2024-04-26T20:15:00Z", "lon": -89.78, "lat": 40.43, "qualifier": null, "product_id": "202404262225-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-89.78, 40.43]}}, {"id": "421", "type": "Feature", "properties": {"wfo": "DMX", "type": "C", "magf": null, "county": "Union", "typetext": "FUNNEL CLOUD", "state": "IA", "remark": null, "city": "1 W Kent", "source": "Public", "unit": null, "valid": "2024-04-27T00:40:00Z", "lon": -94.47, "lat": 40.95, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.47, 40.95]}}, {"id": "422", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 1.93, "county": "Dawson", "typetext": "RAIN", "state": "NE", "remark": "AWOS station KLXN Lexington Airport.", "city": "1 WNW Lexington", "source": "AWOS", "unit": "Inch", "valid": "2024-04-26T12:55:00Z", "lon": -99.77, "lat": 40.78, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "1.93"}, "geometry": {"type": "Point", "coordinates": [-99.77, 40.78]}}, {"id": "423", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.96, "county": "Schuyler", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-SY-6 Rushville 4.1 NE.", "city": "4 SSW Ray", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -90.5, "lat": 40.15, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.96"}, "geometry": {"type": "Point", "coordinates": [-90.5, 40.15]}}, {"id": "424", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Saunders", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "5 SE Yutan", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T20:25:00Z", "lon": -96.34, "lat": 41.19, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.34, 41.19]}}, {"id": "425", "type": "Feature", "properties": {"wfo": "ILX", "type": "O", "magf": null, "county": "Mason", "typetext": "NON-TSTM WND DMG", "state": "IL", "remark": "Power lines down. Gusty winds on back edge of decaying showers.", "city": "Forest City", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T20:10:00Z", "lon": -89.83, "lat": 40.37, "qualifier": null, "product_id": "202404262225-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-89.83, 40.37]}}, {"id": "426", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.29, "county": "Garfield", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station GARF009 Burwell 2SSW.", "city": "2 SSW Burwell", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.15, "lat": 41.75, "qualifier": "M", "product_id": "202404261508-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.29"}, "geometry": {"type": "Point", "coordinates": [-99.15, 41.75]}}, {"id": "427", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Boone", "typetext": "TORNADO", "state": "NE", "remark": "Tornado moving east.", "city": "4 W Newman Grove", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T20:50:00Z", "lon": -97.86, "lat": 41.75, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.86, 41.75]}}, {"id": "428", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 0.88, "county": "Van Zandt", "typetext": "HAIL", "state": "TX", "remark": null, "city": "4 SW Canton", "source": "Amateur Radio", "unit": "Inch", "valid": "2024-04-26T21:47:00Z", "lon": -95.91, "lat": 32.51, "qualifier": "M", "product_id": "202404262155-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "0.88"}, "geometry": {"type": "Point", "coordinates": [-95.91, 32.51]}}, {"id": "429", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Dallas", "typetext": "FLOOD", "state": "MO", "remark": "Water over the road and impassable at greasy creek and hayes road.", "city": "3 SSE Buffalo", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T16:05:00Z", "lon": -93.07, "lat": 37.61, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.07, 37.61]}}, {"id": "430", "type": "Feature", "properties": {"wfo": "SGX", "type": "N", "magf": 40.0, "county": "San Diego", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "AWOS station KL08 Borrego Valley Airport.", "city": "3 ENE Borrego Springs", "source": "AWOS", "unit": "MPH", "valid": "2024-04-26T15:55:00Z", "lon": -116.32, "lat": 33.27, "qualifier": "M", "product_id": "202404262004-KSGX-NWUS56-LSRSGX", "st": "CA", "magnitude": "40"}, "geometry": {"type": "Point", "coordinates": [-116.32, 33.27]}}, {"id": "431", "type": "Feature", "properties": {"wfo": "ARX", "type": "R", "magf": 1.17, "county": "Chickasaw", "typetext": "RAIN", "state": "IA", "remark": "CO-OP Observer station NHPI4 New Hampton.", "city": "New Hampton", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -92.31, "lat": 43.06, "qualifier": "M", "product_id": "202404271237-KARX-NWUS53-LSRARX", "st": "IA", "magnitude": "1.17"}, "geometry": {"type": "Point", "coordinates": [-92.31, 43.06]}}, {"id": "432", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Lonoke", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Hardwood fence blown over.", "city": "1 N Austin", "source": "Public", "unit": null, "valid": "2024-04-27T00:48:00Z", "lon": -91.98, "lat": 35.01, "qualifier": null, "product_id": "202404270203-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-91.98, 35.01]}}, {"id": "433", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.1, "county": "Knox", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station GBGI2 Galesburg.", "city": "1 W Galesburg", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -90.39, "lat": 40.95, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.1"}, "geometry": {"type": "Point", "coordinates": [-90.39, 40.95]}}, {"id": "434", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": "*** 3 INJ *** This EF3 tornado touched down on the northeast side of Lincoln near the intersection of Havelock Ave and 84th street causing damage to a business and a large transmission line south of Havelock Ave. The tornado moved northeast through agricultural fields, snapping power poles and large trees while increasing in strength. The tornado hit a manufacturing plant at 98th Street and Highway 6 where 70 employees were sheltered. The plant received EF-3 damage. There was a complete failure of the roof and 3 walls of the plant. Employee cars sustained varying damage, with the worst being thrown at least 75-100 yards. Tree trunks were snapped northeast of this location at a nearby business which sustained roof and siding damage. The tornado quickly crossed 98th Street and Highway 6 where a BNSF train locomotive took a direct hit, derailing numerous cars. The tornado continued northeast across open fields, crossing I-80 and eventually Salt Creek. There was substantial tree damage along the path and along Salt Creek as well as deposited roof debris from the manufacturing plant. As the tornado continued northeast, it crossed Waverly Road just west of 134th St. A farm near this location sustained damage where the house sustained window damage and two large wood-framed outbuildings were completely destroyed. The tornado continued northeast and weakened and eventually crossed Salt Creek near 141st St before lifting just northeast of that location. Preliminary reports indicate 3 injuries and no fatalities associated with this tornado.", "city": "5 ENE Lincoln", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T19:52:00Z", "lon": -96.61, "lat": 40.85, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.61, 40.85]}}, {"id": "435", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.56, "county": "Custer", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station CUST4283 Gothenburg 11N.", "city": "13 ENE Brady", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.13, "lat": 41.08, "qualifier": "M", "product_id": "202404261505-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.56"}, "geometry": {"type": "Point", "coordinates": [-100.13, 41.08]}}, {"id": "436", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.91, "county": "Tazewell", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-TZ-40 Morton 5.1 E.", "city": "2 WSW Deer Creek", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -89.37, "lat": 40.62, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.91"}, "geometry": {"type": "Point", "coordinates": [-89.37, 40.62]}}, {"id": "437", "type": "Feature", "properties": {"wfo": "SHV", "type": "G", "magf": 63.0, "county": "Titus", "typetext": "TSTM WND GST", "state": "TX", "remark": "Measured AWOS wind gust at the Mount Pleasant Airport.", "city": "5 S Mount Pleasant", "source": "AWOS", "unit": "MPH", "valid": "2024-04-26T22:30:00Z", "lon": -94.97, "lat": 33.1, "qualifier": "M", "product_id": "202404262332-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": "63"}, "geometry": {"type": "Point", "coordinates": [-94.97, 33.1]}}, {"id": "438", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Franklin", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Trees downed on two structures between Mount Vernon and Winnsboro.", "city": "5 NNE Winnsboro", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T22:05:00Z", "lon": -95.27, "lat": 33.02, "qualifier": null, "product_id": "202404270037-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.27, 33.02]}}, {"id": "439", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Pulaski", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Large tree limbs down in Gibson. Winds estimated to be 60 mph.", "city": "Gibson", "source": "NWS Employee", "unit": null, "valid": "2024-04-27T00:25:00Z", "lon": -92.23, "lat": 34.9, "qualifier": null, "product_id": "202404270051-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.23, 34.9]}}, {"id": "440", "type": "Feature", "properties": {"wfo": "VEF", "type": "N", "magf": 66.0, "county": "San Bernardino", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "The sensor at Twentynine Palms Airport began gusting over 58 mph at 1013 am and continued until 325 pm. A peak gust of 66 mph was reported at 1059 am.", "city": "12 NNW Twentynine Palms", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-26T17:59:00Z", "lon": -116.15, "lat": 34.29, "qualifier": "E", "product_id": "202404270607-KVEF-NWUS55-LSRVEF", "st": "CA", "magnitude": "66"}, "geometry": {"type": "Point", "coordinates": [-116.15, 34.29]}}, {"id": "441", "type": "Feature", "properties": {"wfo": "TSA", "type": "H", "magf": 1.5, "county": "Tulsa", "typetext": "HAIL", "state": "OK", "remark": "pic larger than quarter shown on air...time estimated from radar.", "city": "1 S Skiatook", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-26T21:28:00Z", "lon": -96.0, "lat": 36.36, "qualifier": "E", "product_id": "202404270024-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-96.0, 36.36]}}, {"id": "442", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.76, "county": "Morgan", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station JCKI2 Jacksonville.", "city": "South Jacksonville", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -90.23, "lat": 39.71, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.76"}, "geometry": {"type": "Point", "coordinates": [-90.23, 39.71]}}, {"id": "443", "type": "Feature", "properties": {"wfo": "GID", "type": "H", "magf": 1.0, "county": "Nance", "typetext": "HAIL", "state": "NE", "remark": "Report on Facebook of Quarter sized hail north of Genoa.", "city": "4 N Genoa", "source": "Public", "unit": "Inch", "valid": "2024-04-26T20:05:00Z", "lon": -97.73, "lat": 41.5, "qualifier": "E", "product_id": "202404262205-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-97.73, 41.5]}}, {"id": "444", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 1.0, "county": "Tarrant", "typetext": "HAIL", "state": "TX", "remark": "Report from mPING: Quarter (1.00 in.).", "city": "2 SE Kennedale", "source": "Public", "unit": "Inch", "valid": "2024-04-26T17:09:00Z", "lon": -97.21, "lat": 32.63, "qualifier": "E", "product_id": "202404261712-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-97.21, 32.63]}}, {"id": "445", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.17, "county": "Adams", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station NE-AD-6 Hastings 3.4 N.", "city": "3 N Hastings", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.4, "lat": 40.64, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.17"}, "geometry": {"type": "Point", "coordinates": [-98.4, 40.64]}}, {"id": "446", "type": "Feature", "properties": {"wfo": "EAX", "type": "H", "magf": 1.75, "county": "Worth", "typetext": "HAIL", "state": "MO", "remark": "Photo relayed of golf ball size hail in Worth County. Time and location estimated from radar.", "city": "4 ENE Sheridan", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-27T00:12:00Z", "lon": -94.54, "lat": 40.53, "qualifier": "E", "product_id": "202404270229-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-94.54, 40.53]}}, {"id": "447", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "McLennan", "typetext": "TORNADO", "state": "TX", "remark": "Another tornado developed north of Tours, just west of Berger Road. This tornado initially damaged trees and a shed, but strengthened as it crossed Czech Hall Road. The tornado hit a property on County Line Road causing EF-2 damage to a barn and a shop on the property. The tornado scattered heavy farm material into the field to the east. The tornado continued into Hill County crossing CR 3238 where an eye witness reported it dissipated before developing the next tornado. Maximum estimated winds were 110 to 115 mph.", "city": "3 SE West", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T17:48:00Z", "lon": -97.05, "lat": 31.78, "qualifier": null, "product_id": "202404281643-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.05, 31.78]}}, {"id": "448", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Clarke", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "4 S Osceola", "source": "Public", "unit": null, "valid": "2024-04-27T04:03:00Z", "lon": -93.8, "lat": 40.97, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.8, 40.97]}}, {"id": "449", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Union", "typetext": "TORNADO", "state": "IA", "remark": "Large tornado near Afton moving northeast. Debris field reported with damage.", "city": "2 W Afton", "source": "Law Enforcement", "unit": null, "valid": "2024-04-27T00:54:00Z", "lon": -94.23, "lat": 41.03, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.23, 41.03]}}, {"id": "450", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.94, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "1 NE Dwtn Rapid City", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T12:00:00Z", "lon": -103.21, "lat": 44.1, "qualifier": "M", "product_id": "202404261256-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.94"}, "geometry": {"type": "Point", "coordinates": [-103.21, 44.1]}}, {"id": "451", "type": "Feature", "properties": {"wfo": "SGF", "type": "T", "magf": null, "county": "Bourbon", "typetext": "TORNADO", "state": "KS", "remark": "Spotter indicated brief touchdown.", "city": "3 S Devon", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T22:45:00Z", "lon": -94.82, "lat": 37.88, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "KS", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.82, 37.88]}}, {"id": "452", "type": "Feature", "properties": {"wfo": "EAX", "type": "H", "magf": 1.0, "county": "Holt", "typetext": "HAIL", "state": "MO", "remark": "EM reported quarter-sized hail at Hwy 59 and Holt County line.", "city": "5 ENE Corning", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T22:38:00Z", "lon": -95.37, "lat": 40.26, "qualifier": "E", "product_id": "202404262258-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.37, 40.26]}}, {"id": "453", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.88, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "4 S Dwtn Rapid City", "source": "NWS Employee", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -103.24, "lat": 44.02, "qualifier": "M", "product_id": "202404261443-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.88"}, "geometry": {"type": "Point", "coordinates": [-103.24, 44.02]}}, {"id": "454", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "White", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Numerous large trees down in Searcy, powerlines also reported down along with fence damage.", "city": "Searcy", "source": "Public", "unit": null, "valid": "2024-04-27T01:10:00Z", "lon": -91.73, "lat": 35.25, "qualifier": null, "product_id": "202404270251-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-91.73, 35.25]}}, {"id": "455", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.55, "county": "Christian", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station PNAI2 Pana.", "city": "1 SSW Pana", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -89.09, "lat": 39.37, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.55"}, "geometry": {"type": "Point", "coordinates": [-89.09, 39.37]}}, {"id": "456", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.83, "county": "Sangamon", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station ROCI2 1.5 W Rochester.", "city": "2 WSW Rochester", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T10:45:00Z", "lon": -89.57, "lat": 39.74, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.83"}, "geometry": {"type": "Point", "coordinates": [-89.57, 39.74]}}, {"id": "457", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Monona", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "3 NNE Pisgah", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T22:05:00Z", "lon": -95.91, "lat": 41.87, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.91, 41.87]}}, {"id": "458", "type": "Feature", "properties": {"wfo": "TFX", "type": "S", "magf": 2.0, "county": "Beaverhead", "typetext": "SNOW", "state": "MT", "remark": "SNOTEL - Lemhi Ridge (Elev 8100 ft).", "city": "18 W Grant", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T03:30:00Z", "lon": -113.44, "lat": 44.99, "qualifier": "E", "product_id": "202404270559-KTFX-NWUS55-LSRTFX", "st": "MT", "magnitude": "2"}, "geometry": {"type": "Point", "coordinates": [-113.44, 44.99]}}, {"id": "459", "type": "Feature", "properties": {"wfo": "TSA", "type": "D", "magf": null, "county": "Pittsburg", "typetext": "TSTM WND DMG", "state": "OK", "remark": "Large trees and power lines down.", "city": "Mcalester", "source": "Public", "unit": null, "valid": "2024-04-26T12:45:00Z", "lon": -95.77, "lat": 34.94, "qualifier": null, "product_id": "202404261301-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.77, 34.94]}}, {"id": "460", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.21, "county": "York", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station 2594D Henderson 3ENE.", "city": "3 ENE Henderson", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T12:40:00Z", "lon": -97.75, "lat": 40.8, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.21"}, "geometry": {"type": "Point", "coordinates": [-97.75, 40.8]}}, {"id": "461", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.58, "county": "Hughes", "typetext": "RAIN", "state": "SD", "remark": "ASOS station KPIR Pierre Muni AP. 48-hour total.", "city": "1 E Pierre Regional Air", "source": "ASOS", "unit": "Inch", "valid": "2024-04-27T10:53:00Z", "lon": -100.28, "lat": 44.38, "qualifier": "M", "product_id": "202404271151-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.58"}, "geometry": {"type": "Point", "coordinates": [-100.28, 44.38]}}, {"id": "462", "type": "Feature", "properties": {"wfo": "SJT", "type": "H", "magf": 1.25, "county": "San Saba", "typetext": "HAIL", "state": "TX", "remark": "1.25 inch hail reported at Colorado Bend State Park.", "city": "8 ESE Chappel", "source": "Public", "unit": "Inch", "valid": "2024-04-26T15:10:00Z", "lon": -98.44, "lat": 31.02, "qualifier": "E", "product_id": "202404261521-KSJT-NWUS54-LSRSJT", "st": "TX", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-98.44, 31.02]}}, {"id": "463", "type": "Feature", "properties": {"wfo": "GLD", "type": "R", "magf": 2.25, "county": "Norton", "typetext": "RAIN", "state": "KS", "remark": "24 hour rainfall report of 2.25 inches.", "city": "Norton", "source": "Public", "unit": "Inch", "valid": "2024-04-26T12:30:00Z", "lon": -99.89, "lat": 39.84, "qualifier": "M", "product_id": "202404261231-KGLD-NWUS53-LSRGLD", "st": "KS", "magnitude": "2.25"}, "geometry": {"type": "Point", "coordinates": [-99.89, 39.84]}}, {"id": "464", "type": "Feature", "properties": {"wfo": "SHV", "type": "F", "magf": null, "county": "Titus", "typetext": "FLASH FLOOD", "state": "TX", "remark": "Some high water reported on city streets in and around the Mount Pleasant area and especially south of Mount Pleasant towards the Sulphur River.", "city": "2 S Mount Pleasant", "source": "Law Enforcement", "unit": null, "valid": "2024-04-27T00:42:00Z", "lon": -94.97, "lat": 33.14, "qualifier": null, "product_id": "202404270043-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.97, 33.14]}}, {"id": "465", "type": "Feature", "properties": {"wfo": "BIS", "type": "R", "magf": 1.22, "county": "McHenry", "typetext": "RAIN", "state": "ND", "remark": "Broadcast media relayed report. Still raining.", "city": "3 N Karlsruhe", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-26T21:15:00Z", "lon": -100.62, "lat": 48.13, "qualifier": "M", "product_id": "202404262214-KBIS-NWUS53-LSRBIS", "st": "ND", "magnitude": "1.22"}, "geometry": {"type": "Point", "coordinates": [-100.62, 48.13]}}, {"id": "466", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "St. Clair", "typetext": "FLOOD", "state": "MO", "remark": "Water over the road on se 900 rd.", "city": "1 ESE Collins", "source": "Amateur Radio", "unit": null, "valid": "2024-04-26T16:51:00Z", "lon": -93.61, "lat": 37.89, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.61, 37.89]}}, {"id": "467", "type": "Feature", "properties": {"wfo": "TOP", "type": "R", "magf": 1.41, "county": "Shawnee", "typetext": "RAIN", "state": "KS", "remark": null, "city": "2 NE Silver Lake", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T12:42:00Z", "lon": -95.84, "lat": 39.12, "qualifier": "M", "product_id": "202404261248-KTOP-NWUS53-LSRTOP", "st": "KS", "magnitude": "1.41"}, "geometry": {"type": "Point", "coordinates": [-95.84, 39.12]}}, {"id": "468", "type": "Feature", "properties": {"wfo": "VEF", "type": "D", "magf": null, "county": "Clark", "typetext": "TSTM WND DMG", "state": "NV", "remark": "Powerline knocked down due to high winds as showers and thunderstorms moved through the Las Vegas Valley.", "city": "2 NE Green Valley", "source": "Broadcast Media", "unit": null, "valid": "2024-04-26T19:35:00Z", "lon": -115.06, "lat": 36.06, "qualifier": null, "product_id": "202404270607-KVEF-NWUS55-LSRVEF", "st": "NV", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-115.06, 36.06]}}, {"id": "469", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.35, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station EW6504 Doniphan.", "city": "1 E Doniphan", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T12:35:00Z", "lon": -98.36, "lat": 40.77, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.35"}, "geometry": {"type": "Point", "coordinates": [-98.36, 40.77]}}, {"id": "470", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.62, "county": "Todd", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "16 SSE Mission", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-27T12:00:00Z", "lon": -100.53, "lat": 43.09, "qualifier": "M", "product_id": "202404272333-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.62"}, "geometry": {"type": "Point", "coordinates": [-100.53, 43.09]}}, {"id": "471", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.38, "county": "Lincoln", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station GW1126 North Platte.", "city": "1 W North Platte", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T14:59:00Z", "lon": -100.8, "lat": 41.13, "qualifier": "M", "product_id": "202404261507-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.38"}, "geometry": {"type": "Point", "coordinates": [-100.8, 41.13]}}, {"id": "472", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Butler", "typetext": "TORNADO", "state": "NE", "remark": "Center pivot overturned, tree and outbuilding damage, road signs torn down. Delayed report.", "city": "4 WNW Dwight", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T19:00:00Z", "lon": -97.1, "lat": 41.1, "qualifier": null, "product_id": "202404271727-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.1, 41.1]}}, {"id": "473", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.25, "county": "Wheeler", "typetext": "RAIN", "state": "NE", "remark": null, "city": "13 NE Bartlett", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -98.34, "lat": 42.0, "qualifier": "M", "product_id": "202404261511-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-98.34, 42.0]}}, {"id": "474", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.98, "county": "Peoria", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-PR-8 Peoria 3.4 WNW.", "city": "4 SSW Alta", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -89.67, "lat": 40.77, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.98"}, "geometry": {"type": "Point", "coordinates": [-89.67, 40.77]}}, {"id": "475", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 1.0, "county": "Tarrant", "typetext": "HAIL", "state": "TX", "remark": "Quarter hail reported in Arlington.", "city": "Arlington", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T17:11:00Z", "lon": -97.13, "lat": 32.69, "qualifier": "M", "product_id": "202404261713-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-97.13, 32.69]}}, {"id": "476", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Washington", "typetext": "HAIL", "state": "NE", "remark": "Report from mPING: Quarter (1.00 in.).", "city": "3 W Blair", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:46:00Z", "lon": -96.19, "lat": 41.55, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.19, 41.55]}}, {"id": "477", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Butler", "typetext": "TORNADO", "state": "NE", "remark": "An EF-1 tornado began near the intersection of Highway 15 and Ashland Road moving north-northeast as a broad multiple-vortex tornado. It snapped trees and a road sign and overturned center-pivot irrigation systems along its path. Near its end, a second brief tornado developed 1 mile east of this tornado.", "city": "4 NW Bee", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T19:51:00Z", "lon": -97.11, "lat": 41.05, "qualifier": null, "product_id": "202405041718-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.11, 41.05]}}, {"id": "478", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Douglas", "typetext": "HAIL", "state": "NE", "remark": null, "city": "1 NW Carter Lake", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:55:00Z", "lon": -95.94, "lat": 41.3, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-95.94, 41.3]}}, {"id": "479", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 2.5, "county": "Lancaster", "typetext": "HAIL", "state": "NE", "remark": "delayed report time estimated by radar.", "city": "3 E Davey", "source": "Public", "unit": "Inch", "valid": "2024-04-26T19:54:00Z", "lon": -96.6, "lat": 40.99, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "2.5"}, "geometry": {"type": "Point", "coordinates": [-96.6, 40.99]}}, {"id": "480", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "Very large tornado moving into western Elkhorn.", "city": "1 NW Elkhorn", "source": "Amateur Radio", "unit": null, "valid": "2024-04-26T20:45:00Z", "lon": -96.26, "lat": 41.29, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.26, 41.29]}}, {"id": "481", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.91, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-CP-111 Champaign 0.6 NNE.", "city": "1 NNE Champaign", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -88.26, "lat": 40.12, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.91"}, "geometry": {"type": "Point", "coordinates": [-88.26, 40.12]}}, {"id": "482", "type": "Feature", "properties": {"wfo": "ICT", "type": "R", "magf": 0.62, "county": "Allen", "typetext": "RAIN", "state": "KS", "remark": "CO-OP Observer station MRNK1 Moran.", "city": "Moran", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -95.17, "lat": 37.91, "qualifier": "M", "product_id": "202404271301-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "0.62"}, "geometry": {"type": "Point", "coordinates": [-95.17, 37.91]}}, {"id": "483", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Union", "typetext": "TORNADO", "state": "IA", "remark": "Trained spotter reported tornado on the ground east of Creston. Time and location estimated from radar.", "city": "4 WNW Afton", "source": "Trained Spotter", "unit": null, "valid": "2024-04-27T00:28:00Z", "lon": -94.27, "lat": 41.06, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.27, 41.06]}}, {"id": "484", "type": "Feature", "properties": {"wfo": "TOP", "type": "R", "magf": 1.62, "county": "Shawnee", "typetext": "RAIN", "state": "KS", "remark": null, "city": "4 NNE Berryton", "source": "NWS Employee", "unit": "Inch", "valid": "2024-04-26T14:55:00Z", "lon": -95.62, "lat": 39.0, "qualifier": "M", "product_id": "202404261455-KTOP-NWUS53-LSRTOP", "st": "KS", "magnitude": "1.62"}, "geometry": {"type": "Point", "coordinates": [-95.62, 39.0]}}, {"id": "485", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Madison", "typetext": "TORNADO", "state": "IA", "remark": "Delayed report. Video submitted via social media. Briefly touched down and lifted west of Martensdale. Location estimated from radar.", "city": "2 NE Patterson", "source": "Public", "unit": null, "valid": "2024-04-27T01:15:00Z", "lon": -93.85, "lat": 41.37, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.85, 41.37]}}, {"id": "486", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Washington", "typetext": "HAIL", "state": "NE", "remark": "Report from mPING: Golf Ball (1.75 in.).", "city": "Blair", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:12:00Z", "lon": -96.14, "lat": 41.55, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-96.14, 41.55]}}, {"id": "487", "type": "Feature", "properties": {"wfo": "PSR", "type": "H", "magf": 0.25, "county": "Maricopa", "typetext": "HAIL", "state": "AZ", "remark": "Pea sized hail reported.", "city": "2 SSW Wittmann", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-27T04:13:00Z", "lon": -112.54, "lat": 33.76, "qualifier": "E", "product_id": "202404270615-KPSR-NWUS55-LSRPSR", "st": "AZ", "magnitude": "0.25"}, "geometry": {"type": "Point", "coordinates": [-112.54, 33.76]}}, {"id": "488", "type": "Feature", "properties": {"wfo": "SLC", "type": "S", "magf": 0.9, "county": "Salt Lake", "typetext": "SNOW", "state": "UT", "remark": "CO-OP Observer station PKCU1 Silver Lake Brighton.", "city": "Silver Lake", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T16:00:00Z", "lon": -111.58, "lat": 40.6, "qualifier": "M", "product_id": "202404270237-KSLC-NWUS55-LSRSLC", "st": "UT", "magnitude": "0.9"}, "geometry": {"type": "Point", "coordinates": [-111.58, 40.6]}}, {"id": "489", "type": "Feature", "properties": {"wfo": "SGF", "type": "H", "magf": 1.25, "county": "Bourbon", "typetext": "HAIL", "state": "KS", "remark": null, "city": "4 N Uniontown", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T22:30:00Z", "lon": -94.98, "lat": 37.9, "qualifier": "E", "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "KS", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-94.98, 37.9]}}, {"id": "490", "type": "Feature", "properties": {"wfo": "LZK", "type": "D", "magf": null, "county": "Jackson", "typetext": "TSTM WND DMG", "state": "AR", "remark": "Numerous trees and powerlines down in Weldon. Power is also out.", "city": "Weldon", "source": "Public", "unit": null, "valid": "2024-04-27T01:52:00Z", "lon": -91.23, "lat": 35.45, "qualifier": null, "product_id": "202404270331-KLZK-NWUS54-LSRLZK", "st": "AR", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-91.23, 35.45]}}, {"id": "491", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Jasper", "typetext": "TORNADO", "state": "IA", "remark": "*** 1 INJ *** Reports of damage in Monroe. Time estimated from radar. Update for injury.", "city": "Monroe", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T02:41:00Z", "lon": -93.1, "lat": 41.52, "qualifier": null, "product_id": "202404270654-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.1, 41.52]}}, {"id": "492", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.44, "county": "Adams", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station ADAM057 Prosser 2.2 SE.", "city": "2 SSE Prosser", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.55, "lat": 40.66, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.44"}, "geometry": {"type": "Point", "coordinates": [-98.55, 40.66]}}, {"id": "493", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.15, "county": "Furnas", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station FURN4032 Arapahoe 1.78 SE.", "city": "2 SSE Arapahoe", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -99.88, "lat": 40.28, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.15"}, "geometry": {"type": "Point", "coordinates": [-99.88, 40.28]}}, {"id": "494", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.82, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station CMII2 2.5 W Champaign.", "city": "2 WSW Champaign", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T10:15:00Z", "lon": -88.31, "lat": 40.1, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.82"}, "geometry": {"type": "Point", "coordinates": [-88.31, 40.1]}}, {"id": "495", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 0.94, "county": "Jones", "typetext": "RAIN", "state": "SD", "remark": "Cocorahs station SD-JN-7 Murdo 11.6 W.", "city": "3 W Okaton", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -100.95, "lat": 43.88, "qualifier": "M", "product_id": "202404271613-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "0.94"}, "geometry": {"type": "Point", "coordinates": [-100.95, 43.88]}}, {"id": "496", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Boone", "typetext": "HAIL", "state": "NE", "remark": null, "city": "6 WSW Cedar Rapids", "source": "Public", "unit": "Inch", "valid": "2024-04-26T19:15:00Z", "lon": -98.26, "lat": 41.54, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-98.26, 41.54]}}, {"id": "497", "type": "Feature", "properties": {"wfo": "OAX", "type": "C", "magf": null, "county": "Saline", "typetext": "FUNNEL CLOUD", "state": "NE", "remark": "Dispatch called over NAWAS reporting a funnel cloud 15 miles west of Cortland, or 2 miles northwest of Wilber.", "city": "1 NW Wilber", "source": "County Official", "unit": null, "valid": "2024-04-26T19:05:00Z", "lon": -96.97, "lat": 40.49, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.97, 40.49]}}, {"id": "498", "type": "Feature", "properties": {"wfo": "LOT", "type": "N", "magf": 46.0, "county": "Cook", "typetext": "NON-TSTM WND GST", "state": "IL", "remark": "ASOS station KMDW Chicago Midway.", "city": "Midway Airport", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T22:09:00Z", "lon": -87.76, "lat": 41.78, "qualifier": "M", "product_id": "202404270112-KLOT-NWUS53-LSRLOT", "st": "IL", "magnitude": "46"}, "geometry": {"type": "Point", "coordinates": [-87.76, 41.78]}}, {"id": "499", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.23, "county": "Codington", "typetext": "RAIN", "state": "SD", "remark": "CO-OP Observer station RALS2 Rauville 2 W. 48-hour total.", "city": "3 W Rauville", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -97.14, "lat": 44.98, "qualifier": "M", "product_id": "202404271201-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.23"}, "geometry": {"type": "Point", "coordinates": [-97.14, 44.98]}}, {"id": "500", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.03, "county": "Howard", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HOWA4402 St. Paul 2.72 NNE.", "city": "3 N Saint Paul", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.45, "lat": 41.25, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.03"}, "geometry": {"type": "Point", "coordinates": [-98.45, 41.25]}}, {"id": "501", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.55, "county": "Polk", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station POLK006 Stromsburg 1.6 SE.", "city": "1 SSE Stromsburg", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.58, "lat": 41.1, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.55"}, "geometry": {"type": "Point", "coordinates": [-97.58, 41.1]}}, {"id": "502", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "Hill", "typetext": "TORNADO", "state": "TX", "remark": "An EF-1 tornado occurred near Abbott, first developing on the west side of I-35W and CR 2341 where trees were damaged and uprooted. A semi-tractor trailer was rolled over on the interstate. The tornado moved northeast causing tree damage until it reached CR 3106 where it caused minor damage to a few homes. The tornado dissipated near after crossing CR 3106 again, north of CR 3145. Maximum estimated winds were 95 mph.", "city": "1 W Abbott", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T18:49:00Z", "lon": -97.09, "lat": 31.88, "qualifier": null, "product_id": "202404281643-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.09, 31.88]}}, {"id": "503", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.89, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Report via social media.", "city": "4 W Grand Island", "source": "Public", "unit": "Inch", "valid": "2024-04-26T12:24:00Z", "lon": -98.44, "lat": 40.92, "qualifier": "E", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.89"}, "geometry": {"type": "Point", "coordinates": [-98.44, 40.92]}}, {"id": "504", "type": "Feature", "properties": {"wfo": "SHV", "type": "F", "magf": null, "county": "Wood", "typetext": "FLASH FLOOD", "state": "TX", "remark": "Road closure at County Road 4530 and FM 2869 from flooding. High water reported across numerous other road surfaces across the western and northern half of Wood County.", "city": "5 SSE Winnsboro", "source": "Law Enforcement", "unit": null, "valid": "2024-04-27T00:30:00Z", "lon": -95.26, "lat": 32.89, "qualifier": null, "product_id": "202404270031-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.26, 32.89]}}, {"id": "505", "type": "Feature", "properties": {"wfo": "ICT", "type": "R", "magf": 2.13, "county": "Allen", "typetext": "RAIN", "state": "KS", "remark": "24 hour value", "city": "Moran", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -95.17, "lat": 37.91, "qualifier": "M", "product_id": "202404261700-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "2.13"}, "geometry": {"type": "Point", "coordinates": [-95.17, 37.91]}}, {"id": "506", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.48, "county": "York", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station YORK044 York 1.1 ENE.", "city": "1 ENE York", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.57, "lat": 40.88, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.48"}, "geometry": {"type": "Point", "coordinates": [-97.57, 40.88]}}, {"id": "507", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.21, "county": "Knox", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-KX-23 Williamsfield 1.7 NNE.", "city": "2 WSW Elmore", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T11:30:00Z", "lon": -90.01, "lat": 40.95, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.21"}, "geometry": {"type": "Point", "coordinates": [-90.01, 40.95]}}, {"id": "508", "type": "Feature", "properties": {"wfo": "OAX", "type": "C", "magf": null, "county": "Saline", "typetext": "FUNNEL CLOUD", "state": "NE", "remark": null, "city": "Friend", "source": "Fire Dept/Rescue", "unit": null, "valid": "2024-04-26T18:43:00Z", "lon": -97.29, "lat": 40.65, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.29, 40.65]}}, {"id": "509", "type": "Feature", "properties": {"wfo": "PSR", "type": "O", "magf": null, "county": "La Paz", "typetext": "NON-TSTM WND DMG", "state": "AZ", "remark": "***DELAYED REPORT*** Metal roofing blown off sheds and wrapped around a power pole.", "city": "9 NE Parker", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T22:40:00Z", "lon": -114.19, "lat": 34.23, "qualifier": null, "product_id": "202404272156-KPSR-NWUS55-LSRPSR", "st": "AZ", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-114.19, 34.23]}}, {"id": "510", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Wood", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Trees down on multiple county roads in and around the Yantis community.", "city": "Yantis", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T21:45:00Z", "lon": -95.58, "lat": 32.93, "qualifier": null, "product_id": "202404270024-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.58, 32.93]}}, {"id": "511", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.36, "county": "Fulton", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station AVOI2 Avon.", "city": "Avon", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -90.44, "lat": 40.66, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.36"}, "geometry": {"type": "Point", "coordinates": [-90.44, 40.66]}}, {"id": "512", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 0.75, "county": "Hill", "typetext": "HAIL", "state": "TX", "remark": "Dime (0.75 in.) hail W of Whitney.", "city": "3 W Whitney", "source": "Public", "unit": "Inch", "valid": "2024-04-26T18:21:00Z", "lon": -97.37, "lat": 31.97, "qualifier": "M", "product_id": "202404261828-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-97.37, 31.97]}}, {"id": "513", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Madison", "typetext": "TORNADO", "state": "NE", "remark": "This brief EF1 tornado touched down near Grandview Road and East Sherwood Rood, causing tree damage at a farmstead. The tornado moved northeast, damaging large trees along the way and causing EF-1 damage to a gymnastics gym and a pallet plant. The tornado then lifted as it crossed the North Fork of the Elkhorn river.", "city": "4 SE Norfolk", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T22:16:00Z", "lon": -97.37, "lat": 41.99, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.37, 41.99]}}, {"id": "514", "type": "Feature", "properties": {"wfo": "DVN", "type": "N", "magf": 65.0, "county": "Linn", "typetext": "NON-TSTM WND GST", "state": "IA", "remark": "ASOS station KCID Cedar Rapids Arpt.", "city": "Cedar Rapids Municipali", "source": "ASOS", "unit": "MPH", "valid": "2024-04-26T14:14:00Z", "lon": -91.72, "lat": 41.88, "qualifier": "M", "product_id": "202404261524-KDVN-NWUS53-LSRDVN", "st": "IA", "magnitude": "65"}, "geometry": {"type": "Point", "coordinates": [-91.72, 41.88]}}, {"id": "515", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": "*** 1 FATAL, 3 INJ *** An EF3 tornado developed approximately 3 miles east of McClelland, and developed prior to the dissipation of the tornado that tracked near Treynor, so both were occurring at the same time, side by side. This was confirmed by photo and video evidence of storm spotters. This tornado moved toward the north northeast, damaging mainly trees and outbuildings or barns as it tracked up to Sumac Road and 330th Street. At this point, according to radar and storm damage indicators, the tornado rapidly intensified. An outbuilding was totally destroyed near Sycamore road, and the tornado caused extensive tree damage east of 330th Road, south of Minden. The tornado intensified further, and widened to approximately 800 yards as it impacted the town of Minden. Video and spotter reports indicate that there were multiple vortices within the tornado near Minden and points northeast, and there was evidence of narrow zones of the most intense damage which lines up very well with the multiple vortex tornado concept. In fact, there were damage indicators of EF-1 damage and high-end EF- 3 damage within only 100 yards of each other. The most intense damage was on the far east side of Minden. Numerous homes were uninhabitable and several homes were completely destroyed. There were also several sizeable metal buildings southeast of Main Street that were completely destroyed. The construction of these metal structures and the homes that were most impacted, in conjunction with the tree damage and damage to cars with few if any cars being lofted and thrown indicated that this was a very strong EF-3 tornado, near the top of the damage range for an EF- 3. The damage to the town of Minden was extensive, with three injuries and one fatality. The tornado continued northeast of Minden where it produced EF-3 damage at two homes along 345th Street. One of the homes was somewhat intact but was removed from its foundation and slid approximately 10 yards to the northeast. The other home had only small interior rooms remaining. It is worth noting that these two homes were 700 yards apart along the north-south street. EF-2 damage occurred along Whippoorwill Road. The tornado crossed Interstate 80 near 355th Street, flipping a semi, and produced damage nearly three quarters of a mile wide along York Road just north of Interstate 80. Tree and powerline damage continued to the northeast, with a home being very badly damaged near County Road M16 and 450th Street. A home was badly damaged, and a barn was destroyed less than one mile southeast of Tennant. The tornado appears to have been widest near 750th Street and Hackberry Road, at approximately 1 mile in width based on tree and powerline damage. At Highway 44, a home was destroyed along with substantial tree damage. Most walls of the home were standing, but a large automobile was thrown or rolled nearly a quarter mile. The tree and vehicle damage suggested that this location was a stronger section of the tornado. The tornado tracked approximately 1.5 miles northwest of Harlan, and began to turn more toward the north, significantly damaging at least 3 homes near Highway 59 as it crossed. It turned almost due north and traveled several miles along Linden Road, and just narrowly missed the town of Defiance. A second tornado developed just to the east of this one at this time, tracking along Oak Road and causing separate damage. Near Defiance, the damage overlapped damage from another, later, tornado. It also became rain-wrapped according to chaser video, and appears likely to have ended near the Crawford-Shelby county line. There is some potential based on radar data that this tornado tracked farther north into Crawford county, but early damage surveys did not identify a track continuation at this time.", "city": "3 E Mcclelland", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T22:25:00Z", "lon": -95.62, "lat": 41.33, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.62, 41.33]}}, {"id": "516", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Monona", "typetext": "TORNADO", "state": "IA", "remark": "A short-lived tornado developed in an agricultural field and moved generally northeast across fields and pastureland, damaging outbuildings of farmsteads near the intersection of 280th and Poplar Roads. The tornado appeared to dissipate in pastureland before reaching State Highway 183. This makes the length of the tornado path 1.48 miles.", "city": "2 SW Soldier", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T22:17:00Z", "lon": -95.81, "lat": 41.96, "qualifier": null, "product_id": "202405081749-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.81, 41.96]}}, {"id": "517", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": "House damaged.", "city": "1 NW Waverly", "source": "911 Call Center", "unit": null, "valid": "2024-04-26T19:53:00Z", "lon": -96.55, "lat": 40.93, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.55, 40.93]}}, {"id": "518", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Douglas", "typetext": "FLOOD", "state": "MO", "remark": "Car in creek at Y-521 and PP area where Cowskin creek and Praire creek combine.", "city": "4 ENE Goodhope", "source": "Amateur Radio", "unit": null, "valid": "2024-04-26T21:40:00Z", "lon": -92.74, "lat": 36.94, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.74, 36.94]}}, {"id": "519", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.07, "county": "Grant", "typetext": "RAIN", "state": "SD", "remark": "Cocorahs station SD-GT-6 Strandburg 2.5 NW.", "city": "2 NW Strandburg", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -96.8, "lat": 45.06, "qualifier": "M", "product_id": "202404271613-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.07"}, "geometry": {"type": "Point", "coordinates": [-96.8, 45.06]}}, {"id": "520", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Union", "typetext": "TORNADO", "state": "IA", "remark": "Tornado reported to the southwest of Macksburg.", "city": "6 NE Creston", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T00:15:00Z", "lon": -94.29, "lat": 41.13, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.29, 41.13]}}, {"id": "521", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "McLennan", "typetext": "TORNADO", "state": "TX", "remark": "A brief, EF-0 tornado damaged trees west of Heritage Pkwy and south of Easy Rd northwest of Tours. Maximum estimated winds were 75 mph.", "city": "3 SSE West", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T17:48:00Z", "lon": -97.07, "lat": 31.76, "qualifier": null, "product_id": "202404281643-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.07, 31.76]}}, {"id": "522", "type": "Feature", "properties": {"wfo": "DVN", "type": "R", "magf": 1.0, "county": "Clark", "typetext": "RAIN", "state": "MO", "remark": "Rainfall total so far. 6 hour total.", "city": "3 ENE Charlie Heath Mem", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T16:22:00Z", "lon": -91.84, "lat": 40.59, "qualifier": "M", "product_id": "202404261623-KDVN-NWUS53-LSRDVN", "st": "MO", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-91.84, 40.59]}}, {"id": "523", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Harrison", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "4 ESE Logan", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T22:41:00Z", "lon": -95.73, "lat": 41.62, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.73, 41.62]}}, {"id": "524", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.72, "county": "Hayes", "typetext": "RAIN", "state": "NE", "remark": "CO-OP Observer station HAYN1 Hayes Center.", "city": "Hayes Center", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -101.02, "lat": 40.51, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.72"}, "geometry": {"type": "Point", "coordinates": [-101.02, 40.51]}}, {"id": "525", "type": "Feature", "properties": {"wfo": "TSA", "type": "H", "magf": 1.0, "county": "Tulsa", "typetext": "HAIL", "state": "OK", "remark": "Hail slightly larger than a quarter shown on air.", "city": "1 E Skiatook", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-26T21:30:00Z", "lon": -95.99, "lat": 36.37, "qualifier": "E", "product_id": "202404262222-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.99, 36.37]}}, {"id": "526", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.01, "county": "Tazewell", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station MACI2 Mackinaw 2NE.", "city": "2 NE Mackinaw", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -89.33, "lat": 40.55, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.01"}, "geometry": {"type": "Point", "coordinates": [-89.33, 40.55]}}, {"id": "527", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "Tennant", "source": "Broadcast Media", "unit": null, "valid": "2024-04-26T22:59:00Z", "lon": -95.44, "lat": 41.59, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.44, 41.59]}}, {"id": "528", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Platte", "typetext": "TORNADO", "state": "NE", "remark": "Emergency manager reported a tornado on the ground 4 to 5 miles south of Lindsay.", "city": "5 S Lindsay", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T20:29:00Z", "lon": -97.69, "lat": 41.63, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.69, 41.63]}}, {"id": "529", "type": "Feature", "properties": {"wfo": "FWD", "type": "D", "magf": null, "county": "Kaufman", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Trees down on CR 4079.", "city": "Grays Prairie", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:22:00Z", "lon": -96.35, "lat": 32.48, "qualifier": null, "product_id": "202404262230-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.35, 32.48]}}, {"id": "530", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Stanton", "typetext": "TORNADO", "state": "NE", "remark": "Possible tornado.", "city": "3 SE Norfolk", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:20:00Z", "lon": -97.37, "lat": 42.0, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.37, 42.0]}}, {"id": "531", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Butler", "typetext": "TORNADO", "state": "NE", "remark": "Trained spotters confirmed an EF-Unknown tornado with video and photos lasting approximately 1 minute over open fields. Due to no damage indicators hit, we have to rate it EF-Unknown.", "city": "4 WSW Brainard", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T20:06:00Z", "lon": -97.07, "lat": 41.16, "qualifier": null, "product_id": "202405041718-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.07, 41.16]}}, {"id": "532", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Harrison", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "5 SSW Modale", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T21:20:00Z", "lon": -96.04, "lat": 41.55, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.04, 41.55]}}, {"id": "533", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 2.0, "county": "Sarpy", "typetext": "HAIL", "state": "NE", "remark": null, "city": "Papillion", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:45:00Z", "lon": -96.04, "lat": 41.15, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "2"}, "geometry": {"type": "Point", "coordinates": [-96.04, 41.15]}}, {"id": "534", "type": "Feature", "properties": {"wfo": "SGX", "type": "N", "magf": 47.0, "county": "San Diego", "typetext": "NON-TSTM WND GST", "state": "CA", "remark": "Anza Borrego Desert Park weather station.", "city": "2 W Borrego Springs", "source": "Mesonet", "unit": "MPH", "valid": "2024-04-26T23:10:00Z", "lon": -116.4, "lat": 33.26, "qualifier": "M", "product_id": "202404262346-KSGX-NWUS56-LSRSGX", "st": "CA", "magnitude": "47"}, "geometry": {"type": "Point", "coordinates": [-116.4, 33.26]}}, {"id": "535", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.57, "county": "Custer", "typetext": "RAIN", "state": "SD", "remark": "12-hour rainfall.", "city": "5 WNW Hermosa", "source": "Trained Spotter", "unit": "inch", "valid": "2024-04-27T01:10:00Z", "lon": -103.3, "lat": 43.86, "qualifier": "M", "product_id": "202404270111-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.57"}, "geometry": {"type": "Point", "coordinates": [-103.3, 43.86]}}, {"id": "536", "type": "Feature", "properties": {"wfo": "DMX", "type": "G", "magf": 73.0, "county": "Union", "typetext": "TSTM WND GST", "state": "IA", "remark": "Time estimated from radar. Measured by personal weather station.", "city": "2 N Lorimor", "source": "Public", "unit": "MPH", "valid": "2024-04-27T01:15:00Z", "lon": -94.06, "lat": 41.16, "qualifier": "M", "product_id": "202404270626-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": "73"}, "geometry": {"type": "Point", "coordinates": [-94.06, 41.16]}}, {"id": "537", "type": "Feature", "properties": {"wfo": "ICT", "type": "T", "magf": null, "county": "Woodson", "typetext": "TORNADO", "state": "KS", "remark": "storm chaser report.", "city": "4 N Coyville", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T20:42:00Z", "lon": -95.89, "lat": 37.74, "qualifier": null, "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.89, 37.74]}}, {"id": "538", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.84, "county": "Morgan", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station MROI2 0.8 SW Meredosia.", "city": "1 SW Meredosia", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -90.57, "lat": 39.82, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.84"}, "geometry": {"type": "Point", "coordinates": [-90.57, 39.82]}}, {"id": "539", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.56, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "4 WNW Dwtn Rapid City", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T12:00:00Z", "lon": -103.29, "lat": 44.1, "qualifier": "M", "product_id": "202404261205-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.56"}, "geometry": {"type": "Point", "coordinates": [-103.29, 44.1]}}, {"id": "540", "type": "Feature", "properties": {"wfo": "ILX", "type": "O", "magf": null, "county": "Fulton", "typetext": "NON-TSTM WND DMG", "state": "IL", "remark": "Large tree fell on a truck. Gusty winds on back edge of decaying showers.", "city": "4 SW Havana", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T19:45:00Z", "lon": -90.11, "lat": 40.26, "qualifier": null, "product_id": "202404262225-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-90.11, 40.26]}}, {"id": "541", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "An EF2 tornado damage track begins near the V&W Petersen Wildlife Management Area, and moved almost due north from that point, tracking just to the west of Manilla, and generally near 320th Street for much of its track. There was substantial tree damage along this storm`s track, particularly in a line of evergreen trees near Highway 141 and 320th Street where all trunks were snapped and branches removed. The heaviest damage, on the low-end of the EF-2 range, occurred just south of that location where a barn was totally destroyed. The tornado continued due north according to a highly detailed video shared by storm chasers, and ended near 320th and P Avenue.", "city": "5 ENE Defiance", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T23:28:00Z", "lon": -95.26, "lat": 41.86, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.26, 41.86]}}, {"id": "542", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "Multiple destroyed outbuildings and a home that lost a roof. Time estimated from radar.", "city": "3 S Tennant", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T22:57:00Z", "lon": -95.45, "lat": 41.56, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.45, 41.56]}}, {"id": "543", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Lancaster", "typetext": "TORNADO", "state": "NE", "remark": "An EF-1 tornado tracked through mainly open fields, snapping tree trucks. There was one farmstead that had a barn that was badly damaged and minor damage to a home.", "city": "5 SSW Memphis", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T20:12:00Z", "lon": -96.48, "lat": 41.03, "qualifier": null, "product_id": "202405041718-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.48, 41.03]}}, {"id": "544", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Butler", "typetext": "TORNADO", "state": "NE", "remark": "Social media photo of confirmed tornado 9 miles south of David City, Nebraska.", "city": "4 SSE Garrison", "source": "Public", "unit": null, "valid": "2024-04-26T20:00:00Z", "lon": -97.13, "lat": 41.13, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.13, 41.13]}}, {"id": "545", "type": "Feature", "properties": {"wfo": "EAX", "type": "H", "magf": 0.75, "county": "Atchison", "typetext": "HAIL", "state": "MO", "remark": "Report from mPING: Dime (0.75 in.).", "city": "Tarkio", "source": "Public", "unit": "Inch", "valid": "2024-04-26T22:36:00Z", "lon": -95.38, "lat": 40.43, "qualifier": "E", "product_id": "202404270003-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": "0.75"}, "geometry": {"type": "Point", "coordinates": [-95.38, 40.43]}}, {"id": "546", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "Navarro", "typetext": "TORNADO", "state": "TX", "remark": "A citizen captured a video of a brief tornado which formed west of Rice, Texas. The tornado transited mainly bottomland/wetland areas of Cummins Creek, resulting in minor tree damage. This tornado dissipated northwest of Rice, prior to crossing Interstate 45. The tornado was rated EF-0 with maximum winds of 75 mph.", "city": "3 WSW Rice", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T19:19:00Z", "lon": -96.55, "lat": 32.23, "qualifier": null, "product_id": "202404291623-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.55, 32.23]}}, {"id": "547", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.48, "county": "Holt", "typetext": "RAIN", "state": "NE", "remark": null, "city": "Ewing", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -98.35, "lat": 42.26, "qualifier": "M", "product_id": "202404261509-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.48"}, "geometry": {"type": "Point", "coordinates": [-98.35, 42.26]}}, {"id": "548", "type": "Feature", "properties": {"wfo": "DMX", "type": "H", "magf": 3.0, "county": "Ringgold", "typetext": "HAIL", "state": "IA", "remark": null, "city": "Mount Ayr", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T01:03:00Z", "lon": -94.24, "lat": 40.71, "qualifier": "M", "product_id": "202404270103-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": "3"}, "geometry": {"type": "Point", "coordinates": [-94.24, 40.71]}}, {"id": "549", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Christian", "typetext": "FLOOD", "state": "MO", "remark": "One foot of water over Tracker Road.", "city": "2 NNW Nixa", "source": "Amateur Radio", "unit": null, "valid": "2024-04-27T00:53:00Z", "lon": -93.31, "lat": 37.07, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.31, 37.07]}}, {"id": "550", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.25, "county": "Lancaster", "typetext": "HAIL", "state": "NE", "remark": null, "city": "6 SE Malcolm", "source": "Public", "unit": "Inch", "valid": "2024-04-26T19:49:00Z", "lon": -96.79, "lat": 40.85, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-96.79, 40.85]}}, {"id": "551", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.75, "county": "Lancaster", "typetext": "HAIL", "state": "NE", "remark": null, "city": "5 NNW Lincoln", "source": "Public", "unit": "Inch", "valid": "2024-04-26T19:48:00Z", "lon": -96.73, "lat": 40.87, "qualifier": "M", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.75"}, "geometry": {"type": "Point", "coordinates": [-96.73, 40.87]}}, {"id": "552", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "This EF3 tornado developed just east of the Eppley Airfield runway system, about one-quarter mile west of the Amelia Earhart Plaza and Lindbergh Plaza intersection. The tornado destroyed several aircraft hangars and flipped several untethered executive aircraft, producing EF-2 damage. The tornado moved northeast across the Missouri River and crossed Interstate 29 near mile marker 58. It widened to about one-quarter miles, damaging numerous homes and businesses between the interstate and Little Kiln Road. EF-3 damage was sustained to a residence along Little Kiln Road due to the collapse of most of the exterior and interior walls except for a few interior rooms. The tornado continued northeast, moving across Old Lincoln Highway about 1.5 miles south of Crescent. EF-2 damage to several homes occurred due to the major loss of the roof and exterior walls. A vehicle detail shop was destroyed. The tornado moved across mainly woodland areas before impacting a home and farm outbuildings near the intersection of Badger and Jefferson Avenues, where EF-2 damage was sustained to the home due to major roof damage. The tornado moved across agricultural and woodlands between 195th Street and Cougar Avenue, producing EF-1 damage to several manufactured homes and farm outbuildings. It continued northeast across mainly agricultural and woodland, producing EF-0 damage to farm outbuildings by removing large portions of their roofs and snapping large tree limbs. The tornado weakened near the intersection of 210th Street and Teakwood Road, producing intermittent damage to tree limbs. It crossed Interstate 880 about 7 miles west of the I-29 and I-880 interchange, or about 7 miles southeast of Missouri Valley. The tornado dissipated just north of Harrison-Pottawatomie County line in an agricultural field.", "city": "7 ENE Omaha", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T21:58:00Z", "lon": -95.88, "lat": 41.3, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.88, 41.3]}}, {"id": "553", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.89, "county": "Scott", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station FLOI2 Florence.", "city": "5 SSW Oxville", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -90.61, "lat": 39.63, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.89"}, "geometry": {"type": "Point", "coordinates": [-90.61, 39.63]}}, {"id": "554", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.5, "county": "Lancaster", "typetext": "HAIL", "state": "NE", "remark": null, "city": "4 NW Lincoln", "source": "Public", "unit": "Inch", "valid": "2024-04-26T19:41:00Z", "lon": -96.74, "lat": 40.86, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-96.74, 40.86]}}, {"id": "555", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Buffalo", "typetext": "TORNADO", "state": "NE", "remark": "This tornado touched down at 1216 PM CDT 2 miles east southeast of Ravenna, and lifted at 1231 PM CDT 3 miles north of Ravenna. The rating was EF1, with an estimated peak wind of 90 MPH, based on damage to a power pole and outbuildings. The tornado had a path length of 4.76 miles with a width of 175 yards.", "city": "2 ESE Ravenna", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T17:16:00Z", "lon": -98.87, "lat": 41.02, "qualifier": null, "product_id": "202404290108-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.87, 41.02]}}, {"id": "556", "type": "Feature", "properties": {"wfo": "FSD", "type": "H", "magf": 1.25, "county": "Cherokee", "typetext": "HAIL", "state": "IA", "remark": "Quarter to Half Dollar sized hail reported by the Cherokee County EM. Time matched up to Radar.", "city": "4 NNW Washta", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T17:30:00Z", "lon": -95.75, "lat": 42.63, "qualifier": "E", "product_id": "202404261804-KFSD-NWUS53-LSRFSD", "st": "IA", "magnitude": "1.25"}, "geometry": {"type": "Point", "coordinates": [-95.75, 42.63]}}, {"id": "557", "type": "Feature", "properties": {"wfo": "ABR", "type": "R", "magf": 1.05, "county": "Codington", "typetext": "RAIN", "state": "SD", "remark": "CO-OP Observer station WATS2 Watertown. 48-hour total.", "city": "Watertown", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -97.12, "lat": 44.91, "qualifier": "M", "product_id": "202404271155-KABR-NWUS53-LSRABR", "st": "SD", "magnitude": "1.05"}, "geometry": {"type": "Point", "coordinates": [-97.12, 44.91]}}, {"id": "558", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.03, "county": "Champaign", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-CP-135 Urbana 2.2 SE.", "city": "2 SE Urbana", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.17, "lat": 40.09, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.03"}, "geometry": {"type": "Point", "coordinates": [-88.17, 40.09]}}, {"id": "559", "type": "Feature", "properties": {"wfo": "TOP", "type": "R", "magf": 1.1, "county": "Douglas", "typetext": "RAIN", "state": "KS", "remark": null, "city": "1 WNW Lawrence", "source": "NWS Employee", "unit": "Inch", "valid": "2024-04-26T14:56:00Z", "lon": -95.28, "lat": 38.96, "qualifier": "M", "product_id": "202404261456-KTOP-NWUS53-LSRTOP", "st": "KS", "magnitude": "1.1"}, "geometry": {"type": "Point", "coordinates": [-95.28, 38.96]}}, {"id": "560", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.56, "county": "Shelby", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station SRCI2 3.6 E Tower Hill.", "city": "4 ENE Tower Hill", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -88.9, "lat": 39.41, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.56"}, "geometry": {"type": "Point", "coordinates": [-88.9, 39.41]}}, {"id": "561", "type": "Feature", "properties": {"wfo": "FWD", "type": "D", "magf": null, "county": "Van Zandt", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Tree down with approximately a 12 inch trunk near SH 64 and FM 859.", "city": "1 NNW Canton", "source": "Law Enforcement", "unit": null, "valid": "2024-04-26T21:51:00Z", "lon": -95.87, "lat": 32.56, "qualifier": null, "product_id": "202404262201-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.87, 32.56]}}, {"id": "562", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.35, "county": "Holt", "typetext": "RAIN", "state": "NE", "remark": null, "city": "1 W Ewing", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -98.37, "lat": 42.26, "qualifier": "M", "product_id": "202404261510-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.35"}, "geometry": {"type": "Point", "coordinates": [-98.37, 42.26]}}, {"id": "563", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.23, "county": "Moultrie", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station LOVI2 Lovington.", "city": "Lovington", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T10:00:00Z", "lon": -88.63, "lat": 39.71, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.23"}, "geometry": {"type": "Point", "coordinates": [-88.63, 39.71]}}, {"id": "564", "type": "Feature", "properties": {"wfo": "ICT", "type": "C", "magf": null, "county": "Wilson", "typetext": "FUNNEL CLOUD", "state": "KS", "remark": "Video feed relayed funnel cloud.", "city": "1 NNW Benedict", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T21:20:00Z", "lon": -95.75, "lat": 37.63, "qualifier": null, "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.75, 37.63]}}, {"id": "565", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.35, "county": "Adams", "typetext": "RAIN", "state": "NE", "remark": "NWS Office. CO-OP Observer station HSTN1 Hastings 4 N.", "city": "3 SSW Hansen", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T12:20:00Z", "lon": -98.38, "lat": 40.65, "qualifier": "M", "product_id": "202404261252-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.35"}, "geometry": {"type": "Point", "coordinates": [-98.38, 40.65]}}, {"id": "566", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 1.09, "county": "Moultrie", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-MU-1 Arthur 0.8 NNW.", "city": "1 N Arthur", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T10:00:00Z", "lon": -88.47, "lat": 39.73, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "1.09"}, "geometry": {"type": "Point", "coordinates": [-88.47, 39.73]}}, {"id": "567", "type": "Feature", "properties": {"wfo": "OAX", "type": "H", "magf": 1.0, "county": "Washington", "typetext": "HAIL", "state": "NE", "remark": "Report from mPING: Quarter (1.00 in.).", "city": "5 W Washington", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:26:00Z", "lon": -96.3, "lat": 41.4, "qualifier": "E", "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-96.3, 41.4]}}, {"id": "568", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Howard", "typetext": "TORNADO", "state": "NE", "remark": "Emergency management reported power poles down near Highway 11 and Odell Road.", "city": "1 NNW Elba", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T18:14:00Z", "lon": -98.58, "lat": 41.3, "qualifier": null, "product_id": "202404261850-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.58, 41.3]}}, {"id": "569", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 4.19, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HALL043 Wood River 3.1 WSW.", "city": "3 SW Wood River", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.65, "lat": 40.79, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "4.19"}, "geometry": {"type": "Point", "coordinates": [-98.65, 40.79]}}, {"id": "570", "type": "Feature", "properties": {"wfo": "FWD", "type": "T", "magf": null, "county": "Navarro", "typetext": "TORNADO", "state": "TX", "remark": "A brief EF-0 tornado occurred west of Frost in far northwestern Navarro County. A grain elevator was impacted and partially collapsed along State Highway 22 west of Frost. The tornado crossed the highway and produced some EF-0 roof and garage door damage to several homes on the west side of Frost. The tornado dissipated just north of Frost. Maximum estimated winds were 80 mph.", "city": "1 WSW Frost", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T19:30:00Z", "lon": -96.83, "lat": 32.07, "qualifier": null, "product_id": "202404291623-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.83, 32.07]}}, {"id": "571", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Franklin", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Power poles downed across the southern part of Franklin County, Texas.", "city": "3 NNE Winnsboro", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T22:05:00Z", "lon": -95.27, "lat": 33.0, "qualifier": null, "product_id": "202404262329-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.27, 33.0]}}, {"id": "572", "type": "Feature", "properties": {"wfo": "EAX", "type": "T", "magf": null, "county": "Henry", "typetext": "TORNADO", "state": "MO", "remark": "NWS Damage Survey confirms a very brief EF-0 tornado southeast of Clinton, MO. Damage to two outbuildings.", "city": "4 ESE Clinton", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-27T00:34:00Z", "lon": -93.72, "lat": 38.35, "qualifier": null, "product_id": "202404292149-KEAX-NWUS53-LSREAX", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.72, 38.35]}}, {"id": "573", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Boone", "typetext": "TORNADO", "state": "NE", "remark": "4 pivots overturned. 2 hog confinements destroyed. Delay report.", "city": "7 NNE Primrose", "source": "Public", "unit": null, "valid": "2024-04-26T19:55:00Z", "lon": -98.2, "lat": 41.72, "qualifier": null, "product_id": "202404271654-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.2, 41.72]}}, {"id": "574", "type": "Feature", "properties": {"wfo": "DMX", "type": "H", "magf": 1.0, "county": "Warren", "typetext": "HAIL", "state": "IA", "remark": "Report from mPING: Quarter (1.00 in.).", "city": "2 NW Cumming", "source": "Public", "unit": "Inch", "valid": "2024-04-27T01:36:00Z", "lon": -93.78, "lat": 41.5, "qualifier": "E", "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-93.78, 41.5]}}, {"id": "575", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Butler", "typetext": "TORNADO", "state": "NE", "remark": null, "city": "4 WNW Brainard", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T20:05:00Z", "lon": -97.06, "lat": 41.21, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.06, 41.21]}}, {"id": "576", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.84, "county": "Mellette", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "9 N Cedar Butte", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-27T12:00:00Z", "lon": -101.03, "lat": 43.71, "qualifier": "M", "product_id": "202404271249-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.84"}, "geometry": {"type": "Point", "coordinates": [-101.03, 43.71]}}, {"id": "577", "type": "Feature", "properties": {"wfo": "OAX", "type": "D", "magf": null, "county": "Lancaster", "typetext": "TSTM WND DMG", "state": "NE", "remark": "Building collapsed with people inside. Potential gas leak.", "city": "4 SW Waverly", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T19:55:00Z", "lon": -96.59, "lat": 40.88, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.59, 40.88]}}, {"id": "578", "type": "Feature", "properties": {"wfo": "SHV", "type": "H", "magf": 1.0, "county": "Franklin", "typetext": "HAIL", "state": "TX", "remark": "Corrects previous hail report from 1 NW Mount Vernon.", "city": "1 NW Mount Vernon", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-26T17:54:00Z", "lon": -95.23, "lat": 33.18, "qualifier": "E", "product_id": "202404261803-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.23, 33.18]}}, {"id": "579", "type": "Feature", "properties": {"wfo": "SJT", "type": "H", "magf": 1.0, "county": "San Saba", "typetext": "HAIL", "state": "TX", "remark": "Quarter size hail in Bend. Time estimated by radar.", "city": "5 NE Chappel", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:51:00Z", "lon": -98.51, "lat": 31.1, "qualifier": "E", "product_id": "202404262333-KSJT-NWUS54-LSRSJT", "st": "TX", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-98.51, 31.1]}}, {"id": "580", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.95, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HALL044 Cairo 0.4 ESE.", "city": "Cairo", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.6, "lat": 41.0, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.95"}, "geometry": {"type": "Point", "coordinates": [-98.6, 41.0]}}, {"id": "581", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.86, "county": "Macon", "typetext": "RAIN", "state": "IL", "remark": "ASOS station KDEC Decatur Arpt.", "city": "1 WSW Decatur Airport", "source": "ASOS", "unit": "Inch", "valid": "2024-04-27T10:54:00Z", "lon": -88.87, "lat": 39.83, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.86"}, "geometry": {"type": "Point", "coordinates": [-88.87, 39.83]}}, {"id": "582", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Polk", "typetext": "TORNADO", "state": "IA", "remark": "Reported by General Public.", "city": "3 SE Des Moines", "source": "Public", "unit": null, "valid": "2024-04-27T01:56:00Z", "lon": -93.57, "lat": 41.55, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.57, 41.55]}}, {"id": "583", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "3 ESE Neola", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T22:40:00Z", "lon": -95.57, "lat": 41.43, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.57, 41.43]}}, {"id": "584", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Clarke", "typetext": "TORNADO", "state": "IA", "remark": "Damage reported near Osceola. Trees and power lines down. Time estimated from radar.", "city": "Osceola", "source": "Broadcast Media", "unit": null, "valid": "2024-04-27T01:36:00Z", "lon": -93.77, "lat": 41.03, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-93.77, 41.03]}}, {"id": "585", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": "Large tornado destroying homes.", "city": "1 NE Minden", "source": "Storm Chaser", "unit": null, "valid": "2024-04-26T22:45:00Z", "lon": -95.52, "lat": 41.48, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.52, 41.48]}}, {"id": "586", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.79, "county": "Buffalo", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station GW4183 KEARNEY.", "city": "1 WNW Kearney", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T13:05:00Z", "lon": -99.11, "lat": 40.71, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.79"}, "geometry": {"type": "Point", "coordinates": [-99.11, 40.71]}}, {"id": "587", "type": "Feature", "properties": {"wfo": "SLC", "type": "S", "magf": 4.0, "county": "Salt Lake", "typetext": "SNOW", "state": "UT", "remark": "Via_WFO_SLC.", "city": "Brighton - Crest", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:59:00Z", "lon": -111.58, "lat": 40.59, "qualifier": "m", "product_id": "202404270237-KSLC-NWUS55-LSRSLC", "st": "UT", "magnitude": "4"}, "geometry": {"type": "Point", "coordinates": [-111.58, 40.59]}}, {"id": "588", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Shelby", "typetext": "TORNADO", "state": "IA", "remark": "Home destroyed.", "city": "2 W Harlan", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T23:06:00Z", "lon": -95.37, "lat": 41.65, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.37, 41.65]}}, {"id": "589", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.63, "county": "Hamilton", "typetext": "RAIN", "state": "NE", "remark": "24hr rain total.", "city": "Aurora Airport", "source": "AWOS", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.99, "lat": 40.89, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.63"}, "geometry": {"type": "Point", "coordinates": [-97.99, 40.89]}}, {"id": "590", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.81, "county": "Hamilton", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HAMI1858 Aurora 0.91 ENE.", "city": "1 ENE Aurora", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.99, "lat": 40.87, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.81"}, "geometry": {"type": "Point", "coordinates": [-97.99, 40.87]}}, {"id": "591", "type": "Feature", "properties": {"wfo": "UNR", "type": "R", "magf": 0.95, "county": "Pennington", "typetext": "RAIN", "state": "SD", "remark": "24-hour rainfall.", "city": "1 SSW Box Elder", "source": "CoCoRaHS", "unit": "inch", "valid": "2024-04-26T13:00:00Z", "lon": -103.08, "lat": 44.1, "qualifier": "M", "product_id": "202404261535-KUNR-NWUS53-LSRUNR", "st": "SD", "magnitude": "0.95"}, "geometry": {"type": "Point", "coordinates": [-103.08, 44.1]}}, {"id": "592", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.0, "county": "Howard", "typetext": "RAIN", "state": "NE", "remark": "Report via Facebook.", "city": "Saint Libory", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:52:00Z", "lon": -98.36, "lat": 41.08, "qualifier": "E", "product_id": "202404261352-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3"}, "geometry": {"type": "Point", "coordinates": [-98.36, 41.08]}}, {"id": "593", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.41, "county": "Holt", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station DW6767 Chambers.", "city": "Chambers", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T14:55:00Z", "lon": -98.75, "lat": 42.2, "qualifier": "M", "product_id": "202404261507-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.41"}, "geometry": {"type": "Point", "coordinates": [-98.75, 42.2]}}, {"id": "594", "type": "Feature", "properties": {"wfo": "ABQ", "type": "S", "magf": 1.0, "county": "Los Alamos", "typetext": "SNOW", "state": "NM", "remark": null, "city": "1 NNE Pajarito Mountain", "source": "Other Federal", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -106.38, "lat": 35.91, "qualifier": "E", "product_id": "202404281640-KABQ-NWUS55-LSRABQ", "st": "NM", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-106.38, 35.91]}}, {"id": "595", "type": "Feature", "properties": {"wfo": "LBF", "type": "R", "magf": 1.85, "county": "Frontier", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station FRON4353 Cambridge 6NNW.", "city": "15 SE Stockville", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -100.21, "lat": 40.37, "qualifier": "M", "product_id": "202404261504-KLBF-NWUS53-LSRLBF", "st": "NE", "magnitude": "1.85"}, "geometry": {"type": "Point", "coordinates": [-100.21, 40.37]}}, {"id": "596", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 1.93, "county": "Phelps", "typetext": "RAIN", "state": "NE", "remark": "AWOS station KHDE Holdrege Airport.", "city": "3 ENE Holdrege", "source": "AWOS", "unit": "Inch", "valid": "2024-04-26T12:55:00Z", "lon": -99.32, "lat": 40.45, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "1.93"}, "geometry": {"type": "Point", "coordinates": [-99.32, 40.45]}}, {"id": "597", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.5, "county": "Kearney", "typetext": "RAIN", "state": "NE", "remark": "Report via Facebook.", "city": "Axtell", "source": "Public", "unit": "Inch", "valid": "2024-04-26T13:51:00Z", "lon": -99.13, "lat": 40.48, "qualifier": "M", "product_id": "202404261352-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.5"}, "geometry": {"type": "Point", "coordinates": [-99.13, 40.48]}}, {"id": "598", "type": "Feature", "properties": {"wfo": "ICT", "type": "H", "magf": 1.5, "county": "Elk", "typetext": "HAIL", "state": "KS", "remark": null, "city": "4 W Moline", "source": "Emergency Mngr", "unit": "Inch", "valid": "2024-04-26T20:03:00Z", "lon": -96.38, "lat": 37.36, "qualifier": "E", "product_id": "202404270048-KICT-NWUS53-LSRICT", "st": "KS", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-96.38, 37.36]}}, {"id": "599", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Mills", "typetext": "TORNADO", "state": "IA", "remark": "An EF1 tornado damage path began approximately 1 mile north of Pacific Junction, where the tornado was also reported by a trained spotter. The tornado crossed Highway 34 one mile east of Interstate 29 where it snapped trees. It then moved up and into the bluffs, where a home took a direct hit and lost large portions of the roof, and a large camper was flipped on its side. Trees were also snapped at this location. The tornado progressed through a forested area where many tree trunks were snapped. The end of the damage appeared to be near Pony Creek Park, just to the east of the Pony Creek Lake dam.", "city": "1 N Pacific Junction", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T21:52:00Z", "lon": -95.8, "lat": 41.04, "qualifier": null, "product_id": "202404300343-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.8, 41.04]}}, {"id": "600", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.97, "county": "Macon", "typetext": "RAIN", "state": "IL", "remark": "CO-OP Observer station DECI2 Decatur 1 SSE.", "city": "1 S Decatur", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-27T05:00:00Z", "lon": -88.95, "lat": 39.83, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.97"}, "geometry": {"type": "Point", "coordinates": [-88.95, 39.83]}}, {"id": "601", "type": "Feature", "properties": {"wfo": "SHV", "type": "D", "magf": null, "county": "Cass", "typetext": "TSTM WND DMG", "state": "TX", "remark": "Trees and power lines down.", "city": "Hughes Springs", "source": "911 Call Center", "unit": null, "valid": "2024-04-26T23:20:00Z", "lon": -94.63, "lat": 33.0, "qualifier": null, "product_id": "202404270012-KSHV-NWUS54-LSRSHV", "st": "TX", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.63, 33.0]}}, {"id": "602", "type": "Feature", "properties": {"wfo": "GID", "type": "T", "magf": null, "county": "Sherman", "typetext": "TORNADO", "state": "NE", "remark": "This tornado touched down at 1232 PM CDT 2 miles south of Rockville, and lifted at 1248 PM CDT 4 miles north northeast of Rockville. The rating was EF1, with an estimated peak wind of 105 MPH, based on snapped power poles north of town. The tornado had a path length of 5.71 miles and a width of 100 yards.", "city": "2 S Rockville", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T17:32:00Z", "lon": -98.83, "lat": 41.1, "qualifier": null, "product_id": "202404290108-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-98.83, 41.1]}}, {"id": "603", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.91, "county": "York", "typetext": "RAIN", "state": "NE", "remark": "Mesonet station 6417D 4 SSW Polk.", "city": "5 SSW Polk", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-26T12:40:00Z", "lon": -97.81, "lat": 41.01, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.91"}, "geometry": {"type": "Point", "coordinates": [-97.81, 41.01]}}, {"id": "604", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.87, "county": "Piatt", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-PT-14 4 N Cerro Gordo.", "city": "4 N Cerro Gordo", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T12:00:00Z", "lon": -88.72, "lat": 39.95, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.87"}, "geometry": {"type": "Point", "coordinates": [-88.72, 39.95]}}, {"id": "605", "type": "Feature", "properties": {"wfo": "DMX", "type": "H", "magf": 1.0, "county": "Ringgold", "typetext": "HAIL", "state": "IA", "remark": null, "city": "2 SSW Delphos", "source": "Trained Spotter", "unit": "Inch", "valid": "2024-04-27T00:28:00Z", "lon": -94.36, "lat": 40.64, "qualifier": "E", "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-94.36, 40.64]}}, {"id": "606", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 4.58, "county": "Hall", "typetext": "RAIN", "state": "NE", "remark": null, "city": "1 ESE Doniphan", "source": "NWS Employee", "unit": "Inch", "valid": "2024-04-26T13:00:00Z", "lon": -98.36, "lat": 40.77, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "4.58"}, "geometry": {"type": "Point", "coordinates": [-98.36, 40.77]}}, {"id": "607", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "Very large tornado moving through western Elkhorn.", "city": "1 NNW Elkhorn", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T20:47:00Z", "lon": -96.24, "lat": 41.29, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.24, 41.29]}}, {"id": "608", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Douglas", "typetext": "TORNADO", "state": "NE", "remark": "House with severe roof damage.", "city": "1 N Elkhorn", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T20:39:00Z", "lon": -96.23, "lat": 41.29, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-96.23, 41.29]}}, {"id": "609", "type": "Feature", "properties": {"wfo": "FSD", "type": "H", "magf": 1.0, "county": "Cherokee", "typetext": "HAIL", "state": "IA", "remark": "Report and photo via social media.", "city": "Cleghorn", "source": "Public", "unit": "Inch", "valid": "2024-04-26T17:47:00Z", "lon": -95.71, "lat": 42.81, "qualifier": "E", "product_id": "202404261905-KFSD-NWUS53-LSRFSD", "st": "IA", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.71, 42.81]}}, {"id": "610", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.95, "county": "Peoria", "typetext": "RAIN", "state": "IL", "remark": "Mesonet station CHLI2 0.9 E Chillicothe.", "city": "Chillicothe", "source": "Mesonet", "unit": "Inch", "valid": "2024-04-27T11:00:00Z", "lon": -89.48, "lat": 40.92, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.95"}, "geometry": {"type": "Point", "coordinates": [-89.48, 40.92]}}, {"id": "611", "type": "Feature", "properties": {"wfo": "LSX", "type": "R", "magf": 2.1, "county": "Madison", "typetext": "RAIN", "state": "IL", "remark": "Daily total.", "city": "Marine", "source": "Public", "unit": "Inch", "valid": "2024-04-27T03:57:00Z", "lon": -89.78, "lat": 38.79, "qualifier": "M", "product_id": "202404270358-KLSX-NWUS53-LSRLSX", "st": "IL", "magnitude": "2.1"}, "geometry": {"type": "Point", "coordinates": [-89.78, 38.79]}}, {"id": "612", "type": "Feature", "properties": {"wfo": "SGF", "type": "E", "magf": null, "county": "Douglas", "typetext": "FLOOD", "state": "MO", "remark": "State Highway Y is closed due to flooding at Cowskin Creek.", "city": "4 WNW Ava", "source": "Dept of Highways", "unit": null, "valid": "2024-04-26T22:18:00Z", "lon": -92.73, "lat": 36.97, "qualifier": null, "product_id": "202404300821-KSGF-NWUS53-LSRSGF", "st": "MO", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-92.73, 36.97]}}, {"id": "613", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Boone", "typetext": "TORNADO", "state": "NE", "remark": "EM reported the tornado and there is video evidence from a storm chaser. No damage was found and so this tornado was rated an EF Unknown.", "city": "7 NE Albion", "source": "NWS Storm Survey", "unit": null, "valid": "2024-04-26T20:47:00Z", "lon": -97.91, "lat": 41.75, "qualifier": null, "product_id": "202405081800-KOAX-NWUS53-LSROAX", "st": "NE", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-97.91, 41.75]}}, {"id": "614", "type": "Feature", "properties": {"wfo": "TOP", "type": "H", "magf": 1.5, "county": "Nemaha", "typetext": "HAIL", "state": "KS", "remark": null, "city": "Baileyville", "source": "Public", "unit": "Inch", "valid": "2024-04-26T21:10:00Z", "lon": -96.18, "lat": 39.84, "qualifier": "E", "product_id": "202404262113-KTOP-NWUS53-LSRTOP", "st": "KS", "magnitude": "1.5"}, "geometry": {"type": "Point", "coordinates": [-96.18, 39.84]}}, {"id": "615", "type": "Feature", "properties": {"wfo": "ILX", "type": "R", "magf": 0.9, "county": "Vermilion", "typetext": "RAIN", "state": "IL", "remark": "Cocorahs station IL-VR-25 Hoopeston 0.6 E.", "city": "1 E Hoopeston", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-27T10:00:00Z", "lon": -87.66, "lat": 40.46, "qualifier": "M", "product_id": "202404271323-KILX-NWUS53-LSRILX", "st": "IL", "magnitude": "0.9"}, "geometry": {"type": "Point", "coordinates": [-87.66, 40.46]}}, {"id": "616", "type": "Feature", "properties": {"wfo": "OAX", "type": "T", "magf": null, "county": "Pottawattamie", "typetext": "TORNADO", "state": "IA", "remark": null, "city": "7 WNW Neola", "source": "Trained Spotter", "unit": null, "valid": "2024-04-26T22:20:00Z", "lon": -95.75, "lat": 41.48, "qualifier": null, "product_id": "202404270316-KOAX-NWUS53-LSROAX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.75, 41.48]}}, {"id": "617", "type": "Feature", "properties": {"wfo": "FWD", "type": "H", "magf": 1.0, "county": "Van Zandt", "typetext": "HAIL", "state": "TX", "remark": "Quarter sized hail near SH 64 at FM 859.", "city": "1 NNW Canton", "source": "Law Enforcement", "unit": "Inch", "valid": "2024-04-26T21:55:00Z", "lon": -95.87, "lat": 32.56, "qualifier": "M", "product_id": "202404262157-KFWD-NWUS54-LSRFWD", "st": "TX", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-95.87, 32.56]}}, {"id": "618", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.56, "county": "Hamilton", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HAMI004 Aurora 1.0 ESE.", "city": "1 ESE Aurora", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.99, "lat": 40.86, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.56"}, "geometry": {"type": "Point", "coordinates": [-97.99, 40.86]}}, {"id": "619", "type": "Feature", "properties": {"wfo": "BIS", "type": "R", "magf": 1.0, "county": "McHenry", "typetext": "RAIN", "state": "ND", "remark": "Broadcast media relayed. Still raining.", "city": "Velva", "source": "Broadcast Media", "unit": "Inch", "valid": "2024-04-27T03:31:00Z", "lon": -100.93, "lat": 48.06, "qualifier": "M", "product_id": "202404270332-KBIS-NWUS53-LSRBIS", "st": "ND", "magnitude": "1"}, "geometry": {"type": "Point", "coordinates": [-100.93, 48.06]}}, {"id": "620", "type": "Feature", "properties": {"wfo": "DMX", "type": "T", "magf": null, "county": "Union", "typetext": "TORNADO", "state": "IA", "remark": "Tornado with debris near the hospital in Creston.", "city": "Creston", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-27T00:09:00Z", "lon": -94.36, "lat": 41.06, "qualifier": null, "product_id": "202404270439-KDMX-NWUS53-LSRDMX", "st": "IA", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-94.36, 41.06]}}, {"id": "621", "type": "Feature", "properties": {"wfo": "TSA", "type": "T", "magf": null, "county": "Pittsburg", "typetext": "TORNADO", "state": "OK", "remark": "This tornado moved across the northwest side of McAlester, damaging the roofs of homes, uprooting trees, and snapping power poles. The damage survey was conducted by Pittsburg County/McAlester Emergency Mananagement.", "city": "2 N Mcalester", "source": "Emergency Mngr", "unit": null, "valid": "2024-04-26T12:23:00Z", "lon": -95.77, "lat": 34.96, "qualifier": null, "product_id": "202404302308-KTSA-NWUS54-LSRTSA", "st": "OK", "magnitude": ""}, "geometry": {"type": "Point", "coordinates": [-95.77, 34.96]}}, {"id": "622", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 3.48, "county": "Hamilton", "typetext": "RAIN", "state": "NE", "remark": "Cocorahs station HAMI5533 Giltner 0.22 NW.", "city": "Giltner", "source": "Cocorahs", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -98.16, "lat": 40.78, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "3.48"}, "geometry": {"type": "Point", "coordinates": [-98.16, 40.78]}}, {"id": "623", "type": "Feature", "properties": {"wfo": "GID", "type": "R", "magf": 2.26, "county": "Polk", "typetext": "RAIN", "state": "NE", "remark": "CO-OP Observer station SHLN1 3 NE Shelby.", "city": "3 NE Shelby", "source": "CO-OP Observer", "unit": "Inch", "valid": "2024-04-26T12:00:00Z", "lon": -97.39, "lat": 41.22, "qualifier": "M", "product_id": "202404261350-KGID-NWUS53-LSRGID", "st": "NE", "magnitude": "2.26"}, "geometry": {"type": "Point", "coordinates": [-97.39, 41.22]}}]} \ No newline at end of file diff --git a/tests/fixtures/spc_404_no_active_outlook.html b/tests/fixtures/spc_404_no_active_outlook.html new file mode 100644 index 0000000..f59ffd2 --- /dev/null +++ b/tests/fixtures/spc_404_no_active_outlook.html @@ -0,0 +1,260 @@ + + + + Storm Prediction Center: Page Not Found + + + + + + + + + + + + + + + + + +
+ Skip Navigation Links + weather.gov 
+ + + + + + + + + + + +
NOAA logo-Select to go to the NOAA homepageNOAA's National Weather Service Select to go to the NWS homepage
Storm Prediction Center
+ + + + + + + + + + + + +
navigation bar left  + + +  navigation bar end cap
+ + + + + + + + +

+ + + + + + + + + + + + + + + + +
+
+ +
+   + +
+
USA.gov is the U.S. Government's official Web portal to all Federal, state and local government Web resources and services.
+ + +

+ +
+

+ The page you've requested cannot be found. +

+

+ Try our search page, or +

+

+ Report this error to feedback page. +

+
+
+ + + +
+ + + + +
Weather Topics:
+ Watches, + Mesoscale Discussions, + Outlooks, + Fire Weather, + All Products, + Contact Us
+ + + + + + + + + + +

+ NOAA / + National Weather Service
+ National Centers for Environmental Prediction
+ Storm Prediction Center
+ 120 David L. Boren Blvd.
+ Norman, OK 73072 U.S.A.
+ spc.feedback@noaa.gov
+ + +Page last modified: + + +January 01, 1970
+ + Disclaimer
+ + Information Quality
+ + Help
+ + Glossary +
+ + Privacy Policy
+ + Freedom of Information Act (FOIA)
+ + About Us
+ + Career Opportunities +
+ + + + + + +
+ + +
+ + diff --git a/tests/test_corpus.cpp b/tests/test_corpus.cpp new file mode 100644 index 0000000..0d5a44d --- /dev/null +++ b/tests/test_corpus.cpp @@ -0,0 +1,93 @@ +/// @file test_corpus.cpp +/// @brief Drives the shared live-captured SPC fixture corpus through the +/// extracted `spc::parse_*` functions. This is the spc-cpp side of the +/// byte-identity contract: the same fixtures the spc-data PR-0 golden was +/// frozen over must parse to the same feature counts / labels / probs here. +/// The authoritative byte-for-byte SQL diff runs in spc-data PR-3; this +/// guards the SDK in isolation so a regression is caught in spc-cpp's own CI. + +#include "spc/models/outlook.hpp" + +#include +#include +#include +#include +#include + +namespace { + +using namespace spc; + +std::string slurp(const std::string& name) { + std::ifstream f(std::filesystem::path(SPC_FIXTURES_DIR) / name, std::ios::binary); + EXPECT_TRUE(f.is_open()) << "missing fixture: " << name; + std::stringstream buf; + buf << f.rdbuf(); + return buf.str(); +} + +TEST(Corpus, StaticCategoricalFeeds) { + // The 3 live static www.spc.noaa.gov day1-3 categorical feeds (uppercase + // LABEL/ISSUE/VALID/EXPIRE, Polygon + MultiPolygon). + const CategoricalOutlookPayload d1 = parse_categorical(slurp("day1otlk_cat.nolyr.geojson"), 1); + const CategoricalOutlookPayload d2 = parse_categorical(slurp("day2otlk_cat.nolyr.geojson"), 2); + const CategoricalOutlookPayload d3 = parse_categorical(slurp("day3otlk_cat.nolyr.geojson"), 3); + EXPECT_EQ(d1.day_offset, 1); + EXPECT_EQ(d2.day_offset, 2); + EXPECT_EQ(d3.day_offset, 3); + EXPECT_GT(d1.features.size(), 0u); + EXPECT_GT(d2.features.size(), 0u); + EXPECT_GT(d3.features.size(), 0u); + for (const OutlookFeature& f : d1.features) { + EXPECT_GE(f.severity, 1); + EXPECT_LE(f.severity, 5); + EXPECT_FALSE(f.rings.empty()); + } +} + +TEST(Corpus, ArcGISGeoJsonCategoricalParses) { + // ArcGIS f=geojson mirror uses lowercase label/issue/valid/expire — this + // exercises the parser's case-variant fallback chain. + const CategoricalOutlookPayload p = + parse_categorical(slurp("arcgis_day1_categorical.geojson"), 1); + EXPECT_GT(p.features.size(), 0u); + bool saw_tstm = false; + for (const OutlookFeature& f : p.features) { + if (f.label == "TSTM") { + saw_tstm = true; + EXPECT_EQ(f.severity, 1); + } + } + EXPECT_TRUE(saw_tstm) << "expected the day-1 ArcGIS categorical to include a TSTM band"; +} + +TEST(Corpus, ProbabilisticParsesAndScales) { + // ArcGIS f=geojson probabilistic tornado: label is "0.02"/"0.05"/"0.10". + // parse_probabilistic divides by 100 (verbatim spc-data semantics), so a + // "0.02" label -> 0.0002 probability. + const ProbOutlookPayload p = + parse_probabilistic(slurp("arcgis_day1_prob_tornado.geojson"), 1, "tornado"); + ASSERT_GT(p.features.size(), 0u); + for (const ProbOutlookFeature& f : p.features) { + EXPECT_EQ(f.hazard, "tornado"); + EXPECT_GT(f.probability, 0.0); + EXPECT_LT(f.probability, 1.0); + EXPECT_FALSE(f.rings.empty()); + } +} + +TEST(Corpus, MalformedBodyThrows) { + // spc-data contract: parse_* throws std::runtime_error on malformed JSON + // (the SPC HTML 404 body is the canonical example). main.cpp catches it. + EXPECT_THROW((void)parse_categorical(slurp("spc_404_no_active_outlook.html"), 1), + std::runtime_error); +} + +TEST(Corpus, EmptyFeatureCollectionIsEmptyNotError) { + const CategoricalOutlookPayload p = + parse_categorical(R"({"type":"FeatureCollection","features":[]})", 7); + EXPECT_EQ(p.day_offset, 7); + EXPECT_TRUE(p.features.empty()); +} + +} // namespace diff --git a/tests/test_geometry.cpp b/tests/test_geometry.cpp new file mode 100644 index 0000000..afa6f22 --- /dev/null +++ b/tests/test_geometry.cpp @@ -0,0 +1,39 @@ +// Moved verbatim from spc-data/tests/test_geometry.cpp (Workstream C). +// Asserts are identical; only the include path + namespace changed. + +#include "spc/geometry.hpp" + +#include + +namespace { + +using namespace spc; + +TEST(Geometry, Square) { + // Unit square centered at (0,0). + const Polygon square = {{-1.0, -1.0}, {1.0, -1.0}, {1.0, 1.0}, {-1.0, 1.0}, {-1.0, -1.0}}; + EXPECT_TRUE(point_in_polygon(0.0, 0.0, square)); + EXPECT_TRUE(point_in_polygon(0.5, 0.5, square)); + EXPECT_FALSE(point_in_polygon(1.5, 0.0, square)); + EXPECT_FALSE(point_in_polygon(-1.5, 0.0, square)); + EXPECT_FALSE(point_in_polygon(0.0, 1.5, square)); +} + +TEST(Geometry, TriangleOverOklahoma) { + // Triangle approximately covering western OK (lon -103..-98, lat 34..37). + const Polygon ok_tri = {{-103.0, 34.0}, {-98.0, 34.0}, {-100.5, 37.0}, {-103.0, 34.0}}; + EXPECT_TRUE(point_in_polygon(-100.0, 35.0, ok_tri)); // central OK + EXPECT_FALSE(point_in_polygon(-97.0, 35.0, ok_tri)); // just east of triangle + EXPECT_FALSE(point_in_polygon(-100.0, 32.0, ok_tri)); // too far south +} + +TEST(Geometry, MultiRingFeature) { + OutlookFeature feat; + feat.rings.push_back({{0.0, 0.0}, {1.0, 0.0}, {1.0, 1.0}, {0.0, 1.0}, {0.0, 0.0}}); + feat.rings.push_back({{10.0, 10.0}, {11.0, 10.0}, {11.0, 11.0}, {10.0, 11.0}, {10.0, 10.0}}); + EXPECT_TRUE(point_in_feature(0.5, 0.5, feat)); + EXPECT_TRUE(point_in_feature(10.5, 10.5, feat)); + EXPECT_FALSE(point_in_feature(5.0, 5.0, feat)); +} + +} // namespace diff --git a/tests/test_parser.cpp b/tests/test_parser.cpp new file mode 100644 index 0000000..c8b81fc --- /dev/null +++ b/tests/test_parser.cpp @@ -0,0 +1,104 @@ +// Moved verbatim from spc-data/tests/test_parser.cpp (Workstream C). +// Asserts are identical; only the include path + namespace changed. This +// pins that the extracted convective parser is behavior-for-behavior the +// spc-data parser. + +#include "spc/models/outlook.hpp" + +#include + +namespace { + +using namespace spc; + +TEST(SeverityLabel, KnownValues) { + EXPECT_EQ(severity_from_label("MRGL"), 1); + EXPECT_EQ(severity_from_label("SLGT"), 2); + EXPECT_EQ(severity_from_label("ENH"), 3); + EXPECT_EQ(severity_from_label("MDT"), 4); + EXPECT_EQ(severity_from_label("HIGH"), 5); + EXPECT_EQ(severity_from_label("TSTM"), 1); + EXPECT_EQ(severity_from_label("UNKNOWN"), 0); + EXPECT_EQ(severity_from_label(""), 0); +} + +TEST(Parser, EmptyFeatures) { + const CategoricalOutlookPayload p = + parse_categorical(R"({"type":"FeatureCollection","features":[]})", 1); + EXPECT_TRUE(p.features.empty()); + EXPECT_EQ(p.day_offset, 1); +} + +TEST(Parser, CategoricalPolygon) { + const CategoricalOutlookPayload p = parse_categorical(R"({ + "type": "FeatureCollection", + "features": [{ + "type": "Feature", + "properties": { + "LABEL": "SLGT", + "ISSUE": "202604170100", + "VALID": "202604171200", + "EXPIRE": "202604181200" + }, + "geometry": { + "type": "Polygon", + "coordinates": [[[-98, 34], [-94, 34], [-94, 38], [-98, 38], [-98, 34]]] + } + }] + })", + 1); + ASSERT_EQ(p.features.size(), 1u); + EXPECT_EQ(p.features[0].label, "SLGT"); + EXPECT_EQ(p.features[0].severity, 2); + ASSERT_EQ(p.features[0].rings.size(), 1u); + EXPECT_EQ(p.features[0].rings[0].size(), 5u); +} + +TEST(Parser, MultiPolygon) { + const CategoricalOutlookPayload p = parse_categorical(R"({ + "type": "FeatureCollection", + "features": [{ + "type": "Feature", + "properties": {"LABEL": "ENH"}, + "geometry": { + "type": "MultiPolygon", + "coordinates": [ + [[[-100, 35], [-98, 35], [-98, 37], [-100, 37], [-100, 35]]], + [[[-85, 30], [-83, 30], [-83, 32], [-85, 32], [-85, 30]]] + ] + } + }] + })", + 1); + ASSERT_EQ(p.features.size(), 1u); + EXPECT_EQ(p.features[0].severity, 3); + ASSERT_EQ(p.features[0].rings.size(), 2u); +} + +TEST(Parser, ProbabilisticTornado) { + const ProbOutlookPayload p = parse_probabilistic(R"({ + "type": "FeatureCollection", + "features": [ + {"properties": {"LABEL": "2"}, + "geometry": {"type":"Polygon","coordinates":[[[-100,34],[-95,34],[-95,38],[-100,38],[-100,34]]]}}, + {"properties": {"LABEL": "5"}, + "geometry": {"type":"Polygon","coordinates":[[[-99,35],[-96,35],[-96,37],[-99,37],[-99,35]]]}} + ] + })", + 1, "tornado"); + ASSERT_EQ(p.features.size(), 2u); + EXPECT_EQ(p.features[0].hazard, "tornado"); + EXPECT_DOUBLE_EQ(p.features[0].probability, 0.02); + EXPECT_DOUBLE_EQ(p.features[1].probability, 0.05); +} + +TEST(Parser, UnknownLabelSkipped) { + const CategoricalOutlookPayload p = parse_categorical(R"({ + "type": "FeatureCollection", + "features": [{"properties":{"LABEL":"XYZ"},"geometry":{"type":"Polygon","coordinates":[[[0,0],[1,0],[1,1],[0,1],[0,0]]]}}] + })", + 1); + EXPECT_TRUE(p.features.empty()); +} + +} // namespace diff --git a/tools/cpp_auto_allowlist.txt b/tools/cpp_auto_allowlist.txt new file mode 100644 index 0000000..46e061f --- /dev/null +++ b/tools/cpp_auto_allowlist.txt @@ -0,0 +1,3 @@ +# Repo-owned exceptions for the explicit local-type policy. +# Format: relative/path.cpp|line snippet +# Empty by design — net-new parsers spell out types or mark `// auto-ok`. diff --git a/tools/cpp_auto_audit.py b/tools/cpp_auto_audit.py new file mode 100644 index 0000000..8663bb7 --- /dev/null +++ b/tools/cpp_auto_audit.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python3 +"""Audit repo-owned C++ sources for disallowed local ``auto`` usage. + +Policy: +- allow ``auto`` for structured bindings +- allow ``auto`` for lambda closure objects +- allow ``auto`` for iterator-like values +- allow explicit one-off exceptions marked with ``auto-ok`` + +Everything else is expected to spell out the type directly. Repos can +carry a local allowlist while older files are being burned down. The +allowlist format is one rule per line: + + relative/path.cpp|line snippet + +The snippet is matched as a substring against the stripped source line. +""" + +from __future__ import annotations + +import argparse +import subprocess +import sys +from dataclasses import dataclass +from pathlib import Path +import re + + +CPP_SUFFIXES = {".cpp", ".hpp", ".cc", ".cxx", ".hh", ".hxx"} +DEFAULT_ALLOWLIST = "tools/cpp_auto_allowlist.txt" +WORD_AUTO = re.compile(r"\bauto\b") +STRUCTURED_BINDING = re.compile(r"\bauto(?:\s*[\*&])?\s*\[") +DECLARATION_AUTO = re.compile( + r"^\s*(?:for\s*\(\s*)?(?:const\s+|constexpr\s+|static\s+|volatile\s+|mutable\s+)*" + r"auto(?:\s*[\*&])?\s*(?:\w+|\[)" +) + +ITERATOR_HINTS = ( + ".begin(", + ".end(", + ".cbegin(", + ".cend(", + ".rbegin(", + ".rend(", + ".crbegin(", + ".crend(", + ".find(", + ".lower_bound(", + ".upper_bound(", + ".equal_range(", + "std::begin(", + "std::end(", + "std::cbegin(", + "std::cend(", + "std::find(", + "std::lower_bound(", + "std::upper_bound(", + "std::equal_range(", + "std::max_element(", + "std::min_element(", + "std::prev(", + "std::next(", +) + + +@dataclass(frozen=True, slots=True) +class AllowRule: + relative_path: str + snippet: str + + +@dataclass(frozen=True, slots=True) +class Violation: + relative_path: str + line_number: int + line: str + + +def tracked_cpp_files(repo_root: Path) -> list[Path]: + # ``git ls-files`` returns tracked files only — a brand-new + # untracked test file is invisible to local audit but still + # caught by CI once it's committed, which makes the divergence + # surface as a CI fail after the developer thought they ran + # lint clean. Also include ``--others --exclude-standard`` so + # untracked-but-not-ignored files (typical for fresh test files) + # get audited too. + proc = subprocess.run( + ["git", "ls-files", "--cached", "--others", "--exclude-standard"], + cwd=repo_root, + check=True, + capture_output=True, + text=True, + ) + seen: set[Path] = set() + files: list[Path] = [] + for raw in proc.stdout.splitlines(): + path = repo_root / raw + if path in seen: + continue + seen.add(path) + if path.suffix not in CPP_SUFFIXES: + continue + if any(part.startswith("build") for part in path.parts): + continue + if "_deps" in path.parts: + continue + files.append(path) + return files + + +def read_allowlist(path: Path) -> list[AllowRule]: + if not path.exists(): + return [] + rules: list[AllowRule] = [] + for raw in path.read_text().splitlines(): + stripped = raw.strip() + if not stripped or stripped.startswith("#"): + continue + relative_path, sep, snippet = stripped.partition("|") + if not sep: + raise ValueError(f"invalid allowlist rule: {raw!r}") + rules.append(AllowRule(relative_path=relative_path.strip(), snippet=snippet.strip())) + return rules + + +def is_lambda_closure(line: str) -> bool: + if "=" not in line: + return False + eq_index = line.find("=") + open_bracket = line.find("[", eq_index) + close_bracket = line.find("]", open_bracket + 1) if open_bracket != -1 else -1 + return open_bracket != -1 and close_bracket != -1 and close_bracket > open_bracket + + +def is_iterator_like(line: str) -> bool: + return any(hint in line for hint in ITERATOR_HINTS) + + +def is_allowed_auto(line: str) -> bool: + stripped = line.strip() + if "auto-ok" in stripped: + return True + if not DECLARATION_AUTO.search(stripped): + return True + if STRUCTURED_BINDING.search(stripped): + return True + if is_lambda_closure(stripped): + return True + if is_iterator_like(stripped): + return True + return False + + +def matches_allowlist(relative_path: str, line: str, rules: list[AllowRule]) -> bool: + stripped = line.strip() + for rule in rules: + if rule.relative_path == relative_path and rule.snippet in stripped: + return True + return False + + +def collect_violations(repo_root: Path, allowlist: list[AllowRule]) -> list[Violation]: + violations: list[Violation] = [] + for path in tracked_cpp_files(repo_root): + relative_path = path.relative_to(repo_root).as_posix() + for line_number, line in enumerate(path.read_text().splitlines(), start=1): + if not WORD_AUTO.search(line): + continue + if is_allowed_auto(line): + continue + if matches_allowlist(relative_path, line, allowlist): + continue + violations.append( + Violation(relative_path=relative_path, line_number=line_number, line=line.rstrip()) + ) + return violations + + +def parse_args() -> argparse.Namespace: + parser = argparse.ArgumentParser() + parser.add_argument("--repo-root", default=".") + parser.add_argument("--allowlist", default=DEFAULT_ALLOWLIST) + parser.add_argument("--write-allowlist", action="store_true") + return parser.parse_args() + + +def write_allowlist(path: Path, violations: list[Violation]) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + lines = [ + "# Repo-owned exceptions for the explicit local-type policy.", + "# Format: relative/path.cpp|line snippet", + ] + for violation in violations: + lines.append(f"{violation.relative_path}|{violation.line.strip()}") + path.write_text("\n".join(lines) + "\n") + + +def main() -> int: + args = parse_args() + repo_root = Path(args.repo_root).resolve() + allowlist_path = repo_root / args.allowlist + allowlist = read_allowlist(allowlist_path) + violations = collect_violations(repo_root, allowlist) + if args.write_allowlist: + write_allowlist(allowlist_path, violations) + return 0 + if not violations: + print("cpp_auto_audit: no disallowed local auto usage found") + return 0 + print("cpp_auto_audit: disallowed local auto usage found", file=sys.stderr) + for violation in violations: + print( + f"{violation.relative_path}:{violation.line_number}: {violation.line.strip()}", + file=sys.stderr, + ) + return 1 + + +if __name__ == "__main__": + raise SystemExit(main())