User:Swen Wacker/POI/Tabellen erstellen

From OpenStreetMap Wiki
Jump to: navigation, search

Wie erstelle ich eine aktuelle Liste bestimmter POI

Ziel dieser Beschreibung ist es, mit möglichst geringem Technik- und Knowhow-Einsatz Auswertungen zu erzielen, die hier im Wiki als Tabelle stehen können. Dem Autor ist bewusst, dass das Ziel mit einer lokalen oder gar auf einem externen Server installierten Datenbank "schicker" erreichen werden kann. Der Autor hat kaum Ahnung von regulären Ausdrücken und freut sich über jeden Hinweis, wie das besser und performanter geht.

Der folgende Text ist für Laien - wie der Autor einer ist - geschrieben.

Ich mache mir also einmal viel Arbeit. Danach geht es (hoffentlich) leicht und flott. Das Ergebnis kann man hier sehen: Lüneburg/POI

Die Lüneburger POI zubereiten

  • Da ich nur einen Teilbereich Niedersachsens betrachten will, schneide ich mir den Teil raus, der mich interessiert: die Stadt Lüneburg. Dazu besorge ich mir bei OSM Boundaries die aktuelle Relation der Stadtgrenzen Lüneburgs. Ich wähle das poly-format aus und benenne die Datei in gebiet.poly um.
  • Jetzt lege ich mir mit einem Texteditor eine Datei an, die 01_gebiet-ausschneiden.bat heißen wird und ebenfalls in dem bekannten Ordner dauerhaft wohnen soll. Diese Batch-Datei hilft mir dabei, osmconvert.exe zu bedienen. In der Datei sage ich osmconvert.exe, dass es sich die Geofabrik-Daten nehmen und mit Hilfe von gebiet.poly eine Datei daraus basteln soll, die gebiet-latest.osm.pbf heißt:
osmconvert niedersachsen-latest.osm.pbf -B=gebiet.poly -o=gebiet-latest.osm.pbf
Nach einem Klick auf 01_gebiet-ausschneiden.bat habe ich kurze Zeit später eine neue Datei in meinem Ordner: gebiet-latest.osm.pdf.
  • Für meine Zwecke ist es gut, wenn ich nur Knoten, aber keine Wege oder Relationen, im Datenbestand habe. Sonst gehen mir z.B. bei den Spielplätzen diejenigen durch die Lappen, die als Fläche angelegt wurden. Auch da hilft mir osmconvert.exe. Die Batchdatei mit dem Namen 02_all-to-nodes.bat macht das:
osmconvert gebiet-latest.osm.pbf --all-to-nodes -o=gebiet-latest_nodes.osm.pbf
  • Schließlich nehme ich osmconvert.exe wörtlich und wandle gebiet-latest_nodes.osm.pbf in einen OSM-Datei um. Das kann die Batch-Datei 03_gebiet_pbf_2_osm.bat, in der steht:
osmconvert gebiet-latest_nodes.osm.pbf -o=gebiet-latest_nodes.osm
  • Das Herunterladen der Datei (mit dem Kommandozeilentool wget.exe link) und die drei Batch-Dateien packe ich in eine Batch-Datei, die ich osmmacher.bat nenne:
call wget -O niedersachsen-latest.osm.pbf "http://download.geofabrik.de/europe/germany/niedersachsen-latest.osm.pbf"
call 01_gebiet 
call 02_all-to-nodes
call 03_gebiet_pbf_2_osm
del gebiet-latest.osm.pbf
del gebiet-latest_nodes.osm.pbf 
Erläuterung: call erlaubt es, mit einer Batch-Datei eine andere Batch-Datei aufzurufen. Wird diese beendet, geht es in der Batch-Datei weiter. wget -O niedersachsen-latest.osm.pbf "http://download.geofabrik.de/europe/germany/niedersachsen-latest.osm.pbf" überschreibt (Parameter -O) eine vorhandende niedersachsen-latest.osm.pbf mit dem Download von der genannten Adresse. Mit del gebiet-latest.osm.pbf und del gebiet-latest_nodes.osm.pbf werden nun nicht mehr nötige temporäre Dateien, die osmconvert.exe produziert hat, gelöscht.
  • Zukünftig geht es einfacher:
    • osmmacher.bat anklicken

