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

Не знаете, где задать вопрос? Задавайте здесь.
Ответить
Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

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

Сообщение Tink » 03 дек 2012, 08:15

Здравствуйте!
Необходимо создать слой 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 запросом к серверу, подскажите как быть ?

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 03 дек 2012, 18:48

Не вижу в вашем примере URL WFS - сервера. Прокси - это понятно, но где в описании слоя ссылка на сам WFS-сервер?
Spatial is now, more than ever, just another column- The Geometry Column.

Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

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

Сообщение Tink » 04 дек 2012, 08:31

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

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... :?:

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 04 дек 2012, 13:04

Вы же сами уже ответили на свой вопрос. Делается это так:

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


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.
Spatial is now, more than ever, just another column- The Geometry Column.

Ответить

Вернуться в «Я новичок!»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 32 гостя