Posts tagged ‘google’

Bikekarte dank Google Fusion

Ich war diese Woche gesundheitlich nicht so fit, umso mehr Zeit hatte ich Codezeilen zu tippen. Ich habe die letzten Tage mit Google Fusion verbracht und bereits darauf aufmerksam gemacht.

Ich bin wieder einen Schritt weiter. Meine persönliche Bikekarte mit Google Maps API V3 und einer Google Fusion Tabelle ist live. Die Karte ist auch über diverse Parameter filterbar.

Meine Bikekarte zeigt mir alle meine Mountainbike Touren auf einmal auf der Karte, welche ich auf GPSies führe. Ich kann bequem nach Länge, Anstieg und höchsten Punkt filtern.
Coole Sache, Google. Das Ganze soll natürlich auch recht skalierbar sein.

Die Bikekarte wird von mir sicherlich noch erweitert werden. Als nächstes in der Reihe Google Fusion plane ich folgende Sachen:

  • eine ähnliche Karte mit den hier detailiert beschriebenen Touren (inkl. weiteren Filtern)
  • Highlighting der ausgewählten Strecke in der Karte
  • eine Karte und Umgebungsliste der Mountainbike Laden in der Schweiz*

* ride hat diese Liste auf ihrer Website, aber die Suche ist meiner Meinung nach suboptimal. Ist man unterwegs, möchte man in der Regel einfach die 5 nächstgelegenen Shops vom aktuellen Standort sehen. Ich werde dies mal versuchen und dann Ride informieren.

Detaillierter PHP Code

Für die Entwickler unter Euch, hier wie das Ganze detaillierter aussieht:

1. Daten von gpsies in eine google fusion tabelle einfügen

GPSies wie auch Google Fusion stellen beide eine API zur Verfügung.
Ich gehe davon aus, dass die Tabelle auf Fusion bereits besteht (diese kann sonst auch per API generiert werden).

$page = 0;
while (true) {
    $page++;

    // Strecken von GPSies auslesen
    $file = file_get_contents('http://www.gpsies.com/api.do?searchUsername=deineID&country=CH&trackTypes=mountainbiking&limit=100&resultPage=' . $page);
    $xml = simplexml_load_string($file);
    if (chop($xml->meta->resultSize) == 0)
        break;

    // kml der Strecke holen und Geoinformation speichern
    $gpsiesId = chop($track->fileId);
    $file = (file_get_contents('http://www.gpsies.com/download.do?filetype=kml&fileId=' . $gpsiesId);
    $kml = simplexml_load_string($file);
    $geo = '';

    foreach ($kml->Document->Folder->Placemark as $placemark) {
        if ($placemark->MultiGeometry->LineString) {
            foreach ($placemark->MultiGeometry->LineString as $line) {
                $geo .= chop($line->coordinates);
            }
        }
    }

    $values = array(
        'gpsiesid'  => $gpsiesId,
        'name'      => chop($track->title),
        'distance'  => round(chop($track->trackLengthM) / 1000, 1),
        'ascent'    => chop($track->totalAscentM),
        'elevation' => chop($track->altitudeMaxHeightM),
        'geometry'  => '' . $geo . '',
    );

    // Daten in Fusion Tabelle laden
    $keys = implode(", ", array_keys($values));
    $vals = implode("', '", $values);
    $command = "INSERT INTO " . $this->opts['tableId'] . " (" . $keys . ") VALUES ('" . $vals . "')";

    execFusion($command);

   // gpsies Server nicht überlasten
   sleep(2);
}

Für ein INSERT in Google Fusion braucht es eine Authentifizierung. Der Service heisst “fusiontables”.

Je nach Befehl (INSERT, UPDATE, …) muss die Query mit HTTP-POST oder GET ausgeführt werden.

function execFusion($command) {
    $auth = "das-ist-dein-schlüssel";

    $headers = array(
        "Authorization: GoogleLogin auth=" . $auth,
    );

    $curl = curl_init($this->baseurl);
    curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

    // make post or get depending on command
    if (preg_match('!^(insert|update|delete)!i', $command))
        curl_setopt($curl, CURLOPT_POSTFIELDS, array('sql' => $command));
    else
        curl_setopt($curl, CURLOPT_URL, $this->baseurl . '?sql=' . urlencode($command));

    $return = curl_exec($curl);
    curl_close($curl);

    return $return;
}

2. Google Maps API V3 und Fusion Table

Das Einfügen der Fusion Table als Layer geht ziemlich einfach im Javascript:

    // Google Maps instanzieren
    var latlng = new google.maps.LatLng(46.798448583333, 8.2318785277778);
    var myOptions = {
            zoom: 8,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.TERRAIN
    };
    var map = new google.maps.Map(document.getElementById("map"), myOptions);

    // Google Fusion anzeigen
    var fusionTableLayer = new google.maps.FusionTablesLayer(tableID);
    fusionTableLayer.setMap(map);

    // Filter (man muss die Spalte mit der Geoinformation selektieren, sonst gehts nicht)
    var query = "select geometry from " + tableID + " where distance < 30";
    fusionTableLayer.setOptions({ query: query });

3. Nachtrag Authentisierungs Key für Google Fusion erhalten

Den Key erhält man mit Hilfe von ClientLogin von Google. Beachte die auch die Service Namen.

function getAuth() {
    $clientlogin_url = "https://www.google.com/accounts/ClientLogin";
    $clientlogin_post = array(
        "accountType" => "GOOGLE", // HOSTED, GOOGLE, HOSTED_OR_GOOGLE
        "Email" => "your login",
        "Passwd" => "your password",
        "service" => "fusiontables",
        "source" => "some reference name of your app"
    );

    // Initialize the curl object
    $curl = curl_init($clientlogin_url);

    curl_setopt($curl, CURLOPT_POST, true);
    curl_setopt($curl, CURLOPT_POSTFIELDS, $clientlogin_post);
    curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
    curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);

    $response = curl_exec($curl);

    preg_match("/Auth=([a-z0-9_\-]+)/i", $response, $matches);
    $auth = $matches[1];

    return $auth;
}

Darstellung der Tracks auf einer Karte, dank Google Fusion

Vor ein paar Wochen bin ich über Google Fusion gestolpert (dank GPSies).

Ich hatte nun endlich Zeit etwas damit zu spielen und habe meine Mountainbike Strecken von gpsies in eine Fusion Tabelle importiert.

Damit lässt sich sehr einfach eine Karte generieren oder auch nach bestimmten Kriterien filtern.
Hier eine Karte aller importierten Tracks:

Ich werde dann als nächsten Schritt versuchen, meine Tourenbeschreibungen von federwegCH automatisch in eine Karte zu importieren.

Das Tool ist auf jeden Fall bewundernswert! Well Done Google!