Skip to content

Instantly share code, notes, and snippets.

@malakka
Forked from kevinkub/incidence.js
Last active May 26, 2022 18:03
Show Gist options
  • Star 54 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • Save malakka/0576bb922e7b81b95137a06b619bba1b to your computer and use it in GitHub Desktop.
Save malakka/0576bb922e7b81b95137a06b619bba1b to your computer and use it in GitHub Desktop.
COVID-19 Inzidenz-Widget für iOS innerhalb Deutschlands 🇩🇪
// Licence: Robert Koch-Institut (RKI), dl-de/by-2-0
const newCasesApiUrl = `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_COVID19/FeatureServer/0/query?f=json&where=NeuerFall%20IN(1%2C%20-1)&returnGeometry=false&spatialRel=esriSpatialRelIntersects&outFields=*&outStatistics=%5B%7B%22statisticType%22%3A%22sum%22%2C%22onStatisticField%22%3A%22AnzahlFall%22%2C%22outStatisticFieldName%22%3A%22value%22%7D%5D&resultType=standard&cacheHint=true`;
const incidenceUrl = (location) => `https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,last_update,cases,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 saveIncidenceLatLon = (location) => {
let fm = FileManager.iCloud()
let path = fm.joinPath(fm.documentsDirectory(), "covid19latlon.json")
fm.writeString(path, JSON.stringify(location))
}
const getsavedIncidenceLatLon = () => {
let fm = FileManager.iCloud()
let path = fm.joinPath(fm.documentsDirectory(), "covid19latlon.json")
let data = fm.readString(path)
return JSON.parse(data)
}
let widget = await createWidget()
if (!config.runsInWidget) {
await widget.presentSmall()
}
Script.setWidget(widget)
Script.complete()
async function createWidget(items) {
let data, attr, header, label
const list = new ListWidget()
// fetch new cases
data = await new Request(newCasesApiUrl).loadJSON()
if(!data || !data.features || !data.features.length) {
const errorList = new ListWidget()
errorList.addText("Keine Ergebnisse für die Anfrage nach den Neuinfektionen.")
return errorList
}
header = list.addText("🦠 Neuinfektionen ".toUpperCase())
header.centerAlignText()
header.font = Font.mediumSystemFont(10)
label = list.addText("+"+data.features[0].attributes.value)
label.font = Font.mediumSystemFont(20)
label.centerAlignText()
const country = list.addText("Deutschland")
country.centerAlignText()
country.font = Font.mediumSystemFont(12)
country.textColor = Color.gray()
list.addSpacer()
// fetch new incidents
let location
if(args.widgetParameter) {
const fixedCoordinates = args.widgetParameter.split(",").map(parseFloat)
location = {
latitude: fixedCoordinates[0],
longitude: fixedCoordinates[1]
}
} else {
Location.setAccuracyToThreeKilometers()
try {
location = await Location.current()
console.log('get current lat/lon')
saveIncidenceLatLon(location)
} catch(e) {
console.log('using saved lat/lon')
location = getsavedIncidenceLatLon()
}
}
data = await new Request(incidenceUrl(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
}
attr = data.features[0].attributes
const incidence = attr.cases7_per_100k.toFixed(1)
const cityName = attr.GEN
const cases =attr.cases
const lastUpdate = attr.last_update
header = list.addText("🦠 Inzidenz".toUpperCase())
header.centerAlignText()
header.font = Font.mediumSystemFont(10)
label = list.addText(incidence)
label.centerAlignText()
label.font = Font.mediumSystemFont(24)
label2 = list.addText("("+cases+")")
label2.centerAlignText()
label2.font = Font.mediumSystemFont(12)
if(incidence >= 50) {
label.textColor = Color.red()
} else if(incidence >= 25) {
label.textColor = Color.orange()
}
const city = list.addText(cityName)
city.centerAlignText()
city.font = Font.mediumSystemFont(12)
city.textColor = Color.gray()
list.addSpacer()
label3 = list.addText ("letztes Update: "+lastUpdate.substr(0,10))
label3.centerAlignText()
label3.font = Font.mediumSystemFont(6)
return list
}
@pin00b
Copy link

pin00b commented Oct 30, 2020

Wenn man bei der incidenceURL bei outFields=* angibt, statt der kommaseparierten Liste, dann liefert der Server alles was er hat... z.B. auch Tote 🙈... aber vielleicht wollen wir das lieber gar nicht wissen

Kannst du das genauer angeben? Wie muss der Zeilencode exakt lauten? Ich bekommen trotz *️⃣ denselben output... 🤔 🤷‍♂️

@thunderm24
Copy link

#Wenn man bei der incidenceURL bei outFields=* angibt, statt der kommaseparierten Liste, dann liefert der Server alles was er hat... z.B. auch Tote 🙈... aber vielleicht wollen wir das lieber gar nicht wissen

Kannst du das genauer erklären?

@leenenn
Copy link

leenenn commented Jan 10, 2021

Hallo,

da sich die Situation immer mehr zugespitzt, wäre es für mich auch sinnvoll, die aktuellen Todeszahlen für Deutschland hinzuzufügen. Das unterstreicht noch mal wie kritisch die Situation sich aktuell weiter entwickelt.
Wäre das möglich!

@maximus210793
Copy link

Wie kann man bei den Neuinfektionen ein 1000er Trennzeichen in Form eines Punktes einfügen?

@wolfissimo
Copy link

Das geht mit .toLocaleString() .

Also Zeile 46
label = list.addText("+"+data.features[0].attributes.value)
ersetzen durch
label = list.addText("+"+data.features[0].attributes.value.toLocaleString())

@maximus210793
Copy link

Cool vielen dank, und ist es möglich noch die Uhrzeit hinter dem Aktualisierungsdatum hinzuzufügen ?

@Retroboter
Copy link

Retroboter commented Jan 20, 2021

Super Sache. Kann ich auch einen festen Standort hinterlegen? Falls ja, an welcher Stelle trage ich die Koordinaten ein?

Ich hätte gerne das Widget wie gehabt, mit der Inzidenz vom aktuellen Standort und auch ein Widget mir meiner Homebase, da diese Zahl ausschlaggebend ist für den 15 km Radius.

@Eeewald85 hatte ja bereits den Vorschlag gemacht, finde ich gut und sinnvoll. Für einen selbst ist ja der Wert am Wohnort wichtig für die Einschränkungen, nicht der Ort an dem man sich gerade befindet.

@knipser01
Copy link

Hallo, kenne mich nicht aus, aber kann mir von euch Profis jemand sagen wie ich erstellen kann, dass ich zum Beispiel 3 Landkreise sehe?

@Prot3ctor
Copy link

Was ist denn die Zahl in Klammern über Düsseldorf?

Das ist die Anzahl der aktuellen Fälle in Düsseldorf

Kann nicht sein, in meinem Landkreis sind aktuell 132 Fälle laut Landratsamt Seite und das Script zeigt mir 6521 an 🤷🏻‍♂️

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment