Parkhaus-Auslastung

In Basel laufen derzeit mehrere Grossprojekte für unterirdische Parkings. Dabei stellt sich die Frage: Wer braucht all diese Plätze? Und: Sind die bestehenden Parkings denn überhaupt ausgelastet?

Einen guten Überblick bietet www.parkleitsystem-basel.ch/status.php; dort werden die aktuellen Belegungszahlen minütlich aktualisiert dargestellt. Und noch besser: Es wird ein RSS-Feed mit strukturierten XML-Daten zur Verfügung gestellt: http://www.parkleitsystem-basel.ch/rss_feed.php.

Dieser Feed ist folgendermassen aufgebaut:

<rss version="2.0">
<channel>
<title>Permanentes Parkleitsystem Basel</title>
<description>Ein Parkleitsystem ist ein Informationssystem welches die Aufgabe hat, Parkmoeglichkeiten in einer Stadt anzuzeigen und die Autofahrer zielgerecht dorthin zu fuehren.</description>
<link>http://www.parkleitsystem-basel.ch/status.php</link><lastBuildDate>Thu, 26 Apr 2018 14:07:55 +0100</lastBuildDate><generator>FeedCreator 1.7.2-ppt (info@mypapit.net)</generator>
<item><title>Parkhaus Bad. Bahnhof</title><link>http://www.parkleitsystem-basel.ch/parkhaus/badbahnhof.php</link><description>Anzahl freie Parkpl&auml;tze: 68</description><comments>Stand: 26.04.2018 14:07:00</comments><pubDate>Thu, 26 Apr 2018 13:07:00 +0100</pubDate></item>
...
Entscheidend sind die drei Elemente title, description und comments. Diese werden mit der PHP-Funktion simplexml_load_file in ein Array gepackt, danach wird das Array in einer foreach-Schleife abgearbeitet (die einzelnen item-elemente, dies mit dem Kommando
foreach($xml->channel->item as $test){
Kleine Bearbeitungen und das Entfernen eines Umlauts später steht das Array bereit, um in eine Mysql-Datenbank mit Spalten für die einzelnen Parkhäuser eingefügt zu werden.
$xml=simplexml_load_file($url) or die("Error: Cannot create object");

$arrayfuerdb = array();

foreach($xml->channel->item as $test){
 if(trim($test->title) == "Parkhaus Bahnhof S&uuml;d"){
 $test->title = "Parkhaus Bahnhof Sued";
 }
 $arrayfuerdb[trim($test->title)] = intval(substr($test->description,strpos($test->description,":")+2));
}

$date_for_database = date ("Y-m-d H:i:s", strtotime(substr($xml->channel->item[0]->comments,strpos($xml->channel->item[0]->comments,"Stand: ")+7)));

$arrayfuerdb["datetime"] = $date_for_database;
var_dump($arrayfuerdb);

$wpdb->insert('parkleitsystem',$arrayfuerdb); }

Ein CURL-Befehl führt das entsprechende Script seither alle fünf Minuten aus und füttert die Datenbank.

Erstmals elegant gelöst habe ich die automatisierte Ausgabe via JSON und der JSON-Importfunktion von infogr.am. Die Vorgaben für den Infogram-Import sind hier aufgefürt: https://infogram.com/api/examples/live.json. Ich habe diese Vorgabe mit zwei zusätzlichen echo“]“;-Kommandos erfüllt, den Rest des Arrays habe ich mittels json_encode ausgegeben. Wichtig dabei war, bei der Datenabfage an die MySql-Datenbank den Parameter Array_N zu übergeben, damit es als numerisches Array zurückgegeben wird.

Ein kleines Kunststück ist mir bei der SQL-Abfage des Datums geglückt, und zwar mit dem Statement

"Select DATE_FORMAT(datetime, '%a,%H:%i') as Zeit, [...]"

in Kombination mit einem vorher abgesetzten

$wpdb->query("SET lc_time_names = 'de_DE';");

Das führt dazu, dass die Ausgabe als abgekürzter Wochentag auf Deutsch + Uhrzeit ausgegeben wird. Der ganze Code:

if($_GET["output"]=="infogram"){
 $wpdb->query("SET lc_time_names = 'de_DE';");
 $alleeintraege = $wpdb->get_results( "Select DATE_FORMAT(datetime, '%a,%H:%i') as Zeit,`Parkhaus Bad. Bahnhof`, `Parkhaus Messe`, `Parkhaus Europe`, `Parkhaus Rebgasse`, `Parkhaus Claramatte`, `Parkhaus Clarahuus`, `Parkhaus Elisabethen`, `Parkhaus Steinen`, `Parkhaus City-USB`, `Parkhaus Storchen`, `Parkhaus Post Basel`, `Parkhaus Centralbahnparking`, `Parkhaus Aeschen`, `Parkhaus Anfos`, `Parkhaus Bahnhof Sued` FROM parkleitsystem",ARRAY_N );

 $arrayhinzu = array("Zeit","Parkhaus Bad. Bahnhof", "Parkhaus Messe", "Parkhaus Europe", "Parkhaus Rebgasse", "Parkhaus Claramatte", "Parkhaus Clarahuus", "Parkhaus Elisabethen", "Parkhaus Steinen", "Parkhaus City-USB", "Parkhaus Storchen", "Parkhaus Post Basel", "Parkhaus Centralbahnparking", "Parkhaus Aeschen", "Parkhaus Anfos", "Parkhaus Bahnhof Sued");

array_unshift($alleeintraege,$arrayhinzu);
 echo "[";
 echo json_encode($alleeintraege);
//Print array in JSON format
 echo "]";die();

Hier die fertige, sich selbst aktualisierende Grafik:

Die fertige Geschichte gibt’s online und in der Print-Version als pdf.

Autor: Samuel Hufschmid

Jounalist bei bz Basel, Papi, Organisator Swiss Kubb Open, mit Interesse an Datenjournalismus.

Kommentar verfassen