devto 2026-10-10 원문 보기 ↗
If you run a roofing or restoration company, you have probably paid for a hail map. The raw data behind most of them is public: the NOAA Storm Prediction Center (SPC) publishes a CSV of every hail, damaging-wind and tornado report for every day since 2004.
The files are awkward to use directly:
175 means 1.75").https://www.spc.noaa.gov/climo/reports/ for the dates you need (YYMMDD_rpts_hail.csv, _wind.csv, _torn.csv).Size column by 100 to get inches.from math import radians, sin, cos, asin, sqrt
def miles(lat1, lon1, lat2, lon2):
lat1, lon1, lat2, lon2 = map(radians, (lat1, lon1, lat2, lon2))
a = sin((lat2 - lat1) / 2) ** 2 + cos(lat1) * cos(lat2) * sin((lon2 - lon1) / 2) ** 2
return 3958.8 * 2 * asin(sqrt(a))
I packaged those steps as an Apify Actor: NOAA Hail, Wind & Tornado Storm Reports. Give it a date range, a state or a point and radius, and a minimum hail size. It returns one row per report with hail size in inches, wind in mph, UTC time, coordinates, county, state and distance in miles. You can export the result as CSV or Excel.
These are ground reports from storm spotters and National Weather Service offices, not radar estimates. Dense areas are well covered; storms over open country can go unreported. For checking a customer's date of loss that is usually what you want, because a logged report is evidence an adjuster recognises. For mapping every square mile a storm touched, you would need radar-derived hail swaths instead.
Questions about the data or the edge cases (the UTC day boundary catches most people) are welcome in the comments.