Форум Блог
pix

Реализация определяющей выборки в Mapserver

Небольшой пример иллюстрирующий построение карты с выборочным показом объектов.

Типичная задача при визуализации пространственной информации - демонстрация некоторого ее подмножества (назовем этот механизм определяющей выборкой), скрыв остальную информацию. Это подмножество может быть определено как пространственно (например ограничением географического охвата или какой-то более сложной формой), так и через атрибутивную таблицу объектов. В данном примере мы иллюстрируем, как можно, с помощью специально сформированного URL карты осуществить выборку и показать только выбранные объекты, скрыв остальные. Данная возможность может пригодится для динамического уменьшения количества информации, показываемой на карте. В терминологии ESRI данные вид выборки называется "definition query" (определяющая выборка).

Данный пример предполагает, что у читателя уже есть работающий MapServer и есть некая карта, к которой надо добавить возможность подобных выборок.

Изменения в map-файле

В конфигурационном файле карты необходимо произвести следующие изменения:

В главный раздел необходимо добавить тэг QUERYMAP, вот так:

QUERYMAP
	STATUS ON
	SIZE 400 300
	STYLE  SELECTED
END

Обращаем внимание, что в STATUS должно стоять именно ON, иначе не будет работать.

В разделе слоя, к которому будет осуществляться запрос (LAYER), так же необходимо установить правило составления запроса:

LAYER
...
	METADATA
		qstring_validation_pattern '.'
	END
...
END

Туда же нужно добавить ссылку на шаблон для вывода атрибутивной информации, несмотря на то, что нас в данном случае интересует выборка с отображением элементов карты, а не атрибутики, это все равно необходимо сделать. Файл шаблона должен существовать, хотя содержимое его не имеет значения. Если этого не сделать, Mapserver будет выдавать следующее сообщение об ошибке:

msQueryByAttributes(): Query error. Requested layer has no templates defined so is not queryable.

Таким образом, к содержимому LAYER добавляется еще несколько строк, указывающих местонахождение главного шаблона (в нашем случае это файл template.html). Содержимое данного раздела представляет собой некоторое ухищрение, если ограничиться просто TEMPLATE "template_subst.html", то будет карта с результатом будет выведена столько раз, сколько объектов попадает в выборку определенную qstring, qitem, qlayer. Данный подход складывает все эти карты в одну, при этом TEMPLATE и FOOTER ссылаются на существующий, но абсолютно пустой файл (само собой для своего проекта это может быть изменено).

LAYER
...
	TEMPLATE 	"template_subst.html"
	FOOTER		"template_subst.html"
	HEADER		"template.html"
...
END

В ту же секцию, возможно сразу после TEMPLATE'ов, необходимо также добавить тэг METADATA со схемой проверки запроса. Так как мы по-умолчанию предполагаем, что запрос наш верен (за это у нас отвечается код на Javascript), то наша строка проверки будет выглядеть таким образом:

LAYER
...
	TEMPLATE 	"template_subst.html"
	...
	METADATA
		qstring_validation_pattern '.'
	END
...
END

Если этого не сделать, получим ошибку от MapServer такого содержания:

mapserv(): Web application error. Metadata qstring_validation_pattern is not set.

 

Изменения в html

В HTML нашего шаблона нужно добавить параметры запросов:

<input type="hidden" name="qlayer" value="">
<input type="hidden" name="qitem" value="">
<input type="hidden" name="qstring" value="">

И небольшой JavaScript, который будет получить выбранное значение от списка и отправлять его MapServer'у.

<SCRIPT language=JavaScript type=text/javascript>
<!--
function create_query(form) {
vid=form.vid.value;
query="('[State]'=='"+vid+"')";
if (query != "") {
query="("+query+")"
form.qstring.value=query;
form.qitem.value="State";
form.qlayer.value="states_poly";
};
}

function on_submit_form(){
create_query(document.mapserv);
document.mapserv.mode.value="itemnquery"
document.mapserv.target = "_self";
document.mapserv.submit();
}
// -->
</SCRIPT>

Посмотреть пример работающей определяющей выборки реализованной описанным выше образом можно здесь.

Пример результирующего URL, содержащего запрос:

http://gis-lab.info/cgi-bin/mapserv?map=/path/to/example/defquery.map&mode=itemnquery&imgext=-97.238976+39.838907+-82.122902+51.166491&imgxy=200.0+150.0&layer=states_poly&layer=states_line&zoom=0&qlayer=states_poly&qitem=State&qstring='Minnesota'

Обсудить в форуме (Комментариев - 0)

См. также:

Начало работы с MapServer >>>
Выражения в MapServer >>>

Последнее обновление: February 24 2008
(Наверх)

E-mail: 3 цифры: Введите 3 цифры с картинки в поле
Комментарий, вопрос, ошибка: (?)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter (?)

О нас : Статьи : Программы : Форум (все) : Документация : Контакты : Участие : English

Новости сайта:(?)