[Talk-de] Bitte um kurzfristige (Leaflet)Unterstützung (Fahrdaten in Karte für Spendenrallye)

Sven arcormail22000-osm at yahoo.de
So Jul 12 21:10:29 UTC 2015


Hallo,

mein Teampartner und ich nehmen in Kürze an einer Wohltätigkeitsrally
teil, die uns von London nach Ulan-Bator, der Hauptstadt der Mongolei,
führt.

Wir haben in unserem Auto einen Logger, der zum einen Positionsdaten,
zum anderen noch Fahrzeugdaten wie Außentemperatur etc. erfasst. Diese
Daten sollen automatisiert auf eine Karte visualisiert werden, die wir
in unser Wordpress-Blog einbinden.

Wir haben den Aufwand und die Expertise, die man für eine solche
Einbindung benötigt, komplett unterschätzt und müssen das Ganze am
Mittwoch Abend stehen haben. Aaaahhhh!

Wir haben schon aus dem Bekanntenkreis tolle Unterstützung erhalten,
sind aber jetzt an einige Knackpunkte gekommen, die wir ohne langwierige
Einarbeitung nicht selbst lösen können.

Daher die Frage und große Bitte, einmal kurz den Sachverhalt zu scannen
und zu prüfen, ob jemand ein Patentrezept kennt oder uns einen Weg
aufzeigen kann oder jemand empfehlen kann, der das (auch kommerziell)
machen könnte unter den zeitlichen Rahmenbedingungen.

**Ausgangslage**

Die zwei Datenarten, die wir erheben, tun wir in eine Datei packen,
damit nur
eine Datei ausgelesen und verlinkt werden muss. Wir haben dabei einmal
die Positionsdaten und dann noch ein paar fahrzeugspezifische Parameter,
die noch genauer definiert werden müssen, aber die im nachfolgenden
Code-Snippet schon mal als Dummy drinstehen.

Pro Fahrt, d.h. Zündung an und Zündung aus, wird ein Datensatz erzeugt,
dieser liegt im xml-Format vor (damit wir mehrere Werte unterbringen
können, was ja bei gpx nicht geht).

Hier ein Beispiel:

<?xml version="1.0" encoding="utf-8"?>
<snapshot>
        <header>
                <serial>71878101986</serial>
                <vin></vin>
                <time>2013-03-05T06:57:42.0Z</time>
        </header>
        <data>
                <value name="velocity" unit="kmh">283.67</value>
                <value name="engine-speed" unit="rpm">6500.434</value>d
        </data>
        <gps lat="49.1564640" lon="9.3104110">
                <fix>3d</fix>
        <ele>190.70</ele>
        </gps>
</snapshot>

Ideen waren bisher:

1 Leaflet mit GPX-Plugin https://github.com/mpetazzoni/leaflet-gpx

2 CartoDB mit entsprechender automatisierter Datenanbindung

3 Openlayers und OSM-Script zur GPX-Anbindung
http://wiki.openstreetmap.org/wiki/Openlayers_Track_example (aber mit
Openlayers 3)

Als Endziel soll eine Karte entstehen, die wir auf unserem
Wordpress-Blog, vermutlich als iframe, einbinden können oder zumindest
hin verlinken können. Diese Karte sollte unser Fortkommen dokumentieren
und regelmäßig aktualisiert werden. Idealerweise sieht das ganze später
auch wie eine Route aus und nicht wie bei Google eine lange Reihe von
hundert Wegpunkten. Idealerweise kann man ferner auf einen Wegpunkt
klicken oder so und sieht dann in einem Pop-Up oder sonstwie die paar
fahrzeugspezifischen Werte, die wir im XML-Format mit erheben
(voraussichtlich Höhe, Außentemperatur etc.).

Fallstricke sind dabei folgende:

1)
Wir erheben im Fahrzeug alle 10 Minuten (um Datenvolumen zu reduzieren)
einen Wegpunkt mit Zusatzdaten. Die XML-Datei hätte demnach bei einer
einstündigen Fahrt, wenn die Zündung ausgeht, 6 Wegpunkte erfasst. Diese
einzelnen fahrtenbasierten Dateien, das nur als Hintergrund, werden
stündlich an das Backend des Dienstleisters übertragen und auf unseren
FTP geschoben. Wenn Handynetz vorhanden ist. Das heißt, dass wir
vielleicht pro Stunde bei kurzen Fahrten 3 xml-Dateien neu reinbekommen
oder nach zwei Tagen, wenn wieder Handy-Empfang ist, gesammelt 10
xml-Dateien.

Irgendwie muss jetzt ein Skript auf dem FTP nachschauen, ob es neue
Daten gibt, die Daten auslesen und in die Karte bringen.

2)
Wenn ich es richtig verstehe, ist leaflet nur ein Skript, dass
client-seitig was ausführt. Wenn wir jetzt pro Wegpunkt 100 kb erzeugen,
dann aber ja voraussichtlich 10 Stunden am Tag fahren, dann haben wir
nach zwei Wochen in Summe Wegpunkte in der Größenordnung von Megabyte.
Wenn also clientseitig das Auslesen und Interpretieren der Daten
erfolgt, dann müssen unsere Website-Besucher, gerade auf einem mobile
device, ewig warten, bis sich die Karte aufbaut. Das spricht dann
irgendwie für CartoDB, wo alles bei denen lagert und man nur die Karte
erhält (so zumindest mein Verständnis).


