Schlagwort-Archive: OpenStreetMap

Hydrantenmapping in OpenStreetMap – Schoener leben mit Fast-Linked-Open-Data

Ich hatte neulich zweieinhalb Wochen Urlaub und bin dabei unvermittelt in eine ganze Reihe von Rabbit Holes gefallen, in die ich mich ueber den Urlaub hinweg reingegraben habe. Das ueberrascht niemanden, die/der mich kennt, aber ich fand die Zusammenhaenge dazwischen so spannend, dass ich das mal aufschreiben wolle.

Alles fing mit einem Abend in der Feuerwehr an. Wir sollten ueber mehrere Abende alle Hydranten im Ortsgebiet anfahren, kontrollieren, spuelen und – wo noetig – Maengel aufschreiben. Fehlt ein Hinweisschild eines Unterflurhydranten, laesst sich ein Hydrant nicht vernuenftig oeffnen – oder aber auch, sind neue hinzugekommen, die wir nicht in unserem Hydrantenplan haben. In einer idealen Welt gaebe es natuerlich einen gut funktionierenden Austausch zwischen Gemeinde, Wasserversorger und Feuerwehr, so dass alle immer denselben Zustand dokumentiert haben. Aber ich muss ja niemandem erzaehlen, dass wir nicht in einer perfekten Welt leben.

Wo sind Hydranten – von analog zu digital?

Als ich 1999 zur Feuerwehr kam, bestand der Hydrantenplan aus einer fotokopierten Ortskarte, in die mit roter und blauer Farbe die Ueber- und Unterflurhydranten haendisch hineingemalt worden waren. Kurz darauf erstellten zwei Kollegen quasi ein „Lookbook“, in dem jeder der Hydranten mit einem Foto des Umfelds und einer kurzen Beschreibung je eine Karteikarte in einem Ordner bekam, die dann alle alphabetisch nach Strassennamen sortiert waren.

Beide Ansaetze haben Vor- und Nachteile: Bei der Uebersichtskarte sieht man stets den geographischen Kontext – gerade Unterflurhydranten tarnen sich aber gelegentlich recht gut in ihrer Umgebung, so dass man sie nicht immer leicht findet. Das Umfeldfoto hilft beim Auffinden, dafuer kann man ohne eine Kontext-Karte umliegende andere Hydranten uebersehen, die in einer anderen, aber nahen Strasse liegen.

Wegen eines anderen Urlaubs-Rabbitholes kam ich daher recht schnell auf die Idee, Umfeldfotos und Karte mit Koordinaten zu verbinden – und was laege da naeher, als eine gute Vermessung mit Hilfe von OpenStreetMap und Wikimedia Commons!

Die ersten Hydranten habe ich ganz klassisch nur per Smartphone positioniert. Da wir im temporaerhaus aber seit diesem Jahr einen echtzeitkinematikfaehigen simpleRTK2B-GNSS-Empfaenger samt passender Antenne haben, wollte ich das natuerlich etwas genauer haben 😉 Und so kam es zu einem unvorhergesehenen Projekt zwischen temporaerhaus und Feuerwehr Altenstadt.

Und was mappt man da?

RTK-Mapping: Positioniere Antenne ueber Hydranten, warte auf RTK-Fix, trage Position und Tags in OSM ein. Links ein alter Erhard-Ueberflurhydrant, rechts ein Unterflurhydrant.

Eigentlich alles, was in emergency=fire_hydrant auf OSM beschrieben ist. Um moeglichst alles abzudecken, kann man recht einfach zwischen Tags fuer alle Hydranten und Erweiterungen jeweils fuer Ueber- und Unterflurhydranten unterscheiden:

Fuer alle Hydranten

refDie Hydrantennummer auf dem Hinweisschild oder dem Hydranten selbst – sofern vorhanden
fire_hydrant:pressureDas laesst sich quasi nie ermitteln, d.h. hier einfach yes
fire_hydrant:positiongreen fuer Gruenflaeche, lane fuer die Fahrbahn, sidewalk fuer den Gehweg und parking_lot fuer Parkplaetze. Insbesondere bei Unterflurhydranten ist es super gut zu wissen, ob er auf einer Parkflaeche liegt!
water_sourcein der Regel main, also die abhaengige Loeschwasserversorgung
survey:dateDas Datum, an dem du diesen Hydranten eingetragen hast, YYYY-MM-DD
Auf solch einem Hinweisschild ist normalerweise haeufig eine Identfikationsnummer zu sehen. Hier aber leider nicht. Immerhin laesst sich der Leitungsdurchmesser 80 mm durch das „80“ rechts vom „H“ ablesen.

Speziell fuer Unterflurhydranten

fire_hydrant:typeunderground
fire_hydrant:diameterDas ist der Wert auf dem zugehoerigen Hydrantenschild – sofern das vorhanden ist! Falls keines vorhanden ist, siehe…
fire_hydrant:diameter:signed=noWenn kein Hinweisschild vorhanden ist. Dadurch lassen sich auch leicht die Hydranten ohne Schilder spaeter ermitteln

Speziell fuer Ueberflurhydranten:

fire_hydrant:typepillar
couplingsDie Anzahl der Festkupplungen, z.B. 2 oder 3
couplings:typeHier in der Regel storz
couplings:diametersNach den deutschen Kupplungsbezeichnungen, z.B. B;B oder B;B;A oder gar C;C;B (ja, das gibt es, und das festzustellen, ist spannend!)
manufacturer…irgendwann lernt man dann auch die Hersteller anhand der Logos oder Aufschriften zu unterscheiden und kann entweder den Hersteller oder die Wikidata-ID des Herstellers eintragen…
Links ein alter VAG-Hydrant mit „DN 80“ im Guss, rechts ein Erhard-nach-1996-Hydrant mit „DN 80“ auf dem Typenschild – das sagt aber nichts ueber die Versorgungsleitung aus.

Zu beachten bei Ueberflurhydranten: Die haben zwar bisweilen auch einen Rohrdurchmesser angegeben – bei den alten Hydranten im Guss im Hydrantenkoerper, bei den neueren auf den Typenschildern ausgewiesen. Dieser Durchmesser gilt aber nur fuer das Steigrohr, nicht fuer die Wasserversorgung selbst. Im OSM-Wiki wird daher davon abgeraten, diesen Durchmesser als Leitungsdurchmesser zu taggen!

Auch nur eine Karte – aber auswertbar

Darstellung in der OpenFireMap

Zunaechst hat man damit auf den ersten Blick nicht viel gegenueber der alten handgemalten Karte gewonnen: Die Hydranten sind in OpenStreetMap eingetragen, und in Ansichten wie z.B. dem „Humanitaer“-Layer kann man sie in der gerenderten Karte auf openstreetmap.org auch anzeigen – wobei die nicht einmal zwischen Ueber- und Unterflurhydranten in der Darstellung unterscheidet.

Auf OSMHydrant oder der OpenFireMap bekommt man jedoch schon jetzt eine genauere Darstellung und bei OSMHydrant per Klick auf den Hydranten auch weitere Informationen. Damit alleine liesse sich schon auf einem Alarmmonitor im Feuerwehrhaus anzeigen, welche Wasserentnahmestellen es im Umfeld eines Einsatzorts bei einem Brandalarm gibt!

Zu beachten: Die OpenFireMap wird nur woechentlich am Dienstag aktualisiert. Von der Eintragung bis zur Anzeige im Kartenlayer kann also bis zu einer Woche vergehen.

Links ein alter VAG-Hydrant mit nur zwei C-Abgaengen und einem B-Abgang – ungewoehnliche Konstellation, die wir bei der Erhebung „Hutzelmaennchen“ genannt haben. Man beachte die Oeffnungsvorrichtung oben, die nicht einmal einen Sechskant fuer den Hydrantenschluessel Typ B hat. Rechts ein moderner VAG Nova Niro 365 mit zwei B-Abgaengen.