Die Lüneburger POI sortieren

  • Ich greife etwas vor: Ich werde gleich Tabellen automatisch bearbeiten. Die Tabellen haben das Format *.cvs, ein Textformat, das in jedem Editor geöffnet werden kann, aber auch von Excel gelesen werden kann. Dazu gibt es das nützliche Programmm sed.exe, das aus der Unix-Welt stammt und mit dem man prima Textdateien bearbeiten kann. Ich gehe hierhin und lade mir die Binaries und die Dependencies herunter. Mich interessieren nur diese vier Dateien: sed.exe, libiconv2.dll, regex2.dll und libintl3.dll. Die kommen in meinen Ordner.
  • Jetzt erstelle ich mir für jede POI-Kategorie einen Ordner. Dort will ich Dateien erzeugen. Zunächst muss ich wissen, welche Tags für den gewählten Wert relevant sind. Das finde ich im hier im Wiki auf den jeweiligen Seiten. Für Apotheken z.B. interessieren mich neben der id noch die Angaben für amenity, name, operator, opening_hours, contact:phone, contact:website und dispensing. Ich sage zu osmconvert.exe (das Programm osmconvert.exe liegt einen Ordner höher, nämlich im Grundordner): Nimm gebiet-latest.osm.pbf (die Datei liegt einen Ordner höher, nämlich im Grundordner), erstelle eine csv-Datei mit den Spalten "@id amenity name operator opening_hours contact:phone contact:website brand dispensing", gebe der Tabelle Spaltenüberschriften und speichere die ganze Datei schließlich als csv-Datei gebiet-latest-apotheke.csv in meinem Unterordner ab. Das schreibe ich so in die erste Zeile meiner Batch-Datei pharmacy.bat:
../osmconvert ../gebiet-latest.osm --csv="@id amenity name operator opening_hours contact:phone contact:website brand dispensing" --csv-headline -o=gebiet-latest-apotheke.csv
  • Das Blöde ist, dass diese Datei ziemlich viele Dinge enthält, die ich nicht brauche. Ich brauche ja nur die erste Zeile (wegen der Spaltenüberschriften) und die Zeilen, in denen der Begriff "pharmacy" vorkommt (solange er von Tabulatoren umgeben ist - Zur Vermeidung von falschen Positiven). Das regelt sed.exe für mich: Kopiere die erste Zeile sowie alle Zeilen, in denen "<Tabulator>pharmacy<Tabulator>" steht, aus der Datei gebiet-latest-apotheke.csv und schreibe sie in pharmacy.csv . Das schreibe ich in die zweite Zeile meiner Batch-Datei pharmacy.bat
sed -n -e 1p -e "2,${/[\t]pharmacy[\t]/p}" gebiet-latest-apotheke.csv > pharmacy.csv
  • Das mache ich jetzt mit jeder POI-Tabelle, die ich erstelle möchte. Um den Überblick zu behalten, gruppiere ich die POI in mehrere Unterordner (z.B: Kommunikation, Gesundheit, Behörden ...). Die zugehörigen Batch-Datei benenne ich jeweils wie die Tabelle (zu pharmacy.csv gehört pharmacy.bat usw.)

Aus der CSV-Datei eine Wiki-Tabelle machen

Weil diese Tabellen hier im Wiki stehen sollen, will ich die csv-Dateien noch in Mediawiki-Tabellen umwandeln. Dabei könnten mir Online-Tools wie

helfen. Aber ich mache das mit sed.exe, dann habe ich weniger zu tun und kann die @id zu anklickbaren Links machen.

