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

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

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

Сообщение 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>';
}
};

А мне нужно получить информацию о всех объектах выделенных в области(многоугольник). В коде отсев идет по координатам клика .
Можно ли указать в параметрах отсева координаты области или есть какой-нибудь другой способ?
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение 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); 
лангольеры под окном жрали время ом-ном-ном
Amayak
Новоприбывший
Сообщения: 8
Зарегистрирован: 11 ноя 2010, 07:39
Репутация: 0

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

Сообщение Amayak »

А как сделать чтобы инфу об объекты показать в popup-е.
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

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

Сообщение 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); 
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение 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.
лангольеры под окном жрали время ом-ном-ном
Kris
Интересующийся
Сообщения: 37
Зарегистрирован: 31 май 2011, 03:09
Репутация: 0

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

Сообщение Kris »

Mavka, спасибо за объяснение, помощь по контроллерам пригодилась в другом вопросе. Но что касается этого вопроса, я не хочу вешать запрос на контроллер в том виде, в котором это показано в примере.
Я нашел еще один более подходящий пример, но я не нашел, за что отвечает параметр filter в 46 строке. И можете дать ссылку, где можно посмотреть список параметров для request: 'GetFeature'?
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka »

Строка 46 - см. Filter Encoding (OGC FE) в "Серверы WMS и фильтрация данных"
GetFeature - см. WFS
лангольеры под окном жрали время ом-ном-ном
Tink
Участник
Сообщения: 50
Зарегистрирован: 20 июл 2012, 15:49
Репутация: 4

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

Сообщение Tink »

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

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




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

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

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 2 гостя