Die eigentliche Magie beginnt aber, wenn man die so hinterlegten Daten weiter direkt aus der Overpass-API auswertet, beispielsweise mit OverpassTurbo. Beispielsweise koennen wir uns alle Unterflurhydranten ausgeben lassen, fuer die wir angegeben haben, dass sie keinen angegebenen Leitungsdurchmesser haben – also das zugehoerige Hinweisschild fehlt:

node["emergency"="fire_hydrant"]["fire_hydrant:type"="underground"]["fire_hydrant:diameter:signed"="no"]({{bbox}});

Genauso koennen wir spaeter so alle Hydranten abfragen, als JSON exportieren und weiterverarbeiten – beispielsweise, um eine Kartei mit einer Karte pro Hydrant daraus zu erstellen. Oder aber auch, um die „besonderen“ Hydranten zu identifizieren, die beispielsweise nur zwei C-Abgaenge haben.

Und auch die Versorgung von Gebaeuden laesst sich dadurch auswerten. OSMHydrant bietet einen ersten Eindruck, indem man dort Umkreise um Hydranten zeichnen kann – das hilft schon fuer einen groben Ueberblick. In der Realitaet lassen sich Schlauchleitungen aber nicht in Luftlinie von einem Hydranten verlegen, sondern muessen Strassen folgen – und koennen z.B. auch nicht einfach eine Bahnlinie queren.

Wunderbar passend bloggte Supaplex030 genau zum Zeitpunkt der Erhebung, wie man solch eine Analyse auch mit dem freien GIS QGIS erstellen und dabei entlang von Strassenzuegen arbeiten kann. So laesst sich beispielsweise pruefen, welche Strecken beispielsweise mit einer oder zwei Einpersonenhaspeln oder dem Rollschlauchmaterial auf einem Loeschfahrzeug entlang kartierter Wege erschliessen lassen – und wo die Strecken zu weit dafuer sind. Ein Bonuslevel waere natuerlich die Verbindung mit einem Digitalen Hoehenmodell, wo eine Haspel nicht mehr so einfach bergauf gefahren werden kann – aber prinzipiell geht auch das 😉

Bonuslevel: Fotos machen!

Ein modernerer Erhard-Hydrant mit zwei B-Abgaengen, Modellserie nach 1996

Was in so einer Karte dann aber noch fehlen wuerde, ist das Umfeldfoto, wie es in der frueheren, mit Word erstellten Kartei zu finden waere. Das koennen wir aber beheben!

Wir haben beim Einmessen auch Fotos eines jeden Hydranten mit der Hauskamera aus dem Technikpool des temporaerhaus gemacht und auf Wikimedia Commons in die Kategorie Fire hydrants in Altenstadt (Iller) geladen, die ich dafuer angelegt hatte. In der OpenStreetMap lassen sich solche Fotos ueber Photo Linking mit Objekten verknuepfen. Hier habe ich jedem Hydranten ueber den Tag wikimedia_commons die jeweilige Datei zugeordnet, z.B. File:2025 Altenstadt (Iller) Hydrant Memminger Straße 54.jpg

Hydranten, die zwar schon vermessen, aber noch nicht mit einem Foto versehen sind, lassen sich natuerlich auch einfach mit Overpass Turbo abfragen – man muss die Suche lediglich erweitern, dass kein wikimedia_commons-Tag vorhanden ist:

node["emergency"="fire_hydrant"][!"wikimedia_commons"]({{bbox}});

Spaeter lassen sich diese Fotos so extrahieren und weiterverwenden. Sowohl Hydranten als auch Gebaeuden liesse sich auch ein URL zu Panoramax zuordnen, einer Freien Alternative zu Google StreetView – damit liesse sich noch mehr Kontext herstellen, aber auch die direkte Ansicht einer Adresse vom Strassenniveau aus waere auf dem Einsatzmonitor moeglich, wenn ein Alarm eingeht!

Und jetzt… verlinkt?

Schon mit diesem Informationsbestand ist deutlich mehr moeglich, als das in den bisherigen Hydrantenkartierungen meiner Feuerwehr der Fall war:

  1. Die Koordinaten sind – vor allem durch die RTK-Vermessung – viel praeziser
  2. Wir haben Metadaten zu den Schildern (oder ihrer Abwesenheit), dem Nenndurchmesser der Zuleitung (sofern erfassbar), den Abgangsgroessen und vielem mehr
  3. Wir koennen diese Informationen automatisiert weiterverarbeiten
  4. Auswaertige Kraefte koennen ohne weiteres auf diesen Bestand in OSM zugreifen
  5. und auch andere MapperInnen koennen dazu beitragen, den Bestand zu verbessern, falls z.B. irgendwo ein Hydrant errichtet wurde, den wir gar nicht auf dem Schirm hatten!

Ein typischer Einwand koennte hier sein, dass ja der Datenbestand in der OSM jederzeit boeswillig veraendert werden koennte. Das ist prinzipiell richtig. In der Realitaet kommt das aber beruhigend selten vor. Dennoch koennte es sinnvoll sein, einen eigenen, geprueften Informationsbestand vorzuhalten – der auch Annotationen haben koennte, die in OSM nicht so gedacht sind.

Ein „Tele-Hydrant“ von Hawle. Der telefoniert nicht etwa, sondern er kommt ohne Standrohr aus: Ein Rohr mit zwei B-Abgängen lässt sich einfach herausziehen.

Man koennte beispielsweise all die eingetragenen und geprueften Koordinaten fuer sich vorhalten und periodisch mit OSM vergleichen: Kam etwas hinzu, wurde etwas veraendert, muss ich das pruefen, um meinen Informationsbestand valide zu halten? Was hierfuer in meiner Gemeinde fehlt, ist eben der ref-Identifier, den OSM hier eigentlich vorsieht. Weder die Hydrantenschilder noch die Hydranten selbst haben irgendwo eine ID angegeben, mit der man den Hydranten identifizieren koennte. Zu pruefen waere hier, ob es irgendwo tatsaechlich eine offizielle Nummer gibt, die man „nur“ anbringen und dann einpflegen muesste.

Man koennte hier natuerlich Wikidata missbrauchen, alle Hydranten dort als Datenobjekte anlegen und das als Identifier nutzen – das hielte ich aber schon fast fuer eine Zweckentfremdung des Projekts. Eine eigene Wikibase-Instanz fuer die Feuerwehr, um den bestaetigten Stand festzuhalten, faende ich… lustig! Das ordne ich mal unter „Seitenprojekt des Seitenprojekts“ ein, wenn mir mal langweilig sein sollte 😀

Spannend finde ich zuletzt aber, dass die gewachsene Cottage Industry rund um „Datenverwaltung in Feuerwehren“ eine sehr unterschiedliche Haltung zu so einer Verlinkung faehrt. Einzelne Softwaresysteme erlauben wohl eine Verbindung zu OSM, andere scheinen darauf zu setzen, dass man z.B. Hydranten rein in ihrem Oekosystem pflegt, auf dass man z.B. eine Tablet-Version ihrer Software kauft, die die Anzeige dieser Daten ermoeglicht. Das Charmante am OSM-Mapping finde ich, dass man damit zumindest nach aussen jegliche dieser Lock-Ins aufbricht: Egal woher eine ueberoertliche Unterstuetzung kommt und welche Systeme sie verwendet: Wenn sie OSM auswerten kann, bekommt sie zumindest die grundlegenden, wichtigen Informationen.

Und das zeigt fuer mich wieder einmal: Die ganzen Loesungen, die auf Vermarktung und Verwirtschaftlichung ausgerichtet sind, machen das Ergebnis meist eher nur shitty. Die Erfassung aller Hydranten in einer – zugegeben, im Kernort nur um die 4000 BewohnerInnen starken – Kommune hat mich einen Mittwochabend und einen Sonntagnachmittag gekostet. Eine Befahrung fuer Panoramax waere an einem weiteren entspannten Nachmittag moeglich und haengt gerade nur daran, dass die 360°-Kamera des temporaerhaus wegen eines Defekts die letzten Wochen ausgefallen war. Wenn wir nur allen Menschen mehr Freizeit ermoeglichen wuerden, waere so viel Cooleres, Besseres moeglich. Und ganz nebenher kann man dabei lernen, verschiedene Hydrantenhersteller auf einen Blick zu erkennen und etwas ueber das Hydrantenkartell zu lernen 😀

