You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
2.1 KiB
89 lines
2.1 KiB
import { useState, useEffect } from 'react';
|
|
|
|
export const metadata = {
|
|
id: 'wxradar',
|
|
name: 'Weather Radar',
|
|
description: 'NEXRAD weather radar overlay for North America',
|
|
icon: '☁️',
|
|
category: 'weather',
|
|
defaultEnabled: false,
|
|
defaultOpacity: 0.6,
|
|
version: '1.0.0'
|
|
};
|
|
|
|
export function useLayer({ enabled = false, opacity = 0.6, map = null }) {
|
|
const [layerRef, setLayerRef] = useState(null);
|
|
const [radarTimestamp, setRadarTimestamp] = useState(Date.now());
|
|
|
|
const wmsConfig = {
|
|
url: 'https://mesonet.agron.iastate.edu/cgi-bin/wms/nexrad/n0r.cgi',
|
|
options: {
|
|
layers: 'nexrad-n0r-900913',
|
|
format: 'image/png',
|
|
transparent: true,
|
|
attribution: 'Weather data © Iowa State University Mesonet',
|
|
opacity: opacity,
|
|
zIndex: 200
|
|
}
|
|
};
|
|
|
|
// Add/remove layer
|
|
useEffect(() => {
|
|
if (!map || typeof L === 'undefined') return;
|
|
|
|
if (enabled && !layerRef) {
|
|
try {
|
|
const layer = L.tileLayer.wms(wmsConfig.url, wmsConfig.options);
|
|
layer.addTo(map);
|
|
setLayerRef(layer);
|
|
} catch (err) {
|
|
console.error('WXRadar error:', err);
|
|
}
|
|
} else if (!enabled && layerRef) {
|
|
map.removeLayer(layerRef);
|
|
setLayerRef(null);
|
|
}
|
|
|
|
return () => {
|
|
if (layerRef && map) {
|
|
try {
|
|
map.removeLayer(layerRef);
|
|
} catch (e) {
|
|
// Layer already removed
|
|
}
|
|
}
|
|
};
|
|
}, [enabled, map]);
|
|
|
|
// Update opacity
|
|
useEffect(() => {
|
|
if (layerRef) {
|
|
layerRef.setOpacity(opacity);
|
|
}
|
|
}, [opacity, layerRef]);
|
|
|
|
// Auto-refresh every 2 minutes
|
|
useEffect(() => {
|
|
if (!enabled) return;
|
|
|
|
const interval = setInterval(() => {
|
|
setRadarTimestamp(Date.now());
|
|
}, 120000);
|
|
|
|
return () => clearInterval(interval);
|
|
}, [enabled]);
|
|
|
|
// Force refresh
|
|
useEffect(() => {
|
|
if (layerRef && enabled) {
|
|
layerRef.setParams({ t: radarTimestamp }, false);
|
|
layerRef.redraw();
|
|
}
|
|
}, [radarTimestamp, layerRef, enabled]);
|
|
|
|
return {
|
|
layer: layerRef,
|
|
refresh: () => setRadarTimestamp(Date.now())
|
|
};
|
|
}
|