**bisheriger Plan**

- Cron-Job o.ä. fragt die XML-Dateien einmal ab ( die sind systematisch
benannt)
- XML wird ausgelesen, also: das
Relevante (Zeitstempel, Koordinaten?) wird ausgelesen, und in SQL-Datenbank
geworfen
- anderes Script liest jeweils in Laufzeit die Punkte aus und gibt sie in
einem Leaflet-kompatiblen Format aus. Idealerweise so, dass eine maximale
Menge an Punkten nicht überschritten wird und bei größeren Mengen erstmal
generalisiert wird.


**konkretisierter Plan**

1. Einlesen XML, XML-Parsing, Überprüfung eventueller Doppler, Schreiben in
SQL-Datenbank. In der Datenbank reicht im Prinzip eine Tabelle:

tab rallye_karte_positionsdaten

id (int, Index)
lat (float)
lon (float)
zeitstempel (timestamp) *

* zeitangaben sind vom Logger immer UTC

Diese drei Daten könnte ein Script nach dem XML-Parsing ja auch direkt
INSERTen.

2. Ausgabe: Herausfinden, wie viele Punkte sinnvollerweise dargestellt
werden, Ausgabe dann entsprechend notfalls etwas vereinfacht unter
Berücksichtigung des angezeigten Kartenausschnittes. Da müsste man
vermutlich etwas AJAXen oder in den sauren Apfel beißen und alles laden
oder eine passende Bib finden. Zweiter Punkt, der etwas Probleme
bereitet, ist ad-hoc. Verbindungslinien zwischen den angezeigten Punkten
würde
man vielleicht jeweils ad-hoc generieren,  vermutlich ist das kein
Problem, weil man nur die richtige Reihenfolge der Punkte braucht (hat
man ja per Timestamp).

**Arbeitsstand**

1) Kartengrundlage von mapbox: https://goo.gl/Pz63Pf

2) das parsing der XML in die Datenbank:

<?
// Parst eine XML-Loggerdatei
// und schreibt den Datensatz (Annahme: pro XML nur einer!)
// in SQL-Datenbank
// Keine Überprüfung auf Doppler bis hier

// Datenbankdaten

// $db_url = ;
// $db_user = ;
// $db_pass = ;
// $db_name = ;

// Pfad/URL der einzulesenden XML-Datei
$xmlFile = 'datei.xml';

// und hier geht es los mit dem XML-Parsing

if (file_exists($xmlFile)) {
    $xml = simplexml_load_file($xmlFile);


// geparste daten in variablen hauen und gleich bei jeder schauen, ob sie
überhaupt da sind, wenn nicht, dann verwerfen wir den ganzen datensatz, da
eh unbrauchbar
// dann also: exit.

if (!$v_timestamp = $xml->header[0]->time)
exit;

if(!$v_lat = $xml->gps[0]['lat'])
exit;

if(!$v_lon = $xml->gps[0]['lon'])
exit;

echo $v_lat;

} else {
    exit("Datei $xmlFile geht nicht auf....");
}

// so, jetzt an die Datenbank

// DB-Verbindung herstellen

$db = mysql_connect("$db_url", "$db_user", "$db_pass");
mysql_select_db("$db_name",$db);

// SQL-Statement und danach gleich an Datenbank schicken

$sql = "INSERT INTO rallye_karte_positionsdaten (zeitstempel,lat,lon)
VALUES ('$v_timestamp','$v_lat','$v_lon')";
$db_abfrage = mysql_query($sql,$db);

?>


3) in Wordpress basteln wir derzeit ein Plugin für dieses parsing und
fügen eine weitere Spalte mit einem Infotextfeld in die Datenbanktabelle
ein. Nachträglich kann man dann zu jedem beliebigen eingelesenen
Koordinatenpunkt noch einen kurzen Infotext einfügen. Auf der Karte sind
entsprechende Punkte dann besonders gekennzeichnet und ankilckbar, dann
geht die Infobox mit dem Infotext auf.


**Aufgaben und Probleme**

Die Daten auf die Karte bringen, dass ist aktuell die größte Hürde. Wir
wissen noch nicht ganz, wie jetzt diese Punkte da als Pop-up klickbar
werden. Auch ganz großes Problem ist die Datengeneralisierung, so dass
die Karte noch ladbar ist auf Handys etc.


Also, wer uns kurzfristig unterstützen kann, sichert sich nicht nur ein
großes Dankeschön, sondern auch ein goody aus einem Ort, den man nicht
mal im OSM gemappt hat. :-)

Beste Grüße

Sören




-- 
Team Fritz Headquarter
London - Mongolia Charity Rally
www.teamfritz2015.de
info at teamfritz2015.de
fb.com/teamfritz2015
@teamfritz2015




Mehr Informationen über die Mailingliste Talk-de