Add zoom-aware symbology, fix globe popovers, expand geo coverage (#34)
* Add zoom-aware symbology, fix globe popovers, expand geo coverage Map rendering improvements based on user feedback: - Globe markers now scale with camera altitude (onZoom hook) - Priority-based visibility culls low-priority markers at world view - Globe popovers use getScreenCoords for accurate positioning - Flat map labels hidden at low zoom, revealed progressively - Default globe altitude lowered from 2.5 to 1.8 for better fill - Americas region zoom tightened to CONUS focus Geographic coverage expansion: - 4 new OpenSky air theaters: Caribbean, Gulf of Guinea, Cape Route, Horn of Africa - Flight corridors now span Americas and Africa - NOAA alerts extract centroid lat/lon from GeoJSON geometry - EPA RadNet stations geocoded with hardcoded coords for 10 US cities - ISS + Tiangong positions estimated from TLE orbital elements - GDELT geoEvents() now called in briefing for mapped event points - New legend entries: Weather Alert, EPA RadNet, Space Station, GDELT Event * Fix null-safe coordinate checks and remove injected data blob - Use `!= null` instead of truthy checks for lat/lon in noaa.mjs and inject.mjs so valid 0-coordinates (equator/prime meridian) are not silently dropped - Reset jarvis.html `let D` back to null placeholder so generated runtime data is not part of the PR diff * Remove re-injected data blob from jarvis.html Reset let D back to null — previous commit was correct but inject.mjs build verification re-injected the payload.
This commit is contained in:
@@ -57,15 +57,33 @@ export async function briefing() {
|
||||
wildfires: fire.length,
|
||||
other: other.length,
|
||||
},
|
||||
topAlerts: features.slice(0, 15).map(f => ({
|
||||
event: f.properties?.event,
|
||||
severity: f.properties?.severity,
|
||||
urgency: f.properties?.urgency,
|
||||
headline: f.properties?.headline,
|
||||
areas: f.properties?.areaDesc,
|
||||
onset: f.properties?.onset,
|
||||
expires: f.properties?.expires,
|
||||
})),
|
||||
topAlerts: features.slice(0, 15).map(f => {
|
||||
// Extract centroid from GeoJSON geometry
|
||||
let lat = null, lon = null;
|
||||
const geo = f.geometry;
|
||||
if (geo?.type === 'Polygon' && geo.coordinates?.[0]?.length) {
|
||||
const coords = geo.coordinates[0];
|
||||
lat = coords.reduce((s, c) => s + c[1], 0) / coords.length;
|
||||
lon = coords.reduce((s, c) => s + c[0], 0) / coords.length;
|
||||
} else if (geo?.type === 'MultiPolygon' && geo.coordinates?.length) {
|
||||
const coords = geo.coordinates[0][0];
|
||||
lat = coords.reduce((s, c) => s + c[1], 0) / coords.length;
|
||||
lon = coords.reduce((s, c) => s + c[0], 0) / coords.length;
|
||||
} else if (geo?.type === 'Point') {
|
||||
[lon, lat] = geo.coordinates;
|
||||
}
|
||||
return {
|
||||
event: f.properties?.event,
|
||||
severity: f.properties?.severity,
|
||||
urgency: f.properties?.urgency,
|
||||
headline: f.properties?.headline,
|
||||
areas: f.properties?.areaDesc,
|
||||
onset: f.properties?.onset,
|
||||
expires: f.properties?.expires,
|
||||
lat: lat != null ? +lat.toFixed(3) : null,
|
||||
lon: lon != null ? +lon.toFixed(3) : null,
|
||||
};
|
||||
}),
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user