In der Karte im Viel-Falter Projekt sollte zu den gekachelten Rasterlayern ein weiterer Layer mit der Biotop-Kartierung von Tirol dazukommen. Da die gesamte Vektor-Geometrie mit über 200 MB im GeoJSON Format zu Buche schlägt, muss der Datensatz auf die Ausmaße aktuellen Ansicht (BoundingBox) eingeschränkt werden. Einigermaßen überrascht stellte ich fest, dass es hierzu (fast) keine fertige Lösung gibt. Hier mein Weg:
PostGIS
Da der Vektordatensatz aus vielen kleinen Polygonen besteht eignet er sich wunderbar für Einschränkungen anhand der aktuellen BoundingBox. Postgresql in Kombination mit PostGIS macht diese Berechnungen sehr einfach und mit einem räumlichen Index auch sehr schnell. Also war der erste Schritt den Vektordatensatz im Shapefile Format in die Postgresql Datenbank zu importieren.
shp2pgsql -I -W LATIN1 -s 31254 BIK_PL.shp > bik.sql
Das Datenfile im Shapefile lag in der Kodierung LATIN1 (ISO-8859-1) und in der Projektion EPSG:31254 (MGI / Austria GK West) vor. Der Parameter -I
erzeugt automatisch einen räumlichen Index am Ende des Imports.
Leaflet Vector Layer
Um mit der leafletjs-Bibliothek auf die PostGIS Daten zugreifen zu können braucht man noch zwei zusätzliche Software Komponenten: Leaflet-Vector-Layer von Jason Sanford und den das PostGIS RESTful Web Service Framework. Um die Javascript Bibliothek Leaflet-Vector-Layer zu installieren reicht es die Datei lvector.js in das Projektverzeichnis zu kopieren und entsprechend zu referenzieren. Die Layerdefinition in leaflet ist wie folgt:
pglayer = new lvector.PRWSF({ url: "http://meinserver.at/pgrest", geotable: "bik_pl", fields: "gid,name", singlePopup: true, uniqueField: "gid", srid: 31254, scaleRange: [15, 19], popupTemplate: '<div class="biotop"><h3>{name}</h3>' +'<footer class="popup">Datenquelle: Land Tirol - data.tirol.gv.at</footer></div>', symbology: { type: "single", vectorOptions: { fillColor: "#2f4a00", fillOpacity: 0.4, weight: 1.8, color: "#2f4a00", opacity: 1, clickable: true } } });
PostGIS RESTful Web Service Framework
Was jetzt noch fehlt ist die Schnittstelle zur Datenbank. Mit dem PostGIS RESTful Web Service Framework ist dieser Zugang sehr einfach, denn im besten Fall reicht es die PHP Skripte an die entsprechende Position zu kopieren. Anschließend muss noch die Datenbank-Verbindung eingetragen werden und, vorausgesetzt die aufwändig Rechte Konfiguration in Postgresql ist korrekt, der Layer scheint in der Karte auf.