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

OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 14:44
Филиппов Владислав
Доброго всем здравия.
Собственно, есть listbox c именами слоёв с геосервера.
При выборе одного из списка, он загружается на карту. При выборе другого слоя, отображается другой.
Всё хорошо.
А хочется, чтобы при загрузке слоя, увеличить экстент карты до экстента слоя.

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

         var layer = new ol.layer.Tile({
                title: config[item].label,
                source: new ol.source.TileWMS({
                    url: serverUrl,
                    params: {LAYERS: config[item].name, VERSION: '1.1.1'}
                })
            });
            map.addLayer(layer);
            var extent = layer.getExtent(); --> undefined
            //var extent = map.getLayers().item(1).getExtent(); --> undefined
            map.getView().fit(extent);
может нужно отловить какое-то событие? я пока не понял какое

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 15:04
freeExec
Может я путаю, но он вроде бы задаётся вручную при создании слоя. А чтобы автоматом, это надо как-то спрашивать у сервера.

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 15:56
Филиппов Владислав
руками указывают для растрового файла, а тут сервис, WMS

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 16:20
freeExec
А сервер точно эти данные присылает?
https://github.com/openlayers/openlayer ... es.js#L111

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 16:31
Филиппов Владислав
конечно, иначе как OL отрисует тайлы в нужном месте?
все запросы WMS'а разрешены на сервере всем пользователям

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 16:53
Denis Rykov
Откуда по вашему клиент должен знать охват конкретного слоя wms сервиса? Слой на клиенте запрашивает картинку или тайлы соответствующие текущему охвату карты, а какой там фактический охват данных ему все равно. Единственное место, откуда вы можете получить охват слоя - это GetCapabilities.

[ Сообщение с мобильного устройства ]

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 17:11
freeExec
Филиппов Владислав писал(а):конечно, иначе как OL отрисует тайлы в нужном месте?
все запросы WMS'а разрешены на сервере всем пользователям
Замечательно, а что там по ajax в браузер приходит? Тут не гадать надо, а дебажить :)

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 17:12
Филиппов Владислав
а как работает http://openlayers.org/en/latest/apidoc/ ... #getExtent

а аякса нет у меня. у меня есть конфиг, там урлы. на события изменения выбронного в листбоксах происходит загрузка нужного слоя средствами OL

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 17:31
Denis Rykov
getExtent ничего не вычисляет:
Return the extent of the layer or undefined if it will be visible regardless of extent.
Другими словами, если вы при инициализации слоя не указали свойство extent, то getExtent будет возвращать undefined, что мы и наблюдаем.

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 17:38
Филиппов Владислав
в версиях 3.х нужно было у слоя взять getSource(), типа источник, и у него спросить экстент (я так думаю, гетКапабилитес использовали)

и теперь, насколько я знаю, могу и ошибаться, я не могу использовать OL для целей получения экстента слоя?

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 17:44
Denis Rykov
Если речь идёт про WFS, то возможно, что касается WMS - то не уверен, покажите мне такой пример.

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 17:54
Филиппов Владислав
кроме ссылки на API, показать нечего.
у меня WMS тайлованый, там видно в начале поста

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 18:01
Denis Rykov
Филиппов Владислав писал(а):в версиях 3.х нужно было у слоя взять getSource(), типа источник, и у него спросить экстент (я так думаю, гетКапабилитес использовали)
О каком типе сорса идёт речь? Я не могу найти подобного функционала. Простое решение - распарсить ответ GetCapabilities, используя ol.format.WMSCapabilities и узнать об охватах данных каждого слоя (если там, конечно, корректная информация).

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 20 фев 2017, 20:52
ericsson
На то, что у WMS корректно сконфигурирован extent слоев, полагаться весьма наивно. Сколько видел всяких - казенных, университетских и т.п., не менее чем у половины там ерунда написана. Так что иногда ответ на вопрос "как получить" - "никак".

Re: OL 4 getExtent() у тайлового WMS undefined

Добавлено: 21 фев 2017, 06:48
Филиппов Владислав
всем спасибо за рекомендации!
всё настроено у меня правильно на сервере.
Решение.
Пришлось настроить CORS на сервере.

На клиенте, как и советовали, разбор GetCapabilities()

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

    var url = serverUrl+'?request=GetCapabilities&service=WMS&version=1.1.1';
    var parser = new ol.format.WMSCapabilities();
    $.ajax(url, {crossDomain: true}).then(function (response) {
        result = parser.read(response);
        console.log(result);
    });

=========================================================
            var Layers = result.Capability.Layer.Layer;
            var extent;
            for (var i = 0, len = Layers.length; i < len; i++) {
                var layerobj = Layers[i];
                if (layerobj.Name === config[item].name)
                {
                    extent = layerobj.BoundingBox[0].extent;
                }
            }
            var mExtent = ol.proj.transformExtent(extent, 'EPSG:4326', 'EPSG:3857');
            map.getView().fit(mExtent);
Выделение_007.png
Выделение_007.png (18.82 КБ) 9066 просмотров