#OSM Outline Service für Köln
##Überblick
Dieser Service liefert die Umrisse für Köln für die Stadtteile, die Stadtbezirke und die Stadt selber im geoJson Format. Grundlage hierfür sind die OSM Daten. Der Service gibt für bereits erstellte Datensätze die abgespeicherten Ergebnisse zurück.
##Funktionsweise
Der Service ist in Java geschrieben. Er läßt sich mit maven bauen.
- checkout git
- mvn clean install
Der Service antwortet mit einer geoJson-Datenstruktur. Die beispielhafte Einbindung des Services in Leaflet ist in index.html umgesetzt.
Die Installation erfolgt als Webapplikation in einem Application-Server. Ich habe den Service auf Basis von Tomcat entwickelt.
Folgende REST-Endpoints stehen zur Verfügung:
- /boundariesosmkoeln/service/<level>; Gibt die Umrisse der Stadt, des Stadtteils oder des Stadtbezirks von Köln zurück mit threshold 10
- /boundariesosmkoeln/service/<level>/<threshold>; Gibt die Umrisse der Stadtteile, der Stadtbezirke oder von Köln mit angegebenem threshold zurück
- /boundariesosmkoeln/service/generate; Erstellt die Umrisse
Der Service erlaubt es die Umrisse zu vereinfachen, mit dem Ergebnis, dass der Datenumfang der zu ladenden Daten sich verringert. Die Vereinfachung erfolgt auf Datenbankebene und wird durch anhängen des threshold angefordert. Dabei steht die Zahl für Auflösung; z.B.
- /boundariesosmkoeln/service/stadteile/100 vereinfacht auf 100m Genauigkeit
- /boundariesosmkoeln/service/stadteile/1000 vereinfacht auf 1000m Genauigkeit
Die Generalisierung wird mit dem Douglas-Peucker Algorithmus, auf Basis von PostGis umgesetzt. Dieser verwirft jeden Punkt, dessen Entferung vom Segment geringer ist, als der übergebene Schwellwert. Das Problem hierbei ist generell, dass benachbarte Polygone entweder nicht mehr direkt benachbart sind, oder sich an einigen Stellen überlappen.
Um dies zu verhindern, wird die Anfrage in Anlehnung an An example showing how to simplify a multipolygon layer, keeping topology between objects umgesetzt.
##Definition der DB-Verbindung
Der Service benötigt ggf. eine postgresql-Datenbank mit OSM-Daten und Postgis-Erweiterung. Die Verbindung wird über jndi im Tomcat definiert. Hierfür ist folgender Eintrag in der context.xml des Tomcat notwendig:
<Resource
name="jdbc/postgresql"
auth="Container"
type="javax.sql.DataSource"
username="username"
password="password"
driverClassName="org.postgresql.Driver"
url="jdbc:postgresql://server:5432/dbname"
maxTotal="25"
maxIdle="10"
validationQuery="select 1" />
Die Abfragen selber werden per prepared Statement durchgeführt. Die Definition der Statements erfolgt als resource und wird von der jeweiligen AskFor-Klasse aus den resources geladen.
##admin_level
Dabei steht der admin_level für folgende Aufteilung in Deutschland:
- nicht verwendet
- deutsche Aussengrenze
- nicht verwendet
- Bundesland
- Regierungsbezirk
- Landkreis / Kreis / kreisfreie Stadt / Stadtkreis
- Amtsgemeinde, Verwaltungsgemeinschaft
- Stadt, Gemeinde
- Stadtbezirk / Gemeindeteil mit Selbstverwaltung
- Stadtteil / Gemeindeteil ohne Selbstverwaltung
Die Abfragen gegen die Datenbank sind recht zeitaufwändig. Z.B. benötigt bei mir die Abfrage auf die Stadtteile in Köln ca 15 Minuten. Um die Zeit abzukürzen, sind dieser Webanwendung bereits berechnete GeoJson Strings hinterlegt, die im Normalfall ausgeliefert werden. Durch den Endpunkt "generate" (Beispiel: /boundariesosmkoeln/service/generate) wird die Erstellung des Polygons gegen die Datenbank in jedem Fall ausgeführt. Mit Übergabeparametern können spezielle Polygon berechnet werden (Beispiel: /boundariesosmkoeln/service/generate?level=stadtteile&threshold=250). Das Ergebnis dieser Berechnung wird im Filesystem abgelegt. Der Ort dafür wird in der application.properties for Start des Servers eingetragen und als Ergebnis des Service zurückgegeben.
Bereits berechnete Daten sind in diesem Projekt auf github hinterlegt und können so direkt verwendet werden: https://github.com/weberius/boundariesosmkoeln/tree/master/src/main/resources