Blog

Genervt von Ampeln? - Lösen Sie das Problem mit einem GPS-Logger, Scala, GeoTools und qGis

Jeroen van Wilgenburg

Aktualisiert Oktober 22, 2025
9 Minuten

Ich lebe in Utrecht, einer Stadt, in der die Stadtverwaltung anscheinend versucht, Autofahrer so weit wie möglich zu ärgern. Öffentliche Verkehrsmittel sind keine Option. Trotz der Staus sind sie langsamer, unzuverlässiger und von der Einstellung der Busfahrer will ich gar nicht erst anfangen. Wenn Sie von einem Ort in Utrecht zu einem anderen fahren wollen, ist es oft eine gute Idee, die nächstgelegene Autobahn zu nehmen, die zwar viel länger ist, aber oft auch viel schneller. Anstatt sich zu beschweren (was jetzt aufhören wird ;) ), könnte es eine Lösung geben. Ich habe die Theorie, dass eine Reise viel schneller geht, wenn Sie Ampeln meiden und so oft wie möglich die Autobahn benutzen. Um diese Theorie zu beweisen, mein neues (Android 2.2) Telefon zu testen, meine Scala-Kenntnisse aufzufrischen und ein cooles Lieblingsprojekt zu haben, habe ich angefangen, meine Fahrten zu protokollieren.In diesem Artikel zeige ich Ihnen, wie Sie die Daten sammeln, parsen und in ein brauchbares Format konvertieren und auf einer Karte anzeigen. Dies ist nur ein erster Prototyp und um meine Theorie zu beweisen, brauche ich wahrscheinlich viel mehr Zeit, die ich nicht habe, weil ich ständig im Stau stehe ;). Wenn Sie den ganzen technischen Hokuspokus nicht mögen, scrollen Sie einfach zu den Karten, die sind cool anzuschauen.

Vorbereitung

Da ich einen Peugeot fahre, hatte ich aufgrund der Infrarotbeschichtung der Windschutzscheibe Probleme mit dem GPS-Empfang auf meinem Telefon. Um dieses Problem zu lösen, habe ich eine externe Bluetooth-Antenne verwendet und Android angewiesen, diese Antenne zu verwenden. Bluetooth GPS ist dafür eine gute Lösung. Andere Gründe für die Verwendung einer externen Antenne sind, dass sie viel genauer sind, den Akku Ihres Telefons schonen und dass Sie die Antenne dort platzieren können, wo der Empfang am besten ist (das schwarze Rechteck hinter Ihrem Rückspiegel ist ein perfekter Ort und das ist einer der Gründe, warum dieses Rechteck existiert).

Peugeot 406 Windschutzscheibe Infrarot-Beschichtung

Wenn Sie Probleme haben, das Bluetooth-GPS zu starten, versuchen Sie, das GPS und/oder Bluetooth auf Ihrem Telefon zu deaktivieren und zu aktivieren. Ich hatte einige Probleme mit meinem Car Kit, aber wenn Sie zuerst das GPS und dann das Car Kit anschließen, können Sie trotzdem beides verwenden. Sie müssen die Verbindung mit dem GPS überprüfen, wenn Sie jemand anruft. Vor einiger Zeit habe ich die GPS-Verbindung verloren, als mein Kollege Mischa mich anrief, um mir zu sagen, dass die linke Spur viel schneller war ;) Für die Protokollierung habe ich GPS Logger für Android, eine einfache Anwendung, die .gpx und/oder .kml in das Verzeichnis /mnt/sdcard/GPSLogger schreibt. Sie können sogar die Häufigkeit der Protokollierung einstellen. Beachten Sie, dass die Protokollierung nicht in dem eingestellten Intervall erfolgt, das ist nur ein Vorschlag. Die Antenne spuckt einen Datenstrom aus. Wenn Ihr Telefon beschäftigt ist, werden die Daten einfach übersprungen. Seien Sie sich dessen bewusst, wenn Sie die Daten verarbeiten, und geben Sie das Intervall nicht fest vor, sondern verwenden Sie den Zeitstempel der Antenne. Es gibt auch andere Anwendungen zur Protokollierung, einige zeichnen sogar eine Spur auf. Ich bevorzuge eine sehr schnelle Anwendung. Ich möchte nicht warten, bis eine Anwendung gestartet ist, wenn ich mein Auto starte.

Parsen der Daten