Links wikifizieren

  • Schritt 1: sed -i -e "2,$s/^/[https:\/\/www.openstreetmap.org\/node\//" %1.csv Schreibe ab der zweiten Zeile zu Beginn jeder Zeile https://www.openstreetmap.org/node/
  • Schritt 2: sed -i -e "2,$s/[0-9][0-9]*/& &/" %1.csv Nimm die @id, mache ein Leerzeichen dahinter und schreib sie dann nochmal hin (von wegen mediawiki-Link Syntax))
  • Schritt 3: sed -i -e "sed -i -e "s/node\/100000000/way\//;s/node\/200000000/relation\//;s/node\/10000000/way\//;s/node\/20000000/relation\//;s/node\/1000000/way\//;s/node\/2000000/relation\//" %1.csv osmconvert hat die Id der ways (relations) mit (2*)10^15 erweitert - das wird jetzt wieder auseinander gepfriemelt
  • Schritt 4: sed -i -e "2,$s/[0-9]\t/&]/;s/\t]/]\t/" %1.csv den Link mit einer eckigen Klammer abschließen
  • Schritt 5: sed -i -e "s/ 100000000/ /;s/ 10000000/ /;s/ 1000000/ /;s/ 200000000/ /;s/ 20000000/ /;s/ 2000000/ /" %1.csv Aufräumen: da sind noch ein paar (2*)10^15, die weg müssen

Das Zeichen %1.csv soll der Batch-Datei (ich werde sie link.bat nennen und im Grundordner speichern) nachher sagen, welche Tabelle ich gerade meine. Wenn ich die Batch-Datei so aufrufe: link.bat pharmacy - dann wird aus %1 der Wert pharmacy.

Die fünf Schritte könnten in jeweils einer Batch-Datei stehen. Galanter ist es jedoch, all die einzelnen Anweisungen in einer Anweisung zu bündeln. Meine link.bat sieht deshalb so aus (im Original steht alles bitte in einer Zeile, die Umbrüche sind hier nur aus optischen Gründen eingefügt):

sed -i -e "2,$s/^/[https:\/\/www.openstreetmap.org\/node\//;2,$s/[0-9][0-9]*/& /;s/node\/100000000/way\//;s/node\/200000000/relation\//
;s/node\/10000000/way\//;s/node\/20000000/relation\// ;s/node\/1000000/way\//;s/node\/2000000/relation\//;2,$s/[0-9]\t/&]/;s/\t]/]\t/
;s/ 100000000/ /;s/ 10000000/ /;s/ 1000000/ /;s/ 200000000/ /;s/ 20000000/ /;s/ 2000000/ /" %1.csv

Tabelle wikifizieren

  • Schritt 1: sed -i "1s/\t/ !! /g" %1.csv Mache aus der ersten Zeile eine Überschriftenzeile
  • Schritt 2: sed -i "2,$s/^/|-\n| /g" %1.csv Füge anschließend die Zeichen "|-" und "|" ein
  • Schritt 3: sed -i "s/\t/ || /g" %1.csv Ersetze die restlichen Tabulatoren durch das Zellentrennzeichen "||"
  • Schritt 4: sed -i "1s/^/\{| class=\"wikitable sortable\"\n|+Sortable table\n|-\n!/" %1.csv Füge den Tabellenkopf zu Beginn ein
  • Schritt 5: sed -i "$a\|\}" %1.csv Schließe die Tabelle mit "|}"

Das Zeichen %1.csv soll der Batch-Datei (ich werde sie wiki.bat nennen und im Grundordner speichern) nachher sagen, welche Tabelle ich gerade meine. Wenn ich die Batch-Datei so aufrufe: wiki.bat pharmacy - dann wird aus %1 der Wert pharmacy.

Die 5 Schritte könnten in jeweils einer Batch-Datei stehen. Galanter ist es jedoch, all die einzelnen Anweisungen in einer Anweisung zu bündeln. Meine wiki.bat sieht deshalb so aus (im Original steht alles bitte in einer Zeile, der Umbruch sind hier nur aus optischen Gründen eingefügt)::

