This commit is contained in:
parent
4b50de5135
commit
c5db6e2c1c
109
incidence.js
109
incidence.js
@ -1,72 +1,69 @@
|
|||||||
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
|
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
|
||||||
const apiUrl = (location) => `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json`
|
const apiUrl = (location) => `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k&geometry=${location.longitude.toFixed(3)}%2C${location.latitude.toFixed(3)}&geometryType=esriGeometryPoint&inSR=4326&spatialRel=esriSpatialRelWithin&returnGeometry=false&outSR=4326&f=json`
|
||||||
|
const apiUrlStates = 'https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/Coronaf%E4lle_in_den_Bundesl%E4ndern/FeatureServer/0/query?where=1%3D1&outFields=cases7_bl_per_100k&returnGeometry=false&outSR=4326&f=json'
|
||||||
|
|
||||||
let widget = await createWidget()
|
const widget = await createWidget()
|
||||||
if (!config.runsInWidget) {
|
if (!config.runsInWidget) {
|
||||||
await widget.presentSmall()
|
await widget.presentSmall()
|
||||||
}
|
}
|
||||||
|
|
||||||
Script.setWidget(widget)
|
Script.setWidget(widget)
|
||||||
Script.complete()
|
Script.complete()
|
||||||
|
|
||||||
async function createWidget(items) {
|
async function createWidget(items) {
|
||||||
let location
|
const data = await getData()
|
||||||
|
|
||||||
if(args.widgetParameter) {
|
|
||||||
|
|
||||||
const fixedCoordinates = args.widgetParameter.split(",").map(parseFloat)
|
|
||||||
|
|
||||||
location = {
|
|
||||||
latitude: fixedCoordinates[0],
|
|
||||||
longitude: fixedCoordinates[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
} else {
|
|
||||||
|
|
||||||
Location.setAccuracyToThreeKilometers()
|
|
||||||
location = await Location.current()
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
const data = await new Request(apiUrl(location)).loadJSON()
|
|
||||||
|
|
||||||
if(!data || !data.features || !data.features.length) {
|
|
||||||
const errorList = new ListWidget()
|
|
||||||
errorList.addText("Keine Ergebnisse für den aktuellen Ort gefunden.")
|
|
||||||
return errorList
|
|
||||||
}
|
|
||||||
|
|
||||||
const attr = data.features[0].attributes
|
|
||||||
const incidence = attr.cases7_per_100k.toFixed(1)
|
|
||||||
const cityName = attr.GEN
|
|
||||||
const list = new ListWidget()
|
const list = new ListWidget()
|
||||||
|
|
||||||
if(Device.isUsingDarkAppearance()){
|
|
||||||
const gradient = new LinearGradient()
|
|
||||||
gradient.locations = [0, 1]
|
|
||||||
gradient.colors = [
|
|
||||||
new Color("111111"),
|
|
||||||
new Color("222222")
|
|
||||||
]
|
|
||||||
list.backgroundGradient = gradient
|
|
||||||
}
|
|
||||||
|
|
||||||
const header = list.addText("🦠 Inzidenz".toUpperCase())
|
const header = list.addText("🦠 Inzidenz".toUpperCase())
|
||||||
header.font = Font.mediumSystemFont(13)
|
header.font = Font.mediumSystemFont(13)
|
||||||
|
if(data) {
|
||||||
list.addSpacer()
|
if(!data.shouldCache) {
|
||||||
|
list.addSpacer(6)
|
||||||
const label = list.addText(incidence+"")
|
const loadingIndicator = list.addText("Ort wird ermittelt...".toUpperCase())
|
||||||
label.font = Font.boldSystemFont(24)
|
loadingIndicator.font = Font.mediumSystemFont(13)
|
||||||
label.textColor = Color.green()
|
loadingIndicator.textOpacity = 0.5
|
||||||
|
}
|
||||||
if(incidence >= 50) {
|
list.addSpacer()
|
||||||
label.textColor = Color.red()
|
const label = list.addText(data.incidence+"")
|
||||||
} else if(incidence >= 35) {
|
label.font = Font.boldSystemFont(24)
|
||||||
label.textColor = Color.orange()
|
label.textColor = data.incidence >= 50 ? Color.red() : data.incidence >= 35 ? Color.orange() : Color.green()
|
||||||
|
list.addText(data.areaName)
|
||||||
|
if(data.shouldCache) {
|
||||||
|
list.refreshAfterDate = new Date(Date.now() + 60*60*1000)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
list.addSpacer()
|
||||||
|
list.addText("Daten nicht verfügbar")
|
||||||
}
|
}
|
||||||
|
|
||||||
list.addText(cityName)
|
|
||||||
|
|
||||||
return list
|
return list
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getData() {
|
||||||
|
try {
|
||||||
|
const location = await getLocation()
|
||||||
|
if(location) {
|
||||||
|
let data = await new Request(apiUrl(location)).loadJSON()
|
||||||
|
const attr = data.features[0].attributes
|
||||||
|
return { incidence: attr.cases7_per_100k.toFixed(1), areaName: attr.GEN, shouldCache: true };
|
||||||
|
} else {
|
||||||
|
let data = await new Request(apiUrlStates).loadJSON()
|
||||||
|
const incidencePerState = data.features.map((f) => f.attributes.cases7_bl_per_100k)
|
||||||
|
const averageIncidence = incidencePerState.reduce((a, b) => a + b) / incidencePerState.length
|
||||||
|
return { incidence: averageIncidence.toFixed(1), areaName: "Deutschland", shouldCache: false };
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
return null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getLocation() {
|
||||||
|
try {
|
||||||
|
if(args.widgetParameter) {
|
||||||
|
const fixedCoordinates = args.widgetParameter.split(",").map(parseFloat)
|
||||||
|
return { latitude: fixedCoordinates[0], longitude: fixedCoordinates[1] }
|
||||||
|
} else {
|
||||||
|
Location.setAccuracyToThreeKilometers()
|
||||||
|
return await Location.current()
|
||||||
|
}
|
||||||
|
} catch(e) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user