What is in a street name – Schoener leben mit Linked Data

Eines meiner Lieblingsbeispiele, wenn ich ueber Linked Open Data spreche, sind Strassennamen. Das klingt auf den ersten Blick weit hergeholt, aber wer jemals groessere Mengen an Adressen mit einem Computer verarbeiten wollte, ist vermutlich irgendwann ueber die Liste der Falsehoods programmers believe about addresses gestolpert.

Die Quadrate in Mannheim (anstatt Strassennamen) sind dabei eher die Ausnahme. Dass in einer Gemeinde – in der Regel nach Eingemeindungen – mehrere Straßen mit demselben Namen existieren, oder dass in einer Ortschaft gar keine Strassennamen vergeben wurden, kommt dagegen relativ haeufig vor. Hilgermissen als Gemeinde mit 2200 BewohnerInnen, aber keinem einzigen Strassennamen, ist angesichts seiner Groesse so besonders, dass das DLF Nova einen Rundfunkbeitrag wert war. Neben Hilgermissen gibt es aber viele weitere kleine Oertchen, in denen die Haeuser einfach nur eine Hausnummer haben. Und egal, ob es einen Strassennamen gibt oder nicht: Sobald Menschen eine Adresse in irgendein Computersystem eingeben, wird es schnell haarig und fehlerhaft.

Adlitz: Schilder in die naechsten Staedte, aber keine Strassenschilder. Roehrensee, CC BY-SA 4.0, via Wikimedia Commons

Bei den Ortschaften ohne Strassennamen liegt das meist am Verwirrungsfaktor. Wir haben uns so sehr daran gewoehnt, dass eine Adresse aus Strasse, Hausnummer, Postleitzahl und Ortschaft liegt, dass es sich falsch anfuehlen wuerde, einfach nur „5, 95491 Adlitz“ zu schreiben – obwohl das eigentlich richtig waere.
Vermutlich alle diese Doerfer ohne Strassennamen wurden spaetestens durch die Gebietsreformen in den 1960er- und 70er-Jahren der naechstgroesseren Gemeinde zugeschlagen und verwenden auch die Postleitzahl dieser (oder einer anderen) groesseren Gemeinde. Daher liegt es nahe, diese Adresse stattdessen „Adlitz 5, 95491 Ahorntal“ zu schreiben.

Auch wenn das fuer die Postzustellung oder fuer die eigene Orientierung keinen praktischen Unterschied macht – richtig ist das nicht, und bei der maschinellen Auswertung kann so etwas zu Problemen fuehren. (Dass es zwar eine Gemeinde Ahorntal gibt, aber gar keinen Ort, der so heisst, ist noch einmal eine ganz andere Geschichte, die hier aber keine grosse Rolle spielt).

Denn, wie auch bei gesprochener Sprache sind wir als Menschen ganz gut darin, Mehrdeutigkeiten oder unpraezise Ausdruecke einfach passend zum Kontext einzuordnen. Wir lesen nicht einfach nur, was irgendwo steht und interpretieren das nur buchstaeblich, sondern wir interpretieren ohne gross darueber nachdenken zu muessen, was gemeint gewesen sein koennte. Aber bloederweise gehen wir andersherum auch beim Schreiben davon aus, dass ein Gegenueber schon wissen wird, was eigentlich gemeint ist. Und dass dieses Gegenueber nicht etwa ein Computer ist, der das Geschriebene vergleichsweise woertlich auslegt. Und dann wird’s wild.

Ganz offizielles Strassenschild – der Platz heisst aber offiziell „Augsburger-Tor-Platz“! Foto: -stkCC BY-SA 4.0, via Wikimedia Commons

Zuletzt bin ich darueber gestolpert, als WikipedianerInnen aus dem WikiMUC und dem temporaerhaus gemeinsam bei einem Editathon die tausenden Feuerwehren in Bayern in Wikidata einpflegen wollten. Der Landesfeuerwehrverband hat eine Liste aller bayerischen Feuerwehren auf seiner Website, und die wird ganz offensichtlich von Menschen gepflegt, mit der Schreibweise der Adressen, die sie gewohnt sind. Mal wird im Strassen-Feld der Name des Ortsteils dem Strassennamen vorangestellt („Schwaighausen, Unterharter Straße 3“), mal steht im Gemeinde-Feld eine Kombi aus Ortsteil und Gemeinde („Triefenstein OT Homburg“) oder aber irgendwann ist womoeglich beim Feuerwehrhaus das Hausnummernschild abgefallen und alle sind sich einig, dass die Hausnummer „neben HsNr. 7“ scho so basst. Das ist schliesslich eine Feuerwehr, die kann man selbst in einem kleinen Dorf mit nur einer Garage fuer den Tragkraftspritzenanhaenger nicht so einfach uebersehen. Meist ist da ja irgendwas an die Wand gemalt oder es ist eine E57 auf dem Dach, also bittschoen, das wird man ja wohl finden, und die Feuerwehrdienstleistenden brauchen eh keine Hausnummer, wenn die Sirene mal geht, damit sie zu ihrem Feuerwehrhaus kommen.

Wenn dazu noch inoffizielle Abkuerzungen und vielfaeltige Interpretationen von Getrennt- oder Zusammenschreibung kommen, wird es endgueltig wild. Das temporaerhaus hat eine Adresse in der „Augsburger Straße“ – allein in unserer Community wurden sehr lange verschiedenste Varianten von „Augsburger-Str.“ ueber „Augsburgerstr.“, jeweils dann mit Varianten mit scharfem s oder Doppel-S verwendet (bis ich das nicht mehr ausgehalten und darum gebeten habe, dass wir das alle so schreiben, wie es richtig™ ist, damit ich besser schlafen kann).

Offizieller NameWas man so findet
Maximilian-Straßer-StraßeMaximilian-Strasse-Straße
Bürgermeister-Wolfgang-Brügel-StraßeBgm.W.-Brügel-Str.
St.-Ulrich-StraßeSt. Ulrich Str.
Dr.-Appelhans-WegDr.-Appelhansweg
Sankt-Johannes-Baptist-StraßeSt.- Joh.- Bapt.- Str.

Meine These ist, dass selbst bei den Datenbestaenden innerhalb einer Stadtverwaltung je Strasse im Schnitt deutlich mehr als zwei Schreibweisen ueber alle Systeme hinweg existieren, und bislang konnte das noch niemand widerlegen. Oft ist nicht einmal auf allen Strassenschildern der richtige Name der Strasse angebracht. Die „falschen“ Schilder sind bisweilen erkennbar alte Exemplare, die moeglicherweise vor einer Vereinheitlichung der Schreibweise aufgehaengt wurden. Aber nicht nur „neue“ Strassenschilder stimmen nicht immer mit dem amtlichen Namen ueberein, auch in Liegenschaftsverzeichnissen, Excel-Listen und moeglicherweise auch Fachverfahren tummeln sich mit grosser Sicherheit verschiedene Schreibweisen derselben Strasse.

Das kann automatisierte Auswertungen… schwierig machen. Der Versuch, aus den Adressen der Feuerwehren ueber Nominatim Geokoordinaten zu ermitteln, lief bei beeindruckend vielen der Eintraege gegen die Wand. Und selbst wenn man in einer Kommunalverwaltung ueberhaupt gleichzeitigen Zugriff auf alle Speicherorte haette, wo Strassennamen vorkommen: Eine Suche „gib mir alle Informationen, die irgendwie mit der Sankt-Johannes-Baptist-Straße zusammenhaengen“ wird spaetestens mit einer so kreativen Abkuerzung wie „St.- Joh- Bapt.- Str.“ (man beachte die Leerzeichen!) herausfordernd.

