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

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 959
Зарегистрирован: 17 фев 2006, 06:28
Проекты: 1
Репутация: 131
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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);
может нужно отловить какое-то событие? я пока не понял какое

freeExec
Гуру
Сообщения: 553
Зарегистрирован: 23 апр 2011, 10:32
Проекты: 1
Репутация: 76
Откуда: Ульяновск

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

Сообщение freeExec » 20 фев 2017, 15:04

Может я путаю, но он вроде бы задаётся вручную при создании слоя. А чтобы автоматом, это надо как-то спрашивать у сервера.

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 959
Зарегистрирован: 17 фев 2006, 06:28
Проекты: 1
Репутация: 131
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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

Сообщение Филиппов Владислав » 20 фев 2017, 15:56

руками указывают для растрового файла, а тут сервис, WMS

freeExec
Гуру
Сообщения: 553
Зарегистрирован: 23 апр 2011, 10:32
Проекты: 1
Репутация: 76
Откуда: Ульяновск

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

Сообщение freeExec » 20 фев 2017, 16:20

А сервер точно эти данные присылает?
https://github.com/openlayers/openlayer ... es.js#L111

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 959
Зарегистрирован: 17 фев 2006, 06:28
Проекты: 1
Репутация: 131
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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

Сообщение Филиппов Владислав » 20 фев 2017, 16:31

конечно, иначе как OL отрисует тайлы в нужном месте?
все запросы WMS'а разрешены на сервере всем пользователям

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

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

Сообщение Denis Rykov » 20 фев 2017, 16:53

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

[ Сообщение с мобильного устройства ]
Spatial is now, more than ever, just another column- The Geometry Column.

freeExec
Гуру
Сообщения: 553
Зарегистрирован: 23 апр 2011, 10:32
Проекты: 1
Репутация: 76
Откуда: Ульяновск

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

Сообщение freeExec » 20 фев 2017, 17:11

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

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 959
Зарегистрирован: 17 фев 2006, 06:28
Проекты: 1
Репутация: 131
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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

Сообщение Филиппов Владислав » 20 фев 2017, 17:12

а как работает http://openlayers.org/en/latest/apidoc/ ... #getExtent

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

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

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

Сообщение Denis Rykov » 20 фев 2017, 17:31

getExtent ничего не вычисляет:
Return the extent of the layer or undefined if it will be visible regardless of extent.
Другими словами, если вы при инициализации слоя не указали свойство extent, то getExtent будет возвращать undefined, что мы и наблюдаем.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 959
Зарегистрирован: 17 фев 2006, 06:28
Проекты: 1
Репутация: 131
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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

Сообщение Филиппов Владислав » 20 фев 2017, 17:38

в версиях 3.х нужно было у слоя взять getSource(), типа источник, и у него спросить экстент (я так думаю, гетКапабилитес использовали)

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

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

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

Сообщение Denis Rykov » 20 фев 2017, 17:44

Если речь идёт про WFS, то возможно, что касается WMS - то не уверен, покажите мне такой пример.
Spatial is now, more than ever, just another column- The Geometry Column.

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 959
Зарегистрирован: 17 фев 2006, 06:28
Проекты: 1
Репутация: 131
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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

Сообщение Филиппов Владислав » 20 фев 2017, 17:54

кроме ссылки на API, показать нечего.
у меня WMS тайлованый, там видно в начале поста

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

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

Сообщение Denis Rykov » 20 фев 2017, 18:01

Филиппов Владислав писал(а):в версиях 3.х нужно было у слоя взять getSource(), типа источник, и у него спросить экстент (я так думаю, гетКапабилитес использовали)
О каком типе сорса идёт речь? Я не могу найти подобного функционала. Простое решение - распарсить ответ GetCapabilities, используя ol.format.WMSCapabilities и узнать об охватах данных каждого слоя (если там, конечно, корректная информация).
Spatial is now, more than ever, just another column- The Geometry Column.

ericsson
Гуру
Сообщения: 3189
Зарегистрирован: 27 июл 2009, 19:26
Репутация: 682
Ваше звание: Вредитель полей

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

Сообщение ericsson » 20 фев 2017, 20:52

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

Аватара пользователя
Филиппов Владислав
Гуру
Сообщения: 959
Зарегистрирован: 17 фев 2006, 06:28
Проекты: 1
Репутация: 131
Ваше звание: Геннадич
Откуда: Новосибирск
Контактная информация:

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 КБ) 1343 просмотра

Ответить

Вернуться в «Веб-картография»