OpenLayers a WFS-T

Poznámka

Nastavení editace vektorových dat pomocí protokolu WFS-T vyžaduje již určité programátorské schopnosti. Tento příklad berte pouze jako ilustrativní, pro reálný systém je potřeba ošetřit celou řadu krajních případů. Příklad vychází z oficiální dokumentace k TinyOWS [1].

Editace pomocí protokolu WFS-T (transakční WFS) vyžaduje jednak nastavení na straně serveru a jednak přidání editačních nástrojů do projektu OpenLayers. Pokračovat budeme na předchozím příkladě, ale poněkud jej rozšíříme. Verzi s WFS-T si můžete prohlédnout zde.

Nejprve přidáme do seznamu strategií u vrstvy WFS strategii pro ukládání:

                var saveStrategy = new OpenLayers.Strategy.Save();
                wfs = new OpenLayers.Layer.Vector("Budovy", {
                    strategies: [new OpenLayers.Strategy.Fixed(), saveStrategy],
                    projection: new OpenLayers.Projection("EPSG:5514"),
                    protocol: new OpenLayers.Protocol.WFS({
                    version: "1.1.0",
                    srsName: "EPSG:5514",
                    url: "/services/vugtkwfs",
                    featureNS :  "http://www.tinyows.org/",
                    featureType: "mystavebniobjekty",
                    geometryName: "puvodnihranice", // originalnihranice, geom
                    schema: "/services/vugtkwfs?service=wfs&request=DescribeFeatureType&version=1.1.0&typename=tows:mystavebniobjekty"
                    })
                });

Poznámka

Zkontrolovat název sloupce s geometrií

Přidáme nástroje pro kreslení nových prvků a změnu existujících prvků v mapě:

                // vytvoříme panel nástrojů
                var panel = new OpenLayers.Control.Panel(
                  {'displayClass': 'olControlEditingToolbar'}
                );

                // kreslení polygonů
                var draw = new OpenLayers.Control.DrawFeature(
                    wfs, OpenLayers.Handler.Polygon,
                    {
                        title: "Draw Feature",
                        displayClass: "olControlDrawFeaturePolygon",
                        multi: true
                    });

                // mazání
                var del = new DeleteFeature(wfs, {title: "Delete Feature"});

                // přidání nástrojů do panelu a panelu do mapy
                panel.addControls([navigate, save, del, edit, draw]);

Nakonec vyrobíme tlačítko s ukládací funkcí:

                // uložení
                var save = new OpenLayers.Control.Button({
                    title: "Save Changes",
                    trigger: function() {
                        if(edit.feature) {
                            edit.selectControl.unselectAll();
                        }
                        saveStrategy.save();
                    },
                    displayClass: "olControlSaveFeatures"
                });

Závěr

Tento příklad je (už při pohledu na zdrojový kód) poměrně komplexní - v úvodu souboru jsme museli nastavit kaskádové styly jednotlivých tlačítek, museli jsme definovat funkce pro mazání prvků a pro odeslání prvků protokolem WFS-T na server, přidávat tlačítka pro editaci geometrií ručně v kódu.

OpenLayers je poměrně komplexní knihovna - na úrovni jiných programátorských knihoven používaných v GIS. S její pomocí lze vytvořit velice funkční aplikace, ale jen velice málo funkcí je hotových k okamžitému použití pro laika-neprogramátora.

Další věc, která v příkladu není nijak ošetřena, je autorizace a autentifikace uživatele. Předpokládáme čtení/zápis pro všechny. Obecně je toto na webu problém, mapová aplikace musí být dostupná ze stejné URL jako WFS server - tak, aby nedocházelo k problémům s tzv. cross site scripting. V tom případě totiž není jednoduše možné předat přihlašovací údaje vzdálenému serveru, neboť jsou zachyceny právě na službě proxy.

Poznámky

[1]Příklad pro TinyOWS a OpenLayers http://mapserver.org/tinyows/openlayershowto.html