Nicht nur bei alten Strassenschildern schleichen sich Falschschreibungen ein. Diese Strasse heisst korrekt „Warmwässerle“. Foto: LooniverseCC BY-SA 4.0, via Wikimedia Commons

Mit dem Konzept von Linked Data koennte man das ganz anders umsetzen. Die Sankt-Johannes-Baptist-Straße koennte ein Datenobjekt mit dem URI ld.bayern.de/location/street/081513121337 haben. Die 081513121337 koennte dabei eine hierarchische Bedeutung haben und dadurch Rueckschluesse auf Regierungsbezirk, Landkreis und Gemeinde geben – es koennte aber auch eine ganz beliebige, fortlaufende Nummer sein, so wie bei Wikidata. Und dieses Datenobjekt hat dann passende Eigenschaften – beispielsweise:

  • Ein Label mit dem Namen der Strasse. In mehrsprachigen Gebieten koennen das auch mehrere Label sein, mit maschinenlesbarer Bezeichnung, welche Sprache das jeweils ist
  • in welcher Verwaltungsgliederung es liegt – also z.B. die zugehoerige Gemeinde, mit einem Link zum Datenobjekt dieser Gemeinde. Moeglicherweise auch feiner granular mit Bezeichnung des genauen Ortsteils
  • weitere Identifier, z.B. die Nummer im Strassenverzeichnis der Gemeinde
  • moeglicherweise eine Auszeichnung, ob es sich um eine amtliche (gewidmete) Strasse mit offiziellem Strassennamen handelt, oder sowas wie den „Resis-Traktor-Weg“, den zwar alle so kennen und benutzen, den es aber „offiziell“ nicht gibt
  • Geoinformationen wie einen Linienzug, der die Strasse auf einer Karte definiert, oder einen Link auf ein solches Geofeature-Datenobjekt
  • die Information, nach wem oder was die Strasse benannt ist – zum Beispiel mit einem Link auf das Wikidata-Objekt

Oder ganz praktisch:

schema.org/nameSankt-Johannes-Baptist-Straße
schema.org/identifier081513121337
schema.org/containedInPlaceld.bayern.de/municipality/09775164
geosparql#hasGeometrygeo.ld.bayern.de/location/street/geometry/081513121337
schema.org/postalCode89264
P138Q40662 (Johannes der Täufer)

Solch eine Datenhaltung hat gleich in mehreren Aspekten grossen Charme. Die Idee ist, dass – egal wo in der Kommunalverwaltung ein Strassenname eingegeben werden soll – per Autovervollstaendigung anhand des Namens das passende Datenobjekt aus diesem Linked-Data-Strassenregister gesucht wird. Auf der „Bildschirmvorderseite“ und ueberall, wo es in Texten und Adressen in der Folge um diese Strasse geht, wird stets das Label, also der Strassenname angezeigt. Der ist dadurch immer auch der „richtige“, aber sonst aendert sich weiter nichts.

Bei der Speicherung wird aber immer der URI auf diese Strasse abgelegt. Und das heisst, dass viel verlaesslichere Datenabfragen moeglich sind: Ueber alle Dinge – Firmen, Gebaeude, Einrichtungen – in genau dieser Strasse. Ueber alle Strassen in einer Gemeinde. Oder auch – falls auch das passend codiert ist – ueber alle Strassen in einem bestimmten Ortsteil, ganz ohne Namenskonventionen, wie der Ortsteil anzugeben ist. Und wird einmal eine Strasse umbenannt, zum Beispiel, weil ein Namensgeber spaeter als unwuerdig befunden wird, muss nur im Linked-Data-Strassenverzeichnis das Label geaendert werden, und in kuerzester Zeit ist diese Aenderung einheitlich an allen Stellen vollzogen.

Hildegards gibt es viele – gemeint ist hier Q234410 (Wikipedia). Foto: LooniverseCC BY-SA 4.0, via Wikimedia Commons

Wenn ueber Linked Data eindeutig bezeichnet wird, nach wem oder was eine Strasse benannt ist, ist auch viel leichter nachvollziehbar, nach welchem Frieden die Friedenstrasse in Neu-Ulm benannt ist, ohne dafuer zum Strassenschild gehen und die Legendentafel darunter lesen zu muessen. Auch die OpenStreetMap hat eine passende Eigenschaft NamedAfter, in die man die passende Wikidata-ID eintragen kann. Mit MapComplete kann man das relativ komfortabel fuer die Strassen in der eigenen Stadt eintragen.

Hier sieht man dann auch die Magie verlinkter Datenbestaende in der Praxis. Denn weil die Datenobjekte der Personen, nach denen eine Strasse benannt wurde, meist auch weitere Informationen wie z.B. das Geschlecht angeben, laesst sich mit Linked Open Data auch ganz durchautomatisiert und ohne weiteres Zutun darstellen, wie eigentlich das Geschlechterverhaeltnis bei der Strassenbenennung ist – so wie auf dieser interaktiven Karte von Frankfurt. Vor beinahe 11 Jahren hatte unsere Open-Data-Ehrenamtsgruppe das noch mit viel Handarbeit machen muessen und die Karte war auch irgendwann tot und die Daten versauerten – der EqualStreetNames-Ansatz laesst sich mit wenig Handarbeit uebertragen, und die Datenpflege in Linked Open Data hilft am Ende allen auf der ganzen Welt, auch wenn das Kartenprojekt einmal untergehen sollte!

Noch nicht ganz fertig: Eine interaktive Karte zur Geschlechterverteilung bei der Strassenbenennung in Neu-Ulm

Letzte Woche war ich beruflich fuer einen Vortrag (Slides) auf der TRANSFORM-Konferenz in Bern, wo ich viele inspirierende Diskussionen ueber Linked Data fuehren konnte. In einem Gespraech mit einem beeindruckend tief in der Materie arbeitenden Menschen von der Schweizerischen Bundeskanzlei liess ich nebenher das Strassenbeispiel als praktische Anwendung von LOD mit Nutzen fuer die Verwaltung fallen. Und mein Gegenueber blickte mich ueberrascht an – ich weiss rueckblickend nicht, ob es verwundert oder gar mitleidig war – und sagte lapidar, dass es das in der Schweiz natuerlich bereits gebe.

Fuer jede einzelne Strasse.

Ich versuchte, nicht sogleich aufzuspringen und mich in den naechstgelegenen Fluss zu stuerzen, sondern liess mir zeigen, dass in der Tat, es fuer jede Strasse in der Schweiz ein Datenobjekt gibt, zum Beispiel fuer den Philosophenweg in Bern, samt der zugehoerigen Geometrie. Und falls das Verlangen fuer die Sache nach dem Fluss nicht nachlasse, faende ich natuerlich auch die Aare als Datenobjekte, wobei es sich hier zu meinem Wohl explizit um Badegewaesser handle.

Die jeweils uebergeordnete Entitaet „Bern“ verlinkt natuerlich auch auf das Wikidata-Item zu Bern. Wie sich das halt gehoert, wenn man Dinge bitte gleich richtig macht.

Es faellt mir schwer, den Zustand meines Emotiotops in diesem Moment zu beschreiben. Aehnlich ging es mir spaeter, als ein Mitarbeiter der Statistik bei der Stadt Zuerich mich neugierig fragte, wie viele kommunale Statistikabteilungen in Deutschland denn in ihren Prozessen mit Linked Data arbeiten wuerden, so wie sie, ganz natuerlich.

Zack. Bumm. Geht einfach. Screenshot von https://geo.ld.admin.ch/sparql/

