Запрос GetFeatureInfo возвращает информацию об объекте (объектах), расположенных в локации запроса, указанного, например, кликом мыши.
Обсудить в форуме Комментариев 3
Создание сервиса WMS с помощью MapServer описано в соответствующей статье. Эта статья рассматривает некоторые особенности настройки слоёв WMS, доступных для запросов GetFeatureInfo, которые применяются для получения информации об объектах.
В MapServer результат ответа на запрос GetFeatureInfo может быть представлен в одном из трёх форматов:
Чтобы сообщить MapServer в каком виде вы хотите получить результаты, необходимо в URL как параметр передать нужный формат, например, info_format=application/vnd.ogc.gml. Если в info_format ничего не передавать, то результат будет возвращен в формате text/plain. Далее рассмотрим особенности использования каждого формата.
Вне зависимости от формата ответа, обязательным условием использования запросов является присутствие в разделе LAYER тега "TEMPLATE" с указанием на некоторый файл (фактически, этот файл может быть пустым или вовсе отсутствовать), иначе вы будете получать сообщение об ошибке Requested layer(s) are not queryable. Файл, указанный в этом теге, будет непосредственно использоваться только в случае формата ответа text/html. Соответственно, если используется этот формат, файл должен существовать.
MAP
...
LAYER
...
TEMPLATE template.html
...
END
...
END
Для запроса результатов в этом формате, необходимо передать в URL info_format=text/plain, либо ничего не передавать, так как этот формат ответа используется по умолчанию. Также, по умолчанию результат запроса в text/plain всегда пуст, по причине того, что все атрибутивные поля слоя заблокированы. Чтобы снять блокировку, необходимо воспользоваться недокументированным тегом wms_include_items, поместив его в раздел METADATA объекта LAYER и выставив в значение "all":
MAP
...
LAYER
...
METADATA
...
wms_include_items "all"
...
END
...
END
...
END
Ответ в формате text/plain будет иметь следующий вид:
GetFeatureInfo results: Layer 'soils' Feature 0: gid = '6' id = '3' FAOSOIL = 'I-Gx-Rx-2c' UNIT = 'I' TYPE = 'LITHOSOLS' NAME = 'Литосоли'
Для запроса результатов в этом формате, необходимо передать в URL info_format=text/html. Однако это не всё, если просто передать этот параметр, то в ответ придёт ошибка WMS server error. Unsupported INFO_FORMAT value (text/html). Для устранения этой ошибки в раздел WEB/METADATA должна быть включена инструкция "wms_feature_info_mime_type text/html".
MAP
...
WEB
...
METADATA
...
wms_feature_info_mime_type "text/html"
...
END
...
END
...
END
Чтобы сервер смог вернуть ответ в указанном формате, файл шаблона должен быть оформлен надлежащим образом (в том числе разделен на "HEADER", "TEMPLATE" и "FOOTER"). Условие разнесения шаблона по трём файлам - очень важно, файл, указанный в "HEADER", обрабатывается единожды, в то время как обращение к файлу "TEMPLATE" происходит каждый раз по мере извлечения записей из БД или файла данных, после того, как все записи были извлечены, обрабатывается файл "FOOTER". В файл "HEADER" можно включить, например, ссылку на CSS таблицу и в результате получать достаточно красиво оформленные результаты запросов.
MAP
...
LAYER
...
HEADER header.html
TEMPLATE template.html
FOOTER footer.html
...
END
...
END
Пример содержимого "HEADER" (файл header.html):
<!-- MapServer Template -->
<html>
<head>
<link rel="stylesheet" href="style.css" type="text/css" />
<meta http-equiv="content-type" content="text/html; charset=UTF-8"></meta>
<title>GetFeatureInfo Response</title>
</head>
<body>
<table>
<caption>Имя слоя: soils</caption>
<tbody>
<th>FAOSOIL</th>
<th>UNIT</th>
<th>TYPE</th>
<th>NAME</th>
Пример содержимого "TEMPLATE" (файл template.html, содержит список полей запроса):
<!-- MapServer Template -->
<tr>
<td>[item name=FAOSOIL format=$value escape=none]</td>
<td>[item name=UNIT format=$value escape=none]</td>
<td>[item name=TYPE format=$value escape=none]</td>
<td>[item name=NAME format=$value escape=none]</td>
</tr>
Описание параметров шаблона доступно в документации.
Пример содержимого "FOOTER" (файл footer.html):
<!-- MapServer Template -->
</tbody>
</table>
</body>
</html>
Ответ в формате text/html будет иметь следующий вид:

Для запроса результатов в этом формате, необходимо передать в URL info_format=application/vnd.ogc.gml. Кроме того, в разделе LAYER необходимо выставить тег DUMP в значение TRUE.
MAP
...
LAYER
...
DUMP TRUE
...
END
...
END
По умолчанию, список возвращаемых полей - пуст. Чтобы выбрать нужные поля, воспользуйтесь комбинацией тегов gml_include_items и gml_exclude_items. Следующий пример демонстрирует формирование списка, состоящего из всех полей за исключением одного:
MAP
...
LAYER
...
METADATA
...
gml_include_items "all"
gml_exclude_items "NAME"
...
END
...
END
...
END
При обращении к серверу с указанием данного формата ответа, в ответ вы получите файл в формате GML, который браузер предложит сохранить. В дальнейшем файл может быть просмотрен в любом текстовом редакторе.
Пример GML файла:
<?xml version="1.0" encoding="ISO-8859-1"?>
<msGMLOutput
xmlns:gml="http://www.opengis.net/gml"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soils_layer>
<soils_feature>
<gml:boundedBy>
<gml:Box srsName="EPSG:4326">
<gml:coordinates>0.584244,-0.786084 2.134148,-0.056728</gml:coordinates>
</gml:Box>
</gml:boundedBy>
<gid>6</gid>
<id>3</id>
<FAOSOIL>I-Gx-Rx-2c</FAOSOIL>
<UNIT>I</UNIT>
<TYPE>LITHOSOLS</TYPE>
</soils_feature>
</soils_layer>
</msGMLOutput>
Обсудить в форуме Комментариев 3
Последнее обновление: September 09 2021
Дата создания: 17.04.2010
Автор(ы): Денис Рыков
© GIS-Lab и авторы, 2002-2021. При использовании материалов сайта, ссылка на GIS-Lab и авторов обязательна. Содержание материалов - ответственность авторов. (подробнее).