Страница 1 из 1

Как правильно создать WFS слой в OpenLayers 2.12 ?

Добавлено: 03 дек 2012, 08:15
Tink
Здравствуйте!
Необходимо создать слой WFS получающий данные GET запросом. Сервер не понимает JSONP, поэтому для доступа к серверу (он сторонний) настроен proxy. OSM слои (тайловые) стягиваются на ура, а вот WFS слой не получается даже создать нормально. Просто не понимаю как, хотя и примеры смотрел и гуглил, но что-то не доходит ни как.

Запрос к серверу на получение WFS:

Код: Выделить всё

localhost/proxy?service=WFS&version=1.0.0&srsname=EPSG:4326&request=GetFeature&typeName=TheNameLayer
WFS слой пытаюсь создать так (через протокол WFS) :

Код: Выделить всё

var layer = new OpenLayers.Layer.Vector(
    'Название слоя',
    {
        //strategies: [new OpenLayers.Strategy.BBOX()],
        strategies: [new OpenLayers.Strategy.Fixed(), new OpenLayers.Strategy.Save()],
        layers: 'TheNameLayer',
        protocol: new OpenLayers.Protocol.WFS({
            version: "1.0.0",
            url: "/proxy",
            featurePrefix: '',
            featureType: 'TheNameLayer',
            srsname: 'EPSG:4326'
        }),
        visibility: false
    }
);
Получаю такой POST запрос к серверу:

Код: Выделить всё

http://localhost/proxy
причем в POST вообще нет ни каких параметров - то есть ничего из параметров не передалось даже в POST параметрах - просто url с несколькими автоматически добавляемыми заголовками OpenLayers и браузером

Пробовал получать данные и так (через протокол Script) :

Код: Выделить всё

var protocol = new OpenLayers.Protocol.Script({
    url: serverUrl,
    params: {
        service: "WFS",
        version: "1.0.0",
        srsname: "EPSG:4326",
        request: "GetFeature",
        typeName: 'TheNameLayer'
    }
});
В ответе сервера я получаю то что и должен - XML.
Но вот не задача - при таком протоколе в параметры добавляется ещё один параметр

Код: Выделить всё

callback=OpenLayers.Protocol.Script.registry.c{N}
В результате чего вываливается ошибка что callback не найдена. Что естественно, ведь сервер не поддерживает JSONP

Так как же правильно создать WFS слой (что бы он тянул данные GET запросом приведенного вида) ?



--------------------------------------------------
Дополнение:
--------------------------------------------------

Получилось послать запрос, используя Script, без callack, так

Код: Выделить всё

var protocol = new OpenLayers.Protocol.Script({
        url: serverUrl,
        params: {
            service: "WFS",
            version: "1.0.0",
            srsname: "EPSG:4326",
            request: "GetFeature",
            typeName: layerName
        },
        callbackTemplate: "",
        callbackKey: ""
});
В результате чего посылается запрос вида:

Код: Выделить всё

localhost/proxy?service=WFS&version=1.0.0&srsname=EPSG:4326&request=GetFeature&typeName=TheNameLayer&=
Но все равно вываливается ошибка:
Resource interpreted as Script but transferred with MIME type text/xml: "http://localhost/proxy?service=WFS&vers ... eNameLayer&=".
OpenLayers.js:24953
OpenLayers.Protocol.Script.OpenLayers.Class.createRequest
OpenLayers.Protocol.Script.OpenLayers.Class.read
OpenLayers.Strategy.Fixed.OpenLayers.Class.load
OpenLayers.Events.OpenLayers.Class.triggerEvent
OpenLayers.Layer.OpenLayers.Class.setVisibility
OpenLayers.Control.LayerSwitcher.OpenLayers.Class.updateMap
OpenLayers.Control.LayerSwitcher.OpenLayers.Class.onButtonClick
OpenLayers.Events.OpenLayers.Class.triggerEvent
OpenLayers.Events.buttonclick.OpenLayers.Class.buttonClick
OpenLayers.Events.OpenLayers.Class.triggerEvent
OpenLayers.Events.OpenLayers.Class.handleBrowserEvent
(anonymous function)
Uncaught SyntaxError: Unexpected token <
Похожу он все равно ищет в ответе callback функцию и пытается её вызвать, а её то нет в помине в ответе сервера!

Если кто подключал WFS с GET запросом к серверу, подскажите как быть ?

Re: Как правильно создать WFS слой в OpenLayers 2.12 ?

Добавлено: 03 дек 2012, 18:48
Denis Rykov
Не вижу в вашем примере URL WFS - сервера. Прокси - это понятно, но где в описании слоя ссылка на сам WFS-сервер?

Re: Как правильно создать WFS слой в OpenLayers 2.12 ?

Добавлено: 04 дек 2012, 08:31
Tink

Код: Выделить всё

url: serverUrl,
где

Код: Выделить всё

serverUrl = "/proxy"
остальная строка (параметры), по сути должны формироваться WFS, которые прокси должен переслать WFS серверу.
И эти параметры почему-то не формируются. :(

Пока получение WFS сделал через Vector и GML, но мне это как-то не нравится...

Код: Выделить всё

var layer = new OpenLayers.Layer.Vector(
    "Название слоя", 
    {
        protocol: new OpenLayers.Protocol.HTTP({
            url: "/proxy?SERVICE=WFS&VERSION=1.0.0&REQUEST=GetFeature&TYPENAME=TheLaeyrName&SRSNAME=EPSG:3857",
            format: new OpenLayers.Format.GML()
        }),
        strategies: [new OpenLayers.Strategy.Fixed(), new OpenLayers.Strategy.Save()],
        visibility: false
    }
);
Так работает, но все же хотелось бы понять как это сделать через WFS... :?:

Re: Как правильно создать WFS слой в OpenLayers 2.12 ?

Добавлено: 04 дек 2012, 13:04
Denis Rykov
Вы же сами уже ответили на свой вопрос. Делается это так:

Код: Выделить всё


wfs_options = {
url: 'http://fakeurl/tinyows.cgi?',
params: {
request: "GetFeature",
service: "wfs",
version: "1.0.0",
typeName: "layername"
},
format: new OpenLayers.Format.GML({
featureNS: "http://nextgis.org/sf",
geometryName: "wkb_geometry"
})
}

wfs = new OpenLayers.Layer.Vector('WFS', {
strategies: [new OpenLayers.Strategy.Fixed()],
visibility: true,
protocol: new OpenLayers.Protocol.HTTP(wfs_options),
});

Если хотите использовать стратегию BBOX, то нужно дополнительно настроить параметр filterToParams.