Ich habe dann versucht, ueber diesen mentalen Zustand hinwegzukommen, indem ich eine SPARQL-Abfrage gebaut habe, um mir die Geometrien aller 822 Strassen in Bern ausgeben zu lassen, was in rund einer Sekunde… einfach so ging. Alle Haltestellen in Bern bekommt man in 0,225 Sekunden. Auch einfach so. Ganz selbstverstaendlich. Und ganz nebenbei, wenn in der Schweiz Linked Open Data veroeffentlicht wird, folgt das – natuerlich – verbindlich dem URI-Schema *.ld.admin.ch/*. Und es sei auch alles dafuer technisch notwendige ausgerollt, damit das funktioniert und dauerhaft stabile URIs sicherstelle, wie sich das ja auch gehoert. Nicht etwa, dass sich irgendwie Namen und damit auch URIs von Ministerien aendern (wie das bis heute selbst in DCAT-AP.de geschieht!) und dann fuehren auf einmal sowohl Website-URLs wie auch URIs ins Nirvana. Also so, wie das heute in Deutschland immer noch gang und gaebe ist und woran auch ueberraschend viele Digital-Lobby-Organisationen ueberhaupt gar keinen Anstoss nehmen.

Waere das bei uns auch so ganz normal, koennte man mal eben im Vorbeigehen ganz viele andere Schmerzen einfach so loesen.

Auszug aus dem Strassenverzeichnis von 1954, das die Open-Data-Community im temporaerhaus freundlicherweise von der Stadt Neu-Ulm bekommen hatte – der Ist-Zustand besteht immer noch aus Texten, manchmal eben auch auf Schreibmaschine geschrieben. Weitergeholfen fuer die Ueberfuehrung in Linked Open Data hat das dennoch immens!

Wer datenjournalistisch Sachverhalte auf Karten darstellen moechte, kennt naemlich dieses Problem auch: Geographische Raumbezuege sind haeufig nur eben als textliche Beschreibungen zugaenglich. Egal ob es darum geht, Unfallschwerpunkte auf einer Karte darzustellen, wie Jan-Georg Plavec berichtet (LinkedIn), oder um regelmaessig wiederkehrende Aufgaben wie die Darstellung von Wahlergebnissen auf einer Karte: Oft gibt es die Voraussetzungen fuer solch eine Kartendarstellung gar nicht maschinenlesbar.

Der Zuschnitt der Wahlkreise bei einer Wahl ist dabei noch vergleichsweise einfach: Das ist eine Liste von Kommunen oder Stadtbezirken, und dafuer gibt es meistens irgendwelche Geoshapes, die sich dafuer halbwegs angenehm verwursten lassen (Beispiel: Die Liste der Stimmkreise in Bayern). Sobald es aber um die Wahl- bzw. Stimmbezirke innerhalb einer Gemeinde geht, kann es anstrenged werden. Die liegen naemlich viel zu oft immer noch nur als Listen der in ihnen befindlichen Strassen vor. Und selbst an diese Listen zu kommen, kann aufwaendig sein, wie diese Dokumentation bei der OpenStreetMap zeigt.

Hat nichts mit Stimmbezirken zu tun, aber erwaehnt nochmal die Hildegardstr.: In dieser Version des Neu-Ulmer Strassenverzeichnis von 1978 sind auch die vorherigen Strassennamen erkennbar. Nochmals vielen Dank an die Stadt Neu-Ulm!

Aus Sicht der Wahlbehoerde ist das auch nachvollziehbar. Denn von einer Kartendarstellung hat sie ja fuer die Aufstellung des Stimmverzeichnis erst einmal gar nichts: Wenn ihr die Liste der jedem Wahllokal zugehoerigen Strassen vorliegt, kann sie aus dem Meldeverzeichnis die jeweiligen Listen der Wahlberechtigten erstellen – fuer ihren Auftrag hat sie damit alle Informationen, die sie braucht. Wenn es eine geographische Darstellung der Wahlbezirke anhand der Strassenlisten gibt, ist das womoeglich nur ein Zusatzaufwand. Manchmal leistet man sich den, manchmal aber auch nicht. Und wenn es eine geographische Darstellung gibt, heisst das immer noch nicht, dass die dafuer notwendigen Daten auch z.B. von Datenjournalist*innen wiederverwendet werden koennen.

Bei der Recherche gefunden: Eine immerhin (geo)graphische Darstgellung der Wahlbezirke in Regensburg, im PDF der Wahlbezirke sortiert nach Strassennamen. Das Dokument ist mit LaTeX generiert und ich bin jetzt total neugierig, wie die das machen!

Waeren die Strassen aber Datenobjekte, mit verknuepfter Geometrie, waere in beide Richtungen vieles so viel einfacher. Fuer den Zuschnitt der Stimmbezirke waeren Neuordnungen quasi live moeglich: Mit Drag und Drop auf der Karte (und der nur verwaltungsintern zugaenglichen Linked-Data-Verknuepfung zu Meldedaten) liessen sich Neuzuschnitte und die Auswirkungen auf die Gesamtzahl der Wahlberechtigten ganz einfach simulieren – oder auch durch mathematische Optimierungsverfahren Vorschlaege machen. Und ist die Ausdehnung einmal festgelegt, waere es ueberhaupt kein Problem mehr, diesen Zuschnitten geographische Umringe zuzuordnen.

Wir muessten dafuer nur die Informationen aus der Textform in das Linked-Data-Prinzip ueberfuehren. Das ist keine Zauberei, sondern einfach nur Infrastrukturarbeit, fuer die es den notwendigen Sachverstand fuer IT-Architektur und Datenstrukturen braucht. Und die bereits auf mittlere Sicht allen Beteiligten beeindruckend viel Handarbeit sparen und Fehlerquellen vermeiden wuerde.

OSM-Routing führt zur Mate

wpid-wp-1438105280442.jpeg

Bislang waren Ausfluege zum Mate-Dealer fuer mich hier immer was, das man mit nem Auto macht. Schliesslich ist der Mate-Dealer im Industriegebiet NU-Offenhausen, was selbst fuer Neu-Ulm am Arsch der Welt ist.

Das hier schon beschriebene OSM-Fahrradrouting hat aber ne Strecke in petto, die auch ganz gut fahrradgeeignet ist. Die angegebene Viertelstunde je Richtung klappt mit vollem Haenger eher nicht, aber trotzdem.

Im Uebrigen soll angemerkt werden, dass die Radverkehrsfuehrung in Neu-Ulm zum Kotzen ist.

Randnotiz: Ja, es gibt „den“ Matedealer. Also den einzigen. Laut Matekarte gibt’s das zwar auch im Marktkauf Soeflingen und dem Oststadt-REWE, zu ersterem isses aber auch ne halbe Weltreise, und in letzterem hab ich die nie gesehen. Goebel in Neu-Ulm fuehrt das Zeug seit @hey_johnnypark die Belegschaft dort 2011 so lange geloechert hat, bis sie’s mal testweise bestellt hatten. Der Erfolg blieb nicht aus.

Mal ne Frage an alle Ulmer gibts jetzt eigentlich Club Mate in Ulm wo zu kaufen?

Neues von der #clubmate-Front: Die Dame von Getränke Göbel (Neu-#Ulm) besorgt 5 Kästen, sagt mir dann Bescheid. Wenns läuft -> Sortiment. 🙂

Replying to @Nitek @Nitek RT @Frankz3000: 2,5 Kisten hat der Göbel nun noch. Kam heute rein, wird aber wegen dem Ansturm ins Sortiment aufgenommen. #clubmate

OSM rendert jetzt auch Fahrradstellplaetze

Letzten Sommer hatten wir auf dem Campus alle Fahrradstellplaetze in OpenStreetMap nacherfasst, nachdem die Vorlage der Verwaltung leider nicht so praxistauglich war. Mit Leaflet und Overpass kamen die dann auch auf eine klickbare Karte – denn in der normalen Einstellung hat die OSM Fahrradabstellanlagen nicht gerendert.

fahrradstellplaetze_osm

Das ist seit dem Rollout von openstreetmap-carto v2.30.0 anders: Ueberall, wo Anlagen gemappt sind, tauchen sie auch im Default-Kartenstil auf. Yay 😉

OSM kann jetzt auch Routing

Der Titel ist ein wenig irrefuehrend, denn mit der OpenStreetMap konnte man schon frueher automatisiert herausfinden, wie man von A nach B kommt – aber nun ist das Feature auch direkt auf der Startseite implementiert.

„Hae, Routing auf ner Onlinekarte, das ist doch ein alter Hut“, moechte man sagen. Die OSM erklaert selbst:

Well, the first thing to note is that the philosophy of OpenStreetMap is not to offer a one-stop-shop on our main website, but to create truly open data to empower others to do great things with it. So there has already been fantastic OSM-based travel routing for many years, on excellent websites such as OSRM, Mapquest, Graphhopper, Cyclestreets, Komoot, cycle.travel… the list goes on and on.

But all of those things are on other websites and apps, so people don’t always realise that OpenStreetMap has this power. What this latest development has done is really neat: the OSM website offers directions which are actually provided by third-party systems, but they are included in the main site via some crafty JavaScript coding. So as well as being really handy in itself to have directions available, it helps “first glancers” to see all the things they can do with OSM.

Ich habe das Feature gleich mal ausprobiert und durfte gleich als erstes feststellen: Wow, das Ding ist schnell! Probiert das mal aus: Gebt eine wie auch immer formatierte Adresse in das Start- oder Zielfeld ein und seht zu, wie diese quasi instantan in das richtige Format aufgeloest und einem OSM-Punkt zugeordnet wird. Im etwas seltsamen Format [Hausnummer], [Strasse], [Viertel], [Ortsname], [Regierungsbezirk] und so weiter, aber trotzdem 😉

Zweite Feststellung: Das Ding ist gut! Ich habe als Test mal die Strecke zwischen meiner WG in Ulm und meinem Elternhaus genommen, die ich immer wieder mal mit dem Fahrrad fahre. Und tatsaechlich, je nachdem, welche der beiden Fahrrad-Routing-Engines ich verwende, bekomme ich entweder den Weg an der Iller entlang, oder die Kette von Fahrradwegen durch die Ortschaften im Illertal vorgeschlagen – bis auf zwei kleine Ausnahmen exakt die Wege, die ich auch sonst genommen habe, weil sie die kuerzesten sind.

OSM-Fahrradrouting an Voehringen vorbei. Karte: © OpenStreetMap-Mitwirkende

OSM-Fahrradrouting an Voehringen vorbei. Karte: © OpenStreetMap-Mitwirkende

Womoeglich hat mich die OSM sogar auf einen besseren Weg gebracht: Ich fuhr immer den ausgewiesenen Fahrradweg oestlich an Voehringen vorbei, waehrend die OSM mich ueber Illerzell leiten wuerde. Vielleicht ist das kuerzer, ziemlich sicher spare ich mir dabei jedenfalls den Anstieg ueber die Bahnueberfuehrung. Muss ich mir mal genauer ansehen.

Seltsames Routing in Illertissen. Karte © OpenStreetMap-Mitwirkende

Seltsames Routing in Illertissen. Karte © OpenStreetMap-Mitwirkende

An anderer Stelle scheint das Routing weniger Sinn zu ergeben. In Illertissen werde ich einen grossen Umweg mit mehreren Zacken ueber den Bahnhof geleitet, weil der getrennte Radweg irgendwann an der Ulmer Strasse aufhoert, und die Ortsdurchfahrt der S2031 vom Fahrradrouter wohl als zu „gefaehrlich“ eingeordnet wird – womoeglich fehlt in der OSM einfach die Information, dass die Ulmer/Memminger Str. in Illertissen mittlerweile sogar mit Fahrrad-Schutzstreifen ausgestattet ist. Ich konnt’s leider nicht auf die Schnelle nachvollziehen, weil mich der Flash-Editor an der Stelle ueberfordert 😀

Solche Fehler zu finden und dadurch zur Korrektur der Kartendaten aufzurufen ist naemlich noch ein weiteres Ziel der Routing-Implementierung auf der OSM-Hauptseite:

ften you don’t notice a bit of data that needs tweaking unless it actually shows up on the map image. Lots of things aren’t shown on our default rendering, so the feedback loop offers less incentive for people to get them correct. And that goes doubly for things that you never “see” on the map – subtle things like “no left turn” at a particular junction, or “busses only” access on a tiny bit of road, or tricky data issues like when a footpath doesn’t quite join a road that it should join on to. Now that people can see a recommended route directly on the OSM homepage, they have an incentive to quickly pop in and fix little issues like that. The end effect will be OSM’s data going up one more level in terms of its quality for routing. This will empower everyone to do great things with geographic data and getting from A to B.

Also: Probiert mal rum – und wenn z.B. Routen nur strassengenau funktionieren, nehmt’s als Anlass, Hausnummern nachzutragen, wo ihr koennt 😀

Immer aktuelle POI-Karten mit Leaflet und Overpass

uulm-map

Wir hatten neulich das Gebaeudemanagement der Uni um eine Uebersicht der von ihr aufgestellten Radparkanlagen gebeten – mit dem Hintergedanken, das schoen aufbereitet zu veroeffentlichen, um moegliche Bedarfe zu erkennen und potenziellen Radler*innen eine schoene Uebersicht an die Hand zu geben.

Die Uebersicht kam dann in Form eines PDF-Plans mit blauen Bobbeln je Abstellanlage – und der PDF-Plan war nicht etwa irgendein Geospatial PDF, nein, das war einfach „nur“ ein Umgebungsplan ohne auch nur den Ansatz eines Koordinatensystems oder sonstiger Hinweise, wo man sich denn befaende. Leider benutzt man in der Univerwaltung kein GIS, so dass es kein Repository fuer relevante Geodaten (z.B. auch Hoersaele, Eisautomaten,…) an der uulm gibt.

Passt genau!

Passt genau!

Als Fingeruebung habe ich deswegen erst einmal die Karte (bzw. einen Export davon) in QGIS georeferenziert. Anstatt (wie geplant) daraus eine Onlinekarte mit qgis2leaf zu exportieren, habe ich dabei erst einmal Dinge gelernt, von denen ich nicht dachte, dass ich sie einmal lernen wuerde. Zum Beispiel, dass WGS84 nicht gleich WGS84 ist, sondern einmal WGS84 als Koordinatensystem auf dem Referenzellipsoiden (EPSG:4326) und einmal als sphaerische Merkatorprojektion (EPSG:3857). Waehrend die OSM-Ursprungsdaten in EPSG:4326 sind, werden die Kacheln (wie auch bei Google Maps) als Projektion in EPSG:3857 referenziert; Koordinateneingaben werden aber als EPSG:4326 angenommen und dann in EPSG:3857 umprojiziert…

Das interessiert natuerlich keine Sau, die ihr Fahrrad abstellen will.

Nach einigem Ueberlegen kam ich daher zum Schluss, die Punkte auf der Karte mit der OpenStreetMap abzugleichen. Dort wird naemlich nicht nur der Ort abgelegt, sondern auch Metainformation wie die Zahl der Abstellplaetze, ob eine Ueberdachung besteht, etc. Die habe ich also bei den fehlenden Anlagen noch nachgetragen, und so ist seit dem Wochenende die OSM an der Uni Ulm mit der Realitaet der Abstellplaetze wieder weitgehend in Einklang 😉

Blieb die Frage, wie diese Daten dann den Weg in eine interaktive Karte finden, die ein wenig moderner ist als ein 2,5 MB grosses PDF.

Ich hatte mich neulich schon einmal mit der Overpass API fuer die Openstreetmap beschaeftigt, um komplette OSM-Dumps fuer Ulm zu ziehen. Eher wenig Beachtung hatte ich dabei dem Detail geschenkt, dass das ja 1.) eine API ist und 2.) damit auch Selektionen auf bestimmte Tags moeglich sind.

Mit Overpass Turbo ist das leicht auszuprobieren: Einfach mal im Wizard oben links eine beliebige Abfrage eingeben (Beispiele stehen schon darunter) und Ausfuehren – voila, da kommen die Daten als GeoJSON und werden auch auf der Karte angezeigt. Und von einer Aenderung eines solchen Punkts im OSM-Originaldatensatz dauert es nur wenige Sekunden, bis eine neuerliche Overpass-Abfrage die aktualisierten Daten anzeigt. Wohoo!

Mit leaflet-layer-overpass existiert derweil eine JS-Bibliothek, die Overpass mit Leaflet verknuepft, und so dauerte es nicht lange, bis die erste fertige Fahrradabstellanlagenkarte fertig war. Das einzige, was noch verbleibt, sind kleine Tweaks wie bessere Infopopups und eine Unterscheidung zwischen offenen und ueberdachten Abstellmoeglichkeiten.


Größere Karte anzeigen

Ich faende es cool, wenn moeglichst viele Geodaten der uulm nach und nach den Weg in die OSM finden wuerden. So blieben die Daten zentral in der Karte schlechthin, anstelle in verschiedenen dezentralen Repositories zu versauern – und nach und nach koennten Dinge wie Hoersaalfinder oder Uebersichtskarten von Eisautomaten allesamt mit Leaflet und Overpass realisiert werden 😉

Civic Issue Tracking mit Mark-A-Spot

@ManuelBogner von der SWP machte die datalove-Gruppe vor gut zwei Wochen auf eine Anwendung der SZ aufmerksam, in der Unfallschwerpunkte markiert werden koennen – und die dafuer verwendete Drupal-Distribution Mark-A-Spot. Die kann beliebige Eingaben verwalten (z.B. uebervolle Muelleimer, kaputte Strassenlaternen oder aehnliches), die entgegennehmende Stelle kann den Status der Eingabe aktualisieren (von „in Bearbeitung“ bis „wurde abgearbeitet“), und das Ganze ist dann auch noch mit dem Open311-Standard kompatibel.

markaspot

Weil ich mir das mal ansehen wollte, habe ich mir das mal testweise auf meinem Raspberry Pi installiert – und weil es dabei einige Fallstricke gab, ist das hier kurz dokumentiert.

Exkurs: Ich habe fuer solche RasPi-Spielereien ein Minimal-Image auf einer 1-GB-SD-Karte (bitte dortige Installations- und Konfigurationsanleitung beachten). Das reicht locker aus; gegebenenfalls muss zwischendurch der apt-Cache mit apt-get clean geleert werden. Fuer die hier gezeigte Installation sind folgende zusaetzlichen Pakete noetig: apache2 apache2-utils libapache2-mod-php5 php5 php5-sqlite php5-common php5-cgi php5-gd unzip

Mark-A-Spot wird als komplette Distribution ausgeliefert, d.h. im aktuellen Master-Branch von Github liegt ein komplettes Drupal samt aller Erweiterungen, um eine lauffaehige Mark-A-Spot-Instanz zu bauen. Analog zum Installationsvideo laeuft die Installation folgendermassen:

Mark-a-Spot Open311 Server from Holger Kreis on Vimeo.

cd /var/www
wget https://github.com/markaspot/mark-a-spot/archive/master.zip
unzip master.zip
mv mark-a-spot-master/* .
rm master.zip

Wie in der Drupal-Anleitung angegeben muessen fuer die Installation noch einige Rechte gesetzt werden:

chmod a+w sites/default
cp sites/default/default.settings.php sites/default/settings.php
chmod a+w sites/default/settings.php

Da der RasPi fuer so eine Installation eine verdammt untermotorisierte Maschine ist, muss noch der Speicher fuer PHP und die maximale Scriptausfuehrungszeit hochgesetzt werden, sonst wird der Installer mit einem AJAX-Fehler 400 abbrechen:

nano /etc/php5/apache2/php.ini

service apache2 restart

Danach wird einfach der RasPi im Browser aufgerufen und der Installationsprozess so wie im Video vervollstaendigt. Dauert etwa eine halbe Stunde (ja, das Ding ist zu langsam dafuer…)

Danach sollte die Seite an sich laufen – bis auf vielleicht den Seiteneffekt, dass keine der Unterseiten laedt, sondern einen 404 liefert. Das liegt in der Regel an den Clean URLs; in der Installationsbeschreibung wird das en passant erwaehnt:

Make sure that clean urls are supported and active: http://yourserver/?q=admin/config/search/clean-urls

Falls Clean URLs nicht funktionieren, kann man die also dort abstellen (einfach den Haken wegmachen) – oder aber analog zu dieser Anleitung den Apache konfigurieren:

a2enmod rewrite
service apache2 restart
nano /etc/apache2/sites-enabled/000-default

Bleibt zuletzt nur noch, wie im Initial Configuration-Abschnitt angegeben, die Startpositionen und Karteneinstellungen anzupassen.

Hope this helps 😉

Selbstgemachte Haltestellen-Umgebungsplaene

Es gibt ja so Momente, in denen moechte man ein Problem loesen, und dann schliesst man sich so lange ein, bis man hinreichend nahe an eine Loesung gekommen ist. So in der Art erging es mir am Schwoerwochenende, eigentlich wegen einer ganz trivialen Sache: Ich haette gerne Umgebungsplaene fuer die Bushaltestellen rund um die Uni.

Ein Grund, warum ich hier im Blog nicht mehr so viel schreibe ist naemlich, dass ich seit gut einem Jahr der Mobilitaetsreferent der Uni-Studierendenvertretung bin und in dieser Eigenschaft umso mehr anderswo schreibe. Und ein Problem, auf das ich in diesem Rahmen stiess, war der Umstand, dass es an vielen Haltestellen in der Stadt mittlerweile Orientierungsplaene fuer die naehere Umgebung gibt – es so etwas aber ausgerechnet an der Uni, an die immer wieder Konferenzteilnehmer*innen und sonstige Externe anreisen, ausschliesslich an der Haltestelle Kliniken Eselsberg gibt.

In einer Besprechung hatten die Stadtwerke zugesagt, Plaene nachzuruesten, sofern die Haltestellen dafuer noch freie Plaetze haben – und wir sagten zu, die dazugehoerigen Plaene zu bauen. Und nachdem Stefan Wehrmeyer mir beim occ13 noch einige Funktionen von TileMill naeher brachte, die ich bis dato nicht kannte, war der Weg schon einmal vorgezeichnet 🙂

Die Idee

Lokalen OpenStreetMap-Auszug von Ulm und Umgebung (genauer: Regierungsbezirk Tuebingen) downloaden, mit TileMill stylen, exportieren und aufbereiten

umgebplan

Die Umsetzung

Vorbereitung: TileMill und PostGIS installieren

(Siehe hierzu auch https://github.com/mapbox/osm-bright und http://wiki.openstreetmap.org/wiki/PostGIS/Installation

 sudo apt-get install tilemill postgresql postgresql-contrib postgis osm2pgsql
 sudo -u postgres createuser stk # as superuser
 sudo -u postgres createdb --encoding=UTF-8 --owner=stk tuebingen
 sudo -u postgres createlang plpgsql tuebingen

PostGIS einrichten, Karte laden und importieren

 sudo -u postgres psql -d tuebingen -f /usr/share/postgresql/9.1/contrib/postgis-1.5/postgis.sql
 sudo -u postgres psql -d tuebingen -f /usr/share/postgresql/9.1/contrib/postgis-1.5/spatial_ref_sys.sql
 sudo -u postgres psql -d tuebingen -f /usr/share/postgresql/9.1/contrib/postgis_comments.sql
 sudo -u postgres psql -d tuebingen -c "ALTER TABLE geometry_columns OWNER TO stk;"
 sudo -u postgres psql -d tuebingen -c "ALTER TABLE spatial_ref_sys OWNER TO stk;"
 wget http://download.geofabrik.de/europe/germany/baden-wuerttemberg/tuebingen-regbez-latest.osm.pbf
 osm2pgsql -c -G -d tuebingen tuebingen-regbez-latest.osm.pbf

osm-bright laden und anpassen

 git clone https://github.com/mapbox/osm-bright.git
 cd osm-bright
 cp configure.py.sample configure.py
 # edit according to readme
 ./make.py

Projekteinstellungen in project.mml:

"bounds": [
          9.9376,
          48.4151,
         9.971,
          48.4294
],
"center": [
          9.9535,
          48.4243,
          15
]

POIs hinzufuegen

Icons: http://www.sjjb.co.uk/mapicons/downloads (SJJB)

sudo apt-get install librsvg2-bin
./generatepngall.sh

Waehrend die PNGs gerendert werden, Layer in Tilemill hinzufuegen:

{
      "geometry": "point",
      "extent": [
        8.252064998851305,
        47.14375559492619,
        10.28521039856825,
        48.91388219485537
      ],
      "Datasource": {
        "type": "postgis",
        "table": "( SELECT name, highway, way\n  FROM planet_osm_point\n  WHERE building IS NULL AND highway IN ('bus_stop')\n  ORDER BY z_order ASC NULLS LAST\n) AS data",
        "key_field": "",
        "geometry_field": "way",
        "extent_cache": "auto",
        "extent": "918615.673665123,5965570.29255198,1144944.3842703,6260261.61701241",
        "dbname": "tuebingen",
        "user": "stk"
      },
      "id": "transit",
      "class": "",
      "srs-name": "900913",
      "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
      "advanced": {},
      "name": "transit"
    },
    {
      "geometry": "point",
      "extent": [
        8.252064998851305,
        47.14375559492619,
        10.28521039856825,
        48.91388219485537
      ],
      "Datasource": {
        "type": "postgis",
        "table": "( SELECT name, way, highway\n  FROM planet_osm_point\n  WHERE building IS NULL AND highway IN ('bus_stop')\n  ORDER BY z_order ASC NULLS LAST\n) AS data",
        "key_field": "",
        "geometry_field": "way",
        "extent_cache": "auto",
        "extent": "918615.673665123,5965570.29255198,1144944.3842703,6260261.61701241",
        "dbname": "tuebingen",
        "user": "stk"
      },
      "id": "transitlabel",
      "class": "",
      "srs-name": "900913",
      "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
      "advanced": {},
      "name": "transitlabel"
    },
    {
      "geometry": "point",
      "extent": [
        8.252064998851305,
        47.14375559492619,
        10.28521039856825,
        48.91388219485537
      ],
      "Datasource": {
        "type": "postgis",
        "table": "( SELECT *\n  FROM planet_osm_point\n  WHERE building IS NULL AND amenity IN ('biergarten', 'cafe', 'restaurant', 'bicycle_parking', 'charging_station', 'parking', 'atm') \n ORDER BY z_order ASC NULLS LAST\n) AS data",
        "key_field": "",
        "geometry_field": "",
        "extent_cache": "auto",
        "extent": "918615.673665123,5965570.29255198,1144944.3842703,6260261.61701241",
        "dbname": "tuebingen",
        "user": "stk"
      },
      "id": "uulmpoi",
      "class": "",
      "srs-name": "900913",
      "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over",
      "advanced": {},
      "name": "uulmpoi"
    }

und dann folgendes Styling in uulm.mss:

/* ****************************************************************** */

 #transitlabel[zoom >= 16] {
  text-name: [name];
  text-face-name: @sans;
  text-placement: point;
  text-wrap-width:60;
  text-fill: @poi_text;
  text-halo-radius: 2;
  text-halo-fill: @road_halo;
  text-min-distance: 2;
  text-placement-type: simple;
  text-allow-overlap: true;
  text-placements: "S,E,N,W,NE,SE,NW,SW,14,12,10";
  text-dx: 10;
  text-dy: 20;
 }

 #transit[zoom = 16] {point-file: url(img/sjjb/transport_bus_station.glow.999999.12.png); }
 #transit[zoom >= 17] {point-file: url(img/sjjb/transport_bus_station.glow.999999.20.png); }
 #transit[zoom >= 19] {point-file: url(img/sjjb/transport_bus_station.glow.999999.24.png); }

 #uulmpoi [amenity='cafe'][zoom <= 16] {point-file: url(img/icon/cafe-12.png); }
 #uulmpoi [amenity='cafe'][zoom >= 17] {point-file: url(img/icon/cafe-18.png); }
 #uulmpoi [amenity='cafe'][zoom >= 19] {point-file: url(img/icon/cafe-24.png); }

 #uulmpoi [amenity='restaurant'][zoom <= 16] {point-file: url(img/sjjb/food_restaurant.glow.8E7409.12.png); }
 #uulmpoi [amenity='restaurant'][zoom >= 17] {point-file: url(img/sjjb/food_restaurant.glow.8E7409.20.png); }
 #uulmpoi [amenity='restaurant'][zoom >= 19] {point-file: url(img/sjjb/food_restaurant.glow.8E7409.24.png); }

