Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung
Nächste Überarbeitung
Vorherige Überarbeitung
gf_informatik:daten_sca:maps_python [2023-06-12 19:03] – [Lösungen] scagf_informatik:daten_sca:maps_python [2023-06-20 18:39] (aktuell) – [Aufgabe 6: Abstimmungsresultate] sca
Zeile 35: Zeile 35:
 Ein geschlossenes **Polygon** (Vieleckt) notiert man so: Ein geschlossenes **Polygon** (Vieleckt) notiert man so:
 <code> <code>
-"POLYGON ((x1 y1, x2 y2, x3 y3))"+"POLYGON ((x1 y1, x2 y2, x3 y3, x1 y1))"
 </code> </code>
 In diesem Falle erhält man natürlich ein Dreieck. Beachte hier die Verwendung von **doppelten Klammern**. In diesem Falle erhält man natürlich ein Dreieck. Beachte hier die Verwendung von **doppelten Klammern**.
Zeile 43: Zeile 43:
 "MULTIPOINT ((x1 y1, x2 y2, x3 y3))" "MULTIPOINT ((x1 y1, x2 y2, x3 y3))"
 "MULTILINESTRING ((x1 y1, x2 y2), (x3 y3, x4 y4))"" "MULTILINESTRING ((x1 y1, x2 y2), (x3 y3, x4 y4))""
-"MULTIPOLYGON (((x1 y1, x2 y2, x3 y3)),((x4 y4, x5 y5, x6 y6)))"+"MULTIPOLYGON (((x1 y1, x2 y2, x3 y3, x1 y1)),((x4 y4, x5 y5, x6 y6, x4 y4)))"
 </code> </code>
  
-==== WKR in Google Maps ====+==== WKT in Google Maps ====
  
 Um Punkte, Linien und Polygone in Google Maps einzuzeichnen, kann man diese Formen in einem CSV-File festlegen. Dazu benötigt man die entsprechenden **Koordinaten** ($x:$ longitude/Längengrad, $y:$ latitude/Breitengrad). Um Punkte, Linien und Polygone in Google Maps einzuzeichnen, kann man diese Formen in einem CSV-File festlegen. Dazu benötigt man die entsprechenden **Koordinaten** ($x:$ longitude/Längengrad, $y:$ latitude/Breitengrad).
Zeile 74: Zeile 74:
 ===== Aufgaben ===== ===== Aufgaben =====
  
 +Arbeite *nicht* mit Excel / Google Sheets, sondern mit einem reinen **Texteditor** wie **Visual Studio Code**.
 === Aufgabe 1: Big 4 im TG === === Aufgabe 1: Big 4 im TG ===
  
-Erstelle ein leeres CSV-File mit Header "Name,WKT" und füge folgende Elemente hinzu. Verwende die Koordinaten aus der Theorie oben: +Erstelle ein leeres CSV-File mit Header "Name,WKT" und füge Punkte für die vier Gemeinden Frauenfeld, Weinfelden, Romanshorn, Kreuzlingen hinzu. Verwende die Koordinaten aus der Theorie oben:
- +
-   * Vier Punkte für die Gemeinden Frauenfeld, Weinfelden, Romanshorn, Kreuzlingen +
-   * Linie von Weinfelden nach Kreuzlingen +
-   * Viereck, welches die vier Gemeinden verbindet+
  
 Importiere das File dann in Google Maps und stelle sicher, dass alles stimmt. Importiere das File dann in Google Maps und stelle sicher, dass alles stimmt.
Zeile 116: Zeile 113:
 ++++ ++++
  
-=== Aufgabe 4: Städte mit vielen Einwohnern ===+=== Aufgabe 4: Gemeinden mit Anfangsbuchstaben === 
 + 
 +   1. Wähle einen Anfangsbuchstaben, z.B. "W", und speichere diesen in einer Variable. 
 +   1. Ermittle nun alle Bahnhöfe, die mit diesem Buchstaben beginnen ... 
 +   1. und generiere das entsprechende CSV-File. 
 +   1. Importiere es in Google Maps, um diese anzuzeigen. 
 + 
 +=== Aufgabe 5: Städte mit vielen Einwohnern ===
  
 Identifiziere (möglichst) alle Städte mit $10'000$ Einwohnern oder mehr und zeige sie auf einer Google Map an. Identifiziere (möglichst) alle Städte mit $10'000$ Einwohnern oder mehr und zeige sie auf einer Google Map an.