Ich habe beschlossen, die .gpx-Daten zu verwenden und .kml zu überspringen. Ich habe bereits einige Erfahrung mit gpx, aber kml sollte kein Problem sein. Die Felder, an denen ich interessiert bin, sind die Koordinaten (x,y) und der Zeitstempel. Kurs und Geschwindigkeit sind ebenfalls sehr nützlich, aber das sind abgeleitete Daten, für die ich GeoTools verwenden werde. Da das GPS nicht wirklich weiß, wann Sie stillstehen, erhalten Sie bei niedrigen Geschwindigkeiten eine Menge Datenmüll. Im Moment reicht es aus, davon auszugehen, dass Sie stillstehen, wenn die Geschwindigkeit unter 5 km/h fällt. Ein weiterer Punkt ist, dass das Geschwindigkeitsfeld ungültig wird, wenn Sie Trackpunkte aus dem Protokoll entfernen. Ich möchte die Durchschnittsgeschwindigkeit auf einem Abschnitt der Strecke, nicht am Trackpunkt selbst. Zum Parsen der Daten habe ich Scala verwendet. Dieses Beispiel erklärt, wie man xml in Scala parst. Die Struktur eines Trackpoints in der gpx-Datei ist wie folgt: [xml] <trkpt lat="52.131231666666665" lon="5.011798333333333"> <ele>49.4</ele> <Kurs>329.36</Kurs> <Geschwindigkeit>29.8172</Geschwindigkeit> <src>gps</src> <Zeit>2010-12-23T07:23:21+01:00</Zeit> </trkpt> [/xml] Ich bin an lat (y), lon (x) und Zeit interessiert. Mit diesen Feldern kann ich die Geschwindigkeit berechnen und meine Karte erstellen.

Anzeige der Geschwindigkeit

