RKI Daten einlesen und Ausgeben
Dieses Jahr ist anders. Anders, weil unser Alltag immer irgendwie mit Corona zu tun hat. Wir halten Abstand, wir tragen Masken und hoffen, dass die Pandemie in den Griff bekommen wird. Manchmal habe ich Zweifel, aber die Zweifel sind trügerisch und führen zu einem Paradoxen Gedankenweg. Statt zu denken, wir können lockerer mit den Regeln der Pandemie umgehen, weil wir hier nicht so stark betroffen sind - wie andere Teile von Europa - sollten wir daran denken, dass wir hier in Deutschland besser dran sind, da große Teile der Bevölkerung die AHA Regeln ernst nehmen und berücksichtigen.
Die Daten des RKI, die wir immer wieder auf verschiedenen Seiten sehen, kommen von der API Schnittstelle NPGEO. Auf der Webseite des NPGEO https://npgeo-corona-npgeo-de.hub.arcgis.com/ können wir auf die zentralen Daten der Pandemie zugreifen. Ein Dashboard zeigt uns die aktuellen Zahlen für Deutschland. Und da setze ich an, denn mein Thema für diesen Blogeintrag ist der Abruf der Daten und wie man diese aufbereiten kann.
Benötigt:
Visual Studio 2019
Anforderung
Über die NPGEO API Explorer soll eine Abfrage zusammengestellt werden. Die heruntergeladenen Daten sollen vom JSON Format eingelesen und in ein Datenobjekt gefüllt werden. Für die Darstellung soll eine Liste mit den Namen der Städten und die 7-Tage-Inzidenz wiedergegeben werden.
API Explorer vom RKI
Aktuell muss man etwas herunter scrollen, bis man an die Links mit den freizugänglichen Daten kommt. Uns interessiert der Link zum Robert Koch-Institut.
Auf der nächsten Seite wählen wir die Datenquelle 'RKI Corona Landkreise' aus und wechseln dort von der Übersicht auf den Tab API-Explorer. Im Rahmen für die Abfrage nehmen wir alle Haken raus, außer für 'cases7_per100k' (7 Tage Inzidenz) und 'GEN' (Name des Landkreises).
In Ausgabeoption kann die Rückgabegeometrie abgestellt werden. Anschließend kopieren wir die fertige Abfrage-URL, die rechts auf der Seite angezeigt wird.
Datenformat betrachten (API-Explorer)
Unten, mit dem Button 'Testen', können die Daten im JSON-Format betrachten werden. Ich weiß nicht, ob ich an dieser Stelle etwas falsch mache, aber bei mir kamen mit den Einstellungen nicht die Daten, die konfiguriert wurden, an. Daher setzte ich auf einen alternativen Weg.
Datenformat betrachten (Abfrage-URL)
Die Abfrage-URL können wir über den Browser in einem neuen Tab abrufen und die Daten in einem unformatierten JSON-Format bekommen. Das Ergebnis anschließend speichern mit dem Kontext Menü 'Speichern unter…'. Die Datei sollte beim Benennen mit '.json' enden, damit diese Datei beim Öffnen mit Visual Studio Code oder Notepad++ richtig erkannt wird (ggf. plugin oder Extension installieren, damit eine Formatierung für JSON funktioniert, kann sein, dass die Formatierung auch manuell angetriggert werden muss).
WPF Anwendung
Inzwischen kann auch mit .NET Core eine WPF Anwendung geschrieben werden. Für den folgenden Aufbau macht dies jedoch keinen Unterschied, da nur grundlegende XAML Elemente verwendet werden, könnte auch eine UWP Anwendung in Frage kommen.
Datenobjekt
Nach dem Erstellen benötigen wir folgenden Datenobjekte.
public class RkiDataResult
{
public Landkreis[] features { get; set; }
public class Landkreis
{
public Attribute attributes { get; set; }
public class Attribute
{
public string GEN { get; set; }
public double cases7_per_100k { get; set; }
}
}
}
Abruf mit WebClient
Hier muss lediglich die Abfrage-URL für den Download eingetragen werden. Die Daten selbst werden dann mit dem 'JsonConvert' Klasse in das zuvor angelegte Datenobjekt umgewandelt. (Die Bibliotek Newtonsoft für 'JsonConvert' wird aus den Nuget Paketen in das Projekt hinzugefügt).
public class RkiWebClientComponent
{
public static RkiDataResult LoadAktualData()
{
var client = new WebClient();
client.Headers[HttpRequestHeader.ContentType] = "application/json";
try
{
var urlAddress = "https://services7.arcgis.com/mOBPykOjAyBO2ZKk/arcgis/rest/services/RKI_Landkreisdaten/FeatureServer/0/query?where=1%3D1&outFields=GEN,cases7_per_100k&returnGeometry=false&outSR=4326&f=json";
var result = client.DownloadString(urlAddress);
return JsonConvert.DeserializeObject<RkiDataResult>(result);
}
catch (Exception e)
{
throw e;
}
}
}
Auflisten und Item-Template
Das Grid in MainWindow wird ersetzt durch eine ListBox, welche einen Namen zugewiesen bekommt. Das Template zu einem Item ermöglicht die Informationen zu platzieren. Die Darstellung des 7-Tage-Inzidenz Wert reicht aus (mit einer Nachkommastelle) daher wird im Binding noch ein StringFormat N1 gesetzt. Für das deutsche Zahlenformat, ist das Setzen der Language auf 'DE' erforderlich.
<Window x:Class="ExampleSimpleReadRkiData.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Title="Aktuelle RKI Daten"
Height="250" Width="400"
Language="DE">
<ListBox x:Name="LandkreiseListe"
HorizontalContentAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate DataType="RkiDataResult.Landkreis.Attributes">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0"
Text="{Binding GEN}"
Margin="0 0 10 0"/>
<TextBlock Grid.Column="1"
Text="{Binding cases7_per_100k, StringFormat=N1}"
HorizontalAlignment="Right" />
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
</Window>
Abruf und in die View laden
In den Behind-Code oder bzw. in die MainWindow.xaml.cs werden die Daten abgerufen und in die ListBox geladen. Diese Aufgabe wird von der Methode 'OnApplyTemplate' übernommen, die hier überschrieben wird. Die Auflistung kann in diesem Zug auch gleich sortiert werden, nach dem 7-Tage-Inzidenz.
public partial class MainWindow : Window
{
public MainWindow() => this.InitializeComponent();
public override void OnApplyTemplate()
{
var rkiData = RkiWebClientComponent.LoadAktualData();
this.LandkreiseListe.ItemsSource = rkiData
.features
.OrderByDescending(o => o.attributes.cases7_per_100k)
.Select(s => s.attributes);
}
}
Fertig
Der interessante Teil ist, woher man die Daten bekommt und wie man das programmatisch abrufen kann.
Nun, das Ganze lässt sich weiterausbauen und das habe ich auch getan. Auf meinem Github Repository findet ihr dieses Beispiel und eine weitere ausgebaute Version. Diese kann die Daten in der Liste sortieren, nach zwei verschiedenen Werten. Die Daten zu einem District werden zusätzlich in einem chronologischen Diagramm angezeigt. Zu dem speichert die Anwendung die tagesaktuellen Daten, womit eine Historie mit dem Diagramm abgebildet werden kann.
Beispiel wie immer
Das Ergebnis kann wieder von meinem Github Repository heruntergeladen werden.
Github - ExampleReadAndShowRkiData
Altes Beispiel was ich mal angefangen hatte
Ein alteres Beispiel, dass die Daten von einemn zwischengespeicherten Datenhalter kommt. Siehe dazu mehr auf rki.marlon-lueckert.de . Im gegensatz zu dem Beispiel, werden die Daten Lokal gespeichert und ermöglich eine eigene Historie abzubilden in Form eines Diagrames.
Github - ExampleReadAndShowRki (Old Example)
Aufwendinge UI mit den selben Funktionen
Der Folgende Branch ist eine Übung bezüglich die Anwendung mehr Ansehnlicher zu gestalten. Hat aber nicht mehr Funktionen als mein altes Beispiel (aber auch nicht alle). Bezieht jedoch die Daten direkt vom RKI und nicht durch einen zwischen Datenhalter. Also wie aus dem Beispiel bereits beschrieben.
Eine weitere API Quellen zum Thema Corona
Der folgende Link führt zu einer weiteren Quelle. Für die, die sich lieber die internationalen Daten ansehen wollen. Mit der Doku über POSTMAN, werden dort auch schon fertige Code Snippeds angezeigt.
Kommentare