Add basic support for active weather alerts
yikes nobody should stake their life on how well this works, but it does seem to basically work..
This commit is contained in:
parent
7ed314b5bf
commit
0710f2238c
4 changed files with 134 additions and 2 deletions
|
@ -10,6 +10,7 @@ const getDefaults = () => {
|
|||
coordinates,
|
||||
cityState,
|
||||
weather: null,
|
||||
alerts: null,
|
||||
forecast: null,
|
||||
radarLatestURL: null,
|
||||
radarLoopURL: null,
|
||||
|
@ -32,14 +33,17 @@ export const useWeatherStore = defineStore('weather', {
|
|||
this.setForecast(null)
|
||||
this.radarLatestURL = null
|
||||
this.radarLoopURL = null
|
||||
this.alerts = null
|
||||
},
|
||||
|
||||
async getWeather() {
|
||||
|
||||
if (!this.weather) {
|
||||
let url
|
||||
let response
|
||||
|
||||
const url = `https://api.weather.gov/points/${this.coordinates}`
|
||||
const response = await fetch(url)
|
||||
url = `https://api.weather.gov/points/${this.coordinates}`
|
||||
response = await fetch(url)
|
||||
const weather = await response.json()
|
||||
if (weather.status == 404) {
|
||||
throw new Error(`Data not found for ${this.coordinates}`)
|
||||
|
@ -57,6 +61,65 @@ export const useWeatherStore = defineStore('weather', {
|
|||
this.radarLoopURL = `https://radar.weather.gov/ridge/standard/${station}_loop.gif`
|
||||
|
||||
this.setWeather(weather)
|
||||
|
||||
// fetch zone to get its official id
|
||||
url = weather.properties.forecastZone
|
||||
response = await fetch(url)
|
||||
const zone = await response.json()
|
||||
|
||||
// fetch alerts for zone
|
||||
url = `https://api.weather.gov/alerts/active/zone/${zone.properties.id}`
|
||||
response = await fetch(url)
|
||||
const zoneAlerts = await response.json()
|
||||
|
||||
// fetch county to get its official id
|
||||
url = weather.properties.county
|
||||
response = await fetch(url)
|
||||
const county = await response.json()
|
||||
|
||||
// fetch alerts for county
|
||||
url = `https://api.weather.gov/alerts/active/zone/${county.properties.id}`
|
||||
response = await fetch(url)
|
||||
const countyAlerts = await response.json()
|
||||
|
||||
const newAlerts = {}
|
||||
|
||||
// use latest timestamp from either zone or county
|
||||
newAlerts.updated = zoneAlerts.updated
|
||||
if (countyAlerts.updated > zoneAlerts.updated) {
|
||||
newAlerts.updated = countyAlerts.updated
|
||||
}
|
||||
|
||||
// collect all alert "features" but de-duplicate them
|
||||
newAlerts.features = {}
|
||||
for (let feature of zoneAlerts.features) {
|
||||
newAlerts.features[feature.properties.id] = feature
|
||||
}
|
||||
for (let feature of countyAlerts.features) {
|
||||
newAlerts.features[feature.properties.id] = feature
|
||||
}
|
||||
newAlerts.features = Object.values(newAlerts.features)
|
||||
|
||||
// put "likely" before "possible" alerts
|
||||
newAlerts.features.sort((a, b) => {
|
||||
|
||||
if (a.properties.certainty == 'Likely' && b.properties.certainty == 'Possible') {
|
||||
return -1
|
||||
}
|
||||
if (a.properties.certainty == 'Possible' && b.properties.certainty == 'Likely') {
|
||||
return 1
|
||||
}
|
||||
|
||||
// if (a.properties.certainty == b.properties.certainty) {
|
||||
// return 0
|
||||
// }
|
||||
|
||||
// TODO: what else should this do?
|
||||
return 0
|
||||
})
|
||||
|
||||
// we have our final alerts
|
||||
this.alerts = newAlerts
|
||||
}
|
||||
|
||||
return this.weather
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue