Страница 1 из 2
Центр слоя
Добавлено: 15 май 2012, 18:32
kliver
Добрый вечер.
Хочу поинтересоваться, возможно ли используя геосервер и опенлаерс отображать при загрузке страницы центр wms слоя? Этот слой постоянно изменяется, появляются новые полигоны. Как понимаю за это отвечает OpenLayers.Bounds.
Сейчас я их устанавливаю переписыванием значения из геосервера вручную. Можно ли как то автоматизировать этот процесс? Или лишь вручную можно задать максимально возможную границу?
Еще попутно такой вопрос. В qgis я создаю полигоны около Екатеринбурга. У проекта выставлена epsg:900913. Затем сохраняю слой в mif файл и ставлю свою ск. Загружаю файл в postgis в которой так же есть строка с определением моей ск. Далее делаю wms в geoserver из загруженного файла в постгис. В Geoserver так же занесена моя ск. У wms слоя я ставлю epsg:900913. При создании карты средствами Openlayers в свойствах проставляю projection:"EPSG:900913"....и полигоны оказываются в Камеруне. На каком этапе возможна ошибка?
Re: Центр слоя
Добавлено: 16 май 2012, 06:59
Denis Rykov
По первому вопросу: чтобы вытянуть, допустим, bbox слоя с именем myLayerName по WMS, нужно спросить его у WMS-сервера, используя запрос GetCapabilities. В OpenLayers это будет выглядеть так:
Код: Выделить всё
wms = new OpenLayers.Format.WMSCapabilities();
OpenLayers.Request.GET({
url:"wmsURL&service=WMS&request=GetCapabilities",
success: function(e){
response = wms.read(e.responseText);
}
});
capability = response.capability;
for (var i=0, len=capability.layers.length; i<len; i+=1) {
var layerObj = capability.layers;
if (layerObj.name === myLayerName) {
map.zoomToExtent(OpenLayers.Bounds.fromArray(layerObj.llbbox));
break;
}
}
По второму вопросу ничего не понял. Сами данные в какой проекции хранятся?
Re: Центр слоя
Добавлено: 17 май 2012, 12:02
kliver
По второму вопросу я сумбурно конечно спросил, но уже разобрался с ошибкой.
А по первому. Функция getExtent() возвращает тот же самый bbox или это разные вещи?
Просто сейчас пытаюсь сделать так что бы при фильтрации слоя, то есть оставлении на нем только одного полигона карта фокусировалась на нем.
Делаю так
Но ничего не происходит
Re: Центр слоя
Добавлено: 17 май 2012, 12:16
Denis Rykov
getExtent же возвращает текущий охват, поэтому смысл ваших действий сводится к тому что вы получаете текущий охват и говорите OL - сделай зум на текущий охват, естественно, ничего не произойдёт. А как фильтрация объектов слоя по вашему должна повлиять на его охват? Ответ - никак. Охват слоя (если мы говорим про WMS) - это его атрибут, который задаётся на этапе его описания на сервере, именно этот атрибут я и предлагал вам получать в предыдущем посте. Если бы у вас был векторный слой, то можно прямо на клиенте получить охват определенного набора объектов, если же слой растровый, то для этого нужно отправить на сервер, например, id объектов, рассчитать bbox, вернуть его клиенту и уже только потом зумить.
Re: Центр слоя
Добавлено: 17 май 2012, 12:21
kliver
Я записал maxExtent по размеру Свердловской области в настройках map. Потом программно выбираю полигоны которые хочу оставить в слое. И после фильтрации вызываю getExtent и вывожу в алерт. И он изменяется.
Но охват все равно не меняется и остается равным первоначально записаному?
Re: Центр слоя
Добавлено: 17 май 2012, 12:26
Denis Rykov
Я чего-то не понимаю, какие полигоны? У вас векторный слой? В первом посте вы написали, что речь идёт о WMS.
Re: Центр слоя
Добавлено: 17 май 2012, 12:33
kliver
Да WMS слой. На нем полигоны. Я путаюсь в формулировке?
Re: Центр слоя
Добавлено: 17 май 2012, 12:35
Denis Rykov
А как вы программно выбираете полигоны на WMS-слое?
Re: Центр слоя
Добавлено: 17 май 2012, 12:36
kliver
CQL фильтр
Научный руководитель пояснил мне, что getExtent() то что мне нужно. И это наверное я просто ввел вас в заблуждение своими точными вопросами.
Но теперь тогда дело в другом getExtent() возвращает что то неверное. Сначала подумал, что дело в проекции.
и сделал
Код: Выделить всё
projection = new OpenLayers.Projection('EPSG: 70066');
displayProjection = new OpenLayers.Projection('EPSG: 900913');
ex=layer.getExtent().transform(projection, displayProjection);
И это при том что в настройках слоя на геосервере выставлено native srs=70066, declared srs=900913 и задано reproject native to declared.
Но это не дало результатов все равно функция возвращает не те результаты.
Re: Центр слоя
Добавлено: 18 май 2012, 10:00
Denis Rykov
Если у вас нет векторных данных, то единственный способ получить охват - запрашивать его с сервера. Вы пробовали мой пример с GetCapabilities?
Re: Центр слоя
Добавлено: 18 май 2012, 11:48
kliver
Да попробовал, но не уверен, что сделал все верно.
Код: Выделить всё
wms = new OpenLayers.Format.WMSCapabilities();
OpenLayers.Request.GET({
url:"http://localhost:8080/geoserver/wms/filedata?request=GetCapabilities",
success: function(e){
response = wms.read(e.responseText);
}
});
capability = response .capability;
for (var i=0, len=capability.layers.length; i<len; i+=1) {
var layerObj = capability.layers[i];
if (layerObj.name === filedata) {
map.zoomToExtent(OpenLayers.Bounds.fromArray(layerObj.llbbox));
break;
}
}
И огнежук сказал что response is not defined. Я неверное что то сделал. Ссылка вроде та, по крайней мере если просто ввести ее в адресную строку то капабилитиес вернется.
И еще пожайста я хотел уточни по формулировке. Если я делаю слой на геосервере из постгис таблицы. То что это будет wms слой или векторный? Заранее извините за глупый вопрос.
На стокекчендже говорят что из wms вообще никак не получить bbox. Нужно создавать wfs и использовать функцию getDataExtent(). По какому пути все таки идти?
Re: Центр слоя
Добавлено: 18 май 2012, 12:39
Denis Rykov
Данные PostGIS таблицы можно опубликовать как растр (WMS) и как вектор (WFS). Не уверен, что нельзя обойтись без WFS. Уберите пробел перед точкой:
Re: Центр слоя
Добавлено: 18 май 2012, 12:46
kliver
Но ваш пример про капабилитес работает и с вмс?
Пробел уже убран.
Re: Центр слоя
Добавлено: 18 май 2012, 12:57
Denis Rykov
Код: Выделить всё
success: function(e){
console.log(e);
response = wms.read(e.responseText);
}
Посмотрите в фаербаге что записано в свойстве responseText объекта e и выложите куда-нибудь текст того, что возвращает GetCapabilities.
Re: Центр слоя
Добавлено: 18 май 2012, 13:14
kliver
http://ifolder.ru/30560624
В геткапабилитиес тоже самое.