Сейчас идет разработка ГИС-ресурса на базе Mapserver/MapScript, все данные слоев которого, обычно содержащиеся в мапфайле, хранятся в БД (postgree). Для отображения карт и выдачи информации требуется обеспечить функционал WMS-сервера. Предлагаемая обработка запроса во всех примерах состоит всегда из нескольких строк:
Код: Выделить всё
<?php
$request = ms_newowsrequestobj();
$request->loadparams();
ms_ioinstallstdouttobuffer();
$oMap = ms_newMapobj("../../service/wms.map");
$oMap->owsdispatch($request);
$contenttype = ms_iostripstdoutbuffercontenttype();
if ($contenttype == 'image/png')
header('Content-type: image/png');
ms_iogetStdoutBufferBytes();
ms_ioresethandlers();
?>
Сердце этого кода - метод
owsdispatch(), представляющий собой "черный ящик", выполняющий всю работу. К сожалению, суть его работы туманна. Например, зачем ему вообще нужен объект карты
mapObj, которому он принадлежит? Ведь все данные, включая мапфайл, он получает из
$request. В WMS-запросе есть параметр "
map", перекрывающий аналогичное значение, присваиваемое в момент создания карты конструктором
ms_newMapobj(...); Какой мапфайл будет использоваться при обработке запроса? А главное, как от него вообще избавиться? Все параметры, которые должны быть в мапфайле, для конкретного слоя можно занести прямо в атрибуты соответствующих объектов, подчиненных
mapObj, но они видимо будут затерты при запуске owsdispatch. Примитивный путь - создавать временный мапфайл, заполнять его данными, выполнять запрос и тут же файл удалять, но хотелось-бы обойтись без таких костылей!