/*
 #uulmpoi [amenity='bicycle_parking'][zoom <= 16] {point-file: url(img/sjjb/transport_parking_bicycle.n.0092DA.12.png); }
 #uulmpoi [amenity='bicycle_parking'][zoom >= 17] {point-file: url(img/sjjb/transport_parking_bicycle.n.0092DA.20.png); }
 #uulmpoi [amenity='bicycle_parking'][zoom >= 19] {point-file: url(img/sjjb/transport_parking_bicycle.n.0092DA.24.png); }
*/

 #uulmpoi[amenity='restaurant'][zoom >= 16] {
  text-name: [name];
  text-face-name: @sans;
  text-placement: point;
  text-wrap-width:60;
  text-fill: @poi_text;
  text-halo-radius: 2;
  text-halo-fill: @road_halo;
  text-min-distance: 2;
  text-placement-type: simple;
  text-allow-overlap: true;
  text-placements: "S,E,N,W,NE,SE,NW,SW,14,12,10";
  text-dx: 10;
  text-dy: 10;
 }

FIXME die Marker sollten SVG sein, das ist noch TODO

Labelprobleme

Beim Rendern nach SVG oder PDF sehen die Labels (Strassennamen etc) seltsam aus: Buchstaben und Halos werden jeweils einzeln gerendert, so dass die Halos jeweils den naechsten Buchstaben ueberdecken. Das Problem scheint bekannt, siehe http://support.mapbox.com/discussions/tilemill/6001-text-halos-look-bad-in-pdfsvg-export, bleibt wohl nur die manuelle Beschriftung. Ich habe einfach die Labels in einem separaten Layer exportiert, der eingeblendet werden kann (oder auch nicht)

