diff --git a/README.md b/README.md index f424cf06eb51ecb73d505477928742712f46b487..32998ac136dcdba01a3fc7798046c8ff89016c03 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,19 @@ -# obwahlen PRE +# obwahlen -R-Code, um den Auszählungsstand hessischer Bürgermeisterwahlen in Echtzeit abzurufen und mit Datawrapper darzustellen +R-Code, um den Auszählungsstand hessischer Bürgermeisterwahlen in Echtzeit abzurufen und mit Datawrapper darzustellen (Frankfurt, Kassel Darmstadt) + +## Votemanager und Datawrapper sind Voraussetzung ## +Das Programm arbeitet mit den Daten, die das Programm "Votemanager" bereitstellt; es ist bei allen größeren hessischen Kommunen im Einsatz. Votemanager publiziert das Auszählungsergebnis live, sobald es vorliegt, nach verschiedenen Aggregationsebenen, bis hinunter auf die Ebene des einzelnen Stimmbezirks als "Schnellmeldung". + +### Votemanager und die Briefwahlbezirke + +Eine Falle, in die ich zunächst gestolpert bin: Neben normalen Stimmbezirken - die mit einem Wahllokal verbunden sind - gibt es die Briefwahlbezirke. Die haben eine Besonderheit: Sie haben rechnerisch 0 Wahlberechtigte - solange sie noch nicht ausgezählt sind, fällt die Berechnung der Wahlbeteiligung in einem Stadtteil immer zu niedrig aus! + +### Datawrapper + +Wir setzen Datawrapper zur Ausgabe der Grafiken ein, das auch unter Last äußerst stabil läuft und eigentlich immer gut aussieht (corona-erprobt). Um die Grafiken vom Skript aktualisieren zu lassen, muss man in DataWRAPPER einen API-Token generieren und im R-Environment hinterlegen - dazu das Paket ```DatawRappr``` von [Github](https://github.com/munichrocker/DatawRappr) installieren, laden, und ```datawrapper_auth("abcdef")``` aufrufen (statt "abcdef" natürlich das API-Token.) + +Die Datawrapper-Darstellungen müssen derzeit noch von Hand angelegt werden - im Fall der Karten mit einem korrekten Shapefile als .geojson. Mehr bei [Datawrapper](https://academy.datawrapper.de/article/145-how-to-upload-your-own-map); wie man mit QGIS aus einem .shp-File ein .geojson mit Zentrierpunkten und Tabellen erstellt, [ist stichpunktartig hier dokumentiert](howto_shapefile.md) ## Ordnerstruktur @@ -13,18 +26,69 @@ R-Code, um den Auszählungsstand hessischer Bürgermeisterwahlen in Echtzeit abz ### Ziele Grafiken: -* Säulengrafik erste fünf; Ergebnis nach derzeitigem Auszählungsstand mit "Fortschrittsbalken" +* Säulengrafik erste (top); Ergebnis nach derzeitigem Auszählungsstand mit "Fortschrittsbalken" -* Balkengrafik alle -* Choropleth Stadtteil-Sieger (mit Switcher alle, die gewonnen haben) -* Choropleth Ergebnis nach Kandidat +* Balkengrafik für alle Kandidierenden +* Symbol-Karte Stadtteil-Sieger und für jeden Kandidierenden eine Choropleth-Karte mit dem Ergebnis nach Stadtteil * Tabelle nach Kandidaten (3 beste, 3 schlechteste Stadtteile) -* Tabelle nach Stadtteil +* Tabelle alle Ergebnisse nach Stadtteil ### Konfiguration -- Konfigurationsdatei ```index/config.csv``` mit Link, Starttermin, Datawrapper-Zielen; Anzahl der eingegangenen Briefwahlstimmen -- ```index/index.rda``` mit Tabellen Zuordnung Stimmbezirk->Wahllokal und Stadtteilen +Das Programm holt sich seine Daten aus einer Konfigurationsdatei - entweder für den Live- oder den Testbetrieb, was über die Variable TEST im Progammcode umgestellt wird. Die Indizes für die jeweile Wahl - Kandidatinnen und Kandidaten, Stadtteile und Wahllokal-Zuordnungen - liegen in einem Unterordner mit dem Namen der Wahl, als CSV oder XLSX. + +- Konfigurationsdatei ```index/config.csv``` - eine CSV-Datei mit den Spalten "name" und "value" für die Konfigurations-Variablen und ihre Werte. + +name | value (Erklärung) +----|---- +wahl_name | Name der Wahl, z.B. ob_ffm_2023. Auch Name der Unterordner. +stimmbezirke_url | Die Votemanager-URL, unter der eine CSV-Datei mit den Ergebnissen und dem Meldungsstand nach Stimmbezirk abrufbar ist. (Beim Testen auf eine eigene URL oder einen Dateipfad umbiegen) +wahlberechtigt | Anzahl der vom Wahlamt gemeldeten Wahlberechtigten am Tag der Wahl; derzeit nicht benötigt (wäre für Schätzung der Wahlbeteiligung erforderlich) +briefwahl | Anzahl der vom Wahlamt gemeldeten Briefwahlstimmen insgesamt am Tag der Wahl; derzeit nicht benötigt (wäre für Schätzung der Wahlbeteiligung erforderlich) +kandidaten_fname | Filename der Tabelle mit den Kandidaten +zuordnung_fname | Filename der Tabelle mit den Wahlbezirken und der Zuordnung zu Stadtteilen +stadtteile_fname | Filename einer Liste mit Stadtteilen und Nummer +startdatum | Zeitpunkt, ab dem die Wahlauszählung laufen soll +top | Anzahl der führenden Kandidatinnen, die die erste Säulengrafik und die Anzahl der Ergebnis Balken in den Tooltipps der Karten steuert +top_id | Datawrapper-ID für die Säulengrafik für das derzeitige Ergebnis der führenden (top) Kandidatinnen und Kandidaten +karte_sieger_id | Datawrapper-ID der Symbolkarte mit den Siegern nach Stadtteil +karte_kand1_id | Die Datawrapper-IDs für die Choropleth-Karten der Kandidatinnen; für jede eine Karte - nummeriert nach der Reihenfolge auf dem Wahlzettel (wie in der Indexdatei ```kandidaten.xlsx``` hinterlegt) +...karte_kandn_id | +tabelle_alle_id | Die Datawrapper-ID für die Balkengrafik mit allen Kandidierenden - die technisch eigentlich eine Tabelle ist und deswegen tabelle_alle_id heißt +hochburgen_id | Die Datawrapper-ID für die Tabelle mit den besten und schlechtesten Stadtteilergebnissen nach Kandidat +tabelle_stadtteile_id | Die Datawrapper-ID für die Tabelle mit den Gesamtergebnissen +social1_id | Für Social Media: ID der Top-Säulengrafik +social2_id | Für Social Media: ID einer Kopie der Gesamt-Tabelle/Balkengrafik + +- Tabelle kandidaten.xlsx (im Unterordner mit dem Wahlnamen) enthält folgende Spalten: +Spalte | Wert +---- | ---- +Nummer | laufende Nr. des Kandidierenden nach Wahlzettel als ID +Vorname | (und ggf. Doktortitel) +Name | +Parteikürzel | Kurzform der Partei des Kandidaten (z.B. "PARTEI" statt "Partei für Arbeit, Rechtsstaat, Tierschutz, Elitenförderung und basisdemokratische Initiative"") +Partei | Vollständiger Parteiname (derzeit nicht verwendet) +Farbwert | Die Kampagnenfarbe bzw. die Farbe für die Darstellungen des Kandidierenden als Hex-RGB-String, also z.B. "#B92837" +URL | Verlinkung auf den Hintergrundartikel zum Kandidaten (derzeit nicht verwendet) + +- Die Stadtteil-Datei kann man aus QGIS exportieren, wenn man das Shapefile erstellt (CSV oder XLSX): + +Spalte | Wert +---- | ---- +nr | Laufende Nummer, ID des Stadtteils +name | Name des Stadtteils (dient auch als ID, also auf Tippfehler achten!) +lon | Längengrad des Zentrierpunkts für den Stadtteil +lat | Breitengrad des Zentrierpunkts für den Stadtteil + +- Die Stimmbezirks-Datei enthält die Zuordnungen für die Wahlbezirke zu Stadtteilen und wird aus der Open-Data-Beispieldatei des votemanagers erstellt: + +Spalte | Wert +---- | ---- +nr | ID des Stimmbezirks +ortsteilnr | ID des Stadtteils +ortsteil Name des Stadtteils + +Nicht benötigte Spalten können in der Tabelle bleiben, sollten aber möglichst nicht "name" oder so heißen. ### Aufarbeitung diff --git a/howto_shapefiles.md b/howto_shapefiles.md index b60bcfdb77d78f2857ed9873e4595b74e196b904..c75fe0a9c11e08ba9a8f97e1262d823741b41b40 100644 --- a/howto_shapefiles.md +++ b/howto_shapefiles.md @@ -1,3 +1,5 @@ +Notizen: Erstellen eines .geojson-Shapefiles in WGS84 aus einem Standard-Shapefile im falschen Koordinatensystem mit QGIS + 1. Shapefile in QGIS importieren 2. GEOJSON im richtigen Koordinatensystem erstellen @@ -6,9 +8,6 @@ Dazu Rechtsklick auf den Layer; Koordinatensystem WGS84, exportieren 3. Stadtteile generieren Menü "Vektor", "Geometrieverarbeitungswerkzeuge", "Auflösen" - und dann in der Dialogbox auswählen "Felder auflösen [optional]", und dann die Attribute hinzufügen, nach denen zusammengeführt werden soll. -In KS beispielsweise gab es die - - - Rechtsklick auf den Layer; Exportieren als GEOJSON - nicht vergessen, das Bezugssystem auf WGS84 umzustellen! - Rechtsklick auf den Layer; Export als XLSX - ggf. Geo-Attribute abschalten @@ -23,4 +22,4 @@ Dann noch Geokoordinaten der Zentroidpunkte: Rechte Seite die Toolbox, dort "Vek 5. CSV-/XLSX-Dateien putzen - Brauchen eine Stadtteil-Datei mit nr,name,lon,lat (erzeugt aus den Zentroiden) -- Brauchen einen Wahlbezirks-Zuordnung +- Brauchen einen Wahlbezirks-Zuordnung \ No newline at end of file