Zeile 125: Zeile 129:
    1. Falls ja versuchst du im SBB-Datensatz die Koordinaten dieser Gemeinde zu ermitteln.    1. Falls ja versuchst du im SBB-Datensatz die Koordinaten dieser Gemeinde zu ermitteln.
    1. **Achtung:** Das geht nicht immer! Warum? Verwende deshalb `try-except`, damit der Code nicht crashed.    1. **Achtung:** Das geht nicht immer! Warum? Verwende deshalb `try-except`, damit der Code nicht crashed.
 +   1. Falls du einen passenden Eintrag gefunden hast im SBB-Datensatz, schreibst du einen entsprechenden Eintrag ins CSV.
 +   1. Optional kann man als "Name" im CSV-File nicht nur den <Gemeindenamen> sondern z.B. <Gemeindenamen (Einwohner)> anzeigen. Dann hat man eine Karte, bei der man auf die Gemeinden klicken kann und gleich die Anzahl Einwohner sieht.
 +   
 +
 +
 +=== Aufgabe 5+ (Optional) ===
 +
 +Erweitere die letzte Aufgabe: Es fehlen noch einige Ortschaften, auch wichtige wie Zürich und Basel. Warum? Versuche den Code so zu erweitern, dass möglichst viele dieser 'problematischer' Ortschaften auch integriert werden.
 +
 +=== Aufgabe 6: Abstimmungsresultate ===
 +
 +Zu Abstimmungen kann man jeweils die detaillierten Daten im JSON-Format herunterladen. Hier der Link zu den 
 +[[https://opendata.swiss/de/dataset/echtzeitdaten-am-abstimmungstag-zu-eidgenoessischen-abstimmungsvorlagen|Daten der eidgenössischen Abstimmungen]]
 +
 +Hier direkt zur 
 +[[https://opendata.swiss/de/dataset/echtzeitdaten-am-abstimmungstag-zu-eidgenoessischen-abstimmungsvorlagen/resource/964e6c70-c3af-4c25-8d1b-88be1ea30d02|Abstimmung vom 18.06.2023]]
 +
 +   1. Lade den Datensatz zur aktuellsten eidgenössischen Abstimmung herunter.
 +   1. Verschaffe dir einen Überblick: Wie ist der Datensatz aufgebaut? Tipps:
 +      1. Mit `.keys()` kannst du sehen, welches die Schlüssel eines Dicts sind.
 +      1. Mit `type(...)` kannst du ermitteln, um was für einen Typ es sich handelt.
 +      1. Achtung: Der Datensatz beinhaltet ein Dict, welches Listen enthält, welches wiederum Dicts enthält u.s.w.
 +      1. Falls du überfordert bist damit, findest du unten die Antwort
 +   1. Finde in diesem Datensatz die Anzahl Ja-Stimmen zu allen Vorlagen in *deinem* Wohnort.
 +   1. Finde die extremsten Gemeinden zu den jeweiligen Vorgaben: Höchste und tiefste Anzahl Ja- resp. Nein-Stimmen
 +   1. **Zusatzaufgabe:** Stelle einen Sachverhalt von diesem Datensatz mithilfe von WKT in Google Maps graphisch dar. Beispiel: Ermittle für eine Vorlage von jedem Kanton die beiden Gemeinden mit dem höchsten Ja- resp- Nein Anteil. Erstelle dann eine Karte, die dies darstellt. Falls im Datensatz `sbb.json` die jeweilige Gemeinde nicht eingetragen ist, musst du diese halt nachschlagen.
 +
 +++++Tipps: Aufbau Datensatz inkl. Beispiel|
 +<code python>
 +# lade Datensatz (JSON) in ein dict mit Name data
 +
 +vorlagen = data['schweiz']['vorlagen'] # vorlagen ist Liste, Länge entspricht Anzahl Vorlagen
 +vorlage = vorlagen[0] # vorlage beinhaltet alle Infos zur ersten Vorlage (erstes Element der Liste vorlagen
 +print(vorlage['vorlagenTitel'][0]['text']) #  Name der Vorlage (0 für Deutsch)
 +
 +kantone = vorlage['kantone'] # Liste mit Infos zu allen Kantonen (zur gewählten Vorlage)
 +kanton = kantone[3] # Infos zu einem Kanton (Zahl 0 - 25, weil 26 Kantone)
 +print(kanton['geoLevelname']) # Name dieses Kantons
 +
 +gemeinden = kanton['gemeinden'] # Liste mit Infos zu allen Gemeinden in diesem Kanton (zur gewählten Vorlage)
 +gemeinde = gemeinden[7] # Alle Infos zu einer Gemeinde
 +
 +resultat = gemeinde['resultat'] # Resultat
 +jaStimmenInProzent = resultat['jaStimmenInProzent']
 +"""
 +</code>
 +++++
  
  
Zeile 149: Zeile 200:
 ++++ ++++
  
-++++Aufgabe 4|+++++Aufgabe 5| 
 + 
 +Reguläre Lösung
 <code python> <code python>
 import json import json
Zeile 171: Zeile 224:
                 print("Fehler: ",town)                 print("Fehler: ",town)
 </code> </code>
 +
 +Mit optionalem Part:
 +<code python>
 +import json
 +
 +INHABITANTS_MIN = 50000
 +
 +with open("sbb.json", "r") as json_file:
 +    sbb = json.load(json_file)
 +    
 +with open("gemeinden.json", "r") as json_file:
 +    gemeinden = json.load(json_file)
 +
 +def generate_wkt_point(town):
 +    return '"' + town + '"' + ',' + '"POINT (' + sbb[town]['longitude'] + ' ' + sbb[town]['latitude'] + ')"\n'
 +
 +with open('gemeinden_min_' + str(INHABITANTS_MIN) + '.csv','w') as out_file:
 +    out_file.write('Name,WKT\n') # kann alternativ auch mit csv.writer arbeiten
 +
 +    for town in gemeinden:
 +        if gemeinden[town]['inhabitants'] >= INHABITANTS_MIN:
 +            success = False
 +            for ext in ['',' HB',' SBB']: # try different typical extensions
 +                try:
 +                    out_file.write(generate_wkt_point(town + ext))
 +                    success = True
 +                    break
 +                except:
 +                    continue
 +            if not success:
 +                for t in sbb: # if not found yet, split and try to match first part
 +                    if t.split()[0] == town:
 +                        out_file.write('"' + t + '"' + ',' + '"POINT (' + sbb[t]['longitude'] + ' ' + sbb[t]['latitude'] + ')"\n')
 +                        print(town)
 +                        break
 +</code>
 +
 ++++ ++++
  
  
 </nodisp> </nodisp>
  • gf_informatik/daten_sca/maps_python.1686596605.txt.gz
  • Zuletzt geändert: 2023-06-12 19:03
  • von sca