91³Ô¹ÏÍø

Watch CBS News

Michigan Gov. Whitmer declares state of emergency for 32 counties following storms

Michigan Gov. Gretchen Whitmer on Wednesday declared a state of emergency for 32 counties after overnight Tuesday storms caused significant damage and resulted in tornadoes.

The counties under the state of emergency are Alcona, Allegan, Alpena, Antrim, Arenac, Barry, Benzie, Charlevoix, Clare, Crawford, Emmet, Grand Traverse, Gratiot, Iosco, Kalkaska, Lake, Leelanau, Manistee, Menominee, Missaukee, Montcalm, Montmorency, Newaygo, Oceana, Ogemaw, Oscoda, Osceola, Presque Isle, Roscommon, Saginaw, Shiawassee and Wexford. 

"Significant snowmelt, record rain, flooding, straight-line winds, and tornadoes have damaged homes, roads, and businesses. This emergency declaration will help the state deploy additional resources to help local officials and first responders protect Michiganders and their property," Whitmer said in a statement. "The state will continue to coordinate with local governments and monitor the situation. I encourage everyone to stay updated and follow guidance from your local emergency manager. We will get through this together."   

This is the second state of emergency that Whitmer has declared in the last week. On April 10, the governor declared a state of emergency in Cheboygan County due to rising water levels at the Cheboygan Lock and Dam Complex. Additionally, Whitmer expanded the State Emergency Operations Center for statewide weather-related matters.

On Wednesday, the National Weather Service confirmed that at least five tornadoes touched down in Michigan. The EF-0 and EF-1 tornadoes were located in Allegan, Montcalm and Saginaw counties, which are under the latest state of emergency.

The agency is still surveying areas in Southeast Michigan, where multiple warnings and watches were issued Tuesday night.

In Ann Arbor, officials reported damage to the roof of the University of Michigan Yost Ice Arena. Officials also said that the east wall collapsed at .

View CBS News In
CBS News App Open
Chrome Safari Continue
const link = doc.createElement('link'); link.rel = 'stylesheet'; link.href = '/fly/fly/bundles/cbsnewscontent/css/cmp-banner.min.css?v=296763317a51cab90faa73f1bb146d5c'; doc.head.appendChild(link); doc.body.innerHTML = CONSENT_MESSAGE; } else { el.insertAdjacentHTML('afterend', CONSENT_MESSAGE); } }); } function hidePrivacyMessage() { // Remove from the main document document.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); // Remove from inside any iframes document.querySelectorAll('iframe').forEach(iframe => { const doc = iframe.contentDocument || iframe.contentWindow.document; doc.querySelectorAll(`.${CONSENT_MESSAGE_CLASS}`).forEach(el => el.remove()); }); } function activateGatedScripts() { // Handle both new format (cmp-gated-script) and old OneTrust/Ketch format (optanon-category-4) const gatedScripts = Array.from(document.querySelectorAll('script.cmp-gated-script, script.optanon-category-4')); // Activate scripts sequentially with a small delay to avoid timing issues let delay = 0; gatedScripts.forEach(function(placeholder, index) { setTimeout(function() { // Skip if already processed if (placeholder.hasAttribute('data-cmp-processed')) { return; } placeholder.setAttribute('data-cmp-processed', 'true'); const newScript = document.createElement('script'); newScript.type = 'text/javascript'; // Try new format first (data-cmp-src), then fall back to old format (data-src) const src = placeholder.getAttribute('data-cmp-src') || placeholder.getAttribute('data-src'); if (src) { newScript.src = src; } else if (placeholder.textContent) { // Inline script - just copy the content newScript.textContent = placeholder.textContent; } // Handle new format attributes (data-cmp-attrs) - for both inline and external scripts const attrs = placeholder.getAttribute('data-cmp-attrs'); if (attrs) { const tempDiv = document.createElement('div'); tempDiv.innerHTML = '
<\/div>'; const tempAttrs = tempDiv.firstChild.attributes; for (let i = 0; i < tempAttrs.length; i++) { // For external scripts, allow defer/async. For inline scripts, skip them (not valid) if (src || (tempAttrs[i].name !== 'async' && tempAttrs[i].name !== 'defer')) { newScript.setAttribute(tempAttrs[i].name, tempAttrs[i].value); } } } // Copy other attributes from old OneTrust format for (let i = 0; i < placeholder.attributes.length; i++) { const attr = placeholder.attributes[i]; // Skip attributes we've already handled or don't want to copy if (!['class', 'data-src', 'data-type', 'data-cmp-src', 'data-cmp-attrs', 'data-cmp-processed', 'type', 'async', 'defer', 'src'].includes(attr.name)) { newScript.setAttribute(attr.name, attr.value); } } placeholder.parentNode.replaceChild(newScript, placeholder); // If external script, manually trigger window.onload handlers after it loads // This handles widgets that use window.onload for initialization if (src) { newScript.addEventListener('load', function() { // If page already loaded and script set a new onload handler, trigger it if (document.readyState === 'complete' && window.onload) { const originalOnload = window.onload; window.onload = null; // Clear temporarily to prevent loops originalOnload(); // Execute the handler } }); } }, delay); delay += 500; // 500ms delay between each script to allow full loading }); } cbsoptanon.onScriptsReady(function(cmp) { cmp.ot.targetingAllowed(function(allowed) { if (!allowed) { showPrivacyMessage(); } else { activateGatedScripts(); } }); cmp.ot.awaitInitialConsent(function(consent_model) { cmp.ot.addOnConsentChangedHandler(function() { cmp.ot.targetingAllowed(function(allowed) { if (allowed) { hidePrivacyMessage(); activateGatedScripts(); } else { showPrivacyMessage(); } }); }); }); });