Использование контрола WMSGetFeatureInfo в OpenLayers: различия между версиями

Материал из GIS-Lab
Перейти к навигации Перейти к поиску
Нет описания правки
мНет описания правки
 
(не показано 16 промежуточных версий 2 участников)
Строка 1: Строка 1:
{{Статья|Опубликована|wmsgetfeatureinfo}}
{{Аннотация|Приведены основные настройки контрола WMSGetFeatureInfo, использующегося в [http://openlayers.org/ OpenLayers] и показан базовый пример его использования.}}
== Введение ==
== Введение ==
[http://www.opengeospatial.org/standards/wms Web Map Service Interface Standard] (WMS) предоставляет простой HTTP-интерфейс для передачи клиенту изображений, имеющих географическую привязку. WMS-запрос обязательно содержит наименования запрашиваемого слоя и требуемый охват, а WMS-ответ представляет собой одно или несколько растровых изображений. Кроме того WMS поддерживает опцию прозрачности, позволяющую использовать WMS-слои совместно с остальными, не перекрывая их. Любой WMS-сервер в обязательном порядке поддерживает два типа типа запросов: GetCapabilities (возвращает описание конкретного WMS-сервиса и перечень доступных слоёв) и GetMap (непосредственно запрос изображений), остальные типы, описанные в стандарте, поддерживаются факультативно. Среди этих типов присутствует и GetFeatureInfo, позволяющий запрашивать атрибутивную информацию об объекте, расположенном по указаным координатам. Именно этот тип запроса используется во многих клиентских приложениях и со стороны пользователя может выглядеть, например, как всплывающее окно с информацией об объекте, появляющееся после клика на нём.
[http://www.opengeospatial.org/standards/wms Web Map Service Interface Standard] (WMS) предоставляет простой HTTP-интерфейс для передачи клиенту изображений, имеющих географическую привязку. WMS-запрос обязательно содержит наименования запрашиваемого слоя и требуемый охват, а WMS-ответ представляет собой одно или несколько растровых изображений. Кроме того WMS поддерживает опцию прозрачности, позволяющую использовать WMS-слои совместно с другими слоями, не перекрывая их. Любой сервер WMS в обязательном порядке поддерживает два основных запроса:  
 
*GetCapabilities - возвращает описание конкретного сервиса WMS и перечень доступных слоёв
В данной заметке приведены основные настройки контрола WMSGetFeatureInfo, использующегося в [http://openlayers.org/ OpenLayers] и показан базовый пример его использования.
*GetMap - непосредственно запрос изображений.
остальные запросы, описанные в стандарте, поддерживаются факультативно. Среди них есть и GetFeatureInfo, позволяющий запрашивать атрибутивную информацию об объекте, расположенном по указанным координатам. Именно этот тип запроса используется во многих клиентских приложениях и со стороны пользователя может выглядеть, например, как всплывающее окно с информацией об объекте, появляющееся после щелчка на объекте.


== Настройки WMSGetFeatureInfo ==
== Настройки WMSGetFeatureInfo ==
Строка 13: Строка 16:
| hover
| hover
| {Boolean}
| {Boolean}
| Запрос GetFeatureInfo выполняется при задержки курсора мыши над объектом. По умолчанию false.
| Запрос GetFeatureInfo выполняется при задержке курсора мыши над объектом. По умолчанию ''false'' и запрос выполняется только по щелчку.
|- 
|- 
| maxFeatures
| maxFeatures
Строка 21: Строка 24:
| layers
| layers
| {Array(OpenLayers.Layer.WMS)}
| {Array(OpenLayers.Layer.WMS)}
| Список слоёв к которым будет выполнен запрос GetFeatureInfo. Если значение не определено, то будут использованы все WMS-слои карты, url которых совпадает со значением свойства url самого контрола или одним из url из массива layerUrls. По умолчанию не определено.
| Список слоёв, к которым будет выполнен запрос GetFeatureInfo. Если значение не определено, то будут использованы все WMS-слои карты, url которых совпадает со значением свойства url самого контрола или одним из url из массива layerUrls. По умолчанию не определено.
|-
|-
| queryVisible
| queryVisible
| {Boolean}
| {Boolean}
| Исключает скрытые слои из запроса GetFeatureInfo. По умолчанию false, то есть если, например, слой присутствует среди слоёв, описанных в массиве layers, но при этом выключен на карте, то запрос GetFeatureInfo к этому слою всё равно будет выполнен.
| Если ''true'', исключает скрытые слои из запроса GetFeatureInfo. По умолчанию ''false'', то есть, если слой присутствует среди слоёв, описанных в массиве layers, но при этом выключен на карте, то запрос GetFeatureInfo к этому слою всё равно будет выполнен.
|-
|-
| url
| url
| {String}
| {String}
| URL WMS-сервиса к которому будет осуществляться запрос. Если не установлено при создании контрола WMSGetFeatureInfo, то в качестве значения будет использованo свойство url первого подходящего слоя. По умолчанию не определено.
| URL сервиса WMS к которому будет осуществляться запрос. Если url не задан при создании контрола WMSGetFeatureInfo, то в качестве значения будет использовано свойство url первого подходящего слоя. По умолчанию не определено.
|-
|-
| infoFormat
| infoFormat
| {String}
| {String}
| MIME-тип ответа, который должен отдать сервер. По умолчанию ''text/html''. При использовании в качестве WMS-сервера MapServer может быть использован один из трёх типов: text/plain, text/html или application/vnd.ogc.gml.
| MIME-тип ответа, который должен отдать сервер. По умолчанию ''text/html''. При использовании в качестве сервера WMS MapServer может быть использован один из трёх типов: ''text/plain'', ''text/html'' или ''application/vnd.ogc.gml''.
|-
|-
| vendorParams
| vendorParams
Строка 41: Строка 44:
| format
| format
| {OpenLayers.Format}
| {OpenLayers.Format}
| Формат, используемый для парсинга ответа. По умолчанию OpenLayers.Format.WMSGetFeatureInfo.
| Формат, используемый для парсинга ответа. По умолчанию OpenLayers.Format.WMSGetFeatureInfo, поэтому для корректного парсинга значение infoFormat контрола должно быть установлено в значение ''application/vnd.ogc.gml''.
|}
|}


Полный список доступных свойств и методов доступен в официальной [http://dev.openlayers.org/releases/OpenLayers-2.11/doc/devdocs/files/OpenLayers/Control/WMSGetFeatureInfo-js.html документации].
Полный список доступных свойств и методов доступен в официальной [http://dev.openlayers.org/releases/OpenLayers-2.11/doc/devdocs/files/OpenLayers/Control/WMSGetFeatureInfo-js.html документации]. Здесь же хотелось бы остановить внимание еще на одном свойстве контрола WMSGetFeatureInfo, наследуемого от OpenLayers.Control - eventListeners. Это объект, который позволяет слушать различные события, происходящие с контролом. Для WMSGetFeatureInfo доступно 3 таких события: ''beforegetfeatureinfo'', ''nogetfeatureinfo'', ''getfeatureinfo''.
 
* ''beforegetfeatureinfo'' срабатывает перед отправкой запроса на сервер, данное событие удобно использовать, если при каждом запросе к серверу требуется передавать какой-либо изменяющийся параметр. Например:
Здесь же хотелось бы остановить внимание еще на одном свойстве контрола WMSGetFeatureInfo, наследуемого от OpenLayers.Control - eventListeners - объекта, позволяющего слушать различные события, происходящие с контролом. Для WMSGetFeatureInfo доступно 3 таких события: ''beforegetfeatureinfo'', ''nogetfeatureinfo'', ''getfeatureinfo''.
''beforegetfeatureinfo'' срабатывает перед отправкой запроса на сервер, данное событие удобно использовать, например, если при каждом запросе к серверу требуется передавать какой-либо изменяющийся параметр. Например:
<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
eventListeners: {
eventListeners: {
Строка 53: Строка 54:
         this.vendorParams.settings = Math.random();
         this.vendorParams.settings = Math.random();
     }
     }
}
</syntaxhighlight>
</syntaxhighlight>
''nogetfeatureinfo'' срабатывает в случае если не определено ни одного слоя для запроса. И самое важно событие - ''getfeatureinfo'' наступает в момент прихода ответа от сервера.
* ''nogetfeatureinfo'' срабатывает в случае если не определено ни одного слоя для запроса.
* ''getfeatureinfo'' наступает в момент получения ответа от сервера.


== Пример использования WMSGetFeatureInfo ==
== Пример использования WMSGetFeatureInfo ==
Создадим WMS слой и добавим контрол WMSGetFeatureInfo для запроса информации об объектах этого слоя:
Создадим слой WMS и добавим контрол WMSGetFeatureInfo для запроса информации об объектах этого слоя:


<syntaxhighlight lang="javascript">
<syntaxhighlight lang="javascript">
//Создание карты
//Создание карты
map = new OpenLayers.Map('map', ...);
map = new OpenLayers.Map('map');


// Создание WMS-слоя
// Создание WMS-слоя
Строка 85: Строка 88:
     eventListeners: {
     eventListeners: {
         'getfeatureinfo': function(e) {
         'getfeatureinfo': function(e) {
             console.log(e);
            // Текстовое представление ответа сервера
        }
            console.log(e.text);
 
            // Координаты клика
            console.log(e.xy);
 
            // Список объектов OpenLayers.Feature.Vector, содержащих в атрибутике информацию, полученную с сервера
             console.log(e.features);
        }
     }
     }
});
});
Строка 93: Строка 103:
map.addControl(click_ctrl);
map.addControl(click_ctrl);
</syntaxhighlight>
</syntaxhighlight>
В данном примере при клике на объекте слоя ''report'' будет выполнен запрос GetFeatureInfo к WMS-серверу и при получении ответа (событие ''getfeatureinfo'') будет выведен в консоль. Если с ответом нужно производить какие-то действия (выводить информацию во всплывающем окне, представить в виде таблицы и т.п.), то ''console.log(e)'' необходимо заменить на необходимый функционал.
В данном примере при клике на объекте слоя ''report'' будет выполнен запрос GetFeatureInfo к серверу WMS и при получении ответа (событие ''getfeatureinfo'') в консоль будут выведено несколько свойств объекта события. Если с ответом нужно производить какие-то действия (выводить информацию во всплывающем окне, представить в виде таблицы и т.п.), то ''console.log()'' необходимо заменить на необходимый функционал.
 
Если в качестве сервера WMS используется MapServer, то настоятельно рекомендуется ознакомиться со статьёй [http://gis-lab.info/qa/mapserver-getfeatureinfo.html Особенности работы с запросами GetFeatureInfo для организации сервиса WMS на базе MapServer].
 
== Cross-domain security ==
Политика безопасности JavaScript запрещает обращаться на другие серверы. Поэтому если домен (включая номер порта) на котором расположен сервер WMS отличается от домена на котором расположено само web-приложение, то для функционирования контрола WMSGetFeatureInfo потребуется создать proxy-скрипт (используя, например, php или python), который будет обрабатываться тем же сервером, на котором расположено web-приложение. Можно воспользоваться штатным скриптом из состава OpenLayers или [http://trac.osgeo.org/openlayers/browser/trunk/openlayers/examples/proxy.cgi скачать] его отдельно. Этот скрипт написан на python, поэтому для его функционирования на сервере должен быть установлен соответствующий интерпретатор. Настройка прокси заключается в указании перечня доменов к которым разрешено обращаться. Для наших целей достаточно добавить в массив ''allowedHosts'' адрес домена по которому расположен сервер WMS. Дополнительно о настройке ProxyHost можно прочитать [http://trac.osgeo.org/openlayers/wiki/FrequentlyAskedQuestions#ProxyHost здесь].

Текущая версия от 07:13, 26 марта 2012

Эта страница опубликована в основном списке статей сайта
по адресу http://gis-lab.info/qa/wmsgetfeatureinfo.html


Приведены основные настройки контрола WMSGetFeatureInfo, использующегося в OpenLayers и показан базовый пример его использования.

Введение

Web Map Service Interface Standard (WMS) предоставляет простой HTTP-интерфейс для передачи клиенту изображений, имеющих географическую привязку. WMS-запрос обязательно содержит наименования запрашиваемого слоя и требуемый охват, а WMS-ответ представляет собой одно или несколько растровых изображений. Кроме того WMS поддерживает опцию прозрачности, позволяющую использовать WMS-слои совместно с другими слоями, не перекрывая их. Любой сервер WMS в обязательном порядке поддерживает два основных запроса:

  • GetCapabilities - возвращает описание конкретного сервиса WMS и перечень доступных слоёв
  • GetMap - непосредственно запрос изображений.

остальные запросы, описанные в стандарте, поддерживаются факультативно. Среди них есть и GetFeatureInfo, позволяющий запрашивать атрибутивную информацию об объекте, расположенном по указанным координатам. Именно этот тип запроса используется во многих клиентских приложениях и со стороны пользователя может выглядеть, например, как всплывающее окно с информацией об объекте, появляющееся после щелчка на объекте.

Настройки WMSGetFeatureInfo

Краткий перечень наиболее часто используемых настроек контрола:

Свойство Тип Описание
hover {Boolean} Запрос GetFeatureInfo выполняется при задержке курсора мыши над объектом. По умолчанию false и запрос выполняется только по щелчку.
maxFeatures {Integer} Максимальное количество возвращаемых записей, определяет значение параметра FEATURE_COUNT запроса GetFeatureInfo. По умолчанию 10.
layers {Array(OpenLayers.Layer.WMS)} Список слоёв, к которым будет выполнен запрос GetFeatureInfo. Если значение не определено, то будут использованы все WMS-слои карты, url которых совпадает со значением свойства url самого контрола или одним из url из массива layerUrls. По умолчанию не определено.
queryVisible {Boolean} Если true, исключает скрытые слои из запроса GetFeatureInfo. По умолчанию false, то есть, если слой присутствует среди слоёв, описанных в массиве layers, но при этом выключен на карте, то запрос GetFeatureInfo к этому слою всё равно будет выполнен.
url {String} URL сервиса WMS к которому будет осуществляться запрос. Если url не задан при создании контрола WMSGetFeatureInfo, то в качестве значения будет использовано свойство url первого подходящего слоя. По умолчанию не определено.
infoFormat {String} MIME-тип ответа, который должен отдать сервер. По умолчанию text/html. При использовании в качестве сервера WMS MapServer может быть использован один из трёх типов: text/plain, text/html или application/vnd.ogc.gml.
vendorParams {Object} Дополнительные параметры, которые будут включены в строку запроса. Например, при таком определении данного свойства: {radius: 10} в запрос добавится подстрока "&RADIUS=10"
format {OpenLayers.Format} Формат, используемый для парсинга ответа. По умолчанию OpenLayers.Format.WMSGetFeatureInfo, поэтому для корректного парсинга значение infoFormat контрола должно быть установлено в значение application/vnd.ogc.gml.

Полный список доступных свойств и методов доступен в официальной документации. Здесь же хотелось бы остановить внимание еще на одном свойстве контрола WMSGetFeatureInfo, наследуемого от OpenLayers.Control - eventListeners. Это объект, который позволяет слушать различные события, происходящие с контролом. Для WMSGetFeatureInfo доступно 3 таких события: beforegetfeatureinfo, nogetfeatureinfo, getfeatureinfo.

  • beforegetfeatureinfo срабатывает перед отправкой запроса на сервер, данное событие удобно использовать, если при каждом запросе к серверу требуется передавать какой-либо изменяющийся параметр. Например:
eventListeners: {
    'beforegetfeatureinfo': function() {
        this.vendorParams.settings = Math.random();
    }
}
  • nogetfeatureinfo срабатывает в случае если не определено ни одного слоя для запроса.
  • getfeatureinfo наступает в момент получения ответа от сервера.

Пример использования WMSGetFeatureInfo

Создадим слой WMS и добавим контрол WMSGetFeatureInfo для запроса информации об объектах этого слоя:

//Создание карты
map = new OpenLayers.Map('map');

// Создание WMS-слоя
var report = new OpenLayers.Layer.WMS('report',
    "http://gis-lab.info/cgi-bin/mapserv?map=/usr/local/www/website/map/wms.map",
    {layers: "report_l", transparent: true},
    {isBaseLayer: false, opacity: 1, singleTile: true, visibility: true}
);
map.addLayers([report]);

// Создание контрола WMSGetFeatureInfo
var click_ctrl = new OpenLayers.Control.WMSGetFeatureInfo({
    url: "http://gis-lab.info/cgi-bin/mapserv?map=/usr/local/www/website/map/wms.map",
    layers: [report],
    queryVisible: true,
    infoFormat: 'application/vnd.ogc.gml',
    maxFeatures: 50,
    autoActivate: true,
    // Vendor-specific параметр, используемый в MapServer (радиус поиска объектов в пикселях)
    vendorParams: {
        radius: 10
    },
    eventListeners: {
        'getfeatureinfo': function(e) {
            // Текстовое представление ответа сервера
            console.log(e.text);

            // Координаты клика
            console.log(e.xy);

            // Список объектов OpenLayers.Feature.Vector, содержащих в атрибутике информацию, полученную с сервера
            console.log(e.features);
         }
    }
});

// Добавляем контрол на карту
map.addControl(click_ctrl);

В данном примере при клике на объекте слоя report будет выполнен запрос GetFeatureInfo к серверу WMS и при получении ответа (событие getfeatureinfo) в консоль будут выведено несколько свойств объекта события. Если с ответом нужно производить какие-то действия (выводить информацию во всплывающем окне, представить в виде таблицы и т.п.), то console.log() необходимо заменить на необходимый функционал.

Если в качестве сервера WMS используется MapServer, то настоятельно рекомендуется ознакомиться со статьёй Особенности работы с запросами GetFeatureInfo для организации сервиса WMS на базе MapServer.

Cross-domain security

Политика безопасности JavaScript запрещает обращаться на другие серверы. Поэтому если домен (включая номер порта) на котором расположен сервер WMS отличается от домена на котором расположено само web-приложение, то для функционирования контрола WMSGetFeatureInfo потребуется создать proxy-скрипт (используя, например, php или python), который будет обрабатываться тем же сервером, на котором расположено web-приложение. Можно воспользоваться штатным скриптом из состава OpenLayers или скачать его отдельно. Этот скрипт написан на python, поэтому для его функционирования на сервере должен быть установлен соответствующий интерпретатор. Настройка прокси заключается в указании перечня доменов к которым разрешено обращаться. Для наших целей достаточно добавить в массив allowedHosts адрес домена по которому расположен сервер WMS. Дополнительно о настройке ProxyHost можно прочитать здесь.