sed -i "1s/\t/ !! /g;2,$s/^/|-\n| /g;s/\t/ || /g;
1s/^/\{| class=\"wikitable sortable\"\n|+Sortable table\n|-\n!/;$a\|\}" %1.csv

Tabellen in einem Rutsch herstellen

All diese ganze Vorarbeit macht mir zukünftig das Arbeiten leichter. Mal angenommen, ich habe einen Unterordner Finanzen angelegt, in dem ich zwei Tabellen erstellen möchte: Geldautomaten und Banken. Ich habe deshalb (wie oben für pharmacy.bat erklärt) zwei Batch-Dateien in dem Ordner erstellt: amt.bat und bank bat. Dazu kommt jetzt noch eine Datei, die ich csv.bat nenne. Dort sage ich meinem windows: Rufe atm.bat auf, dann bank.bat. Forme mit link.bat erst atm.csv und dann bank.csv um. Dann forme die beiden Tabellen endgültig mit wiki.bat zu einer mediawiki-Tabelle. Das sieht dann so aus:

call atm
call bank
call ../link atm
call ../link bank
call ../wiki atm
call ../wiki bank
call del sed*
call del *latest*.csv

Erläuterung: call erlaubt es, mit einer Batch-Datei eine andere Batch-Datei aufzurufen. Wird diese beendet, geht es in der Batch-Datei weiter. Mit del sed* werden unnötige temporäre Dateien, die sed.exe produziert hat, gelöscht. Mit del *latest*.csv werden nicht mehr benötige Tabellen, die osmconvert.exe produziert hat, gelöscht.


Zukünftig geht es einfacher:

  • csv.bat anklicken

Die meiste Zeit kostet es, die Tabelle hier ins Wiki zu transportieren. So sieht das dann aus:

Beispiel einer so entstandenen Tabelle

pharmacy
@id amenity name operator opening_hours contact:website contact:phone brand dispensing lastcheck
324007531 pharmacy Apotheke Helms Rainer Helms yes
387282065 pharmacy Apotheke Feldstraße Dirk Düvel Mo-Sa 08:00-23:00;Su 09:00-20:00 yes
387282066 pharmacy Hirsch-Apotheke Martin Möller Mo-Fr 08:00-18:30; Sa 08:00-13:00 yes
387282067 pharmacy Apotheke Am Sande Dirk Düvel Mo-Sa 07:00-19:00 yes
387282068 pharmacy Raths-Apotheke Thomas Heuer Mo-Fr 08:00-19:00;Sa[1] 08:00-16:00;Sa 08:00-15:00 yes
387282070 pharmacy Einhorn Apotheke Ulrich Steiger Mo-Fr 08:30-18:30;Sa 08:30-13:30 yes
387282071 pharmacy Löwen-Apotheke Hans Nabil Humsi Mo-Sa 08:00-19:00;Sa 08:00-14:00 yes
414134117 pharmacy Apotheke am Kurzentrum Apoth. Christoph Hinsch Mo-Fr 08:00-13:00;Sa 09:00-20:00 yes
421737624 pharmacy Apotheke am Kran Dr. Felix Eggert Mo,Tu,Th,Fr 08:00-18:00;We 08:00-18:30;Sa 09:00-13:00 +49 4131/35399 yes
421737627 pharmacy Flora-Apotheke Klaus-Dieter Flachmann yes
421737629 pharmacy Wasserknecht-Apotheke Dietlind Bröer Mo-Fr 08:30-18:30;Sa 08:30-13:30 yes
426587868 pharmacy Apotheke am Moldenweg Dr. Thomas Heuer Mo-Fr 08:30-18:00 yes
426587869 pharmacy Apotheke am Schrangenplatz Martin Möller Mo-Fr 08:30-18:00;Sa 09:00-13:00 yes
426587870 pharmacy Grapengießer-Apotheke Uwe Weseloh Mo-Fr 08:30-19:00;Sa 09:00-16:00 yes
426587871 pharmacy Schmids Apotheke Arnold Oelenberg Mo-Fr 08:30-18:00;Sa 09:00-12:00 yes
426587872 pharmacy Kosmos-Apotheke Sigrun Scholz yes
503313376 pharmacy Apotheke am Kreideberg Jörg Meyer-Ruttmann Mo-Fr 08:00-18:30;Sa 08:00-13:00 yes
614104454 pharmacy Apotheke im Garbers-Center Apoth. Dirk Düvel Mo-Sa 08:00-20:00 yes
1269538961 pharmacy Elch Apotheke Frank F. Keller Mo-Th 08:00-13:00, 14:30-18:30;Fr 08:00-18:00;Sa 08:30-12:00 yes
3042856057 pharmacy Apotheke am Bockelsberg Dr. Felix Eggert Mo-Fr 08:00-13:00, 15:00-18:00;Sa 08:00-13:00 yes