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

Запрос инфорации об обьектах, выдеененых Poligon в OpenLayer

Добавлено: 25 авг 2011, 09:09
Kris
Как получить информацию об объектах(точка) выделенных с помощью произвольного многоугольника?

У меня есть код, позволяющий при клике на точку, получить для нее информацию:

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

map.events.register('click', map, function (e) {
document.getElementById('nodelist').innerHTML = "Загрузка... подождите...";
var params = {
REQUEST: "GetFeatureInfo",
EXCEPTIONS: "application/vnd.ogc.se_xml",
BBOX: map.getExtent().toBBOX(),
X: e.xy.x,
Y: e.xy.y,
INFO_FORMAT: 'text/html',
QUERY_LAYERS: map.layers[2].params.LAYERS,
FEATURE_COUNT: 50,
Layers: 'intranet_gen:earthquakes_catalog_of_sakhalin',
Styles: '',
Srs: 'EPSG:4326',
WIDTH: map.size.w,
HEIGHT: map.size.h,
format: format};
if(cql_query)
{ params.CQL_FILTER=cql_query; }
OpenLayers.loadURL("http://geo.febras.net/geoserver/wms", params, this, setHTML, setHTML);
OpenLayers.Event.stop(e);
});

и

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

function setHTML(response){
var http;
if (response.responseText != "") {
document.getElementById('nodelist').innerHTML = response.responseText;
}
else
{
document.getElementById('nodelist').innerHTML = '<html> <body>Данные не могут быть загружены</body> </html>';
}
};

А мне нужно получить информацию о всех объектах выделенных в области(многоугольник). В коде отсев идет по координатам клика .
Можно ли указать в параметрах отсева координаты области или есть какой-нибудь другой способ?

Re: Запрос инфорации об обьектах, выдеененых Poligon в OpenL

Добавлено: 25 авг 2011, 09:40
Mavka
Если простой прямоугольник, то делается с помощью
OpenLayers.​Control.​GetFeature (пример)

Для произвольного многоугольника его нужно сперва нарисовать, а потом использовать в качестве фильтра для WFS-запроса GetFeature. Например, используя CQL (передается в группе params) фильтр будет выглядеть примерно так:

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

CQL_FILTER=INTERSECTS(the_geom, POLYGON((10 10, 20 10, 20 20, 10 10)) 
Получить описание геометрии в формате WKT можно методом extractGeometry:

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

format = new OpenLayers.Format.WKT;
format.extractGeometry(feature.geometry); 

Re: Запрос инфорации об обьектах, выдеененых Poligon в OpenL

Добавлено: 15 сен 2011, 20:30
Amayak
А как сделать чтобы инфу об объекты показать в popup-е.

Re: Запрос инфорации об обьектах, выдеененых Poligon в OpenL

Добавлено: 23 сен 2011, 03:36
Kris
С рисованием полигона проблем нет.
Mavka, Вы можете немного подробнее расписать как вызвать WFS-запрос GetFeature? Я не совсем понимаю принцип работы, даже из примера.Конкретнее не понимаю как работает этот код(ниже), и как его использовать для запросов, например по нажатию кнопки.

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

control.events.register("featureselected", this, function(e) {
                select.addFeatures([e.feature]);
            });
            control.events.register("featureunselected", this, function(e) {
                select.removeFeatures([e.feature]);
            });
            control.events.register("hoverfeature", this, function(e) {
                hover.addFeatures([e.feature]);
            });
            control.events.register("outfeature", this, function(e) {
                hover.removeFeatures([e.feature]);
            });
Результатом запроса является только описание геометрии(т.е координаты точек), или же результат будет аналогичен результату запроса GetFeatureInfo?

И еще, что такое feature.geometry, в коде:

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

format = new OpenLayers.Format.WKT;
format.extractGeometry(feature.geometry); 

Re: Запрос инфорации об обьектах, выдеененых Poligon в OpenL

Добавлено: 24 сен 2011, 00:41
Mavka
Про события в OpenLayers см. здесь.

Контроллер GetFeature слушает несколько событий браузера, в том числе и mouse click. В этот момент он загружает данные по заданному протоколу (обычно, это WFS) и сам генерирует несколько новых событий, например - "объект загружен" (featureselected).

Соответственно, событию featureselected может быть назначен свой обработчик. Как правило, это добавление полученного с сервера объекта на векторный слой - в примере так и сделано:

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

select.addFeatures([e.feature]);

Если задан параметр single, то контроллер загружает с сервера несколько объектов (например, точка попала в несколько полигонов сразу) и выбирает из них наиболее удачный. Для удачного потом генерирует featureselected, а для остальных featureunselected. Но т.к. контроллер кэширует ответы в массиве features, то под featureunselected попадают вообще все ранее загруженные объекты. Поэтому, хоть контроллер и не связан со слоем напрямую, но может удалить ранее добавленные объекты:

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

control.events.register("featureunselected", this, function(e) {
select.removeFeatures([e.feature]);
});

Следующие два события, hoverfeature и outfeature, проявляются только в режиме hover. Это когда мышкой не щелкать, а просто навести ее и подождать (по-умолчанию, 250 мс). Все аналогично предыдущим событиям.
Kris писал(а):Результатом запроса является только описание геометрии(т.е координаты точек), или же результат будет аналогичен результату запроса GetFeatureInfo?
Да, аналогично GetFeatureInfo. Мне лень смотреть, но предполагаю что это будет объект класса OpenLayers.Feature.Vector.
Kris писал(а):И еще, что такое feature.geometry, в коде
В том смысле, что берется слой Vector. На нем рисуется объект. А потом из этого объекта берется только геометрия. Ну, в Feature.Vector еще много чего имеется - атрибуты, bbox, стили. А для фильтра берем геометрию. Если ближе знакомы с GetFeatureInfo, то в нем тоже можно посмотреть feature.geometry.

Re: Запрос инфорации об обьектах, выдеененых Poligon в OpenL

Добавлено: 26 сен 2011, 04:16
Kris
Mavka, спасибо за объяснение, помощь по контроллерам пригодилась в другом вопросе. Но что касается этого вопроса, я не хочу вешать запрос на контроллер в том виде, в котором это показано в примере.
Я нашел еще один более подходящий пример, но я не нашел, за что отвечает параметр filter в 46 строке. И можете дать ссылку, где можно посмотреть список параметров для request: 'GetFeature'?

Re: Запрос инфорации об обьектах, выдеененых Poligon в OpenL

Добавлено: 26 сен 2011, 09:07
Mavka
Строка 46 - см. Filter Encoding (OGC FE) в "Серверы WMS и фильтрация данных"
GetFeature - см. WFS

Re: Запрос инфорации об обьектах, выдеененых Poligon в OpenL

Добавлено: 04 фев 2013, 08:48
Tink
Да, применительно к WFS это отличный подход (я имею введу отбор через SLD).
Но к WMS мне подобный подход применить не удалось... ни с фильтром, ни с SLD...
См. Фильтрация объектов в WMS в GeoServer

Есть ли способ запроса WMS только по объектам удовлетворяющих некоторыми условиям ?
Для меня желателен отбор объектов под произвольным полигоном (и я имею введу именно отбор объектов, без изменения стиля отрисовки)... То есть нужно всего лишь показать объекты под полигоном стилем заданным на GeoServer




PS
Вопрос снимаю :!:
Ответы нашел тут (CQL and ECQL) и тут (ECQL Reference) :D