Ich dachte, es wäre schön, jede Strecke in einer Farbe anzuzeigen, die der Geschwindigkeit entspricht. Zur Anzeige der Karten verwende ich qGis, eine Desktop-Anwendung zur Darstellung von GIS-Daten. QGis kann alle möglichen Formate laden (Shapefiles, einfache .csv's und es sind viele Plugins verfügbar). Nachdem ich eine Weile versucht hatte, mit GeoTools Shapefiles zu erzeugen, entschied ich, dass Punkte (anstelle von Streckenabschnitten) gut genug sind. Schließlich interessiert mich die Zeit, die ich an Ampeln verbringe. In den Nightly-Versionen von qGis 1.7 gibt es ein neues und verbessertes Plugin für begrenzten Text. Die Jungs von Linfiniti haben sogar ein Anleitungsvideo dafür gemacht! Mit Version 1.7 ist es möglich, bekannten Text zu importieren. Damit ist mein Problem sofort gelöst, leider ist es für Mac Os noch nicht verfügbar. Ich muss also erst einmal eine Karte mit Punkten anzeigen:

Um die Daten zu importieren, habe ich die geparste xml-Datei zunächst in eine .csv-Datei konvertiert. Ein Ausschnitt aus der Ausgabe: [text]lonX, latY, speed, dateTime [/text] 5.074956666666667, 52.09170666666667, 37.266029160336, 2011-01-04T09:07:35.000+01:00 5.07473, 52.091948333333335, 31.436951983284487, 2011-01-04T09:07:38.000+01:00 5.0746, 52.092083333333335, 26.498677863536287, 2011-01-04T09:07:40.000+01:00

Berechnen der Geschwindigkeit

Zur Berechnung der Geschwindigkeit habe ich GeoTools in Scala verwendet: [scala] /**

  • @param start (Startpunkt (lon, lat))
  • @param Ziel (Endpunkt (lon, lat))
  • @return Entfernung in Metern / def calcDistance(start: (Double, Double), destination: (Double, Double)): Double = { val geodeticCalculator = new GeodeticCalculator(); geodeticCalculator.setStartingGeographicPoint(start._1, start._2); geodeticCalculator.setDestinationGeographicPoint(destination._1, destination._2); // Wird für einen bestimmten GeodeticCalculator immer nur einmal berechnet val ellipsoid = geodeticCalculator.getEllipsoid(); val sourceUnit = ellipsoid.getAxisUnit(); val targetUnit = SI.METER; val converterTo = sourceUnit.getConverterTo(targetUnit); // Zur Anwendung nach jeder Entfernungsberechnung converterTo.convert(geodeticCalculator.getOrthodromicDistance()); } [/scala] Die Geschwindigkeit wird wie folgt berechnet: (distanceInMeters / deltaMillis) 3600

    Begrenzte Textebene

    Die csv-Datei kann mit dem Plugin delimited text in QGis importiert werden. QGis ist intelligent genug, um zu erkennen, dass lonX und latY die x- und y-Koordinaten sind. Wenn die Ebene importiert ist, sehen Sie eine Karte mit Punkten, die alle die gleiche Farbe haben. Um die Farben zu ändern, doppelklicken Sie auf die Ebene in der Legende auf der linken Seite. Wählen Sie Symbologie und abgestuftes Symbol als Legendenart. Ich habe die Anzahl der Klassen auf 7 erhöht und auf die Schaltfläche Klassifizieren geklickt. QGis generiert eine Art Farbverlauf für Sie, der leicht geändert werden kann. Mit Stil speichern und laden können Sie diese Einstellungen zur späteren Verwendung speichern und laden.

    OpenStreetMap-Rasterebene (Georeferenzierung)

    Um eine Basisebene zu erstellen, habe ich eine Karte von OpenStreetMap heruntergeladen. Wenn Sie die Website aufrufen und eine schöne Ansicht einer Karte haben, die Sie in qGis verwenden möchten, können Sie auf die Registerkarte Export klicken. Dadurch öffnet sich ein Dock, in dem Sie ein Bild exportieren können. Merken Sie sich die Koordinaten, Sie brauchen sie in qGis! Öffnen Sie in qGis das Plugin Georeferencer. Klicken Sie auf die erste Schaltfläche in der Symbolleiste und öffnen Sie das von Ihnen gespeicherte Bild. Zoomen Sie in die obere linke Ecke des Bildes und fügen Sie einen Punkt hinzu (die drei Punkte in der Symbolleiste) und geben Sie die soeben gespeicherten Koordinaten ein. Machen Sie dasselbe für die untere rechte Ecke. Klicken Sie auf die grüne Schaltfläche Abspielen und klicken Sie auf den Ordner rechts vom Ausgaberaster. Sie haben nun ein georeferenziertes tiff-Bild, das Sie als Rasterebene in qGis hinzufügen können.Natürlich hat diese Karte nur eine Zoomstufe, die etwas verzerrt aussieht (siehe den Screenshot im nächsten Absatz).Ich bin mir nicht sicher, ob die von mir erwähnten Plugins standardmäßig installiert sind. Wenn dies nicht der Fall ist und Sie Probleme haben, lassen Sie es mich bitte wissen, dann füge ich diesem Blog einen entsprechenden Abschnitt hinzu. Normalerweise können Plugins unter dem Menüpunkt Plugins, Plugins verwalten aktiviert/deaktiviert werden.

    Anzeige der stationären Zeit

    Zur Anzeige der Standzeit habe ich das Intervall verwendet, in dem die Geschwindigkeit unter 5 km/h fällt. Diese Zeit ist als Feld in der csv-Datei enthalten, die wir in qGis verwenden können. Erstellen Sie in qGis eine abgegrenzte Textebene. Wählen Sie unter Symbologie das Ampelsymbol und vergrößern Sie es (ich habe 5 Punkte verwendet). Fügen Sie nun eine Beschriftung hinzu. Das Feld, das die Beschriftung enthält, sollte das Feld sein, in dem sich die Verzögerung befindet. Die Beschriftung wird standardmäßig oben auf dem Symbol angezeigt, besser ist es, sie unten rechts zu platzieren. Erhöhen Sie die Schriftgröße und -farbe (z.B. 24 und schwarz) und fügen Sie einen Puffer hinzu (2.0, weiß). Jetzt erscheinen auf der Karte Ampelsymbole mit einer Verzögerung daneben. Natürlich wollen wir auch eine Spur der gefahrenen Route anzeigen. Dies kann mit einer gpx-Ebene erreicht werden. Gehen Sie in das Menü Plugins, Gps, Gps-Tools. Klicken Sie auf die Registerkarte GPX laden..., suchen Sie nach dem gpx und wählen Sie unter Featuretypen die Tracks aus. In den Eigenschaften können Sie die Liniengröße und -farbe anpassen.

    Die violetten Linien stellen zwei verschiedene Fahrten dar. Die von mir analysierte Fahrt beginnt an der Ampel mit der Nummer 17, fÃ?hrt Ã?ber die 18 und endet bei der 15. Auf OpenStreetMap:Â Ausfahrt 17 auf der Autobahn A12.

    Fazit/Zukunft

    Ich dachte immer, ich warte minutenlang vor einer Ampel, aber so schlimm ist es nicht. Es kommt selten vor, dass man länger als eine Minute warten muss. Ich schätze, ich muss an meiner Ungeduld arbeiten ;)Ich zeige die Standzeit an und die muss nicht unbedingt an einer Ampel sein. Ein Haltestellen-Symbol wäre also vielleicht besser geeignet ;) Der nächste Schritt ist das 'Einfangen' der GPS-Daten auf den OpenStreetMap-Straßen und die Berechnung der Durchschnittsgeschwindigkeit. Ich arbeite auch daran, schönere Karten zu bekommen (jetzt sind die Karten verzerrt und nur für eine Zoomstufe geeignet). Das hat wahrscheinlich etwas mit den Koordinatensystemen zu tun und ich könnte OpenLayers einen Versuch geben. Androgeoid ist eine sehr schöne Seite mit Bewertungen von Android-Apps. Sie hat mir wirklich geholfen, die richtigen Tools für meine Arbeit auszuwählen.

    Quellen

    GPS Logger für Android Bluetooth GPS Androgeoid GeoTools OpenStreetMap Delimted text plugin video Herding XML in Scala

Verfasst von

Jeroen van Wilgenburg

Contact

Let’s discuss how we can support your journey.