Handarbeit

Die Idealvorstellung war ja, dass sich der Prozess irgendwie automatisieren lassen wuerde, insbesondere wegen der Labels ging das aber nicht so einfach. Deswegen ging ich den folgenden Weg:

  • Einzelne Layer nacheinander exportieren, Breite 4000, Zoomlevel 17, Ausgabeformat PDF
    • Baselayer (Geometrien)
    • Strassenlabels
    • Transitmarker
    • POIs
  • Alle Layer in Illustrator (ich weiss, keine freie Software, gibts aber im PC-Pool an der Uni) zu einem Composite zusammenfuegen
  • Haendisch Beschriftungen hinzufuegen, einmal detailliert und einmal fuer den Uebersichtsplan
  • Alles in InDesign fuer den Druck anpassen

  • Optional: Versehentlich Schriftfarbe auf Passermarken setzen und sich wundern, warum die Glyphen pixelig rauskommen, bis man den Fehler bemerkt

Eine bessere Variante waere es, die Beschriftungen nochmals als eigene Datenquelle vorzuhalten und einzublenden, dann liesse sich das auch als SlippyMap exportieren, haette aber genau wieder dasselbe Problem, wenn man PDFs fuer den Druck exportieren moechte. Den derzeitigen Weg halte ich fuer einen gangbaren Kompromiss aus Aufwand/Ergebnis.

Betaversionen: