Erste Gehversuche I
Posted by mawi2002 on 16 March 2019 in German (Deutsch). Last updated on 17 March 2019.Motivation
Was ich tun will: eine Webseite bauen, auf der man
- eine Landkarte
- einen Schiebebalken
- und einen Bereich mit weiteren Details
sieht. Die Landkarte (natürlich OSM) stellt ein ausgewähltes Gebiet dar mit Layern, die farblich Grenzen verschiedener -nennen wir es Einheiten- darstellt. Dies können sein:
- Herzogtümer
- Königreiche
- oder ähnliche geschichtsträchtige Flächen
Der Schiebebalken bestimmt das Jahr, aus welchem die gefüllten Flächen angezeigt werden. Es soll dabei nicht die gesamt OSM “alt” sein, d.h. wenn sich in den Jahren Flussläufe geändert haben, wenn Wälder nicht mehr existieren etc. ist das irrelevant. Es wird immer die aktuelle Situation, die OSM darstellt, durch die Layer durchscheinen.
Und schließlich sollen im Detailbereich weitere Informationen dargestellt werden, die sich auf die gewählte Zeit und den gewählten Kartenausschnitt beziehen. Geboren war die Idee aus meiner Liebe zu historischen Romanen, die ich (Ort und Zeit) auf diesem Weg gern visualisieren wollte - daher würde ich den Detailbereich gern vorsehen, um dort Bücher zu nennen. Prinzipiell geht aber auch jede andere Sorte von Themen.
Das Ganze ist in erster Linie ein Projekt, bei dem ich mich mit dieser OSM-Materie befassen möchte. Es geht nicht darum, in Konkurrenz zu anderen Projekten wie bspw. https://chronas.org http://geacron.com/ oder http://openhistoricalmap.org/ zu treten.
Grundlegendes zur Datenspeicherung
Meine erste Frage also war, wie werden die Daten bei OSM gespeichert, um im nächsten Schritt damit arbeiten zu können.
Es kristallisiert sich schnell diese Hierarchie heraus: Relation » Linie » Knoten
Achtung: eine Relation kann wiederum aus mehreren Relationen bestehen
Prüfen wir die Hierarchie und fragen uns beispielhaft: Von welchen x-y-Koordinatenpaaren wird Sachsen begrenzt? (beachte: hier wird von longitude [lon] und latitude [lat] gesprochen)
- Wir starten mit Deutschland. Welche Relation mag dem zugeordnet sein? Es gibt sicherlich viele Wege, dies herauszufinden, beispielsweise über https://www.wikidata.org >> Suche nach Germany >> Scrolle auf der Seite zum Begriff OSM relation ID >> Finde die relation/51477
- Link mit dieser Relation basteln >> relation/51477
- Auf der linken Seite findet sich unten relation/62467 = Sachsen >> relation/62467
- Wieder links sieht man die Liste der Member, aus denen die Relation aufgebaut ist - in diesem Fall ausschließlich Linien
- Ich picke mir eine Linie heraus: 52304580 >> way/52304580
- Wieder links sehen wir nun eine Liste der Knoten, die diese Linie ergibt
- Ich picke mir einen Knoten heraus: 2923396541 >> node/2923396541
- Wieder links: Link XML herunterladen gibt mir die longitude und latitude Werte zurück, die diesen Knoten beschreiben
Der URL-Aufbau ist also generisch:
- Relation (relation): relation/id
- Linie (way): way/id
- Knoten (node): node/id
Auf jeder dieser Seiten wird ein XML-Download angeboten, der zur Punktgewinnung genutzt werden kann. Auch diese URLs sind generisch:
- Relation (relation): osm.org/api/0.6/relation/id
- Linie (way): osm.org/api/0.6/way/id
- Knoten (node): osm.org/api/0.6/node/id
Mein abgewandeltes Datenbankschema
Hier findet sich ein Datenbankschema, das ich für meine Zwecke angepasst und mit folgenden Aufrufen in meine lokale Datenbank (mysql) eingefügt habe:
CREATE TABLE nodes ( id bigint NOT NULL, description varchar(100), lon double NOT NULL, lat double NOT NULL, CONSTRAINT nodes_pkey PRIMARY KEY (id) ); CREATE TABLE ways ( id bigint NOT NULL, description varchar(100), CONSTRAINT ways_pkey PRIMARY KEY (id) ); CREATE TABLE relations ( id bigint NOT NULL, description varchar(100), valid_from integer, -- Jahr valid_to integer, -- Jahr CONSTRAINT relations_pkey PRIMARY KEY (id, valid_from) ); CREATE TABLE way_nodes ( way_id bigint NOT NULL, nodes_order integer NOT NULL, node_id bigint NOT NULL, CONSTRAINT way_nodes_pkey PRIMARY KEY (way_id, nodes_order) ); CREATE TABLE relation_members ( relation_id bigint NOT NULL, members_order integer NOT NULL, member_type varchar(10) NOT NULL, member_id bigint NOT NULL, role varchar(20) NOT NULL, CONSTRAINT relation_members_pkey PRIMARY KEY (relation_id, members_order) );
Als nächstes werde ich daran gehen, für mich wichtige Daten einiger Relationen in diese Datenbanktabellen zu packen, nachdem ich sie aus OSM ausgelesen haben werde.
Discussion