{
 "region": "chicago",
 "region_name": "Chicago / Lake Michigan",
 "tz": "America/Chicago",
 "run_time": "2026-10-19T21:30-05:00",
 "morning": "2026-10-20",
 "sites": [
  {
   "id": "chicago-riverwalk-state-wabash",
   "name": "Chicago Riverwalk - between the Clark St and DuSable bridges (State/Wabash reach)",
   "lat": 41.887234,
   "lon": -87.6272264,
   "elevation_m": 178.3,
   "position": "riverwalk",
   "agency": "City of Chicago (the Riverwalk site footer names the Department of Fleet & Facility Management; not Chicago Park District)",
   "agency_url": "https://www.chicago.gov/city/en/sites/chicagoriverwalk/home.html",
   "dawn_access": "Chicago Riverwalk FAQ: \"The Riverwalk is open from 6 am to 11 pm.\" Home page: \"Free to the public | Hours 6 am - 11 pm\". ADA ramps at \"East side of State Street\", \"West side of Clark Street\". Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "No drone rule on the Riverwalk FAQ or home page (searched both for 'drone': none). City rules apply: City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://occprodstoragev1.blob.core.usgovcloudapi.net/lsmatterattachmentspublic/c68378a1-66a3-470c-bdcb-69ab29c6e32d.pdf",
   "drone_status": "permit",
   "features": [
    "Chicago River (main branch)",
    "walkway below Upper Wacker Drive (per Riverwalk FAQ)"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Chicago%20Riverwalk%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 504093803 (leisure=park, 'Chicago Riverwalk'); the point is the centroid of that polygon, which by longitude lies between the Clark St bridge (-87.6310) and DuSable bridge (-87.6244). Nominatim has no State St or Wabash Ave bridge, so those two segments are not separately geocoded. Ground elevation: USGS EPQS 3DEP 1 m DEM 178.3 m (https://epqs.nationalmap.gov/v1/json?x=-87.6272264&y=41.887234&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 3.06 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 8.29 nm / 9.54 mi, KORD 13.65 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (1.57 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 0.07 km away at bearing 276 deg; Willis Tower 1.19 km at 217 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Elevation 178.3 m is the DEM at the polygon centroid; the riverside walkway itself is a few metres lower. Fog/low cloud: river channel air is a likely first place for pooled fog, unverified.",
   "look": "towers vanishing into a low deck from street level; mist glow from the river at dawn",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.25,
    "raw_blend": 0.781,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.37,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.5 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.25,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.5,
       "wind_after": 1.45,
       "gust_max": 4.3,
       "cloud_mh_night": 1.0,
       "cloud_low_night": 38.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 0.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 3,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 12.9,
       "t_key": 5.4,
       "cooling": 7.5,
       "t_min_night": 5.4,
       "td_afternoon": 6.6,
       "crossover": -1.1999999999999993,
       "td_drop": 1.1999999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.40000000000009095,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.5,
         "Td": 7.5,
         "RH": 82,
         "wind": 1.4,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14400.0
        },
        {
         "t": "22:00",
         "T": 9.5,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.3,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "23:00",
         "T": 9.8,
         "Td": 6.2,
         "RH": 78,
         "wind": 2.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "00:00",
         "T": 10.0,
         "Td": 6.9,
         "RH": 81,
         "wind": 2.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.1,
         "Td": 6.2,
         "RH": 82,
         "wind": 3.1,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 13400.0
        },
        {
         "t": "02:00",
         "T": 8.2,
         "Td": 4.7,
         "RH": 79,
         "wind": 1.6,
         "low": 9,
         "mid": 9,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "03:00",
         "T": 7.9,
         "Td": 4.5,
         "RH": 79,
         "wind": 1.0,
         "low": 12,
         "mid": 0,
         "high": 2,
         "vis": 14400.0
        },
        {
         "t": "04:00",
         "T": 6.4,
         "Td": 4.8,
         "RH": 90,
         "wind": 1.8,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "05:00",
         "T": 5.8,
         "Td": 5.2,
         "RH": 96,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 5.7,
         "Td": 5.5,
         "RH": 99,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.4,
         "Td": 5.4,
         "RH": 100,
         "wind": 1.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "08:00",
         "T": 5.3,
         "Td": 5.3,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 7.8,
         "Td": 7.6,
         "RH": 99,
         "wind": 1.7,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.6,
         "Td": 10.5,
         "RH": 87,
         "wind": 0.8,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.5,
         "RH": 80,
         "wind": 2.0,
         "low": 7,
         "mid": 0,
         "high": 0,
         "vis": 18900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.93,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.5 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.4 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 -1.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (3 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.983
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.1000000000000005,
       "dpd_key": 2.200000000000001,
       "rh_max": 87,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 19.454545454545453,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 16.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.8,
       "t_key": 9.8,
       "cooling": 5.0,
       "t_min_night": 9.8,
       "td_afternoon": 6.65,
       "crossover": 3.1500000000000004,
       "td_drop": -0.9499999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.6,
         "Td": 8.6,
         "RH": 72,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.2,
         "Td": 8.7,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.9,
         "Td": 9.0,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.3,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 8.7,
         "RH": 82,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 8.1,
         "RH": 80,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.8,
         "Td": 7.9,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 8.0,
         "RH": 86,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.9,
         "Td": 7.5,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 7.7,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 7.7,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.3,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.1,
         "Td": 9.7,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.4,
         "Td": 10.0,
         "RH": 70,
         "wind": 2.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.37,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 19 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.6,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.0 \u00b0C"
       },
       "moisture": {
        "score": 0.23,
        "why": "crossover: forecast night minimum 9.8 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +3.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.666
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.0,
       "crossover": 2.1999999999999993,
       "td_drop": -0.5,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.6,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.1,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.6,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.6,
         "Td": 7.2,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.6,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.1,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.0,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.0,
         "Td": 10.4,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.8,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.37,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.613
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.5,
       "crossover": 6.4,
       "td_drop": -5.0,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.6,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.5,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.3,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.887234&longitude=-87.6272264&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.887234&longitude=-87.6272264&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:55+00:00",
     "elevation_m": 182.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.887234&longitude=-87.6272264&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:55+00:00",
     "elevation_m": 182.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.887234&longitude=-87.6272264&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:55+00:00",
     "elevation_m": 182.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.887234&longitude=-87.6272264&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:55+00:00",
     "elevation_m": 182.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.4,
   "dawn_wind_kt": 1.0
  },
  {
   "id": "home",
   "name": "DuSable Bridge (Michigan Ave)",
   "lat": 41.8888243,
   "lon": -87.6243899,
   "elevation_m": 175.6,
   "position": "bridge",
   "agency": "City of Chicago Department of Transportation (CDOT)",
   "agency_url": "https://www.chicago.gov/city/en/depts/cdot/provdrs/bridge/supp_info/cmbp.html",
   "dawn_access": "No hours published; public street bridge (assumed always open to pedestrians; not stated on any page I found). CDOT raises the Main and South Branch bridges for boats in spring and fall (spring 2026 lifts began Wed 22 April, per CDOT news item); fall schedule not checked. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": null,
   "drone_rule": "No bridge-specific drone rule found. CDOT page: \"CDOT is responsible for more than 300 bridge and viaduct structures, including 37 operable movable bridges\". City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://occprodstoragev1.blob.core.usgovcloudapi.net/lsmatterattachmentspublic/c68378a1-66a3-470c-bdcb-69ab29c6e32d.pdf",
   "drone_status": "permit",
   "features": [
    "Chicago River",
    "bridge deck"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=DuSable%20Bridge%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 548266139 (man_made=bridge) Ground elevation: USGS EPQS 3DEP 1 m DEM 175.6 m (https://epqs.nationalmap.gov/v1/json?x=-87.6243899&y=41.8888243&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 3.21 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 8.45 nm / 9.72 mi, KORD 13.73 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (1.63 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 0.35 km away at bearing 241 deg; Willis Tower 1.47 km at 221 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. DEM reads 175.6 m here (river surface; every bridge point returned the same value), so the deck is higher by an unmeasured amount. Trump, Wrigley, Tribune and NBC towers are within about 0.5 km.",
   "look": "river mist and lit towers in cloud; shoot up the canyon",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.26,
    "raw_blend": 0.783,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.369,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.5 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.26,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.5,
       "wind_after": 1.45,
       "gust_max": 4.3,
       "cloud_mh_night": 1.0,
       "cloud_low_night": 38.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 0.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 3,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 13.0,
       "t_key": 5.5,
       "cooling": 7.5,
       "t_min_night": 5.5,
       "td_afternoon": 6.6,
       "crossover": -1.0999999999999996,
       "td_drop": 1.0999999999999996,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.5,
         "Td": 7.6,
         "RH": 82,
         "wind": 1.4,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14400.0
        },
        {
         "t": "22:00",
         "T": 9.6,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.3,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "23:00",
         "T": 9.9,
         "Td": 6.2,
         "RH": 78,
         "wind": 2.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "00:00",
         "T": 10.1,
         "Td": 6.9,
         "RH": 81,
         "wind": 2.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.1,
         "Td": 6.2,
         "RH": 82,
         "wind": 3.1,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 13400.0
        },
        {
         "t": "02:00",
         "T": 8.2,
         "Td": 4.8,
         "RH": 79,
         "wind": 1.6,
         "low": 9,
         "mid": 9,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "03:00",
         "T": 8.0,
         "Td": 4.5,
         "RH": 79,
         "wind": 1.0,
         "low": 12,
         "mid": 0,
         "high": 2,
         "vis": 14400.0
        },
        {
         "t": "04:00",
         "T": 6.4,
         "Td": 4.9,
         "RH": 90,
         "wind": 1.8,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "05:00",
         "T": 5.8,
         "Td": 5.2,
         "RH": 96,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 5.7,
         "Td": 5.6,
         "RH": 99,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.5,
         "Td": 5.5,
         "RH": 100,
         "wind": 1.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "08:00",
         "T": 5.3,
         "Td": 5.3,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 7.8,
         "Td": 7.7,
         "RH": 99,
         "wind": 1.7,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.6,
         "Td": 10.5,
         "RH": 87,
         "wind": 0.8,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.5,
         "RH": 80,
         "wind": 2.0,
         "low": 7,
         "mid": 0,
         "high": 0,
         "vis": 18900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.93,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.5 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.5 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 -1.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (3 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.983
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.000000000000001,
       "dpd_key": 2.200000000000001,
       "rh_max": 87,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 19.454545454545453,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 16.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.8,
       "t_key": 9.8,
       "cooling": 5.0,
       "t_min_night": 9.8,
       "td_afternoon": 6.65,
       "crossover": 3.1500000000000004,
       "td_drop": -0.9499999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.6,
         "Td": 8.7,
         "RH": 72,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.2,
         "Td": 8.7,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.9,
         "Td": 9.0,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.3,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 8.8,
         "RH": 82,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 8.1,
         "RH": 80,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.8,
         "Td": 7.9,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 8.0,
         "RH": 86,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.9,
         "Td": 7.5,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 7.8,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 7.7,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.3,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.1,
         "Td": 9.8,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.4,
         "Td": 10.0,
         "RH": 70,
         "wind": 2.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 19 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.6,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.0 \u00b0C"
       },
       "moisture": {
        "score": 0.23,
        "why": "crossover: forecast night minimum 9.8 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +3.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.673
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.05,
       "crossover": 2.1499999999999995,
       "td_drop": -0.4500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6999999999999318,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.7,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.2,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.2,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.7,
         "Td": 7.3,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.7,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.2,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.0,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 10.5,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.9,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.614
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.1,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8888243&longitude=-87.6243899&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8888243&longitude=-87.6243899&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:55+00:00",
     "elevation_m": 176.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8888243&longitude=-87.6243899&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:55+00:00",
     "elevation_m": 176.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8888243&longitude=-87.6243899&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:56+00:00",
     "elevation_m": 176.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8888243&longitude=-87.6243899&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:56+00:00",
     "elevation_m": 176.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.5,
   "dawn_wind_kt": 1.0
  },
  {
   "id": "kinzie-street-bridge",
   "name": "Kinzie Street Bridge",
   "lat": 41.8890782,
   "lon": -87.6394928,
   "elevation_m": 175.6,
   "position": "bridge",
   "agency": "City of Chicago Department of Transportation (CDOT)",
   "agency_url": "https://www.chicago.gov/city/en/depts/cdot/provdrs/bridge/supp_info/cmbp.html",
   "dawn_access": "No hours published; public street bridge (assumed always open to pedestrians; not stated on any page I found). CDOT raises the Main and South Branch bridges for boats in spring and fall (spring 2026 lifts began Wed 22 April, per CDOT news item); fall schedule not checked. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": null,
   "drone_rule": "No bridge-specific drone rule found. CDOT page: \"CDOT is responsible for more than 300 bridge and viaduct structures, including 37 operable movable bridges\". City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://occprodstoragev1.blob.core.usgovcloudapi.net/lsmatterattachmentspublic/c68378a1-66a3-470c-bdcb-69ab29c6e32d.pdf",
   "drone_status": "permit",
   "features": [
    "Chicago River",
    "bridge deck"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Kinzie%20Street%20Bridge%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 992404356 (man_made=bridge) Ground elevation: USGS EPQS 3DEP 1 m DEM 175.6 m (https://epqs.nationalmap.gov/v1/json?x=-87.6394928&y=41.8890782&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 2.75 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 8.01 nm / 9.22 mi, KORD 13.11 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (1.9 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 0.97 km away at bearing 102 deg; Willis Tower 1.19 km at 166 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. DEM reads 175.6 m (river surface). Nominatim way is the West Kinzie Street bridge; Kinzie St Railroad Bridge is a different structure and was not geocoded.",
   "look": "river mist and lit towers in cloud; shoot up the canyon",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:09",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:23",
    "sun_12deg": "08:22"
   },
   "score": {
    "fog_probability": 0.26,
    "raw_blend": 0.783,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.37,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.5 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:09",
     "est_end": "10:39",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.26,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.5,
       "wind_after": 1.45,
       "gust_max": 4.3,
       "cloud_mh_night": 1.0,
       "cloud_low_night": 38.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 0.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 3,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 12.9,
       "t_key": 5.4,
       "cooling": 7.5,
       "t_min_night": 5.4,
       "td_afternoon": 6.6,
       "crossover": -1.1999999999999993,
       "td_drop": 1.1999999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.40000000000009095,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.5,
         "Td": 7.5,
         "RH": 82,
         "wind": 1.4,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14400.0
        },
        {
         "t": "22:00",
         "T": 9.5,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.3,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "23:00",
         "T": 9.8,
         "Td": 6.2,
         "RH": 78,
         "wind": 2.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "00:00",
         "T": 10.0,
         "Td": 6.9,
         "RH": 81,
         "wind": 2.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.1,
         "Td": 6.2,
         "RH": 82,
         "wind": 3.1,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 13400.0
        },
        {
         "t": "02:00",
         "T": 8.2,
         "Td": 4.7,
         "RH": 79,
         "wind": 1.6,
         "low": 9,
         "mid": 9,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "03:00",
         "T": 7.9,
         "Td": 4.5,
         "RH": 79,
         "wind": 1.0,
         "low": 12,
         "mid": 0,
         "high": 2,
         "vis": 14400.0
        },
        {
         "t": "04:00",
         "T": 6.4,
         "Td": 4.8,
         "RH": 90,
         "wind": 1.8,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "05:00",
         "T": 5.8,
         "Td": 5.2,
         "RH": 96,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 5.7,
         "Td": 5.5,
         "RH": 99,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.4,
         "Td": 5.4,
         "RH": 100,
         "wind": 1.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "08:00",
         "T": 5.3,
         "Td": 5.3,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 7.8,
         "Td": 7.6,
         "RH": 99,
         "wind": 1.7,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.6,
         "Td": 10.5,
         "RH": 87,
         "wind": 0.8,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.5,
         "RH": 80,
         "wind": 2.0,
         "low": 7,
         "mid": 0,
         "high": 0,
         "vis": 18900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.93,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.5 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.4 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 -1.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (3 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.983
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.9999999999999991,
       "dpd_key": 2.2,
       "rh_max": 87,
       "wind_mean": 0.8,
       "wind_after": 1.2,
       "gust_max": 2.1,
       "cloud_mh_night": 21.818181818181817,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 20.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.8,
       "t_key": 9.5,
       "cooling": 5.300000000000001,
       "t_min_night": 9.5,
       "td_afternoon": 6.35,
       "crossover": 3.1500000000000004,
       "td_drop": -0.9500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.4,
         "Td": 8.5,
         "RH": 72,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.1,
         "Td": 8.6,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.7,
         "Td": 8.8,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.2,
         "Td": 8.7,
         "RH": 79,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 8.5,
         "RH": 81,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.1,
         "Td": 8.0,
         "RH": 81,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.6,
         "Td": 7.9,
         "RH": 83,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.1,
         "Td": 7.7,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.7,
         "Td": 7.5,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "06:00",
         "T": 9.7,
         "Td": 7.7,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.5,
         "Td": 7.3,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.3,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.2,
         "Td": 8.9,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.2,
         "Td": 9.9,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.6,
         "Td": 10.0,
         "RH": 69,
         "wind": 2.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.9,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.98,
        "why": "overnight total cloud (levels unavailable) cloud = 22 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.64,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.3 \u00b0C"
       },
       "moisture": {
        "score": 0.23,
        "why": "crossover: forecast night minimum 9.5 \u00b0C vs afternoon dewpoint 6.3 \u00b0C \u2192 +3.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.673
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.0,
       "crossover": 2.1999999999999993,
       "td_drop": -0.5,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.6,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.1,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.6,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.6,
         "Td": 7.2,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.6,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.1,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.0,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.0,
         "Td": 10.4,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.8,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.37,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.613
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.5,
       "crossover": 6.4,
       "td_drop": -5.0,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.6,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.5,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.3,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8890782&longitude=-87.6394928&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8890782&longitude=-87.6394928&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:56+00:00",
     "elevation_m": 182.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8890782&longitude=-87.6394928&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:56+00:00",
     "elevation_m": 182.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8890782&longitude=-87.6394928&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:56+00:00",
     "elevation_m": 182.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8890782&longitude=-87.6394928&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:56+00:00",
     "elevation_m": 182.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.4,
   "dawn_wind_kt": 1.0
  },
  {
   "id": "clark-street-bridge",
   "name": "Clark Street Bridge",
   "lat": 41.8875108,
   "lon": -87.6310326,
   "elevation_m": 175.6,
   "position": "bridge",
   "agency": "City of Chicago Department of Transportation (CDOT)",
   "agency_url": "https://www.chicago.gov/city/en/depts/cdot/provdrs/bridge/supp_info/cmbp.html",
   "dawn_access": "No hours published; public street bridge (assumed always open to pedestrians; not stated on any page I found). CDOT raises the Main and South Branch bridges for boats in spring and fall (spring 2026 lifts began Wed 22 April, per CDOT news item); fall schedule not checked. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": null,
   "drone_rule": "No bridge-specific drone rule found. CDOT page: \"CDOT is responsible for more than 300 bridge and viaduct structures, including 37 operable movable bridges\". City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://occprodstoragev1.blob.core.usgovcloudapi.net/lsmatterattachmentspublic/c68378a1-66a3-470c-bdcb-69ab29c6e32d.pdf",
   "drone_status": "permit",
   "features": [
    "Chicago River",
    "bridge deck"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Clark%20Street%20Bridge%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 548929212 (man_made=bridge) Ground elevation: USGS EPQS 3DEP 1 m DEM 175.6 m (https://epqs.nationalmap.gov/v1/json?x=-87.6310326&y=41.8875108&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 2.94 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 8.19 nm / 9.42 mi, KORD 13.49 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (1.64 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 0.25 km away at bearing 95 deg; Willis Tower 1.06 km at 203 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. DEM reads 175.6 m (river surface).",
   "look": "river mist and lit towers in cloud; shoot up the canyon",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.26,
    "raw_blend": 0.783,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.369,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.5 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.26,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.5,
       "wind_after": 1.45,
       "gust_max": 4.3,
       "cloud_mh_night": 1.0,
       "cloud_low_night": 38.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 0.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 3,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 12.7,
       "t_key": 5.2,
       "cooling": 7.499999999999999,
       "t_min_night": 5.2,
       "td_afternoon": 6.4,
       "crossover": -1.2000000000000002,
       "td_drop": 1.2000000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.40000000000009095,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.3,
         "Td": 7.3,
         "RH": 82,
         "wind": 1.4,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14400.0
        },
        {
         "t": "22:00",
         "T": 9.3,
         "Td": 6.6,
         "RH": 83,
         "wind": 4.3,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "23:00",
         "T": 9.6,
         "Td": 6.0,
         "RH": 78,
         "wind": 2.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "00:00",
         "T": 9.8,
         "Td": 6.7,
         "RH": 81,
         "wind": 2.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 8.9,
         "Td": 6.0,
         "RH": 82,
         "wind": 3.1,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 13400.0
        },
        {
         "t": "02:00",
         "T": 8.0,
         "Td": 4.6,
         "RH": 79,
         "wind": 1.6,
         "low": 9,
         "mid": 9,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "03:00",
         "T": 7.7,
         "Td": 4.3,
         "RH": 79,
         "wind": 1.0,
         "low": 12,
         "mid": 0,
         "high": 2,
         "vis": 14400.0
        },
        {
         "t": "04:00",
         "T": 6.2,
         "Td": 4.7,
         "RH": 90,
         "wind": 1.8,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "05:00",
         "T": 5.6,
         "Td": 5.0,
         "RH": 96,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 5.5,
         "Td": 5.3,
         "RH": 99,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.2,
         "Td": 5.2,
         "RH": 100,
         "wind": 1.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "08:00",
         "T": 5.1,
         "Td": 5.1,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 7.6,
         "Td": 7.4,
         "RH": 99,
         "wind": 1.7,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.4,
         "Td": 10.3,
         "RH": 87,
         "wind": 0.8,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "11:00",
         "T": 14.7,
         "Td": 11.3,
         "RH": 80,
         "wind": 2.0,
         "low": 7,
         "mid": 0,
         "high": 0,
         "vis": 18900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.93,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.5 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.2 \u00b0C vs afternoon dewpoint 6.4 \u00b0C \u2192 -1.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (3 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.983
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.0,
       "dpd_key": 2.1999999999999993,
       "rh_max": 87,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 19.454545454545453,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 16.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.6,
       "t_key": 9.6,
       "cooling": 5.0,
       "t_min_night": 9.6,
       "td_afternoon": 6.45,
       "crossover": 3.1499999999999995,
       "td_drop": -0.9500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.4,
         "Td": 8.5,
         "RH": 72,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.0,
         "Td": 8.5,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.7,
         "Td": 8.8,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 8.8,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.5,
         "Td": 8.5,
         "RH": 82,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.2,
         "Td": 7.9,
         "RH": 80,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.6,
         "Td": 7.7,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.0,
         "Td": 7.8,
         "RH": 86,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.7,
         "Td": 7.3,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.6,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 7.4,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 7.5,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 8.8,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 13.9,
         "Td": 9.6,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 9.8,
         "RH": 70,
         "wind": 2.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 19 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.6,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.0 \u00b0C"
       },
       "moisture": {
        "score": 0.23,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 6.5 \u00b0C \u2192 +3.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.673
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.3999999999999995,
       "dpd_key": 2.2,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.3,
       "t_key": 8.5,
       "cooling": 6.800000000000001,
       "t_min_night": 8.0,
       "td_afternoon": 5.85,
       "crossover": 2.1500000000000004,
       "td_drop": -0.4500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.7000000000000455,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.6,
         "Td": 8.5,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 11.9,
         "Td": 8.2,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.1,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.2,
         "Td": 7.6,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.4,
         "Td": 7.4,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 8.9,
         "Td": 7.2,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.2,
         "Td": 6.8,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.0,
         "Td": 6.4,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.0,
         "Td": 5.9,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.5,
         "Td": 6.3,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 9.9,
         "Td": 7.8,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 11.8,
         "Td": 10.2,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.6,
         "Td": 11.6,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.0,
         "Td": 11.4,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.0 \u00b0C vs afternoon dewpoint 5.8 \u00b0C \u2192 +2.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.614
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.3999999999999995,
       "dpd_key": 1.3999999999999995,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.2,
       "t_key": 8.7,
       "cooling": 8.5,
       "t_min_night": 8.7,
       "td_afternoon": 2.35,
       "crossover": 6.35,
       "td_drop": -4.949999999999999,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.0,
         "Td": 7.8,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.7,
         "Td": 7.8,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.4,
         "Td": 7.5,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 11.9,
         "Td": 7.2,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.4,
         "Td": 6.9,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.1,
         "Td": 6.8,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.1,
         "Td": 7.2,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 10.8,
         "Td": 7.7,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.2,
         "Td": 7.8,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.4,
         "Td": 7.5,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 7.3,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.3,
         "Td": 7.4,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.5,
         "Td": 8.1,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.5,
         "Td": 9.2,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.4,
         "Td": 7.8,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.7 \u00b0C vs afternoon dewpoint 2.4 \u00b0C \u2192 +6.3 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8875108&longitude=-87.6310326&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8875108&longitude=-87.6310326&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:57+00:00",
     "elevation_m": 211.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8875108&longitude=-87.6310326&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:57+00:00",
     "elevation_m": 211.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8875108&longitude=-87.6310326&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:57+00:00",
     "elevation_m": 211.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8875108&longitude=-87.6310326&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:57+00:00",
     "elevation_m": 211.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.2,
   "dawn_wind_kt": 1.0
  },
  {
   "id": "wolf-point",
   "name": "Wolf Point (confluence of the three river branches)",
   "lat": 41.8867939,
   "lon": -87.6376712,
   "elevation_m": 175.6,
   "position": "riverwalk",
   "agency": "unknown (not found)",
   "agency_url": null,
   "dawn_access": "unknown: no official page found for Wolf Point or Wolf Point Plaza hours or manager. A Groupon listing says 6 am-11 pm for the Riverwalk generally; that is not an official source and not used. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": null,
   "drone_rule": "unknown: owner/manager not identified, so the property-owner consent clause applies to an unknown party. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://occprodstoragev1.blob.core.usgovcloudapi.net/lsmatterattachmentspublic/c68378a1-66a3-470c-bdcb-69ab29c6e32d.pdf",
   "drone_status": "unknown",
   "features": [
    "river confluence"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Wolf%20Point%2C%20Chicago&format=json&limit=1 - Nominatim OSM relation 17507919 (place=locality). Ground elevation: USGS EPQS 3DEP 1 m DEM 175.6 m (https://epqs.nationalmap.gov/v1/json?x=-87.6376712&y=41.8867939&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 2.7 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 7.96 nm / 9.16 mi, KORD 13.24 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (1.74 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 0.8 km away at bearing 86 deg; Willis Tower 0.91 km at 171 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Salesforce Tower (333 W Wolf Point Plaza) is within 0.2 km of this point by coordinates.",
   "look": "towers vanishing into a low deck from street level; mist glow from the river at dawn",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:09",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:23",
    "sun_12deg": "08:22"
   },
   "score": {
    "fog_probability": 0.27,
    "raw_blend": 0.795,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.369,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.5 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:09",
     "est_end": "10:39",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.27,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.5,
       "wind_after": 1.45,
       "gust_max": 4.3,
       "cloud_mh_night": 1.0,
       "cloud_low_night": 38.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 0.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 3,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 13.0,
       "t_key": 5.5,
       "cooling": 7.5,
       "t_min_night": 5.5,
       "td_afternoon": 6.6,
       "crossover": -1.0999999999999996,
       "td_drop": 1.0999999999999996,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.5,
         "Td": 7.6,
         "RH": 82,
         "wind": 1.4,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14400.0
        },
        {
         "t": "22:00",
         "T": 9.6,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.3,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "23:00",
         "T": 9.9,
         "Td": 6.2,
         "RH": 78,
         "wind": 2.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "00:00",
         "T": 10.1,
         "Td": 6.9,
         "RH": 81,
         "wind": 2.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.1,
         "Td": 6.2,
         "RH": 82,
         "wind": 3.1,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 13400.0
        },
        {
         "t": "02:00",
         "T": 8.2,
         "Td": 4.8,
         "RH": 79,
         "wind": 1.6,
         "low": 9,
         "mid": 9,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "03:00",
         "T": 8.0,
         "Td": 4.5,
         "RH": 79,
         "wind": 1.0,
         "low": 12,
         "mid": 0,
         "high": 2,
         "vis": 14400.0
        },
        {
         "t": "04:00",
         "T": 6.4,
         "Td": 4.9,
         "RH": 90,
         "wind": 1.8,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "05:00",
         "T": 5.8,
         "Td": 5.2,
         "RH": 96,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 5.7,
         "Td": 5.6,
         "RH": 99,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.5,
         "Td": 5.5,
         "RH": 100,
         "wind": 1.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "08:00",
         "T": 5.3,
         "Td": 5.3,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 7.8,
         "Td": 7.7,
         "RH": 99,
         "wind": 1.7,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.6,
         "Td": 10.5,
         "RH": 87,
         "wind": 0.8,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.5,
         "RH": 80,
         "wind": 2.0,
         "low": 7,
         "mid": 0,
         "high": 0,
         "vis": 18900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.93,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.5 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.5 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 -1.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (3 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.983
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.700000000000001,
       "dpd_key": 2.0999999999999996,
       "rh_max": 89,
       "wind_mean": 0.65,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 22.727272727272727,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 25.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.8,
       "t_key": 9.2,
       "cooling": 5.600000000000001,
       "t_min_night": 9.2,
       "td_afternoon": 6.85,
       "crossover": 2.3499999999999996,
       "td_drop": -0.25,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.3,
         "Td": 8.8,
         "RH": 74,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.8,
         "RH": 76,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.5,
         "Td": 9.0,
         "RH": 79,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.0,
         "Td": 8.7,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.4,
         "Td": 8.6,
         "RH": 83,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 10.8,
         "Td": 8.0,
         "RH": 83,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.3,
         "Td": 7.9,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.8,
         "Td": 7.7,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.4,
         "Td": 7.3,
         "RH": 87,
         "wind": 0.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 7.6,
         "RH": 89,
         "wind": 0.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 7.1,
         "RH": 87,
         "wind": 0.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 7.7,
         "RH": 85,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 460.0
        },
        {
         "t": "09:00",
         "T": 12.0,
         "Td": 8.8,
         "RH": 81,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.0,
         "Td": 9.8,
         "RH": 76,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.5,
         "Td": 10.0,
         "RH": 70,
         "wind": 2.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.52,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.7 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.89,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.7 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.96,
        "why": "overnight total cloud (levels unavailable) cloud = 23 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.68,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.6 \u00b0C"
       },
       "moisture": {
        "score": 0.35,
        "why": "crossover: forecast night minimum 9.2 \u00b0C vs afternoon dewpoint 6.8 \u00b0C \u2192 +2.3 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.721
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.05,
       "crossover": 2.1499999999999995,
       "td_drop": -0.4500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.7,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.2,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.2,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.7,
         "Td": 7.3,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.7,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.2,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.0,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 10.5,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.8,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.614
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.1,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8867939&longitude=-87.6376712&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8867939&longitude=-87.6376712&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:57+00:00",
     "elevation_m": 177.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8867939&longitude=-87.6376712&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:57+00:00",
     "elevation_m": 177.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8867939&longitude=-87.6376712&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:57+00:00",
     "elevation_m": 177.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8867939&longitude=-87.6376712&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:58+00:00",
     "elevation_m": 177.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.5,
   "dawn_wind_kt": 1.0
  },
  {
   "id": "adler-planetarium-solidarity-drive",
   "name": "Adler Planetarium / Solidarity Drive (Museum Campus peninsula)",
   "lat": 41.8663656,
   "lon": -87.6066259,
   "elevation_m": 184.9,
   "position": "lakefront",
   "agency": "Chicago Park District (Adler Planetarium page: \"Located Within: Northerly Island Park\")",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/adler-planetarium",
   "dawn_access": "Northerly Island Park (WebFetch of its CPD page; direct curl got HTTP 202 challenge): \"Sunday: 6:00 am-11:00 pm\" ... \"Saturday: 6:00 am-11:00 pm\". Adler building hours are the museum's own (adlerplanetarium.org); the outdoor promenade is not separately listed. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan shoreline",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Adler%20Planetarium%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 24825591 (amenity=planetarium, building). Solidarity Drive (Nominatim way 1059858849, 41.8664225,-87.6132091) is the access road about 0.5 km west; the classic skyline view is from the peninsula end by the Adler, so the building point is used. Ground elevation: USGS EPQS 3DEP 1 m DEM 184.9 m (https://epqs.nationalmap.gov/v1/json?x=-87.6066259&y=41.8663656&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3600 MSL-10000 MSL [AREA D]; MDW CLASS C 2300 MSL-3600 MSL (outer shelf, far above 400 ft AGL); ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 3.04 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 8.14 nm / 9.36 mi, KORD 15.02 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (0.51 nm), Rate Field (White Sox) (2.5 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 2.93 km away at bearing 323 deg; Willis Tower 2.79 km at 300 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Skyline is 2.9 km away so the towers appear small; Soldier Field is 0.5 nm away, so Bears home games close this area and put it inside the stadium TFR.",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.3,
    "raw_blend": 0.822,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.326,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.33); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.5 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.3,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.5,
       "wind_after": 1.45,
       "gust_max": 4.3,
       "cloud_mh_night": 1.0,
       "cloud_low_night": 38.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 0.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 3,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 12.9,
       "t_key": 5.4,
       "cooling": 7.5,
       "t_min_night": 5.4,
       "td_afternoon": 6.550000000000001,
       "crossover": -1.1500000000000004,
       "td_drop": 1.1500000000000004,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.5,
         "Td": 7.5,
         "RH": 82,
         "wind": 1.4,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14400.0
        },
        {
         "t": "22:00",
         "T": 9.5,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.3,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "23:00",
         "T": 9.8,
         "Td": 6.1,
         "RH": 78,
         "wind": 2.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "00:00",
         "T": 10.0,
         "Td": 6.9,
         "RH": 81,
         "wind": 2.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.1,
         "Td": 6.1,
         "RH": 82,
         "wind": 3.1,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 13400.0
        },
        {
         "t": "02:00",
         "T": 8.2,
         "Td": 4.7,
         "RH": 79,
         "wind": 1.6,
         "low": 9,
         "mid": 9,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "03:00",
         "T": 7.9,
         "Td": 4.5,
         "RH": 79,
         "wind": 1.0,
         "low": 12,
         "mid": 0,
         "high": 2,
         "vis": 14400.0
        },
        {
         "t": "04:00",
         "T": 6.4,
         "Td": 4.8,
         "RH": 90,
         "wind": 1.8,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "05:00",
         "T": 5.8,
         "Td": 5.2,
         "RH": 96,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 5.7,
         "Td": 5.5,
         "RH": 99,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.4,
         "Td": 5.4,
         "RH": 100,
         "wind": 1.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "08:00",
         "T": 5.3,
         "Td": 5.3,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 7.8,
         "Td": 7.6,
         "RH": 99,
         "wind": 1.7,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.6,
         "Td": 10.4,
         "RH": 87,
         "wind": 0.8,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.4,
         "RH": 80,
         "wind": 2.0,
         "low": 7,
         "mid": 0,
         "high": 0,
         "vis": 18900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.93,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.5 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.4 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 -1.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (3 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.983
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.1000000000000005,
       "dpd_key": 2.200000000000001,
       "rh_max": 87,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 19.454545454545453,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 16.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.8,
       "t_key": 9.8,
       "cooling": 5.0,
       "t_min_night": 9.8,
       "td_afternoon": 6.65,
       "crossover": 3.1500000000000004,
       "td_drop": -0.9499999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.6,
         "Td": 8.6,
         "RH": 72,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.2,
         "Td": 8.6,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.9,
         "Td": 8.9,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.3,
         "Td": 8.9,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 8.7,
         "RH": 82,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 8.1,
         "RH": 80,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.8,
         "Td": 7.8,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 7.9,
         "RH": 86,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.9,
         "Td": 7.5,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 7.7,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 7.6,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.3,
         "Td": 8.9,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.1,
         "Td": 9.7,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.4,
         "Td": 9.9,
         "RH": 70,
         "wind": 2.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.37,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 19 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.6,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.0 \u00b0C"
       },
       "moisture": {
        "score": 0.23,
        "why": "crossover: forecast night minimum 9.8 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +3.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.666
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 0.5999999999999996,
       "dpd_key": 0.5999999999999996,
       "rh_max": 96,
       "wind_mean": 0.4,
       "wind_after": 0.44999999999999996,
       "gust_max": 1.2,
       "cloud_mh_night": 45.18181818181818,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 4,
       "first_sat_hour": "04:00",
       "t_evening": 15.2,
       "t_key": 6.3,
       "cooling": 8.899999999999999,
       "t_min_night": 6.1,
       "td_afternoon": 5.45,
       "crossover": 0.6499999999999995,
       "td_drop": -0.25,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.7000000000000455,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 2.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 11.5,
         "Td": 8.2,
         "RH": 80,
         "wind": 1.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 10.9,
         "Td": 8.1,
         "RH": 83,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 80,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.3,
         "Td": 8.0,
         "RH": 86,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 52,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 32,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 8.9,
         "Td": 7.4,
         "RH": 90,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 29,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.2,
         "Td": 7.0,
         "RH": 92,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 34,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 7.5,
         "Td": 6.6,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 35,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 6.8,
         "Td": 6.0,
         "RH": 95,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 25,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 6.1,
         "Td": 5.5,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 10,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 6.3,
         "Td": 5.7,
         "RH": 96,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 7.7,
         "Td": 7.1,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 9.0,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 12.1,
         "Td": 10.4,
         "RH": 89,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 14.3,
         "Td": 10.2,
         "RH": 76,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.6 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.88,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.66,
        "why": "overnight mid+high levels cloud = 45 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.9 \u00b0C"
       },
       "moisture": {
        "score": 0.81,
        "why": "crossover: forecast night minimum 6.1 \u00b0C vs afternoon dewpoint 5.5 \u00b0C \u2192 +0.6 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.5,
        "why": "model has no visibility field; max RH before sunrise = 96 %"
       }
      },
      "gates": [],
      "raw": 0.821
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.3,
       "t_key": 8.8,
       "cooling": 8.5,
       "t_min_night": 8.8,
       "td_afternoon": 2.45,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.1,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.5,
         "Td": 7.6,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.0,
         "Td": 7.3,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.5,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.2,
         "Td": 7.3,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.8,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.5,
         "Td": 7.6,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.8,
         "Td": 7.4,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.4,
         "Td": 7.5,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.6,
         "Td": 8.2,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.3,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.5,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.8 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8663656&longitude=-87.6066259&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8663656&longitude=-87.6066259&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:58+00:00",
     "elevation_m": 185.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8663656&longitude=-87.6066259&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:58+00:00",
     "elevation_m": 185.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8663656&longitude=-87.6066259&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:58+00:00",
     "elevation_m": 185.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8663656&longitude=-87.6066259&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:58+00:00",
     "elevation_m": 185.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.4,
   "dawn_wind_kt": 1.0
  },
  {
   "id": "museum-campus-shedd-steps",
   "name": "Museum Campus - Shedd Aquarium steps",
   "lat": 41.8676361,
   "lon": -87.6136789,
   "elevation_m": 185.1,
   "position": "lakefront",
   "agency": "Chicago Park District (Shedd page: \"Located Within: Grant (Ulysses) Park\")",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/shedd-aquarium",
   "dawn_access": "Grant (Ulysses) Park CPD page (curl 200): \"Park Hours ... 6:00 am-11:00 pm\" each day. Shedd building hours: sheddaquarium.org. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan shoreline",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Shedd%20Aquarium%2C%20Chicago&format=json&limit=1 - Nominatim OSM relation 17430414 (tourism=aquarium) - the building centroid; the steps themselves were not separately geocoded. Ground elevation: USGS EPQS 3DEP 1 m DEM 185.1 m (https://epqs.nationalmap.gov/v1/json?x=-87.6136789&y=41.8676361&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; MDW CLASS C 2300 MSL-3600 MSL (outer shelf, far above 400 ft AGL); ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 2.84 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 7.93 nm / 9.13 mi, KORD 14.7 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (0.34 nm), Rate Field (White Sox) (2.44 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 2.49 km away at bearing 331 deg; Willis Tower 2.22 km at 304 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Soldier Field is 0.3 nm away (stadium TFR on Bears event days).",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.3,
    "raw_blend": 0.822,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.326,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.33); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.5 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.3,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.5,
       "wind_after": 1.45,
       "gust_max": 4.3,
       "cloud_mh_night": 1.0,
       "cloud_low_night": 38.45454545454545,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 0.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 3,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 12.9,
       "t_key": 5.4,
       "cooling": 7.5,
       "t_min_night": 5.4,
       "td_afternoon": 6.6,
       "crossover": -1.1999999999999993,
       "td_drop": 1.1999999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.5,
         "Td": 7.5,
         "RH": 82,
         "wind": 1.4,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14400.0
        },
        {
         "t": "22:00",
         "T": 9.5,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.3,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14900.0
        },
        {
         "t": "23:00",
         "T": 9.8,
         "Td": 6.2,
         "RH": 78,
         "wind": 2.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "00:00",
         "T": 10.0,
         "Td": 6.9,
         "RH": 81,
         "wind": 2.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.1,
         "Td": 6.2,
         "RH": 82,
         "wind": 3.1,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 13400.0
        },
        {
         "t": "02:00",
         "T": 8.2,
         "Td": 4.8,
         "RH": 79,
         "wind": 1.6,
         "low": 9,
         "mid": 9,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "03:00",
         "T": 7.9,
         "Td": 4.5,
         "RH": 79,
         "wind": 1.0,
         "low": 12,
         "mid": 0,
         "high": 2,
         "vis": 14400.0
        },
        {
         "t": "04:00",
         "T": 6.4,
         "Td": 4.9,
         "RH": 90,
         "wind": 1.8,
         "low": 82,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "05:00",
         "T": 5.8,
         "Td": 5.2,
         "RH": 96,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 5.7,
         "Td": 5.5,
         "RH": 99,
         "wind": 1.6,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.4,
         "Td": 5.4,
         "RH": 100,
         "wind": 1.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "08:00",
         "T": 5.3,
         "Td": 5.3,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 7.8,
         "Td": 7.6,
         "RH": 99,
         "wind": 1.7,
         "low": 93,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.6,
         "Td": 10.5,
         "RH": 87,
         "wind": 0.8,
         "low": 43,
         "mid": 0,
         "high": 0,
         "vis": 15400.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.5,
         "RH": 80,
         "wind": 2.0,
         "low": 7,
         "mid": 0,
         "high": 0,
         "vis": 18900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.93,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.5 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.4 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 -1.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (3 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.983
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.1000000000000005,
       "dpd_key": 2.200000000000001,
       "rh_max": 87,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 19.454545454545453,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 16.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.8,
       "t_key": 9.8,
       "cooling": 5.0,
       "t_min_night": 9.8,
       "td_afternoon": 6.65,
       "crossover": 3.1500000000000004,
       "td_drop": -0.9499999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.6,
         "Td": 8.7,
         "RH": 72,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.2,
         "Td": 8.7,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.9,
         "Td": 9.0,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.3,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 8.7,
         "RH": 82,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 8.1,
         "RH": 80,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.8,
         "Td": 7.9,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 8.0,
         "RH": 86,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.9,
         "Td": 7.5,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 7.7,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 7.7,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.3,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.1,
         "Td": 9.7,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.4,
         "Td": 10.0,
         "RH": 70,
         "wind": 2.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.37,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 19 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.6,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.0 \u00b0C"
       },
       "moisture": {
        "score": 0.23,
        "why": "crossover: forecast night minimum 9.8 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +3.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.666
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 0.5999999999999996,
       "dpd_key": 0.5999999999999996,
       "rh_max": 96,
       "wind_mean": 0.4,
       "wind_after": 0.44999999999999996,
       "gust_max": 1.2,
       "cloud_mh_night": 45.18181818181818,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 4,
       "first_sat_hour": "04:00",
       "t_evening": 15.2,
       "t_key": 6.3,
       "cooling": 8.899999999999999,
       "t_min_night": 6.2,
       "td_afternoon": 5.5,
       "crossover": 0.7000000000000002,
       "td_drop": -0.20000000000000018,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.7000000000000455,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 2.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 11.6,
         "Td": 8.2,
         "RH": 80,
         "wind": 1.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 10.9,
         "Td": 8.1,
         "RH": 83,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 80,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.3,
         "Td": 8.1,
         "RH": 86,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 52,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.8,
         "RH": 88,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 32,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.0,
         "Td": 7.4,
         "RH": 90,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 29,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.2,
         "Td": 7.0,
         "RH": 92,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 34,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 7.6,
         "Td": 6.6,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 35,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 6.8,
         "Td": 6.1,
         "RH": 95,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 25,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 6.2,
         "Td": 5.6,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 10,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 6.3,
         "Td": 5.7,
         "RH": 96,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 7.7,
         "Td": 7.1,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 9.0,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 12.2,
         "Td": 10.4,
         "RH": 89,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 14.4,
         "Td": 10.2,
         "RH": 76,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.6 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.88,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.66,
        "why": "overnight mid+high levels cloud = 45 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.9 \u00b0C"
       },
       "moisture": {
        "score": 0.79,
        "why": "crossover: forecast night minimum 6.2 \u00b0C vs afternoon dewpoint 5.5 \u00b0C \u2192 +0.7 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.5,
        "why": "model has no visibility field; max RH before sunrise = 96 %"
       }
      },
      "gates": [],
      "raw": 0.82
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.5,
       "crossover": 6.4,
       "td_drop": -5.0,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.6,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.5,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8676361&longitude=-87.6136789&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8676361&longitude=-87.6136789&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:58+00:00",
     "elevation_m": 181.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8676361&longitude=-87.6136789&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:59+00:00",
     "elevation_m": 181.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8676361&longitude=-87.6136789&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:59+00:00",
     "elevation_m": 181.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8676361&longitude=-87.6136789&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:59+00:00",
     "elevation_m": 181.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.4,
   "dawn_wind_kt": 1.0
  },
  {
   "id": "northerly-island",
   "name": "Northerly Island (park; former Meigs Field)",
   "lat": 41.8602009,
   "lon": -87.6082797,
   "elevation_m": 179.3,
   "position": "lakefront",
   "agency": "Chicago Park District",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/northerly-island-park",
   "dawn_access": "Northerly Island Park page (WebFetch; curl got HTTP 202): every day \"6:00 am-11:00 pm\". Natural areas (CPD natural-areas FAQ, curl 200): \"Natural Areas are open from dawn to dusk.\" Address 1521 S. Linn White Dr. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked. Natural areas: FAQ text found contains no drone rule.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan shoreline",
    "park and natural area",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Northerly%20Island%2C%20Chicago&format=json&limit=1 - Nominatim OSM relation 2914325 (leisure=park) centroid; the island is long and a point at its north end was not geocoded. Ground elevation: USGS EPQS 3DEP 1 m DEM 179.3 m (https://epqs.nationalmap.gov/v1/json?x=-87.6082797&y=41.8602009&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3600 MSL-10000 MSL [AREA D]; MDW CLASS C 2300 MSL-3600 MSL (outer shelf, far above 400 ft AGL); ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 2.77 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 7.86 nm / 9.05 mi, KORD 15.12 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (0.4 nm), Rate Field (White Sox) (2.15 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 3.43 km away at bearing 332 deg; Willis Tower 3.08 km at 312 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. The US_Airport layer within 12 km of the Loop lists only heliports (type HP), no airport (type AD), so the former Meigs Field is not an airport now. The CPD page says the visitor center closes for Bears home games.",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.22,
    "raw_blend": 0.746,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.164,
    "confidence": "medium",
    "confidence_why": "models differ by 0.16 on the blend score",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 1.3 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "09:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.6,
     "label": "filtered sun",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 60 % with visibility 12 km (stratus, not fog) \u2014 beams possible through gaps"
    },
    "steam_fog": null,
    "photo_score": 0.17,
    "grade": "C",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 1.3000000000000003,
       "dpd_key": 1.3000000000000003,
       "rh_max": 91,
       "wind_mean": 2.3,
       "wind_after": 2.35,
       "gust_max": 4.1,
       "cloud_mh_night": 0.8181818181818182,
       "cloud_low_night": 9.090909090909092,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 12200.0,
       "low_sunrise": 60.0,
       "vis_min": 12200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 13.1,
       "t_key": 4.7,
       "cooling": 8.399999999999999,
       "t_min_night": 4.7,
       "td_afternoon": 6.5,
       "crossover": -1.7999999999999998,
       "td_drop": 3.1,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.4,
         "Td": 7.5,
         "RH": 82,
         "wind": 4.7,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "22:00",
         "T": 9.8,
         "Td": 6.5,
         "RH": 80,
         "wind": 4.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "23:00",
         "T": 10.1,
         "Td": 6.4,
         "RH": 78,
         "wind": 4.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "00:00",
         "T": 9.4,
         "Td": 6.0,
         "RH": 79,
         "wind": 3.8,
         "low": 1,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "01:00",
         "T": 8.1,
         "Td": 4.7,
         "RH": 79,
         "wind": 3.5,
         "low": 7,
         "mid": 0,
         "high": 5,
         "vis": 17300.0
        },
        {
         "t": "02:00",
         "T": 7.7,
         "Td": 3.9,
         "RH": 77,
         "wind": 3.0,
         "low": 7,
         "mid": 4,
         "high": 0,
         "vis": 18100.0
        },
        {
         "t": "03:00",
         "T": 8.2,
         "Td": 3.8,
         "RH": 74,
         "wind": 2.2,
         "low": 1,
         "mid": 0,
         "high": 0,
         "vis": 17300.0
        },
        {
         "t": "04:00",
         "T": 7.6,
         "Td": 3.6,
         "RH": 76,
         "wind": 2.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 6.5,
         "Td": 3.4,
         "RH": 81,
         "wind": 2.4,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "06:00",
         "T": 5.4,
         "Td": 3.4,
         "RH": 87,
         "wind": 2.5,
         "low": 13,
         "mid": 0,
         "high": 0,
         "vis": 12500.0
        },
        {
         "t": "07:00",
         "T": 4.7,
         "Td": 3.4,
         "RH": 91,
         "wind": 2.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "08:00",
         "T": 5.2,
         "Td": 4.8,
         "RH": 97,
         "wind": 2.9,
         "low": 54,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "09:00",
         "T": 8.6,
         "Td": 7.0,
         "RH": 90,
         "wind": 1.8,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "10:00",
         "T": 12.5,
         "Td": 9.9,
         "RH": 84,
         "wind": 0.8,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.3,
         "RH": 79,
         "wind": 2.3,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 19400.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.7,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 1.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 2.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.4 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 4.7 \u00b0C vs afternoon dewpoint 6.5 \u00b0C \u2192 -1.8 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 12.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.775
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.9000000000000004,
       "dpd_key": 2.200000000000001,
       "rh_max": 88,
       "wind_mean": 0.35,
       "wind_after": 0.9,
       "gust_max": 2.3,
       "cloud_mh_night": 21.636363636363637,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 23.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.9,
       "t_key": 9.3,
       "cooling": 5.6,
       "t_min_night": 9.3,
       "td_afternoon": 6.7,
       "crossover": 2.6000000000000005,
       "td_drop": -0.39999999999999947,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.3,
         "Td": 8.6,
         "RH": 73,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.6,
         "RH": 75,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 8.9,
         "RH": 78,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.0,
         "Td": 8.8,
         "RH": 81,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.4,
         "Td": 8.6,
         "RH": 83,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 10.9,
         "Td": 7.9,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.3,
         "Td": 7.7,
         "RH": 84,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 9560.0
        },
        {
         "t": "05:00",
         "T": 9.5,
         "Td": 7.4,
         "RH": 87,
         "wind": 0.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 7.4,
         "RH": 88,
         "wind": 0.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 7.1,
         "RH": 86,
         "wind": 0.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.2,
         "Td": 7.4,
         "RH": 83,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 460.0
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 8.7,
         "RH": 80,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.1,
         "Td": 9.5,
         "RH": 74,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.5,
         "Td": 9.8,
         "RH": 69,
         "wind": 1.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.44,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.9 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.87,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.98,
        "why": "overnight total cloud (levels unavailable) cloud = 22 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.68,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.6 \u00b0C"
       },
       "moisture": {
        "score": 0.31,
        "why": "crossover: forecast night minimum 9.3 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +2.6 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.692
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 0.5999999999999996,
       "dpd_key": 0.5999999999999996,
       "rh_max": 96,
       "wind_mean": 0.4,
       "wind_after": 0.44999999999999996,
       "gust_max": 1.2,
       "cloud_mh_night": 45.18181818181818,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 4,
       "first_sat_hour": "04:00",
       "t_evening": 15.2,
       "t_key": 6.3,
       "cooling": 8.899999999999999,
       "t_min_night": 6.2,
       "td_afternoon": 5.55,
       "crossover": 0.6500000000000004,
       "td_drop": -0.15000000000000036,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.7999999999999545,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 2.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 11.6,
         "Td": 8.2,
         "RH": 80,
         "wind": 1.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 10.9,
         "Td": 8.1,
         "RH": 83,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 80,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.3,
         "Td": 8.1,
         "RH": 86,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 52,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.8,
         "RH": 88,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 32,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.0,
         "Td": 7.4,
         "RH": 90,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 29,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.2,
         "Td": 7.0,
         "RH": 92,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 34,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 7.6,
         "Td": 6.7,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 35,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 6.8,
         "Td": 6.1,
         "RH": 95,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 25,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 6.2,
         "Td": 5.6,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 10,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 6.3,
         "Td": 5.7,
         "RH": 96,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 7.7,
         "Td": 7.1,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 9.0,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 12.2,
         "Td": 10.4,
         "RH": 89,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 14.4,
         "Td": 10.2,
         "RH": 76,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.6 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.88,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.66,
        "why": "overnight mid+high levels cloud = 45 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.9 \u00b0C"
       },
       "moisture": {
        "score": 0.8,
        "why": "crossover: forecast night minimum 6.2 \u00b0C vs afternoon dewpoint 5.5 \u00b0C \u2192 +0.7 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.5,
        "why": "model has no visibility field; max RH before sunrise = 96 %"
       }
      },
      "gates": [],
      "raw": 0.821
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8602009&longitude=-87.6082797&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8602009&longitude=-87.6082797&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:59+00:00",
     "elevation_m": 179.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8602009&longitude=-87.6082797&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:59+00:00",
     "elevation_m": 179.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8602009&longitude=-87.6082797&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:59+00:00",
     "elevation_m": 179.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8602009&longitude=-87.6082797&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:44:59+00:00",
     "elevation_m": 179.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 4.7,
   "dawn_wind_kt": 2.2
  },
  {
   "id": "olive-park",
   "name": "Milton Lee Olive Park (Olive Park)",
   "lat": 41.8942225,
   "lon": -87.6103414,
   "elevation_m": 181.2,
   "position": "lakefront",
   "agency": "unknown: the Park District's permit page lists Olive Park under \"Independently Managed Sites ... please call them directly ... Olive Park | (312) 744-6635\"; manager not named",
   "agency_url": "https://www.chicagoparkdistrict.com/permits-rentals/do-i-need-permit",
   "dawn_access": "unknown for the park itself. Neighbouring Ohio Street Beach (CPD): \"The beach is open from 6 am to 11 pm\". Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": null,
   "drone_rule": "unknown: managed independently of the Park District per its page, so the Park Code permit rule may not apply; call (312) 744-6635 per the CPD list. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://occprodstoragev1.blob.core.usgovcloudapi.net/lsmatterattachmentspublic/c68378a1-66a3-470c-bdcb-69ab29c6e32d.pdf",
   "drone_status": "unknown",
   "features": [
    "Lake Michigan shoreline",
    "manmade peninsula (CPD Ohio Street Beach page)",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Milton%20Lee%20Olive%20Park%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 211039472 (leisure=park). The ticket listed 'Olive Park / Ohio St beach' and 'Milton Lee Olive Park' separately; they are the same park, so one entry. Ohio Street Beach is its own entry. Ground elevation: USGS EPQS 3DEP 1 m DEM 181.2 m (https://epqs.nationalmap.gov/v1/json?x=-87.6103414&y=41.8942225&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 3.91 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 9.11 nm / 10.49 mi, KORD 14.2 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (1.93 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 1.65 km away at bearing 242 deg; Willis Tower 2.73 km at 231 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. CPD's Ohio Street Beach page: \"a 10-acre park that was later named for African-American war hero Milton Olive, III\" (by WebFetch).",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.25,
    "raw_blend": 0.782,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.368,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 4 h before sunrise with 1.6 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.25,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.625,
       "wind_after": 1.5,
       "gust_max": 4.9,
       "cloud_mh_night": 1.0909090909090908,
       "cloud_low_night": 46.72727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 100.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 4,
       "hours_saturated": 4,
       "first_sat_hour": "04:00",
       "t_evening": 12.9,
       "t_key": 5.7,
       "cooling": 7.2,
       "t_min_night": 5.7,
       "td_afternoon": 7.0,
       "crossover": -1.2999999999999998,
       "td_drop": 1.2999999999999998,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.6,
         "Td": 7.5,
         "RH": 81,
         "wind": 1.1,
         "low": 10,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "22:00",
         "T": 9.5,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.5,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14500.0
        },
        {
         "t": "23:00",
         "T": 9.6,
         "Td": 6.0,
         "RH": 78,
         "wind": 1.7,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "00:00",
         "T": 9.8,
         "Td": 6.7,
         "RH": 81,
         "wind": 1.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.3,
         "Td": 6.8,
         "RH": 84,
         "wind": 1.7,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 12400.0
        },
        {
         "t": "02:00",
         "T": 8.3,
         "Td": 5.8,
         "RH": 84,
         "wind": 1.0,
         "low": 24,
         "mid": 10,
         "high": 0,
         "vis": 12300.0
        },
        {
         "t": "03:00",
         "T": 7.9,
         "Td": 5.9,
         "RH": 87,
         "wind": 0.8,
         "low": 69,
         "mid": 0,
         "high": 2,
         "vis": 12200.0
        },
        {
         "t": "04:00",
         "T": 6.6,
         "Td": 5.6,
         "RH": 93,
         "wind": 2.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "05:00",
         "T": 6.2,
         "Td": 5.9,
         "RH": 98,
         "wind": 1.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 6.1,
         "Td": 5.8,
         "RH": 98,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.7,
         "Td": 5.7,
         "RH": 100,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "08:00",
         "T": 5.6,
         "Td": 5.6,
         "RH": 100,
         "wind": 1.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 8.0,
         "Td": 8.0,
         "RH": 100,
         "wind": 1.7,
         "low": 95,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.9,
         "Td": 10.9,
         "RH": 88,
         "wind": 0.8,
         "low": 45,
         "mid": 0,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "11:00",
         "T": 15.0,
         "Td": 11.4,
         "RH": 79,
         "wind": 2.2,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 19000.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.96,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.89,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.2 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.7 \u00b0C vs afternoon dewpoint 7.0 \u00b0C \u2192 -1.3 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (4 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.982
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.000000000000001,
       "dpd_key": 2.200000000000001,
       "rh_max": 87,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 19.454545454545453,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 16.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.8,
       "t_key": 9.8,
       "cooling": 5.0,
       "t_min_night": 9.8,
       "td_afternoon": 6.65,
       "crossover": 3.1500000000000004,
       "td_drop": -0.9499999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.6,
         "Td": 8.7,
         "RH": 72,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.2,
         "Td": 8.7,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.9,
         "Td": 9.0,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.3,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 8.8,
         "RH": 82,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 8.1,
         "RH": 80,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.8,
         "Td": 7.9,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 8.0,
         "RH": 86,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.9,
         "Td": 7.5,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 7.8,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.6,
         "Td": 7.7,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.3,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.1,
         "Td": 9.8,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.4,
         "Td": 10.0,
         "RH": 70,
         "wind": 2.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.4,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 19 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.6,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.0 \u00b0C"
       },
       "moisture": {
        "score": 0.23,
        "why": "crossover: forecast night minimum 9.8 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +3.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.673
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.05,
       "crossover": 2.1499999999999995,
       "td_drop": -0.4500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.7,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.2,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.6,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.6,
         "Td": 7.3,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.7,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.2,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.0,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.0,
         "Td": 10.5,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.8,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.614
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.1,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8942225&longitude=-87.6103414&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8942225&longitude=-87.6103414&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:00+00:00",
     "elevation_m": 178.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8942225&longitude=-87.6103414&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:00+00:00",
     "elevation_m": 178.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8942225&longitude=-87.6103414&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:00+00:00",
     "elevation_m": 178.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8942225&longitude=-87.6103414&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:00+00:00",
     "elevation_m": 178.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.7,
   "dawn_wind_kt": 1.4
  },
  {
   "id": "ohio-street-beach",
   "name": "Ohio Street Beach",
   "lat": 41.8934893,
   "lon": -87.6125998,
   "elevation_m": 177.6,
   "position": "lakefront",
   "agency": "Chicago Park District (Jane Addams Memorial Park)",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/ohio-street-beach",
   "dawn_access": "CPD page (curl 200): \"The beach is open from 6 am to 11 pm, but swimming is only permitted during the beach season when lifeguards are on duty from 11 am to 7 pm\". Beach season: \"the Friday before Memorial Day, through Labor Day\". So it is closed 11 pm-6 am. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan beach",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Ohio%20Street%20Beach%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 211039469 (natural=beach). Ground elevation: USGS EPQS 3DEP 1 m DEM 177.6 m (https://epqs.nationalmap.gov/v1/json?x=-87.6125998&y=41.8934893&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 3.8 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 9.01 nm / 10.37 mi, KORD 14.12 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (1.88 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 1.45 km away at bearing 242 deg; Willis Tower 2.54 km at 230 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet.",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.25,
    "raw_blend": 0.78,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.367,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.6 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.25,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.625,
       "wind_after": 1.5,
       "gust_max": 4.9,
       "cloud_mh_night": 1.0909090909090908,
       "cloud_low_night": 46.72727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 100.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 4,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 12.9,
       "t_key": 5.8,
       "cooling": 7.1000000000000005,
       "t_min_night": 5.8,
       "td_afternoon": 7.050000000000001,
       "crossover": -1.2500000000000009,
       "td_drop": 1.2500000000000009,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.599999999999909,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.7,
         "Td": 7.5,
         "RH": 81,
         "wind": 1.1,
         "low": 10,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "22:00",
         "T": 9.6,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.5,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14500.0
        },
        {
         "t": "23:00",
         "T": 9.7,
         "Td": 6.0,
         "RH": 78,
         "wind": 1.7,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "00:00",
         "T": 9.9,
         "Td": 6.8,
         "RH": 81,
         "wind": 1.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.4,
         "Td": 6.8,
         "RH": 84,
         "wind": 1.7,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 12400.0
        },
        {
         "t": "02:00",
         "T": 8.4,
         "Td": 5.8,
         "RH": 84,
         "wind": 1.0,
         "low": 24,
         "mid": 10,
         "high": 0,
         "vis": 12300.0
        },
        {
         "t": "03:00",
         "T": 8.0,
         "Td": 5.9,
         "RH": 87,
         "wind": 0.8,
         "low": 69,
         "mid": 0,
         "high": 2,
         "vis": 12200.0
        },
        {
         "t": "04:00",
         "T": 6.7,
         "Td": 5.6,
         "RH": 93,
         "wind": 2.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "05:00",
         "T": 6.3,
         "Td": 6.0,
         "RH": 98,
         "wind": 1.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 6.1,
         "Td": 5.8,
         "RH": 98,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.8,
         "Td": 5.8,
         "RH": 100,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "08:00",
         "T": 5.6,
         "Td": 5.6,
         "RH": 100,
         "wind": 1.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 8.0,
         "Td": 8.0,
         "RH": 100,
         "wind": 1.7,
         "low": 95,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.9,
         "Td": 11.0,
         "RH": 88,
         "wind": 0.8,
         "low": 45,
         "mid": 0,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "11:00",
         "T": 15.1,
         "Td": 11.4,
         "RH": 79,
         "wind": 2.2,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 19000.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.96,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.88,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.1 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.8 \u00b0C vs afternoon dewpoint 7.1 \u00b0C \u2192 -1.3 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (4 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.981
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.1000000000000005,
       "dpd_key": 2.3000000000000007,
       "rh_max": 87,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 19.454545454545453,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 16.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.9,
       "t_key": 9.9,
       "cooling": 5.0,
       "t_min_night": 9.9,
       "td_afternoon": 6.65,
       "crossover": 3.25,
       "td_drop": -0.9499999999999993,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.7,
         "Td": 8.7,
         "RH": 72,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.3,
         "Td": 8.7,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 13.0,
         "Td": 9.0,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.4,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.8,
         "Td": 8.8,
         "RH": 82,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.5,
         "Td": 8.1,
         "RH": 80,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.9,
         "Td": 7.9,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.3,
         "Td": 8.0,
         "RH": 86,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.0,
         "Td": 7.5,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 7880.0
        },
        {
         "t": "06:00",
         "T": 9.9,
         "Td": 7.8,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.9,
         "Td": 7.6,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.7,
         "Td": 7.7,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.4,
         "Td": 9.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.2,
         "Td": 9.8,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.5,
         "Td": 10.0,
         "RH": 70,
         "wind": 2.1,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.37,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 19 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.6,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.0 \u00b0C"
       },
       "moisture": {
        "score": 0.21,
        "why": "crossover: forecast night minimum 9.9 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +3.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.664
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.05,
       "crossover": 2.1499999999999995,
       "td_drop": -0.4500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.7,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.2,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.2,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.7,
         "Td": 7.3,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.7,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.2,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.1,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 10.5,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.9,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.614
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.1,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 13.0,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 7.1,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.1,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.5,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8934893&longitude=-87.6125998&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8934893&longitude=-87.6125998&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:00+00:00",
     "elevation_m": 174.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8934893&longitude=-87.6125998&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:01+00:00",
     "elevation_m": 174.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8934893&longitude=-87.6125998&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:01+00:00",
     "elevation_m": 174.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8934893&longitude=-87.6125998&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:01+00:00",
     "elevation_m": 174.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.8,
   "dawn_wind_kt": 1.4
  },
  {
   "id": "oak-street-beach-lakefront-trail",
   "name": "Oak Street Beach / Lakefront Trail at Oak St",
   "lat": 41.9029752,
   "lon": -87.622878,
   "elevation_m": 178.1,
   "position": "lakefront",
   "agency": "Chicago Park District (Lincoln (Abraham) Park)",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/oak-street-beach",
   "dawn_access": "CPD page (curl 200): \"The beach is open from 6 am to 11 pm\". Lakefront Trail CPD page lists no hours; a notice posted 9/14-9/15/26 says repairs \"will be starting in the next few weeks\" in sections from the south end, with detours possible. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan beach",
    "Lakefront Trail",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Oak%20Street%20Beach%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 23803745 (natural=beach). Nominatim found no point for the Lakefront Trail at Oak St, so the trail entry from the ticket is merged here (the trail runs along this beach). Ground elevation: USGS EPQS 3DEP 1 m DEM 178.1 m (https://epqs.nationalmap.gov/v1/json?x=-87.622878&y=41.9029752&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 3.86 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 9.13 nm / 10.51 mi, KORD 13.49 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (2.45 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 1.79 km away at bearing 194 deg; Willis Tower 2.9 km at 202 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Oak Street is 1.8 km from the tower centroid; 875 N Michigan is about 0.5 km away by coordinates.",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.25,
    "raw_blend": 0.78,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.367,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.6 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.25,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.625,
       "wind_after": 1.5,
       "gust_max": 4.9,
       "cloud_mh_night": 1.0909090909090908,
       "cloud_low_night": 46.72727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 100.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 4,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 12.9,
       "t_key": 5.8,
       "cooling": 7.1000000000000005,
       "t_min_night": 5.8,
       "td_afternoon": 7.050000000000001,
       "crossover": -1.2500000000000009,
       "td_drop": 1.2500000000000009,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.599999999999909,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.7,
         "Td": 7.5,
         "RH": 81,
         "wind": 1.1,
         "low": 10,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "22:00",
         "T": 9.6,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.5,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14500.0
        },
        {
         "t": "23:00",
         "T": 9.7,
         "Td": 6.0,
         "RH": 78,
         "wind": 1.7,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "00:00",
         "T": 9.9,
         "Td": 6.8,
         "RH": 81,
         "wind": 1.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.4,
         "Td": 6.8,
         "RH": 84,
         "wind": 1.7,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 12400.0
        },
        {
         "t": "02:00",
         "T": 8.4,
         "Td": 5.8,
         "RH": 84,
         "wind": 1.0,
         "low": 24,
         "mid": 10,
         "high": 0,
         "vis": 12300.0
        },
        {
         "t": "03:00",
         "T": 8.0,
         "Td": 5.9,
         "RH": 87,
         "wind": 0.8,
         "low": 69,
         "mid": 0,
         "high": 2,
         "vis": 12200.0
        },
        {
         "t": "04:00",
         "T": 6.7,
         "Td": 5.6,
         "RH": 93,
         "wind": 2.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "05:00",
         "T": 6.3,
         "Td": 6.0,
         "RH": 98,
         "wind": 1.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 6.1,
         "Td": 5.8,
         "RH": 98,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.8,
         "Td": 5.8,
         "RH": 100,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "08:00",
         "T": 5.6,
         "Td": 5.6,
         "RH": 100,
         "wind": 1.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 8.0,
         "Td": 8.0,
         "RH": 100,
         "wind": 1.7,
         "low": 95,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.9,
         "Td": 11.0,
         "RH": 88,
         "wind": 0.8,
         "low": 45,
         "mid": 0,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "11:00",
         "T": 15.1,
         "Td": 11.4,
         "RH": 79,
         "wind": 2.2,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 19000.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.96,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.88,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.1 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.8 \u00b0C vs afternoon dewpoint 7.1 \u00b0C \u2192 -1.3 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (4 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.981
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.1000000000000005,
       "dpd_key": 2.1999999999999993,
       "rh_max": 87,
       "wind_mean": 0.8,
       "wind_after": 1.2,
       "gust_max": 2.1,
       "cloud_mh_night": 21.818181818181817,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 20.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.9,
       "t_key": 9.6,
       "cooling": 5.300000000000001,
       "t_min_night": 9.6,
       "td_afternoon": 6.449999999999999,
       "crossover": 3.1500000000000004,
       "td_drop": -0.9500000000000011,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.5,
         "Td": 8.5,
         "RH": 72,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.2,
         "Td": 8.7,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.8,
         "Td": 8.9,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.3,
         "Td": 8.8,
         "RH": 79,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 8.5,
         "RH": 81,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.2,
         "Td": 8.1,
         "RH": 81,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 7.9,
         "RH": 83,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 7.8,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.8,
         "Td": 7.6,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "06:00",
         "T": 9.8,
         "Td": 7.7,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.6,
         "Td": 7.4,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.3,
         "Td": 8.9,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.3,
         "Td": 9.9,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.7,
         "Td": 10.0,
         "RH": 69,
         "wind": 2.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.37,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.9,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.98,
        "why": "overnight total cloud (levels unavailable) cloud = 22 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.64,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.3 \u00b0C"
       },
       "moisture": {
        "score": 0.23,
        "why": "crossover: forecast night minimum 9.6 \u00b0C vs afternoon dewpoint 6.4 \u00b0C \u2192 +3.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.665
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.05,
       "crossover": 2.1499999999999995,
       "td_drop": -0.4500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.7,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.2,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.2,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.7,
         "Td": 7.3,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.7,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.2,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.1,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 10.5,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.9,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.614
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.1,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 13.0,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 7.1,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.1,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.5,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9029752&longitude=-87.622878&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9029752&longitude=-87.622878&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:01+00:00",
     "elevation_m": 174.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9029752&longitude=-87.622878&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:01+00:00",
     "elevation_m": 174.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9029752&longitude=-87.622878&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:02+00:00",
     "elevation_m": 174.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9029752&longitude=-87.622878&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:02+00:00",
     "elevation_m": 174.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.8,
   "dawn_wind_kt": 1.4
  },
  {
   "id": "north-avenue-beach",
   "name": "North Avenue Beach",
   "lat": 41.9185066,
   "lon": -87.6280266,
   "elevation_m": 177.9,
   "position": "lakefront",
   "agency": "Chicago Park District (Lincoln (Abraham) Park)",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/north-avenue-beach",
   "dawn_access": "CPD page (curl 200): \"The beach is open from 6 am to 11 pm\"; lifeguards 11 am-7 pm in beach season only. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan beach",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=North%20Avenue%20Beach%2C%20Chicago&format=json&limit=1 - Nominatim OSM relation 12788474 (natural=beach). Ground elevation: USGS EPQS 3DEP 1 m DEM 177.9 m (https://epqs.nationalmap.gov/v1/json?x=-87.6280266&y=41.9185066&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 4.49 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 9.73 nm / 11.2 mi, KORD 12.99 nm. Inside the 3 nm stadium-TFR circle of: Wrigley Field (2.16 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 3.47 km away at bearing 180 deg; Willis Tower 4.47 km at 188 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Not inside the Soldier Field circle but inside Wrigley Field's (2.16 nm).",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:09",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:23",
    "sun_12deg": "08:22"
   },
   "score": {
    "fog_probability": 0.24,
    "raw_blend": 0.764,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.379,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.38); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.6 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:09",
     "est_end": "10:39",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.24,
    "grade": "C",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.625,
       "wind_after": 1.5,
       "gust_max": 4.9,
       "cloud_mh_night": 1.0909090909090908,
       "cloud_low_night": 46.72727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 100.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 4,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 12.9,
       "t_key": 5.8,
       "cooling": 7.1000000000000005,
       "t_min_night": 5.8,
       "td_afternoon": 7.050000000000001,
       "crossover": -1.2500000000000009,
       "td_drop": 1.2500000000000009,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.599999999999909,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.7,
         "Td": 7.5,
         "RH": 81,
         "wind": 1.1,
         "low": 10,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "22:00",
         "T": 9.6,
         "Td": 6.8,
         "RH": 83,
         "wind": 4.5,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 14500.0
        },
        {
         "t": "23:00",
         "T": 9.7,
         "Td": 6.0,
         "RH": 78,
         "wind": 1.7,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15500.0
        },
        {
         "t": "00:00",
         "T": 9.9,
         "Td": 6.8,
         "RH": 81,
         "wind": 1.7,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "01:00",
         "T": 9.4,
         "Td": 6.8,
         "RH": 84,
         "wind": 1.7,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 12400.0
        },
        {
         "t": "02:00",
         "T": 8.4,
         "Td": 5.8,
         "RH": 84,
         "wind": 1.0,
         "low": 24,
         "mid": 10,
         "high": 0,
         "vis": 12300.0
        },
        {
         "t": "03:00",
         "T": 8.0,
         "Td": 5.9,
         "RH": 87,
         "wind": 0.8,
         "low": 69,
         "mid": 0,
         "high": 2,
         "vis": 12200.0
        },
        {
         "t": "04:00",
         "T": 6.7,
         "Td": 5.6,
         "RH": 93,
         "wind": 2.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "05:00",
         "T": 6.3,
         "Td": 6.0,
         "RH": 98,
         "wind": 1.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "06:00",
         "T": 6.1,
         "Td": 5.8,
         "RH": 98,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 5.8,
         "Td": 5.8,
         "RH": 100,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "08:00",
         "T": 5.6,
         "Td": 5.6,
         "RH": 100,
         "wind": 1.3,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 8.0,
         "Td": 8.0,
         "RH": 100,
         "wind": 1.7,
         "low": 95,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.9,
         "Td": 11.0,
         "RH": 88,
         "wind": 0.8,
         "low": 45,
         "mid": 0,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "11:00",
         "T": 15.1,
         "Td": 11.4,
         "RH": 79,
         "wind": 2.2,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 19000.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.96,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.88,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.1 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.8 \u00b0C vs afternoon dewpoint 7.1 \u00b0C \u2192 -1.3 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (4 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.981
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.6999999999999993,
       "dpd_key": 2.8999999999999995,
       "rh_max": 83,
       "wind_mean": 0.95,
       "wind_after": 1.4,
       "gust_max": 2.1,
       "cloud_mh_night": 21.09090909090909,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 18.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.2,
       "t_key": 10.6,
       "cooling": 4.6,
       "t_min_night": 10.6,
       "td_afternoon": 6.7,
       "crossover": 3.8999999999999995,
       "td_drop": -1.0,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 14.1,
         "Td": 8.5,
         "RH": 69,
         "wind": 1.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.8,
         "Td": 8.7,
         "RH": 71,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 13.5,
         "Td": 9.0,
         "RH": 74,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 13.0,
         "Td": 8.9,
         "RH": 76,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 12.6,
         "Td": 8.7,
         "RH": 77,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.8,
         "Td": 8.3,
         "RH": 79,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 11.4,
         "Td": 8.3,
         "RH": 81,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 11.1,
         "Td": 8.2,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.7,
         "Td": 8.0,
         "RH": 83,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 6360.0
        },
        {
         "t": "06:00",
         "T": 10.6,
         "Td": 7.9,
         "RH": 83,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 10.6,
         "Td": 7.7,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 11.0,
         "Td": 8.2,
         "RH": 83,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "09:00",
         "T": 12.7,
         "Td": 9.2,
         "RH": 79,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.5,
         "Td": 10.1,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.6,
         "Td": 10.2,
         "RH": 70,
         "wind": 2.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.23,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.7 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.99,
        "why": "overnight total cloud (levels unavailable) cloud = 21 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.53,
        "why": "temperature fall 18:00 \u2192 sunrise = 4.6 \u00b0C"
       },
       "moisture": {
        "score": 0.12,
        "why": "crossover: forecast night minimum 10.6 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +3.9 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.602
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.05,
       "crossover": 2.1499999999999995,
       "td_drop": -0.4500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.7,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.2,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.2,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.7,
         "Td": 7.3,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.7,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.2,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.1,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 10.5,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.9,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.614
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.1,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 13.0,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 7.1,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.1,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.5,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9185066&longitude=-87.6280266&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9185066&longitude=-87.6280266&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:02+00:00",
     "elevation_m": 174.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9185066&longitude=-87.6280266&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:02+00:00",
     "elevation_m": 174.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9185066&longitude=-87.6280266&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:02+00:00",
     "elevation_m": 174.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9185066&longitude=-87.6280266&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:02+00:00",
     "elevation_m": 174.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.8,
   "dawn_wind_kt": 1.4
  },
  {
   "id": "montrose-harbor",
   "name": "Montrose Harbor",
   "lat": 41.961065,
   "lon": -87.6392345,
   "elevation_m": 175.6,
   "position": "lakefront",
   "agency": "Chicago Park District (Lincoln (Abraham) Park)",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/montrose-harbor",
   "dawn_access": "Harbor page gives no extractable hours; it says \"Located Within: Lincoln (Abraham) Park\", whose CPD page (curl 200) lists \"6:00 am-11:00 pm\". Code B.2 bars being in an unfenced park 11:00 p.m.-6:00 a.m. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "harbor",
    "Lake Michigan shoreline",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Montrose%20Harbor%2C%20Chicago&format=json&limit=1 - Nominatim OSM relation 17766874 (water=harbour) centroid, so the point is on the water; the shore is a short walk. Address 601 W. Montrose Drive. Ground elevation: USGS EPQS 3DEP 1 m DEM 175.6 m (https://epqs.nationalmap.gov/v1/json?x=-87.6392345&y=41.961065&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 5.88 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 11.69 nm / 13.45 mi, KORD 12.04 nm. Inside the 3 nm stadium-TFR circle of: Wrigley Field (1.07 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 8.25 km away at bearing 174 deg; Willis Tower 9.16 km at 178 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Inside Wrigley Field's 3 nm stadium circle (1.07 nm).",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:09",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:23",
    "sun_12deg": "08:22"
   },
   "score": {
    "fog_probability": 0.25,
    "raw_blend": 0.774,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.364,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.36); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.4 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:09",
     "est_end": "10:39",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.25,
    "grade": "C",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.4,
       "wind_after": 1.25,
       "gust_max": 5.2,
       "cloud_mh_night": 1.1818181818181819,
       "cloud_low_night": 42.54545454545455,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 100.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 4,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 13.0,
       "t_key": 5.8,
       "cooling": 7.2,
       "t_min_night": 5.8,
       "td_afternoon": 9.3,
       "crossover": -3.500000000000001,
       "td_drop": 3.500000000000001,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.599999999999909,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.3,
         "Td": 7.0,
         "RH": 80,
         "wind": 1.2,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "22:00",
         "T": 9.5,
         "Td": 6.1,
         "RH": 79,
         "wind": 3.3,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "23:00",
         "T": 8.9,
         "Td": 5.6,
         "RH": 80,
         "wind": 1.7,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "00:00",
         "T": 8.5,
         "Td": 5.4,
         "RH": 81,
         "wind": 2.6,
         "low": 1,
         "mid": 0,
         "high": 1,
         "vis": 14100.0
        },
        {
         "t": "01:00",
         "T": 9.0,
         "Td": 6.1,
         "RH": 82,
         "wind": 1.7,
         "low": 3,
         "mid": 0,
         "high": 0,
         "vis": 13000.0
        },
        {
         "t": "02:00",
         "T": 8.9,
         "Td": 6.5,
         "RH": 85,
         "wind": 1.5,
         "low": 12,
         "mid": 11,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "03:00",
         "T": 8.9,
         "Td": 7.0,
         "RH": 88,
         "wind": 2.6,
         "low": 37,
         "mid": 0,
         "high": 1,
         "vis": 12200.0
        },
        {
         "t": "04:00",
         "T": 7.9,
         "Td": 6.2,
         "RH": 89,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "05:00",
         "T": 6.5,
         "Td": 6.4,
         "RH": 99,
         "wind": 1.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "06:00",
         "T": 6.2,
         "Td": 6.2,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "07:00",
         "T": 5.8,
         "Td": 5.8,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "08:00",
         "T": 5.6,
         "Td": 5.6,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 8.2,
         "Td": 7.9,
         "RH": 98,
         "wind": 1.3,
         "low": 91,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 13.0,
         "Td": 11.2,
         "RH": 89,
         "wind": 0.8,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "11:00",
         "T": 15.3,
         "Td": 11.3,
         "RH": 77,
         "wind": 2.5,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 20500.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.94,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.89,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.2 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.8 \u00b0C vs afternoon dewpoint 9.3 \u00b0C \u2192 -3.5 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (4 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.978
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.0999999999999996,
       "dpd_key": 2.3000000000000007,
       "rh_max": 87,
       "wind_mean": 0.75,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 17.363636363636363,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 14.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.6,
       "t_key": 10.4,
       "cooling": 4.199999999999999,
       "t_min_night": 10.4,
       "td_afternoon": 6.8,
       "crossover": 3.6000000000000005,
       "td_drop": -1.2999999999999998,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.7,
         "Td": 8.9,
         "RH": 73,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.1,
         "Td": 9.1,
         "RH": 77,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.8,
         "Td": 9.2,
         "RH": 79,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.2,
         "Td": 9.4,
         "RH": 83,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 9.2,
         "RH": 85,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.6,
         "Td": 8.8,
         "RH": 83,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 11.0,
         "Td": 8.5,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.6,
         "Td": 8.5,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.5,
         "Td": 8.2,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 10.5,
         "Td": 8.2,
         "RH": 86,
         "wind": 0.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "07:00",
         "T": 10.4,
         "Td": 8.1,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 11.3,
         "Td": 8.8,
         "RH": 85,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1740.0
        },
        {
         "t": "09:00",
         "T": 12.9,
         "Td": 9.7,
         "RH": 81,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 2640.0
        },
        {
         "t": "10:00",
         "T": 14.7,
         "Td": 10.5,
         "RH": 76,
         "wind": 1.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.8,
         "Td": 10.7,
         "RH": 72,
         "wind": 2.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.9,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 17 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.46,
        "why": "temperature fall 18:00 \u2192 sunrise = 4.2 \u00b0C"
       },
       "moisture": {
        "score": 0.16,
        "why": "crossover: forecast night minimum 10.4 \u00b0C vs afternoon dewpoint 6.8 \u00b0C \u2192 +3.6 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.644
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.05,
       "crossover": 2.1499999999999995,
       "td_drop": -0.4500000000000002,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.7,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.2,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.2,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.4,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.7,
         "Td": 7.3,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.7,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.2,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.1,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 10.5,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.9,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.6,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.38,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.614
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.1,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 13.0,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.4,
         "Td": 7.1,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.1,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.5,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.961065&longitude=-87.6392345&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.961065&longitude=-87.6392345&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:03+00:00",
     "elevation_m": 174.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.961065&longitude=-87.6392345&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:03+00:00",
     "elevation_m": 174.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.961065&longitude=-87.6392345&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:03+00:00",
     "elevation_m": 174.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.961065&longitude=-87.6392345&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:03+00:00",
     "elevation_m": 174.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.8,
   "dawn_wind_kt": 1.2
  },
  {
   "id": "montrose-point-bird-sanctuary",
   "name": "Montrose Point (Bird Sanctuary)",
   "lat": 41.9629917,
   "lon": -87.6331701,
   "elevation_m": 183.0,
   "position": "lakefront",
   "agency": "Chicago Park District (natural area)",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/lincoln-park-montrose-point-bird-sanctuary",
   "dawn_access": "CPD page (WebFetch; curl got HTTP 202): \"Natural areas are open from dawn to dusk daily.\" 'Dawn' is not defined on the page, so pre-sunrise access is unconfirmed. Address 200 W. Montrose Harbor Dr. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": null,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked. The sanctuary page itself has no drone text.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan shoreline",
    "natural area / bird sanctuary",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Montrose%20Point%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 23946659 (leisure=nature_reserve, 'Montrose Point Bird Sanctuary'). Ground elevation: USGS EPQS 3DEP 1 m DEM 183.0 m (https://epqs.nationalmap.gov/v1/json?x=-87.6331701&y=41.9629917&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; no MDW Class C at this point; ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 6.15 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 11.91 nm / 13.71 mi, KORD 12.3 nm. Inside the 3 nm stadium-TFR circle of: Wrigley Field (1.35 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 8.43 km away at bearing 177 deg; Willis Tower 9.37 km at 181 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Skyline centroid is 8.4 km away.",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:09",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:23",
    "sun_12deg": "08:22"
   },
   "score": {
    "fog_probability": 0.25,
    "raw_blend": 0.776,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.366,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.37); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.4 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:09",
     "est_end": "10:39",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.25,
    "grade": "C",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.4,
       "wind_after": 1.25,
       "gust_max": 5.2,
       "cloud_mh_night": 1.1818181818181819,
       "cloud_low_night": 42.54545454545455,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 100.0,
       "low_sunrise": 100.0,
       "vis_min": 0.0,
       "vis_fog_hours": 4,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 13.0,
       "t_key": 5.7,
       "cooling": 7.3,
       "t_min_night": 5.7,
       "td_afternoon": 9.2,
       "crossover": -3.499999999999999,
       "td_drop": 3.499999999999999,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.2,
         "Td": 6.9,
         "RH": 80,
         "wind": 1.2,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "22:00",
         "T": 9.5,
         "Td": 6.0,
         "RH": 79,
         "wind": 3.3,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "23:00",
         "T": 8.8,
         "Td": 5.5,
         "RH": 80,
         "wind": 1.7,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 14800.0
        },
        {
         "t": "00:00",
         "T": 8.4,
         "Td": 5.3,
         "RH": 81,
         "wind": 2.6,
         "low": 1,
         "mid": 0,
         "high": 1,
         "vis": 14100.0
        },
        {
         "t": "01:00",
         "T": 9.0,
         "Td": 6.0,
         "RH": 82,
         "wind": 1.7,
         "low": 3,
         "mid": 0,
         "high": 0,
         "vis": 13000.0
        },
        {
         "t": "02:00",
         "T": 8.9,
         "Td": 6.5,
         "RH": 85,
         "wind": 1.5,
         "low": 12,
         "mid": 11,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "03:00",
         "T": 8.9,
         "Td": 7.0,
         "RH": 88,
         "wind": 2.6,
         "low": 37,
         "mid": 0,
         "high": 1,
         "vis": 12200.0
        },
        {
         "t": "04:00",
         "T": 7.8,
         "Td": 6.1,
         "RH": 89,
         "wind": 1.4,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "05:00",
         "T": 6.5,
         "Td": 6.3,
         "RH": 99,
         "wind": 1.8,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "06:00",
         "T": 6.1,
         "Td": 6.1,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 0.0
        },
        {
         "t": "07:00",
         "T": 5.7,
         "Td": 5.7,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "08:00",
         "T": 5.6,
         "Td": 5.6,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 8.2,
         "Td": 7.9,
         "RH": 98,
         "wind": 1.3,
         "low": 91,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "10:00",
         "T": 12.9,
         "Td": 11.1,
         "RH": 89,
         "wind": 0.8,
         "low": 41,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "11:00",
         "T": 15.3,
         "Td": 11.2,
         "RH": 77,
         "wind": 2.5,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 20500.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.94,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.91,
        "why": "temperature fall 18:00 \u2192 sunrise = 7.3 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 5.7 \u00b0C vs afternoon dewpoint 9.2 \u00b0C \u2192 -3.5 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.0 km (4 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.979
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.0999999999999996,
       "dpd_key": 2.200000000000001,
       "rh_max": 87,
       "wind_mean": 0.75,
       "wind_after": 1.2,
       "gust_max": 2.3,
       "cloud_mh_night": 17.363636363636363,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 14.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.5,
       "t_key": 10.3,
       "cooling": 4.199999999999999,
       "t_min_night": 10.3,
       "td_afternoon": 6.75,
       "crossover": 3.5500000000000007,
       "td_drop": -1.3499999999999996,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.6,
         "Td": 8.9,
         "RH": 73,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.0,
         "Td": 9.1,
         "RH": 77,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.7,
         "Td": 9.2,
         "RH": 79,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 9.3,
         "RH": 83,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 9.2,
         "RH": 85,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.5,
         "Td": 8.7,
         "RH": 83,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.9,
         "Td": 8.5,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.5,
         "Td": 8.4,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.2,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "06:00",
         "T": 10.4,
         "Td": 8.2,
         "RH": 86,
         "wind": 0.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "07:00",
         "T": 10.3,
         "Td": 8.1,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 11.2,
         "Td": 8.8,
         "RH": 85,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1740.0
        },
        {
         "t": "09:00",
         "T": 12.8,
         "Td": 9.6,
         "RH": 81,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 2640.0
        },
        {
         "t": "10:00",
         "T": 14.6,
         "Td": 10.4,
         "RH": 76,
         "wind": 1.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.7,
         "Td": 10.7,
         "RH": 72,
         "wind": 2.3,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.38,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.1 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.9,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.8 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight total cloud (levels unavailable) cloud = 17 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.46,
        "why": "temperature fall 18:00 \u2192 sunrise = 4.2 \u00b0C"
       },
       "moisture": {
        "score": 0.17,
        "why": "crossover: forecast night minimum 10.3 \u00b0C vs afternoon dewpoint 6.8 \u00b0C \u2192 +3.6 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.644
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 2.1999999999999993,
       "rh_max": 91,
       "wind_mean": 1.275,
       "wind_after": 0.95,
       "gust_max": 3.1,
       "cloud_mh_night": 51.72727272727273,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.5,
       "t_key": 8.7,
       "cooling": 6.800000000000001,
       "t_min_night": 8.2,
       "td_afternoon": 6.0,
       "crossover": 2.1999999999999993,
       "td_drop": -0.5,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.7999999999999545,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.8,
         "Td": 8.6,
         "RH": 76,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 11.3,
         "Td": 8.1,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 95,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 87,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.6,
         "Td": 7.6,
         "RH": 87,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 75,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.1,
         "Td": 7.3,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 56,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.6,
         "Td": 7.2,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 33,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 8.4,
         "Td": 7.0,
         "RH": 91,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 15,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 8.2,
         "Td": 6.6,
         "RH": 90,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 8.2,
         "Td": 6.1,
         "RH": 87,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 2,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.7,
         "Td": 6.5,
         "RH": 86,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 10.1,
         "Td": 8.0,
         "RH": 87,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.0,
         "Td": 10.4,
         "RH": 90,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 11.8,
         "RH": 88,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 11.5,
         "RH": 79,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.58,
        "why": "overnight mid+high levels cloud = 52 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.84,
        "why": "temperature fall 18:00 \u2192 sunrise = 6.8 \u00b0C"
       },
       "moisture": {
        "score": 0.37,
        "why": "crossover: forecast night minimum 8.2 \u00b0C vs afternoon dewpoint 6.0 \u00b0C \u2192 +2.2 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.613
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.3000000000000007,
       "dpd_key": 1.3000000000000007,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.3,
       "t_key": 8.8,
       "cooling": 8.5,
       "t_min_night": 8.8,
       "td_afternoon": 2.45,
       "crossover": 6.3500000000000005,
       "td_drop": -5.05,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.1,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.5,
         "Td": 7.6,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.0,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.5,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.2,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.5,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.8,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.4,
         "Td": 7.5,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.6,
         "Td": 8.2,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.3,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.5,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.7,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.8 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.672
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9629917&longitude=-87.6331701&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9629917&longitude=-87.6331701&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:03+00:00",
     "elevation_m": 183.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9629917&longitude=-87.6331701&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:04+00:00",
     "elevation_m": 183.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9629917&longitude=-87.6331701&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:04+00:00",
     "elevation_m": 183.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.9629917&longitude=-87.6331701&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:04+00:00",
     "elevation_m": 183.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.7,
   "dawn_wind_kt": 1.2
  },
  {
   "id": "promontory-point",
   "name": "Promontory Point (Hyde Park)",
   "lat": 41.795894,
   "lon": -87.577154,
   "elevation_m": 183.3,
   "position": "lakefront",
   "agency": "Chicago Park District (Burnham Park)",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/promontory-point",
   "dawn_access": "CPD page (curl 200): \"Park Hours ... Sunday: 6:00 am-11:00 pm\" ... every day 6:00 am-11:00 pm. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan shoreline",
    "peninsula",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Promontory%20Point%2C%20Chicago&format=json&limit=1 - Nominatim OSM relation 15772175 (natural=peninsula). Ground elevation: USGS EPQS 3DEP 1 m DEM 183.3 m (https://epqs.nationalmap.gov/v1/json?x=-87.577154&y=41.795894&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3600 MSL-10000 MSL [AREA D]; MDW CLASS C 2300 MSL-3600 MSL (outer shelf, far above 400 ft AGL); ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 2.7 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 7.88 nm / 9.07 mi, KORD 18.36 nm. Outside all three stadium circles (Soldier Field 4.36 nm, Rate Field 3.25 nm, Wrigley 9.79 nm). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 11.0 km away at bearing 337 deg; Willis Tower 10.42 km at 332 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Skyline is 11 km away; the farthest vantage on this list.",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:39",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.12,
    "raw_blend": 0.621,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.347,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.35); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.8 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": null,
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.12,
    "grade": "D",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 2.8,
       "dpd_key": 2.8,
       "rh_max": 82,
       "wind_mean": 2.85,
       "wind_after": 2.7,
       "gust_max": 3.7,
       "cloud_mh_night": 0.18181818181818182,
       "cloud_low_night": 2.272727272727273,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 14600.0,
       "low_sunrise": 4.0,
       "vis_min": 14600.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 13.1,
       "t_key": 5.1,
       "cooling": 8.0,
       "t_min_night": 5.1,
       "td_afternoon": 6.6,
       "crossover": -1.5,
       "td_drop": 4.3,
       "airmass_change": true,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": null,
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.4,
         "Td": 7.3,
         "RH": 81,
         "wind": 4.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15800.0
        },
        {
         "t": "22:00",
         "T": 10.0,
         "Td": 6.3,
         "RH": 78,
         "wind": 4.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 16600.0
        },
        {
         "t": "23:00",
         "T": 10.1,
         "Td": 5.9,
         "RH": 75,
         "wind": 4.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "00:00",
         "T": 9.3,
         "Td": 5.3,
         "RH": 76,
         "wind": 4.2,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "01:00",
         "T": 8.0,
         "Td": 4.4,
         "RH": 78,
         "wind": 3.8,
         "low": 9,
         "mid": 0,
         "high": 2,
         "vis": 16500.0
        },
        {
         "t": "02:00",
         "T": 7.8,
         "Td": 3.9,
         "RH": 76,
         "wind": 3.2,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "03:00",
         "T": 8.6,
         "Td": 4.0,
         "RH": 73,
         "wind": 2.5,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "04:00",
         "T": 7.6,
         "Td": 3.7,
         "RH": 76,
         "wind": 2.5,
         "low": 1,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "05:00",
         "T": 6.7,
         "Td": 2.8,
         "RH": 76,
         "wind": 2.5,
         "low": 3,
         "mid": 0,
         "high": 0,
         "vis": 16400.0
        },
        {
         "t": "06:00",
         "T": 5.7,
         "Td": 2.5,
         "RH": 80,
         "wind": 3.2,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "07:00",
         "T": 5.1,
         "Td": 2.3,
         "RH": 82,
         "wind": 3.2,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 14600.0
        },
        {
         "t": "08:00",
         "T": 5.4,
         "Td": 3.4,
         "RH": 87,
         "wind": 3.9,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "09:00",
         "T": 8.9,
         "Td": 7.1,
         "RH": 88,
         "wind": 1.5,
         "low": 3,
         "mid": 0,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "10:00",
         "T": 12.6,
         "Td": 9.8,
         "RH": 83,
         "wind": 0.8,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "11:00",
         "T": 14.6,
         "Td": 10.6,
         "RH": 77,
         "wind": 2.9,
         "low": 3,
         "mid": 0,
         "high": 0,
         "vis": 19800.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.2,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.8 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 1.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 2.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 0 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.4,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.0 \u00b0C; part of this is cold advection, not radiation (discounted)"
       },
       "moisture": {
        "score": 0.2,
        "why": "crossover: forecast night minimum 5.1 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 -1.5 \u00b0C; rain last 48 h = 0.0 mm; BUT dewpoint falls 4.3 \u00b0C by dawn \u2014 drier air moving in, crossover rule discounted"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 14.6 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.485
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.299999999999999,
       "dpd_key": 2.299999999999999,
       "rh_max": 86,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.1,
       "gust_max": 2.1,
       "cloud_mh_night": 21.09090909090909,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 23.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.7,
       "t_key": 9.2,
       "cooling": 5.5,
       "t_min_night": 9.1,
       "td_afternoon": 6.6,
       "crossover": 2.5,
       "td_drop": -0.3000000000000007,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.5,
         "Td": 8.5,
         "RH": 72,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.3,
         "Td": 8.1,
         "RH": 71,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.8,
         "Td": 8.6,
         "RH": 76,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.2,
         "Td": 8.3,
         "RH": 77,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.7,
         "Td": 8.3,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.1,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.4,
         "Td": 7.8,
         "RH": 84,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.8,
         "Td": 7.5,
         "RH": 86,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "05:00",
         "T": 9.3,
         "Td": 7.0,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "06:00",
         "T": 9.1,
         "Td": 6.8,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.2,
         "Td": 6.9,
         "RH": 86,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 9.8,
         "Td": 7.0,
         "RH": 83,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 460.0
        },
        {
         "t": "09:00",
         "T": 11.8,
         "Td": 8.2,
         "RH": 79,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "10:00",
         "T": 13.8,
         "Td": 9.0,
         "RH": 73,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.2,
         "Td": 9.3,
         "RH": 68,
         "wind": 1.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.33,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.99,
        "why": "overnight total cloud (levels unavailable) cloud = 21 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.67,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.5 \u00b0C"
       },
       "moisture": {
        "score": 0.33,
        "why": "crossover: forecast night minimum 9.1 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 +2.5 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.665
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 0.5,
       "dpd_key": 0.5999999999999996,
       "rh_max": 96,
       "wind_mean": 0.4,
       "wind_after": 0.44999999999999996,
       "gust_max": 1.2,
       "cloud_mh_night": 45.18181818181818,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 4,
       "first_sat_hour": "04:00",
       "t_evening": 15.2,
       "t_key": 6.3,
       "cooling": 8.899999999999999,
       "t_min_night": 6.1,
       "td_afternoon": 5.5,
       "crossover": 0.5999999999999996,
       "td_drop": -0.20000000000000018,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6999999999999318,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 2.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 11.5,
         "Td": 8.2,
         "RH": 80,
         "wind": 1.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 10.9,
         "Td": 8.1,
         "RH": 83,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 80,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.3,
         "Td": 8.1,
         "RH": 86,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 52,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.6,
         "Td": 7.8,
         "RH": 88,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 32,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 8.9,
         "Td": 7.4,
         "RH": 90,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 29,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.2,
         "Td": 7.0,
         "RH": 92,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 34,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 7.5,
         "Td": 6.6,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 35,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 6.8,
         "Td": 6.1,
         "RH": 95,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 25,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 6.1,
         "Td": 5.6,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 10,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 6.3,
         "Td": 5.7,
         "RH": 96,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 7.7,
         "Td": 7.1,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.9,
         "Td": 9.0,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 12.1,
         "Td": 10.4,
         "RH": 89,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 14.3,
         "Td": 10.2,
         "RH": 76,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.5 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.88,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.66,
        "why": "overnight mid+high levels cloud = 45 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.9 \u00b0C"
       },
       "moisture": {
        "score": 0.82,
        "why": "crossover: forecast night minimum 6.1 \u00b0C vs afternoon dewpoint 5.5 \u00b0C \u2192 +0.6 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.5,
        "why": "model has no visibility field; max RH before sunrise = 96 %"
       }
      },
      "gates": [],
      "raw": 0.832
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.2249999999999999,
       "wind_after": 2.05,
       "gust_max": 2.1,
       "cloud_mh_night": 18.09090909090909,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 16.5,
       "t_key": 11.3,
       "cooling": 5.199999999999999,
       "t_min_night": 11.3,
       "td_afternoon": 4.3,
       "crossover": 7.000000000000001,
       "td_drop": -5.6000000000000005,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "08:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 14.7,
         "Td": 9.9,
         "RH": 73,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 9,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 14.6,
         "Td": 10.1,
         "RH": 74,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 14.5,
         "Td": 10.2,
         "RH": 75,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 12,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 14.2,
         "Td": 10.4,
         "RH": 78,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 57,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 13.8,
         "Td": 10.6,
         "RH": 81,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 46,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 13.5,
         "Td": 10.5,
         "RH": 82,
         "wind": 1.3,
         "low": 0,
         "mid": 0,
         "high": 37,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 13.4,
         "Td": 10.7,
         "RH": 84,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 13.0,
         "Td": 10.6,
         "RH": 85,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 10,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 12.5,
         "Td": 10.2,
         "RH": 86,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 9,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 11.8,
         "Td": 10.1,
         "RH": 89,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 10,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 11.3,
         "Td": 9.9,
         "RH": 91,
         "wind": 1.7,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 11.2,
         "Td": 9.2,
         "RH": 87,
         "wind": 2.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 12.0,
         "Td": 7.5,
         "RH": 74,
         "wind": 2.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.6,
         "Td": 6.3,
         "RH": 61,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 15.7,
         "Td": 5.9,
         "RH": 52,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.93,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.2 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 18 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.63,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.2 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 11.3 \u00b0C vs afternoon dewpoint 4.3 \u00b0C \u2192 +7.0 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.626
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.795894&longitude=-87.577154&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.795894&longitude=-87.577154&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:04+00:00",
     "elevation_m": 182.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.795894&longitude=-87.577154&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:04+00:00",
     "elevation_m": 182.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.795894&longitude=-87.577154&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:04+00:00",
     "elevation_m": 182.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.795894&longitude=-87.577154&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:05+00:00",
     "elevation_m": 182.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 5.1,
   "dawn_wind_kt": 3.2
  },
  {
   "id": "margaret-t-burroughs-31st-street-beach",
   "name": "31st Street Beach (Margaret T. Burroughs Beach)",
   "lat": 41.8395034,
   "lon": -87.6067442,
   "elevation_m": 178.3,
   "position": "lakefront",
   "agency": "Chicago Park District (Burnham Park)",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/margaret-t-burroughs-beach",
   "dawn_access": "CPD page (curl 200): \"The beach is open from 6 am to 11 pm\"; Burnham Park page: \"Park Hours ... 6:00 am-11:00 pm\". Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Lake Michigan beach",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=31st%20Street%20Beach%2C%20Chicago&format=json&limit=1 - Nominatim OSM way 185415594 (natural=beach), which Nominatim names 'Margaret Burroughs Beach'. CPD page title: 'Margaret T. Burroughs Beach', address 3100 S. DuSable Lake Shore Drive. Ground elevation: USGS EPQS 3DEP 1 m DEM 178.3 m (https://epqs.nationalmap.gov/v1/json?x=-87.6067442&y=41.8395034&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3600 MSL-10000 MSL [AREA D]; MDW CLASS C 2300 MSL-3600 MSL (outer shelf, far above 400 ft AGL); ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 2.08 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 7.29 nm / 8.39 mi, KORD 15.79 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (1.44 nm), Rate Field (White Sox) (1.34 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 5.6 km away at bearing 342 deg; Willis Tower 4.99 km at 331 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Inside the circles of both Soldier Field (1.44 nm) and Rate Field (1.34 nm).",
   "look": "skyline across the water: a deck cutting the towers, or lake fog rolling onto the shore",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:39",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.21,
    "raw_blend": 0.734,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.175,
    "confidence": "medium",
    "confidence_why": "models differ by 0.17 on the blend score",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 1.3 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
     "heuristic_type": "shallow ground fog",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "09:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 0.6,
     "label": "filtered sun",
     "why": "mid+high cloud at sunrise \u2248 0 %, plus a low deck \u2248 60 % with visibility 12 km (stratus, not fog) \u2014 beams possible through gaps"
    },
    "steam_fog": null,
    "photo_score": 0.17,
    "grade": "C",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 1.3000000000000003,
       "dpd_key": 1.3000000000000003,
       "rh_max": 91,
       "wind_mean": 2.3,
       "wind_after": 2.35,
       "gust_max": 4.1,
       "cloud_mh_night": 0.8181818181818182,
       "cloud_low_night": 9.090909090909092,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 12200.0,
       "low_sunrise": 60.0,
       "vis_min": 12200.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 13.1,
       "t_key": 4.7,
       "cooling": 8.399999999999999,
       "t_min_night": 4.7,
       "td_afternoon": 6.5,
       "crossover": -1.7999999999999998,
       "td_drop": 3.1,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.4,
         "Td": 7.5,
         "RH": 82,
         "wind": 4.7,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15200.0
        },
        {
         "t": "22:00",
         "T": 9.8,
         "Td": 6.5,
         "RH": 80,
         "wind": 4.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 16900.0
        },
        {
         "t": "23:00",
         "T": 10.1,
         "Td": 6.4,
         "RH": 78,
         "wind": 4.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 15600.0
        },
        {
         "t": "00:00",
         "T": 9.4,
         "Td": 6.0,
         "RH": 79,
         "wind": 3.8,
         "low": 1,
         "mid": 0,
         "high": 0,
         "vis": 15300.0
        },
        {
         "t": "01:00",
         "T": 8.1,
         "Td": 4.7,
         "RH": 79,
         "wind": 3.5,
         "low": 7,
         "mid": 0,
         "high": 5,
         "vis": 17300.0
        },
        {
         "t": "02:00",
         "T": 7.7,
         "Td": 3.9,
         "RH": 77,
         "wind": 3.0,
         "low": 7,
         "mid": 4,
         "high": 0,
         "vis": 18100.0
        },
        {
         "t": "03:00",
         "T": 8.2,
         "Td": 3.8,
         "RH": 74,
         "wind": 2.2,
         "low": 1,
         "mid": 0,
         "high": 0,
         "vis": 17300.0
        },
        {
         "t": "04:00",
         "T": 7.6,
         "Td": 3.6,
         "RH": 76,
         "wind": 2.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": 16300.0
        },
        {
         "t": "05:00",
         "T": 6.5,
         "Td": 3.5,
         "RH": 81,
         "wind": 2.4,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 14700.0
        },
        {
         "t": "06:00",
         "T": 5.4,
         "Td": 3.4,
         "RH": 87,
         "wind": 2.5,
         "low": 13,
         "mid": 0,
         "high": 0,
         "vis": 12500.0
        },
        {
         "t": "07:00",
         "T": 4.7,
         "Td": 3.4,
         "RH": 91,
         "wind": 2.2,
         "low": 66,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "08:00",
         "T": 5.2,
         "Td": 4.8,
         "RH": 97,
         "wind": 2.9,
         "low": 54,
         "mid": 0,
         "high": 0,
         "vis": 12200.0
        },
        {
         "t": "09:00",
         "T": 8.6,
         "Td": 7.0,
         "RH": 90,
         "wind": 1.8,
         "low": 8,
         "mid": 0,
         "high": 0,
         "vis": 14300.0
        },
        {
         "t": "10:00",
         "T": 12.5,
         "Td": 9.9,
         "RH": 84,
         "wind": 0.8,
         "low": 4,
         "mid": 0,
         "high": 0,
         "vis": 16700.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.3,
         "RH": 79,
         "wind": 2.3,
         "low": 5,
         "mid": 0,
         "high": 0,
         "vis": 19400.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.7,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.3 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 1.0,
        "why": "mean 10 m wind in the 3 h before sunrise = 2.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.4 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 4.7 \u00b0C vs afternoon dewpoint 6.5 \u00b0C \u2192 -1.8 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.1,
        "why": "model's own visibility minimum before sunrise = 12.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.775
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 2.3999999999999995,
       "dpd_key": 2.5999999999999996,
       "rh_max": 85,
       "wind_mean": 0.8500000000000001,
       "wind_after": 1.1,
       "gust_max": 2.3,
       "cloud_mh_night": 22.636363636363637,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 26.0,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 15.0,
       "t_key": 9.7,
       "cooling": 5.300000000000001,
       "t_min_night": 9.7,
       "td_afternoon": 6.8,
       "crossover": 2.8999999999999995,
       "td_drop": -0.2999999999999998,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.8,
         "Td": 8.6,
         "RH": 71,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 13.6,
         "Td": 8.4,
         "RH": 71,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 13.2,
         "Td": 8.9,
         "RH": 75,
         "wind": 1.7,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.6,
         "Td": 8.5,
         "RH": 76,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 12.1,
         "Td": 8.6,
         "RH": 79,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 8.0,
         "RH": 80,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.7,
         "Td": 7.7,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 10.2,
         "Td": 7.8,
         "RH": 85,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "05:00",
         "T": 9.8,
         "Td": 7.2,
         "RH": 84,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "06:00",
         "T": 9.7,
         "Td": 7.3,
         "RH": 85,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.7,
         "Td": 7.1,
         "RH": 84,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.2,
         "Td": 7.3,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 460.0
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 14540.0
        },
        {
         "t": "10:00",
         "T": 14.0,
         "Td": 9.4,
         "RH": 74,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.3,
         "Td": 9.6,
         "RH": 69,
         "wind": 1.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.3,
        "why": "min T\u2212Td in the 3 h before sunrise = 2.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.91,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.9 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.96,
        "why": "overnight total cloud (levels unavailable) cloud = 23 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.64,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.3 \u00b0C"
       },
       "moisture": {
        "score": 0.27,
        "why": "crossover: forecast night minimum 9.7 \u00b0C vs afternoon dewpoint 6.8 \u00b0C \u2192 +2.9 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.646
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 0.5999999999999996,
       "dpd_key": 0.5999999999999996,
       "rh_max": 96,
       "wind_mean": 0.4,
       "wind_after": 0.44999999999999996,
       "gust_max": 1.2,
       "cloud_mh_night": 45.18181818181818,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 4,
       "first_sat_hour": "04:00",
       "t_evening": 15.2,
       "t_key": 6.3,
       "cooling": 8.899999999999999,
       "t_min_night": 6.2,
       "td_afternoon": 5.55,
       "crossover": 0.6500000000000004,
       "td_drop": -0.15000000000000036,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.7000000000000455,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 2.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 11.6,
         "Td": 8.2,
         "RH": 80,
         "wind": 1.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 10.9,
         "Td": 8.2,
         "RH": 83,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 80,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.3,
         "Td": 8.1,
         "RH": 86,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 52,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.8,
         "RH": 88,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 32,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.0,
         "Td": 7.4,
         "RH": 90,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 29,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.2,
         "Td": 7.0,
         "RH": 92,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 34,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 7.6,
         "Td": 6.7,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 35,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 6.8,
         "Td": 6.1,
         "RH": 95,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 25,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 6.2,
         "Td": 5.6,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 10,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 6.3,
         "Td": 5.7,
         "RH": 96,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 7.7,
         "Td": 7.1,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 9.1,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 12.2,
         "Td": 10.4,
         "RH": 89,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 14.4,
         "Td": 10.2,
         "RH": 76,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.6 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.88,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.66,
        "why": "overnight mid+high levels cloud = 45 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.9 \u00b0C"
       },
       "moisture": {
        "score": 0.8,
        "why": "crossover: forecast night minimum 6.2 \u00b0C vs afternoon dewpoint 5.5 \u00b0C \u2192 +0.7 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.5,
        "why": "model has no visibility field; max RH before sunrise = 96 %"
       }
      },
      "gates": [],
      "raw": 0.821
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.5,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.7,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.1,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8395034&longitude=-87.6067442&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8395034&longitude=-87.6067442&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:05+00:00",
     "elevation_m": 177.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8395034&longitude=-87.6067442&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:05+00:00",
     "elevation_m": 177.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8395034&longitude=-87.6067442&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:05+00:00",
     "elevation_m": 177.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8395034&longitude=-87.6067442&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:05+00:00",
     "elevation_m": 177.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 4.7,
   "dawn_wind_kt": 2.2
  },
  {
   "id": "ping-tom-memorial-park",
   "name": "Ping Tom Memorial Park (Chinatown, South Branch)",
   "lat": 41.8588987,
   "lon": -87.6325387,
   "elevation_m": 181.1,
   "position": "park",
   "agency": "Chicago Park District",
   "agency_url": "https://www.chicagoparkdistrict.com/parks-facilities/tom-ping-memorial-park",
   "dawn_access": "CPD page (WebFetch; curl got HTTP 202): every day \"6:00 am-10:00 pm\" (closes an hour earlier than the lakefront parks). Address 1700 S. Wentworth Ave. Sun data (api.sunrise-sunset.org, 41.888,-87.625): sunrise 07:02 CDT and civil dawn 06:36 on 16 Oct; civil dawn 06:53 on 31 Oct; 05:54 CST on 1 Nov; 06:26 on 30 Nov; 06:43 on 21 Dec. So a 6:00 am opening is before civil dawn on almost every fog-season day, but only by 6 minutes on 1 Nov.",
   "dawn_access_ok": true,
   "drone_rule": "Chicago Park District Code ch. VII sec. C.3.a (Rev. 09/2025): \"No person shall, without a permit: ... (11) bring, land or cause to ascend or descend or alight within the Park District, any airplane, helicopter, flying machine, balloon, parachute or other apparatus for aviation;\". The Code never uses the word 'drone', but the Park District permit page lists \"Flying Machine (e.g. drones)\" among the features that need a Special Event Permit. City ordinance MCC 10-36-400(b) (substitute ordinance SO2015-5419, passed 18 Nov 2015; City Clerk PDF): no person shall operate a small unmanned aircraft in city airspace \"(1) except for hobby or recreational purposes only\"; \"(2) directly over any person who is not involved in the operation ... without such person's consent\"; \"(3) over property that the operator does not own, without the property owner's consent\"; \"(4) at an altitude higher than 400 feet above ground level\"; \"(6) within five miles of any airport\"; \"(8) between dusk and dawn\". Chicago Film Office page: \"The City of Chicago does not issue permits that are specific to drone operations\" but in \"downtown Chicago ... the City of Chicago and Chicago Police will need to review and approve flight plans\" for commercial flights. Current text of 10-36-400 on amlegal could not be fetched (Cloudflare 403), so later amendments are unchecked.",
   "drone_rule_url": "https://www.chicagoparkdistrict.com/media/39051/download?inline",
   "drone_status": "permit",
   "features": [
    "Chicago River (South Branch)",
    "skyline view"
   ],
   "features_source": "Coordinates: https://nominatim.openstreetmap.org/search?q=Ping%20Tom%20Memorial%20Park%2C%20Chicago&format=json&limit=1 - Nominatim OSM relation 5240880 (leisure=park). Ground elevation: USGS EPQS 3DEP 1 m DEM 181.1 m (https://epqs.nationalmap.gov/v1/json?x=-87.6325387&y=41.8588987&wkid=4326&units=Meters&includeDate=true, DEM acquired 6/3/2017).",
   "drive_minutes_est": null,
   "airspace_note": "FAA Class_Airspace point query: ORD CLASS B 3000 MSL-10000 MSL [AREA C]; MDW CLASS C 1900 MSL-3600 MSL (outer shelf, far above 400 ft AGL); ORD Mode C veil (SFC-10,000 MSL); Chicago Class E5 floor 700 ft AGL; surface is Class G. No UAS Facility Map cell at the point (FAA_UAS_FacilityMap_Data; nearest cell 1.86 nm away, ceiling 400 ft, map effective 10/1/2026). Distances to airport reference points (AirNav): KMDW 6.95 nm / 7.99 mi, KORD 14.21 nm. Inside the 3 nm stadium-TFR circle of: Soldier Field (0.74 nm), Rate Field (White Sox) (1.74 nm) (only on event days). No national-security UAS restriction polygon at the point (nearest: MCC Chicago, Surface-400 ft AGL, about 41.8766 N 87.6304 W).",
   "notes": "Skyline view: centre of the 15 target towers is 3.18 km away at bearing 7 deg; Willis Tower 2.22 km at 353 deg (great-circle from the point, computed). drive_minutes_est is null: no Chicago home point exists in data/regions.json yet. Only vantage inside the MDW Class C 1,900 ft MSL outer shelf; still far above 400 ft AGL.",
   "look": "foreground trees and water with the skyline behind; lake fog on an east wind",
   "evidence": "research/H-chicago.md",
   "sun": {
    "civil_dawn": "06:40",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "night_length_h": 13.1,
    "sun_2deg": "07:22",
    "sun_12deg": "08:21"
   },
   "score": {
    "fog_probability": 0.31,
    "raw_blend": 0.833,
    "calibration": "Platt-calibrated on 329 station-mornings (2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL)",
    "models_scored": [
     "ecmwf_ifs025",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "models_failed": {},
    "model_spread": 0.335,
    "confidence": "low",
    "confidence_why": "models disagree (spread 0.33); treat the number as a coin-flip and check the 04:45 refresh",
    "fog_type": {
     "type": "deep fog bank",
     "depth_est": "\u2265 34 m (model profile)",
     "why": "saturated for 3 h before sunrise with 1.6 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
     "heuristic_type": "deep fog bank",
     "profile_note": "HRRR profile at KMDW 07:00 (run 2026-10-19 13:00): saturated (T\u2212Td \u2264 1 \u00b0C) up to 34 m AGL, temperature change 10 m \u2192 80 m: +8.0 \u00b0C (inversion) \u2014 profile supports a deep layer"
    },
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "light": {
     "score": 1.0,
     "label": "sun will reach the fog top",
     "why": "mid+high cloud at sunrise \u2248 0 %"
    },
    "steam_fog": null,
    "photo_score": 0.31,
    "grade": "B",
    "per_model": {
     "gfs_hrrr": {
      "features": {
       "dpd_min": 0.0,
       "dpd_key": 0.0,
       "rh_max": 100,
       "wind_mean": 1.625,
       "wind_after": 1.6,
       "gust_max": 4.3,
       "cloud_mh_night": 0.8181818181818182,
       "cloud_low_night": 31.727272727272727,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": 100.0,
       "low_sunrise": 100.0,
       "vis_min": 100.0,
       "vis_fog_hours": 3,
       "hours_saturated": 3,
       "first_sat_hour": "05:00",
       "t_evening": 13.1,
       "t_key": 4.5,
       "cooling": 8.6,
       "t_min_night": 4.5,
       "td_afternoon": 6.550000000000001,
       "crossover": -2.0500000000000007,
       "td_drop": 2.0500000000000007,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.39999999999997726,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 10.2,
         "Td": 7.2,
         "RH": 82,
         "wind": 2.5,
         "low": 3,
         "mid": 0,
         "high": 0,
         "vis": 14500.0
        },
        {
         "t": "22:00",
         "T": 9.5,
         "Td": 6.4,
         "RH": 81,
         "wind": 4.0,
         "low": 2,
         "mid": 0,
         "high": 0,
         "vis": 16000.0
        },
        {
         "t": "23:00",
         "T": 9.7,
         "Td": 6.2,
         "RH": 79,
         "wind": 3.0,
         "low": 1,
         "mid": 0,
         "high": 0,
         "vis": 15000.0
        },
        {
         "t": "00:00",
         "T": 9.5,
         "Td": 6.4,
         "RH": 81,
         "wind": 3.3,
         "low": 3,
         "mid": 0,
         "high": 0,
         "vis": 13700.0
        },
        {
         "t": "01:00",
         "T": 8.3,
         "Td": 5.1,
         "RH": 80,
         "wind": 3.4,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 15700.0
        },
        {
         "t": "02:00",
         "T": 7.6,
         "Td": 4.0,
         "RH": 78,
         "wind": 2.2,
         "low": 10,
         "mid": 8,
         "high": 0,
         "vis": 17200.0
        },
        {
         "t": "03:00",
         "T": 7.7,
         "Td": 3.9,
         "RH": 77,
         "wind": 1.2,
         "low": 8,
         "mid": 0,
         "high": 1,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 6.6,
         "Td": 3.9,
         "RH": 83,
         "wind": 1.6,
         "low": 16,
         "mid": 0,
         "high": 0,
         "vis": 13500.0
        },
        {
         "t": "05:00",
         "T": 5.4,
         "Td": 4.4,
         "RH": 93,
         "wind": 2.0,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 300.0
        },
        {
         "t": "06:00",
         "T": 5.1,
         "Td": 4.9,
         "RH": 99,
         "wind": 1.7,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "07:00",
         "T": 4.5,
         "Td": 4.5,
         "RH": 100,
         "wind": 1.2,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "08:00",
         "T": 4.6,
         "Td": 4.6,
         "RH": 100,
         "wind": 1.5,
         "low": 100,
         "mid": 0,
         "high": 0,
         "vis": 100.0
        },
        {
         "t": "09:00",
         "T": 7.8,
         "Td": 7.1,
         "RH": 95,
         "wind": 1.7,
         "low": 78,
         "mid": 0,
         "high": 0,
         "vis": 12500.0
        },
        {
         "t": "10:00",
         "T": 12.3,
         "Td": 9.8,
         "RH": 85,
         "wind": 0.6,
         "low": 28,
         "mid": 0,
         "high": 0,
         "vis": 16100.0
        },
        {
         "t": "11:00",
         "T": 14.9,
         "Td": 11.5,
         "RH": 80,
         "wind": 1.9,
         "low": 6,
         "mid": 0,
         "high": 0,
         "vis": 18900.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 1.0,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.0 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.96,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.6 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 1.0,
        "why": "overnight mid+high levels cloud = 1 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.6 \u00b0C"
       },
       "moisture": {
        "score": 1.0,
        "why": "crossover: forecast night minimum 4.5 \u00b0C vs afternoon dewpoint 6.6 \u00b0C \u2192 -2.1 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 1.0,
        "why": "model's own visibility minimum before sunrise = 0.1 km (3 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.992
     },
     "ncep_nbm_conus": {
      "features": {
       "dpd_min": 1.9000000000000004,
       "dpd_key": 2.200000000000001,
       "rh_max": 88,
       "wind_mean": 0.35,
       "wind_after": 0.9,
       "gust_max": 2.3,
       "cloud_mh_night": 21.636363636363637,
       "cloud_low_night": null,
       "cloud_mh_sunrise": 23.5,
       "cloud_source": "total cloud (levels unavailable)",
       "vis_sunrise": 1240.0,
       "low_sunrise": null,
       "vis_min": 1240.0,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 14.9,
       "t_key": 9.3,
       "cooling": 5.6,
       "t_min_night": 9.3,
       "td_afternoon": 6.7,
       "crossover": 2.6000000000000005,
       "td_drop": -0.39999999999999947,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": null,
       "model_clear_hour": "09:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.3,
         "Td": 8.6,
         "RH": 73,
         "wind": 1.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.6,
         "RH": 75,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 8.9,
         "RH": 78,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "00:00",
         "T": 12.0,
         "Td": 8.8,
         "RH": 81,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "01:00",
         "T": 11.4,
         "Td": 8.6,
         "RH": 83,
         "wind": 1.2,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "02:00",
         "T": 10.9,
         "Td": 7.9,
         "RH": 82,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16280.0
        },
        {
         "t": "03:00",
         "T": 10.3,
         "Td": 7.7,
         "RH": 84,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "04:00",
         "T": 9.7,
         "Td": 7.6,
         "RH": 87,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 9560.0
        },
        {
         "t": "05:00",
         "T": 9.5,
         "Td": 7.4,
         "RH": 87,
         "wind": 0.6,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "06:00",
         "T": 9.3,
         "Td": 7.4,
         "RH": 88,
         "wind": 0.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "07:00",
         "T": 9.3,
         "Td": 7.1,
         "RH": 86,
         "wind": 0.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 1240.0
        },
        {
         "t": "08:00",
         "T": 10.2,
         "Td": 7.4,
         "RH": 83,
         "wind": 0.8,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 460.0
        },
        {
         "t": "09:00",
         "T": 12.1,
         "Td": 8.7,
         "RH": 80,
         "wind": 1.0,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 11080.0
        },
        {
         "t": "10:00",
         "T": 14.1,
         "Td": 9.5,
         "RH": 74,
         "wind": 1.4,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        },
        {
         "t": "11:00",
         "T": 15.5,
         "Td": 9.8,
         "RH": 69,
         "wind": 1.9,
         "low": null,
         "mid": null,
         "high": null,
         "vis": 16200.0
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.44,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.9 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.87,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.3 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.98,
        "why": "overnight total cloud (levels unavailable) cloud = 22 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 0.68,
        "why": "temperature fall 18:00 \u2192 sunrise = 5.6 \u00b0C"
       },
       "moisture": {
        "score": 0.31,
        "why": "crossover: forecast night minimum 9.3 \u00b0C vs afternoon dewpoint 6.7 \u00b0C \u2192 +2.6 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.93,
        "why": "model's own visibility minimum before sunrise = 1.2 km (0 h \u2264 1 km overnight)"
       }
      },
      "gates": [],
      "raw": 0.692
     },
     "ecmwf_ifs025": {
      "features": {
       "dpd_min": 0.5999999999999996,
       "dpd_key": 0.5999999999999996,
       "rh_max": 96,
       "wind_mean": 0.4,
       "wind_after": 0.44999999999999996,
       "gust_max": 1.2,
       "cloud_mh_night": 45.18181818181818,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 4,
       "first_sat_hour": "04:00",
       "t_evening": 15.2,
       "t_key": 6.3,
       "cooling": 8.899999999999999,
       "t_min_night": 6.2,
       "td_afternoon": 5.55,
       "crossover": 0.6500000000000004,
       "td_drop": -0.15000000000000036,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.8000000000000682,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 12.1,
         "Td": 8.4,
         "RH": 78,
         "wind": 2.0,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 11.6,
         "Td": 8.2,
         "RH": 80,
         "wind": 1.9,
         "low": 0,
         "mid": 0,
         "high": 100,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 10.9,
         "Td": 8.1,
         "RH": 83,
         "wind": 1.5,
         "low": 0,
         "mid": 0,
         "high": 80,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 10.3,
         "Td": 8.1,
         "RH": 86,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 52,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 9.7,
         "Td": 7.8,
         "RH": 88,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 32,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 9.0,
         "Td": 7.4,
         "RH": 90,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 29,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 8.2,
         "Td": 7.0,
         "RH": 92,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 34,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 7.6,
         "Td": 6.7,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 35,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 6.8,
         "Td": 6.1,
         "RH": 95,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 25,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 6.2,
         "Td": 5.6,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 10,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 6.3,
         "Td": 5.7,
         "RH": 96,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 7.7,
         "Td": 7.1,
         "RH": 96,
         "wind": 0.3,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 10.0,
         "Td": 9.0,
         "RH": 94,
         "wind": 0.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 12.2,
         "Td": 10.4,
         "RH": 89,
         "wind": 0.9,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 14.4,
         "Td": 10.2,
         "RH": 76,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.97,
        "why": "min T\u2212Td in the 3 h before sunrise = 0.6 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.88,
        "why": "mean 10 m wind in the 3 h before sunrise = 0.4 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.66,
        "why": "overnight mid+high levels cloud = 45 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.9 \u00b0C"
       },
       "moisture": {
        "score": 0.8,
        "why": "crossover: forecast night minimum 6.2 \u00b0C vs afternoon dewpoint 5.5 \u00b0C \u2192 +0.7 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.5,
        "why": "model has no visibility field; max RH before sunrise = 96 %"
       }
      },
      "gates": [],
      "raw": 0.821
     },
     "icon_seamless": {
      "features": {
       "dpd_min": 1.4000000000000004,
       "dpd_key": 1.4000000000000004,
       "rh_max": 91,
       "wind_mean": 1.5250000000000001,
       "wind_after": 1.2,
       "gust_max": 1.9,
       "cloud_mh_night": 25.545454545454547,
       "cloud_low_night": 0.0,
       "cloud_mh_sunrise": 0.0,
       "cloud_source": "mid+high levels",
       "vis_sunrise": null,
       "low_sunrise": 0.0,
       "vis_min": null,
       "vis_fog_hours": 0,
       "hours_saturated": 0,
       "first_sat_hour": null,
       "t_evening": 17.4,
       "t_key": 8.9,
       "cooling": 8.499999999999998,
       "t_min_night": 8.9,
       "td_afternoon": 2.55,
       "crossover": 6.3500000000000005,
       "td_drop": -4.95,
       "airmass_change": false,
       "precip_night_mm": 0,
       "precip_dawn_mm": 0,
       "pressure_trend": 0.6000000000000227,
       "model_clear_hour": "10:00",
       "dawn_rows": [
        {
         "t": "21:00",
         "T": 13.2,
         "Td": 8.0,
         "RH": 71,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "22:00",
         "T": 12.9,
         "Td": 8.0,
         "RH": 72,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 6,
         "vis": null
        },
        {
         "t": "23:00",
         "T": 12.6,
         "Td": 7.6,
         "RH": 72,
         "wind": 0.4,
         "low": 0,
         "mid": 0,
         "high": 43,
         "vis": null
        },
        {
         "t": "00:00",
         "T": 12.1,
         "Td": 7.4,
         "RH": 73,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 77,
         "vis": null
        },
        {
         "t": "01:00",
         "T": 11.6,
         "Td": 7.1,
         "RH": 74,
         "wind": 1.2,
         "low": 0,
         "mid": 0,
         "high": 73,
         "vis": null
        },
        {
         "t": "02:00",
         "T": 11.3,
         "Td": 7.0,
         "RH": 75,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "03:00",
         "T": 11.3,
         "Td": 7.4,
         "RH": 77,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 26,
         "vis": null
        },
        {
         "t": "04:00",
         "T": 11.0,
         "Td": 7.9,
         "RH": 81,
         "wind": 1.1,
         "low": 0,
         "mid": 0,
         "high": 21,
         "vis": null
        },
        {
         "t": "05:00",
         "T": 10.4,
         "Td": 8.0,
         "RH": 85,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "06:00",
         "T": 9.6,
         "Td": 7.7,
         "RH": 88,
         "wind": 1.8,
         "low": 0,
         "mid": 0,
         "high": 3,
         "vis": null
        },
        {
         "t": "07:00",
         "T": 8.9,
         "Td": 7.5,
         "RH": 91,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "08:00",
         "T": 8.5,
         "Td": 7.6,
         "RH": 94,
         "wind": 1.4,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "09:00",
         "T": 9.7,
         "Td": 8.3,
         "RH": 91,
         "wind": 1.0,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "10:00",
         "T": 13.7,
         "Td": 9.4,
         "RH": 75,
         "wind": 0.8,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        },
        {
         "t": "11:00",
         "T": 16.6,
         "Td": 8.0,
         "RH": 57,
         "wind": 1.6,
         "low": 0,
         "mid": 0,
         "high": 0,
         "vis": null
        }
       ]
      },
      "factors": {
       "dewpoint_depression": {
        "score": 0.65,
        "why": "min T\u2212Td in the 3 h before sunrise = 1.4 \u00b0C (\u22641 \u00b0C strongly favours fog, >3 \u00b0C rarely fogs)"
       },
       "wind": {
        "score": 0.95,
        "why": "mean 10 m wind in the 3 h before sunrise = 1.5 kt (2\u20135 kt ideal; calm gives only shallow fog; >8 kt mixes it out)"
       },
       "sky": {
        "score": 0.93,
        "why": "overnight mid+high levels cloud = 26 % (clear sky lets the ground radiate and cool)"
       },
       "cooling": {
        "score": 1.0,
        "why": "temperature fall 18:00 \u2192 sunrise = 8.5 \u00b0C"
       },
       "moisture": {
        "score": 0.1,
        "why": "crossover: forecast night minimum 8.9 \u00b0C vs afternoon dewpoint 2.5 \u00b0C \u2192 +6.4 \u00b0C; rain last 48 h = 0.0 mm"
       },
       "model_signal": {
        "score": 0.15,
        "why": "model has no visibility field; max RH before sunrise = 91 %"
       }
      },
      "gates": [],
      "raw": 0.657
     }
    },
    "primary_model": "gfs_hrrr",
    "primary_label": "HRRR"
   },
   "precip": {
    "mm_48h": 0.0,
    "soil_moisture_top": 0.282,
    "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8588987&longitude=-87.6325387&hourly=precipitation%2Csoil_moisture_0_to_1cm%2Csoil_moisture_1_to_3cm&models=icon_seamless&timezone=GMT&past_days=3&forecast_days=1",
    "source": "Open-Meteo ICON assimilated past days (model analysis, not a gauge)"
   },
   "sources": {
    "gfs_hrrr": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8588987&longitude=-87.6325387&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:06+00:00",
     "elevation_m": 180.0
    },
    "ncep_nbm_conus": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8588987&longitude=-87.6325387&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:06+00:00",
     "elevation_m": 180.0
    },
    "ecmwf_ifs025": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8588987&longitude=-87.6325387&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:06+00:00",
     "elevation_m": 180.0
    },
    "icon_seamless": {
     "url": "https://api.open-meteo.com/v1/forecast?latitude=41.8588987&longitude=-87.6325387&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-20T16%3A00",
     "fetched_utc": "2026-10-20T02:45:06+00:00",
     "elevation_m": 180.0
    }
   },
   "water_temp_c": null,
   "dawn_temp_c": 4.5,
   "dawn_wind_kt": 1.2
  }
 ],
 "log": [],
 "calibration": {
  "a": 5.511394479940868,
  "b": -5.384646836851622,
  "n": 329,
  "events": 34,
  "period": "2026-08-21..2026-10-15 at GYY, IKK, JOT, LOT, PNT, RZL",
  "fitted_utc": "2026-10-16T04:17:08+00:00"
 },
 "models": [
  "gfs_hrrr",
  "ncep_nbm_conus",
  "ecmwf_ifs025",
  "icon_seamless"
 ],
 "version": "0.2.0",
 "afd": {
  "url": "https://api.weather.gov/products/022371e7-b621-451f-8d1f-6327372ed430",
  "issued": "2026-10-19T23:15:00+00:00",
  "fog_paragraphs": [
   "- Shallow fog may develop in northeastern Illinois early Tuesday morning. Any fog would dissipate a few hours after sunrise.",
   "The only item of note is a threat for shallow fog overnight into tomorrow morning near Lake Michigan where a modestly more moist environment will advect inland. Otherwise, no significant weather is expected the next 7 days with above to much above average temperatures each day. Generally light winds should allow weak lake breezes to form each of the next several afternoons, but probably only result in slightly cooler conditions right near the lake. Other than a bit of mid-high level cloudiness this afternoon, much of the week looks to be mostly sunny.",
   "Light and variable winds (at times prevailing out of the east) will prevail through the TAF period. Shallow ground fog may develop in the vicinity of ORD/MDW early tomorrow morning (08-13Z timeframe). We have maintained the targeted TEMPO group for 1 1/2SM BR introduced in the 18z tafs. Otherwise, there are no aviation concerns through the TAF period."
  ]
 },
 "metar": {
  "url": "https://aviationweather.gov/api/data/metar?ids=KMDW%2CKORD%2CKPWK%2CKGYY&format=json",
  "obs": [
   {
    "id": "KGYY",
    "time": "2026-10-20T01:00:00.000Z",
    "temp_c": 11,
    "dewp_c": 11,
    "wind_kt": 0,
    "wind_dir": 0,
    "vis_mi": "10+",
    "clouds": [],
    "wx": null,
    "raw": "METAR KGYY 200050Z 00000KT 10SM CLR 11/11 A3035"
   },
   {
    "id": "KMDW",
    "time": "2026-10-20T02:00:00.000Z",
    "temp_c": 12.8,
    "dewp_c": 9.4,
    "wind_kt": 0,
    "wind_dir": 0,
    "vis_mi": "10+",
    "clouds": [
     [
      "FEW",
      10000
     ]
    ],
    "wx": null,
    "raw": "METAR KMDW 200153Z 00000KT 10SM FEW100 13/09 A3036 RMK AO2 SLP283 T01280094"
   },
   {
    "id": "KORD",
    "time": "2026-10-20T02:00:00.000Z",
    "temp_c": 12.8,
    "dewp_c": 6.7,
    "wind_kt": 0,
    "wind_dir": 0,
    "vis_mi": "10+",
    "clouds": [
     [
      "FEW",
      30000
     ]
    ],
    "wx": null,
    "raw": "METAR KORD 200151Z 00000KT 10SM FEW300 13/07 A3036 RMK AO2 SLP281 T01280067"
   },
   {
    "id": "KPWK",
    "time": "2026-10-20T02:00:00.000Z",
    "temp_c": 9.4,
    "dewp_c": 7.2,
    "wind_kt": 0,
    "wind_dir": 0,
    "vis_mi": "10+",
    "clouds": [
     [
      "FEW",
      8000
     ],
     [
      "FEW",
      12000
     ]
    ],
    "wx": null,
    "raw": "METAR KPWK 200152Z 00000KT 10SM FEW080 FEW120 09/07 A3037 RMK AO2 SLP288 T00940072"
   }
  ]
 },
 "gauges": {
  "gauges": {},
  "url": null
 },
 "nbm_text": {
  "url": "https://nomads.ncep.noaa.gov/pub/data/nccf/com/blend/prod/blend.20261020/01/text/blend_nbhtx.t01z",
  "cycle_utc": "2026-10-20T01:00:00+00:00",
  "station": "KMDW",
  "rows": [
   {
    "local": "2026-10-19 21:00",
    "TMP": 55,
    "DPT": 44,
    "WSP": 2,
    "SKY": 22,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 1,
    "CIG": -88
   },
   {
    "local": "2026-10-19 22:00",
    "TMP": 54,
    "DPT": 44,
    "WSP": 0,
    "SKY": 15,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 1,
    "CIG": -88
   },
   {
    "local": "2026-10-19 23:00",
    "TMP": 52,
    "DPT": 45,
    "WSP": 0,
    "SKY": 20,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 1,
    "MVV": 2,
    "CIG": -88
   },
   {
    "local": "2026-10-20 00:00",
    "TMP": 51,
    "DPT": 44,
    "WSP": 0,
    "SKY": 18,
    "VIS": 10.0,
    "LIV": 1,
    "IFV": 1,
    "MVV": 5,
    "CIG": -88
   },
   {
    "local": "2026-10-20 01:00",
    "TMP": 50,
    "DPT": 44,
    "WSP": 0,
    "SKY": 25,
    "VIS": 10.0,
    "LIV": 14,
    "IFV": 17,
    "MVV": 24,
    "CIG": -88
   },
   {
    "local": "2026-10-20 02:00",
    "TMP": 49,
    "DPT": 43,
    "WSP": 0,
    "SKY": 35,
    "VIS": 7.0,
    "LIV": 15,
    "IFV": 17,
    "MVV": 24,
    "CIG": -88
   },
   {
    "local": "2026-10-20 03:00",
    "TMP": 48,
    "DPT": 42,
    "WSP": 0,
    "SKY": 40,
    "VIS": 7.0,
    "LIV": 14,
    "IFV": 16,
    "MVV": 24,
    "CIG": -88
   },
   {
    "local": "2026-10-20 04:00",
    "TMP": 47,
    "DPT": 41,
    "WSP": 0,
    "SKY": 39,
    "VIS": 0.5,
    "LIV": 27,
    "IFV": 40,
    "MVV": 51,
    "CIG": -88
   },
   {
    "local": "2026-10-20 05:00",
    "TMP": 46,
    "DPT": 41,
    "WSP": 0,
    "SKY": 30,
    "VIS": 0.3,
    "LIV": 28,
    "IFV": 40,
    "MVV": 51,
    "CIG": -88
   },
   {
    "local": "2026-10-20 06:00",
    "TMP": 46,
    "DPT": 40,
    "WSP": 0,
    "SKY": 35,
    "VIS": 0.3,
    "LIV": 28,
    "IFV": 40,
    "MVV": 52,
    "CIG": -88
   },
   {
    "local": "2026-10-20 07:00",
    "TMP": 46,
    "DPT": 40,
    "WSP": 0,
    "SKY": 45,
    "VIS": 0.3,
    "LIV": 28,
    "IFV": 41,
    "MVV": 53,
    "CIG": -88
   },
   {
    "local": "2026-10-20 08:00",
    "TMP": 48,
    "DPT": 40,
    "WSP": 0,
    "SKY": 33,
    "VIS": 0.3,
    "LIV": 29,
    "IFV": 41,
    "MVV": 54,
    "CIG": -88
   },
   {
    "local": "2026-10-20 09:00",
    "TMP": 52,
    "DPT": 42,
    "WSP": 0,
    "SKY": 31,
    "VIS": 10.0,
    "LIV": 4,
    "IFV": 6,
    "MVV": 11,
    "CIG": -88
   },
   {
    "local": "2026-10-20 10:00",
    "TMP": 57,
    "DPT": 44,
    "WSP": 0,
    "SKY": 15,
    "VIS": 10.0,
    "LIV": 2,
    "IFV": 3,
    "MVV": 6,
    "CIG": -88
   },
   {
    "local": "2026-10-20 11:00",
    "TMP": 60,
    "DPT": 44,
    "WSP": 0,
    "SKY": 6,
    "VIS": 10.0,
    "LIV": 1,
    "IFV": 2,
    "MVV": 3,
    "CIG": -88
   },
   {
    "local": "2026-10-20 12:00",
    "TMP": 63,
    "DPT": 43,
    "WSP": 0,
    "SKY": 1,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 1,
    "MVV": 2,
    "CIG": -88
   },
   {
    "local": "2026-10-20 13:00",
    "TMP": 65,
    "DPT": 42,
    "WSP": 0,
    "SKY": 2,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": -88
   },
   {
    "local": "2026-10-20 14:00",
    "TMP": 66,
    "DPT": 42,
    "WSP": 3,
    "SKY": 2,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": -88
   },
   {
    "local": "2026-10-20 15:00",
    "TMP": 66,
    "DPT": 41,
    "WSP": 4,
    "SKY": 1,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": -88
   },
   {
    "local": "2026-10-20 16:00",
    "TMP": 66,
    "DPT": 41,
    "WSP": 4,
    "SKY": 3,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": -88
   },
   {
    "local": "2026-10-20 17:00",
    "TMP": 64,
    "DPT": 42,
    "WSP": 5,
    "SKY": 2,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 0,
    "CIG": -88
   },
   {
    "local": "2026-10-20 18:00",
    "TMP": 60,
    "DPT": 43,
    "WSP": 6,
    "SKY": 6,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 1,
    "CIG": -88
   },
   {
    "local": "2026-10-20 19:00",
    "TMP": 58,
    "DPT": 44,
    "WSP": 5,
    "SKY": 11,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 2,
    "CIG": -88
   },
   {
    "local": "2026-10-20 20:00",
    "TMP": 56,
    "DPT": 45,
    "WSP": 5,
    "SKY": 17,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 3,
    "CIG": -88
   },
   {
    "local": "2026-10-20 21:00",
    "TMP": 55,
    "DPT": 45,
    "WSP": 4,
    "SKY": 25,
    "VIS": 10.0,
    "LIV": 0,
    "IFV": 0,
    "MVV": 3,
    "CIG": -88
   }
  ]
 },
 "profile": {
  "url": "https://www.meteo.psu.edu/bufkit/data/HRRR/18/hrrr_kmdw.buf",
  "cycle": "18",
  "init_local": "2026-10-19 13:00",
  "dawn_hours": [
   {
    "saturated_depth_m": 9.0,
    "inversion_dT_c": 5.9,
    "lowest_levels": [
     [
      9.0,
      7.24,
      7.07
     ],
     [
      33.0,
      11.84,
      9.48
     ],
     [
      79.2,
      13.14,
      9.79
     ],
     [
      159.9,
      13.64,
      5.49
     ],
     [
      279.5,
      14.34,
      1.36
     ]
    ],
    "valid_local": "03:00"
   },
   {
    "saturated_depth_m": 8.2,
    "inversion_dT_c": 7.0,
    "lowest_levels": [
     [
      8.2,
      6.14,
      6.04
     ],
     [
      33.0,
      12.24,
      7.64
     ],
     [
      79.2,
      13.14,
      8.0
     ],
     [
      159.9,
      13.84,
      3.0
     ],
     [
      279.4,
      14.24,
      1.0
     ]
    ],
    "valid_local": "04:00"
   },
   {
    "saturated_depth_m": 8.1,
    "inversion_dT_c": 7.7,
    "lowest_levels": [
     [
      8.1,
      5.14,
      5.05
     ],
     [
      32.9,
      11.44,
      6.72
     ],
     [
      79.0,
      12.84,
      8.04
     ],
     [
      159.6,
      13.54,
      3.14
     ],
     [
      279.1,
      13.94,
      0.74
     ]
    ],
    "valid_local": "05:00"
   },
   {
    "saturated_depth_m": 8.1,
    "inversion_dT_c": 7.9,
    "lowest_levels": [
     [
      8.1,
      4.54,
      4.41
     ],
     [
      32.7,
      10.04,
      7.84
     ],
     [
      78.7,
      12.44,
      9.2
     ],
     [
      158.4,
      13.14,
      4.88
     ],
     [
      278.5,
      13.64,
      1.01
     ]
    ],
    "valid_local": "06:00"
   },
   {
    "saturated_depth_m": 33.5,
    "inversion_dT_c": 8.0,
    "lowest_levels": [
     [
      8.9,
      4.94,
      4.78
     ],
     [
      33.5,
      9.24,
      9.09
     ],
     [
      79.5,
      12.94,
      9.15
     ],
     [
      159.9,
      13.04,
      6.14
     ],
     [
      279.1,
      13.54,
      0.82
     ]
    ],
    "valid_local": "07:00"
   },
   {
    "saturated_depth_m": 32.8,
    "inversion_dT_c": 6.2,
    "lowest_levels": [
     [
      8.2,
      6.54,
      6.39
     ],
     [
      32.8,
      8.64,
      8.53
     ],
     [
      78.6,
      12.74,
      9.52
     ],
     [
      159.0,
      12.64,
      7.84
     ],
     [
      278.9,
      13.34,
      1.76
     ]
    ],
    "valid_local": "08:00"
   },
   {
    "saturated_depth_m": 33.0,
    "inversion_dT_c": 3.8,
    "lowest_levels": [
     [
      8.2,
      8.84,
      8.66
     ],
     [
      33.0,
      8.64,
      8.51
     ],
     [
      78.8,
      12.64,
      9.23
     ],
     [
      159.2,
      12.64,
      7.53
     ],
     [
      279.1,
      13.24,
      2.31
     ]
    ],
    "valid_local": "09:00"
   }
  ],
  "station": "KMDW"
 },
 "obs_context": {
  "available": true,
  "metar": {
   "id": "KMDW",
   "time": "2026-10-20T02:00:00.000Z",
   "temp_c": 12.8,
   "dewp_c": 9.4,
   "wind_kt": 0,
   "wind_dir": 0,
   "vis_mi": "10+",
   "clouds": [
    [
     "FEW",
     10000
    ]
   ],
   "wx": null,
   "raw": "METAR KMDW 200153Z 00000KT 10SM FEW100 13/09 A3036 RMK AO2 SLP283 T01280094"
  },
  "station": "KMDW",
  "hrrr_now": {
   "T": 10.5,
   "Td": 7.6,
   "wind": 1.4,
   "low": 8
  },
  "dpd_obs": 3.4,
  "dpd_model": 2.9
 },
 "outlook": {
  "rows": [
   {
    "day": 1,
    "date": "2026-10-20",
    "weekday": "Tue 20 Oct",
    "setup_score": 0.695,
    "band": "decent set-up",
    "spread": 0.875,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "HRRR",
    "type": "deep fog bank",
    "light": "sun will reach the fog top",
    "sunrise": "07:08",
    "azimuth": 103.4,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 0.0,
     "wind_mean": 1.5,
     "cloud_mh_night": 1.0,
     "hours_saturated": 3
    },
    "confidence": "see the main report (calibrated, HRRR included)",
    "per_model": {
     "gfs_hrrr": 0.983,
     "ecmwf_ifs025": 0.614,
     "gfs_global": 0.108,
     "icon_seamless": 0.657,
     "ncep_nbm_conus": 0.673
    },
    "civil_dawn": "06:40",
    "sun_2deg": "07:22",
    "sun_12deg": "08:21",
    "burnoff": {
     "est_start": "09:08",
     "est_end": "10:38",
     "model_clear": "10:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "depth_est": "20\u201380 m (estimate)",
    "type_why": "saturated for 3 h before sunrise with 1.5 kt of wind to stir the layer upward \u2014 enough time and mixing to bury tree lines; only the tallest crowns will poke out",
    "light_why": "mid+high cloud at sunrise \u2248 0 %",
    "agreement": "low",
    "agreement_why": "models disagree (spread 0.88); treat the number as a coin-flip and check the 04:45 refresh",
    "dawn_temp_c": 5.5,
    "dawn_wind_kt": 1.0
   },
   {
    "day": 2,
    "date": "2026-10-21",
    "weekday": "Wed 21 Oct",
    "setup_score": 0.589,
    "band": "marginal",
    "spread": 0.613,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "gfs_hrrr",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "HRRR",
    "type": "shallow ground fog",
    "light": "sun will reach the fog top",
    "sunrise": "07:10",
    "azimuth": 103.9,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 0.3000000000000007,
     "wind_mean": 1.675,
     "cloud_mh_night": 0.0,
     "hours_saturated": 0
    },
    "confidence": "HRRR reaches this morning; models usually agree on the airmass; backtest AUC at this lead 0.726 (measured at 2 days)",
    "per_model": {
     "gfs_hrrr": 0.719,
     "ecmwf_ifs025": 0.736,
     "gfs_global": 0.123,
     "icon_seamless": 0.5,
     "ncep_nbm_conus": 0.597
    },
    "civil_dawn": "06:41",
    "sun_2deg": "07:24",
    "sun_12deg": "08:23",
    "burnoff": {
     "est_start": "07:40",
     "est_end": "08:25",
     "model_clear": "08:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "depth_est": "0\u20133 m, if any (estimate)",
    "type_why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 0.3 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
    "light_why": "mid+high cloud at sunrise \u2248 0 %",
    "agreement": "low",
    "agreement_why": "models disagree (spread 0.61); treat the number as a coin-flip and check the 04:45 refresh",
    "dawn_temp_c": 5.3,
    "dawn_wind_kt": 1.9
   },
   {
    "day": 3,
    "date": "2026-10-22",
    "weekday": "Thu 22 Oct",
    "setup_score": 0.489,
    "band": "marginal",
    "spread": 0.473,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "sun will reach the fog top",
    "sunrise": "07:11",
    "azimuth": 104.3,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 1.9000000000000004,
     "wind_mean": 3.7,
     "cloud_mh_night": 0.0,
     "hours_saturated": 0
    },
    "confidence": "set-up only: dewpoint, wind and sky from the global models; backtest AUC at this lead 0.738 (measured at 3 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.572,
     "gfs_global": 0.121,
     "icon_seamless": 0.573,
     "ncep_nbm_conus": 0.594
    },
    "civil_dawn": "06:42",
    "sun_2deg": "07:25",
    "sun_12deg": "08:25",
    "burnoff": {
     "est_start": "07:41",
     "est_end": "08:26",
     "model_clear": null,
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "depth_est": "0\u20133 m, if any (estimate)",
    "type_why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 1.9 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
    "light_why": "mid+high cloud at sunrise \u2248 0 %",
    "agreement": "low",
    "agreement_why": "models disagree (spread 0.47); treat the number as a coin-flip and check the 04:45 refresh",
    "dawn_temp_c": 12.1,
    "dawn_wind_kt": 4.0
   },
   {
    "day": 4,
    "date": "2026-10-23",
    "weekday": "Fri 23 Oct",
    "setup_score": 0.577,
    "band": "marginal",
    "spread": 0.655,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "sun will reach the fog top",
    "sunrise": "07:12",
    "azimuth": 104.8,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 1.3000000000000007,
     "wind_mean": 4.0,
     "cloud_mh_night": 0.0,
     "hours_saturated": 0
    },
    "confidence": "set-up only: dewpoint, wind and sky from the global models; backtest AUC at this lead 0.738 (measured at 3 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.736,
     "gfs_global": 0.121,
     "icon_seamless": 0.776,
     "ncep_nbm_conus": 0.604
    },
    "civil_dawn": "06:43",
    "sun_2deg": "07:26",
    "sun_12deg": "08:26",
    "burnoff": {
     "est_start": "07:42",
     "est_end": "08:27",
     "model_clear": "09:00",
     "notes": [],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "depth_est": "0\u20133 m, if any (estimate)",
    "type_why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 1.3 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
    "light_why": "mid+high cloud at sunrise \u2248 0 %",
    "agreement": "low",
    "agreement_why": "models disagree (spread 0.66); treat the number as a coin-flip and check the 04:45 refresh",
    "dawn_temp_c": 9.9,
    "dawn_wind_kt": 4.0
   },
   {
    "day": 5,
    "date": "2026-10-24",
    "weekday": "Sat 24 Oct",
    "setup_score": 0.442,
    "band": "poor",
    "spread": 0.481,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "overcast above the fog",
    "sunrise": "07:13",
    "azimuth": 105.3,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 2.0,
     "wind_mean": 4.925,
     "cloud_mh_night": 68.18181818181819,
     "hours_saturated": 0
    },
    "confidence": "pattern only; expect the number to move; backtest AUC at this lead 0.627 (measured at 5 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.558,
     "gfs_global": 0.092,
     "icon_seamless": 0.573,
     "ncep_nbm_conus": 0.482
    },
    "civil_dawn": "06:44",
    "sun_2deg": "07:27",
    "sun_12deg": "08:27",
    "burnoff": {
     "est_start": "08:13",
     "est_end": "09:13",
     "model_clear": null,
     "notes": [
      "cloud above the fog weakens the sun; add ~30\u201345 min"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "depth_est": "0\u20133 m, if any (estimate)",
    "type_why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.0 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
    "light_why": "mid+high cloud at sunrise \u2248 100 % \u2014 flat grey, no beams",
    "agreement": "low",
    "agreement_why": "models disagree (spread 0.48); treat the number as a coin-flip and check the 04:45 refresh",
    "dawn_temp_c": 8.4,
    "dawn_wind_kt": 4.7
   },
   {
    "day": 6,
    "date": "2026-10-25",
    "weekday": "Sun 25 Oct",
    "setup_score": 0.186,
    "band": "poor",
    "spread": 0.48,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "overcast above the fog",
    "sunrise": "07:14",
    "azimuth": 105.8,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 5.0,
     "wind_mean": 4.975,
     "cloud_mh_night": 91.54545454545455,
     "hours_saturated": 0
    },
    "confidence": "pattern only; expect the number to move; backtest AUC at this lead 0.627 (measured at 5 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.091,
     "gfs_global": 0.064,
     "icon_seamless": 0.544,
     "ncep_nbm_conus": 0.12
    },
    "civil_dawn": "06:45",
    "sun_2deg": "07:28",
    "sun_12deg": "08:28",
    "burnoff": {
     "est_start": "08:14",
     "est_end": "09:14",
     "model_clear": null,
     "notes": [
      "cloud above the fog weakens the sun; add ~30\u201345 min"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "depth_est": "0\u20133 m, if any (estimate)",
    "type_why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 5.0 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
    "light_why": "mid+high cloud at sunrise \u2248 100 % \u2014 flat grey, no beams",
    "agreement": "low",
    "agreement_why": "models disagree (spread 0.48); treat the number as a coin-flip and check the 04:45 refresh",
    "dawn_temp_c": 8.9,
    "dawn_wind_kt": 4.9
   },
   {
    "day": 7,
    "date": "2026-10-26",
    "weekday": "Mon 26 Oct",
    "setup_score": 0.204,
    "band": "poor",
    "spread": 0.288,
    "models": [
     "ecmwf_ifs025",
     "gfs_global",
     "icon_seamless",
     "ncep_nbm_conus"
    ],
    "primary": "ECMWF",
    "type": "shallow ground fog",
    "light": "overcast above the fog",
    "sunrise": "07:16",
    "azimuth": 106.2,
    "compass": "ESE",
    "drivers": {
     "dpd_min": 2.799999999999999,
     "wind_mean": 6.4,
     "cloud_mh_night": 100.0,
     "hours_saturated": 0
    },
    "confidence": "pattern only; expect the number to move; backtest AUC at this lead 0.627 (measured at 5 days)",
    "per_model": {
     "gfs_hrrr": null,
     "ecmwf_ifs025": 0.288,
     "gfs_global": 0.086,
     "icon_seamless": 0.374,
     "ncep_nbm_conus": 0.107
    },
    "civil_dawn": "06:46",
    "sun_2deg": "07:30",
    "sun_12deg": "08:31",
    "burnoff": {
     "est_start": "08:16",
     "est_end": "09:16",
     "model_clear": null,
     "notes": [
      "cloud above the fog weakens the sun; add ~30\u201345 min"
     ],
     "basis": "rule-of-thumb window by fog depth (estimate), plus the HRRR hour where its own visibility and dewpoint spread recover (model output)"
    },
    "depth_est": "0\u20133 m, if any (estimate)",
    "type_why": "the primary model never brings T\u2212Td under 1 \u00b0C (minimum 2.8 \u00b0C); anything that forms will be thin patches over water and the wettest low ground",
    "light_why": "mid+high cloud at sunrise \u2248 100 % \u2014 flat grey, no beams",
    "agreement": "medium",
    "agreement_why": "models differ by 0.29 on the blend score",
    "dawn_temp_c": 13.1,
    "dawn_wind_kt": 6.2
   }
  ],
  "best_days": [
   "2026-10-21",
   "2026-10-23",
   "2026-10-22"
  ],
  "sources": {
   "gfs_hrrr": "https://api.open-meteo.com/v1/forecast?latitude=41.8888&longitude=-87.6247&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-26T16%3A00",
   "ecmwf_ifs025": "https://api.open-meteo.com/v1/forecast?latitude=41.8888&longitude=-87.6247&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ecmwf_ifs025&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-26T16%3A00",
   "gfs_global": "https://api.open-meteo.com/v1/forecast?latitude=41.8888&longitude=-87.6247&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=gfs_global&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-26T16%3A00",
   "icon_seamless": "https://api.open-meteo.com/v1/forecast?latitude=41.8888&longitude=-87.6247&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-26T16%3A00",
   "ncep_nbm_conus": "https://api.open-meteo.com/v1/forecast?latitude=41.8888&longitude=-87.6247&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_gusts_10m%2Cwind_direction_10m%2Ccloud_cover%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Cprecipitation%2Csurface_pressure%2Cboundary_layer_height%2Csoil_moisture_0_to_1cm%2Cshortwave_radiation&models=ncep_nbm_conus&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T20%3A00&end_hour=2026-10-26T16%3A00"
  },
  "band_rates": [
   {
    "band": "strong set-up",
    "lo": 0.75,
    "n": 44,
    "fog_rate": 0.25
   },
   {
    "band": "decent set-up",
    "lo": 0.6,
    "n": 82,
    "fog_rate": 0.17
   },
   {
    "band": "marginal",
    "lo": 0.45,
    "n": 154,
    "fog_rate": 0.12
   },
   {
    "band": "poor",
    "lo": 0.0,
    "n": 285,
    "fog_rate": 0.08
   }
  ],
  "lead_skill": {
   "1": 0.746,
   "2": 0.726,
   "3": 0.738,
   "5": 0.627
  },
  "note": "Set-up score = the same factor blend the day-1 report uses, before calibration. It ranks mornings; it is not a probability. Day 1 is calibrated in the main report."
 },
 "lake": {
  "uncalibrated": true,
  "sunrise": "07:08",
  "ground_msl": 180.0,
  "lake_msl": 176.0,
  "lake_name": "Lake Michigan",
  "ridge_label": "skyline",
  "skyline": [
   {
    "name": "Willis Tower",
    "top_msl": 624,
    "state": "no saturated layer"
   },
   {
    "name": "Trump International Hotel & Tower",
    "top_msl": 609,
    "state": "no saturated layer"
   },
   {
    "name": "St. Regis Chicago (Vista)",
    "top_msl": 541,
    "state": "no saturated layer"
   },
   {
    "name": "875 N Michigan (John Hancock Center)",
    "top_msl": 524,
    "state": "no saturated layer"
   },
   {
    "name": "Aon Center",
    "top_msl": 539,
    "state": "no saturated layer"
   },
   {
    "name": "Two Prudential Plaza",
    "top_msl": 492,
    "state": "no saturated layer"
   },
   {
    "name": "NBC Tower",
    "top_msl": 378,
    "state": "no saturated layer"
   },
   {
    "name": "Franklin Center (AT&T Corporate Center, North Tower)",
    "top_msl": 488,
    "state": "no saturated layer"
   },
   {
    "name": "311 S Wacker",
    "top_msl": 476,
    "state": "no saturated layer"
   },
   {
    "name": "One Chicago (East Tower, 14 W Superior St)",
    "top_msl": 476,
    "state": "no saturated layer"
   },
   {
    "name": "Salesforce Tower Chicago",
    "top_msl": 434,
    "state": "no saturated layer"
   },
   {
    "name": "Marina City (both towers)",
    "top_msl": 366,
    "state": "no saturated layer"
   },
   {
    "name": "Wrigley Building (clock tower)",
    "top_msl": 320,
    "state": "no saturated layer"
   },
   {
    "name": "Tribune Tower",
    "top_msl": 328,
    "state": "no saturated layer"
   },
   {
    "name": "150 N Riverside",
    "top_msl": 403,
    "state": "no saturated layer"
   }
  ],
  "steam": {
   "available": true,
   "air_min_c": 13.8,
   "wind_dir": 80,
   "wind_kt": 4.5,
   "onshore": true,
   "sst_c": 14.9,
   "sst_label": "NDBC 45174 water temperature (observation)",
   "sst_time": "2026-10-20T01:30Z",
   "sst_url": "https://www.ndbc.noaa.gov/data/realtime2/45174.txt",
   "delta_c": 1.1,
   "score": 0.0,
   "label": "unlikely",
   "why": "lake 14.9 \u00b0C (NDBC 45174 water temperature (observation)) vs forecast dawn air over the water 13.8 \u00b0C (HRRR) \u2192 +1.1 \u00b0C; steam needs roughly 8\u201310 \u00b0C or more (rule of thumb, uncalibrated); onshore wind carries it ashore toward the skyline"
  },
  "bank": {
   "score": 0.25,
   "label": "unlikely",
   "per_model": {
    "gfs_hrrr": {
     "score": 0.38,
     "low_cloud_pct": 96,
     "wind_dir": 90,
     "wind_kt": 1.4,
     "onshore": true,
     "base_msl": null,
     "top_msl": null,
     "hours_ridge_in_cloud": 0,
     "hours": 5
    },
    "gfs_global": {
     "score": 0.18,
     "low_cloud_pct": 0,
     "wind_dir": 97,
     "wind_kt": 2.5,
     "onshore": true,
     "base_msl": null,
     "top_msl": null,
     "hours_ridge_in_cloud": 0,
     "hours": 5
    },
    "icon_seamless": {
     "score": 0.18,
     "low_cloud_pct": 0,
     "wind_dir": 96,
     "wind_kt": 1.5,
     "onshore": true,
     "base_msl": null,
     "top_msl": null,
     "hours_ridge_in_cloud": 0,
     "hours": 5
    }
   },
   "primary": "gfs_hrrr",
   "why": "low cloud \u2248 96 %, wind 90\u00b0 at 1.4 kt (onshore), saturated layer none vs skyline 180 m, skyline in cloud 0/5 dawn hours (HRRR levels 975\u2013900 hPa over the lake point)"
  },
  "views": [
   {
    "id": "chicago-riverwalk-state-wabash",
    "name": "Chicago Riverwalk - between the Clark St and DuSable bridges (State/Wabash reach)",
    "elevation_m": 178.3,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "home",
    "name": "DuSable Bridge (Michigan Ave)",
    "elevation_m": 175.6,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "kinzie-street-bridge",
    "name": "Kinzie Street Bridge",
    "elevation_m": 175.6,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "clark-street-bridge",
    "name": "Clark Street Bridge",
    "elevation_m": 175.6,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "wolf-point",
    "name": "Wolf Point (confluence of the three river branches)",
    "elevation_m": 175.6,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "adler-planetarium-solidarity-drive",
    "name": "Adler Planetarium / Solidarity Drive (Museum Campus peninsula)",
    "elevation_m": 184.9,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "museum-campus-shedd-steps",
    "name": "Museum Campus - Shedd Aquarium steps",
    "elevation_m": 185.1,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "northerly-island",
    "name": "Northerly Island (park; former Meigs Field)",
    "elevation_m": 179.3,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "olive-park",
    "name": "Milton Lee Olive Park (Olive Park)",
    "elevation_m": 181.2,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "ohio-street-beach",
    "name": "Ohio Street Beach",
    "elevation_m": 177.6,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "oak-street-beach-lakefront-trail",
    "name": "Oak Street Beach / Lakefront Trail at Oak St",
    "elevation_m": 178.1,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "north-avenue-beach",
    "name": "North Avenue Beach",
    "elevation_m": 177.9,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "montrose-harbor",
    "name": "Montrose Harbor",
    "elevation_m": 175.6,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "montrose-point-bird-sanctuary",
    "name": "Montrose Point (Bird Sanctuary)",
    "elevation_m": 183.0,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "promontory-point",
    "name": "Promontory Point (Hyde Park)",
    "elevation_m": 183.3,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "margaret-t-burroughs-31st-street-beach",
    "name": "31st Street Beach (Margaret T. Burroughs Beach)",
    "elevation_m": 178.3,
    "view": "no saturated layer in the primary model"
   },
   {
    "id": "ping-tom-memorial-park",
    "name": "Ping Tom Memorial Park (Chinatown, South Branch)",
    "elevation_m": 181.1,
    "view": "no saturated layer in the primary model"
   }
  ],
  "sources": {
   "gfs_hrrr": "https://api.open-meteo.com/v1/forecast?latitude=41.8888&longitude=-87.6247&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_direction_10m%2Cwind_speed_80m%2Cwind_direction_80m%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Crelative_humidity_975hPa%2Crelative_humidity_950hPa%2Crelative_humidity_925hPa%2Crelative_humidity_900hPa%2Ccloud_cover_975hPa%2Ccloud_cover_950hPa%2Ccloud_cover_925hPa%2Ccloud_cover_900hPa%2Cgeopotential_height_975hPa%2Cgeopotential_height_950hPa%2Cgeopotential_height_925hPa%2Cgeopotential_height_900hPa%2Cwind_direction_925hPa%2Cwind_speed_925hPa&models=gfs_hrrr&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T23%3A00&end_hour=2026-10-20T16%3A00",
   "gfs_global": "https://api.open-meteo.com/v1/forecast?latitude=41.8888&longitude=-87.6247&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_direction_10m%2Cwind_speed_80m%2Cwind_direction_80m%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Crelative_humidity_975hPa%2Crelative_humidity_950hPa%2Crelative_humidity_925hPa%2Crelative_humidity_900hPa%2Ccloud_cover_975hPa%2Ccloud_cover_950hPa%2Ccloud_cover_925hPa%2Ccloud_cover_900hPa%2Cgeopotential_height_975hPa%2Cgeopotential_height_950hPa%2Cgeopotential_height_925hPa%2Cgeopotential_height_900hPa%2Cwind_direction_925hPa%2Cwind_speed_925hPa&models=gfs_global&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T23%3A00&end_hour=2026-10-20T16%3A00",
   "icon_seamless": "https://api.open-meteo.com/v1/forecast?latitude=41.8888&longitude=-87.6247&hourly=temperature_2m%2Cdew_point_2m%2Crelative_humidity_2m%2Cwind_speed_10m%2Cwind_direction_10m%2Cwind_speed_80m%2Cwind_direction_80m%2Ccloud_cover_low%2Ccloud_cover_mid%2Ccloud_cover_high%2Cvisibility%2Crelative_humidity_975hPa%2Crelative_humidity_950hPa%2Crelative_humidity_925hPa%2Crelative_humidity_900hPa%2Ccloud_cover_975hPa%2Ccloud_cover_950hPa%2Ccloud_cover_925hPa%2Ccloud_cover_900hPa%2Cgeopotential_height_975hPa%2Cgeopotential_height_950hPa%2Cgeopotential_height_925hPa%2Cgeopotential_height_900hPa%2Cwind_direction_925hPa%2Cwind_speed_925hPa&models=icon_seamless&timezone=GMT&wind_speed_unit=kn&start_hour=2026-10-19T23%3A00&end_hour=2026-10-20T16%3A00"
  },
  "note": "Lake mechanisms are scored from physical rules of thumb and have no backtest; treat labels as a reading of the set-up, not a probability. The radiation score above still applies to low ground away from the water."
 },
 "history": [
  {
   "morning": "2026-10-16",
   "run_time": "2026-10-16T11:09-05:00",
   "kind": "predawn",
   "fog_probability": 0.01,
   "raw_blend": 0.056,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "high",
   "observed_min_vis_mi": 10.0,
   "observed_fog": false,
   "cams": [
    "2026-10-16-GOES19-umv-geocolor.jpg",
    "2026-10-16-IL-IDOTD1-IK0K.jpg",
    "2026-10-16-IL-IDOTD1-KE01A.jpg",
    "2026-10-16-IL-IDOTD1-ST00A.jpg"
   ],
   "verification_source": "IEM ASOS MDW 04:00\u201309:00 local"
  },
  {
   "morning": "2026-10-17",
   "run_time": "2026-10-16T21:30-05:00",
   "kind": "evening",
   "fog_probability": 0.02,
   "raw_blend": 0.226,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "low",
   "observed_min_vis_mi": 10.0,
   "observed_fog": false,
   "cams": [
    "2026-10-17-GOES19-umv-geocolor.jpg",
    "2026-10-17-IL-IDOTD1-IK0K.jpg",
    "2026-10-17-IL-IDOTD1-KE01A.jpg",
    "2026-10-17-IL-IDOTD1-ST00A.jpg"
   ],
   "verification_source": "IEM ASOS MDW 04:00\u201309:00 local"
  },
  {
   "morning": "2026-10-17",
   "run_time": "2026-10-17T04:45-05:00",
   "kind": "predawn",
   "fog_probability": 0.02,
   "raw_blend": 0.277,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "low",
   "observed_min_vis_mi": 10.0,
   "observed_fog": false,
   "cams": [
    "2026-10-17-GOES19-umv-geocolor.jpg",
    "2026-10-17-IL-IDOTD1-IK0K.jpg",
    "2026-10-17-IL-IDOTD1-KE01A.jpg",
    "2026-10-17-IL-IDOTD1-ST00A.jpg"
   ],
   "verification_source": "IEM ASOS MDW 04:00\u201309:00 local"
  },
  {
   "morning": "2026-10-18",
   "run_time": "2026-10-17T21:30-05:00",
   "kind": "evening",
   "fog_probability": 0.02,
   "raw_blend": 0.229,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "medium",
   "observed_min_vis_mi": 10.0,
   "observed_fog": false,
   "cams": [
    "2026-10-18-GOES19-umv-geocolor.jpg",
    "2026-10-18-IL-IDOTD1-IK0K.jpg",
    "2026-10-18-IL-IDOTD1-KE01A.jpg",
    "2026-10-18-IL-IDOTD1-ST00A.jpg"
   ],
   "verification_source": "IEM ASOS MDW 04:00\u201309:00 local"
  },
  {
   "morning": "2026-10-18",
   "run_time": "2026-10-18T04:45-05:00",
   "kind": "predawn",
   "fog_probability": 0.02,
   "raw_blend": 0.272,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "medium",
   "observed_min_vis_mi": 10.0,
   "observed_fog": false,
   "cams": [
    "2026-10-18-GOES19-umv-geocolor.jpg",
    "2026-10-18-IL-IDOTD1-IK0K.jpg",
    "2026-10-18-IL-IDOTD1-KE01A.jpg",
    "2026-10-18-IL-IDOTD1-ST00A.jpg"
   ],
   "verification_source": "IEM ASOS MDW 04:00\u201309:00 local"
  },
  {
   "morning": "2026-10-19",
   "run_time": "2026-10-18T21:30-05:00",
   "kind": "evening",
   "fog_probability": 0.04,
   "raw_blend": 0.416,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "low",
   "observed_min_vis_mi": null,
   "observed_fog": null,
   "cams": [
    "2026-10-19-GOES19-umv-geocolor.jpg",
    "2026-10-19-IL-IDOTD1-IK0K.jpg",
    "2026-10-19-IL-IDOTD1-KE01A.jpg",
    "2026-10-19-IL-IDOTD1-ST00A.jpg"
   ]
  },
  {
   "morning": "2026-10-19",
   "run_time": "2026-10-19T04:45-05:00",
   "kind": "predawn",
   "fog_probability": 0.07,
   "raw_blend": 0.5,
   "grade": "F",
   "type": "shallow ground fog",
   "confidence": "high",
   "observed_min_vis_mi": null,
   "observed_fog": null,
   "cams": [
    "2026-10-19-GOES19-umv-geocolor.jpg",
    "2026-10-19-IL-IDOTD1-IK0K.jpg",
    "2026-10-19-IL-IDOTD1-KE01A.jpg",
    "2026-10-19-IL-IDOTD1-ST00A.jpg"
   ]
  },
  {
   "morning": "2026-10-20",
   "run_time": "2026-10-19T21:30-05:00",
   "kind": "evening",
   "fog_probability": 0.26,
   "raw_blend": 0.783,
   "grade": "B",
   "type": "deep fog bank",
   "confidence": "low",
   "observed_min_vis_mi": null,
   "observed_fog": null
  }
 ]
}