Страница 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
				
			 
			
					
				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 (18.82 КБ) 10210 просмотров