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

Обсуждение материалов сайта: вопросы, замечания, предложения
Ответить
updates-bot
Bot
Сообщения: 276
Зарегистрирован: 03 фев 2008, 23:13
Репутация: 3

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

Сообщение updates-bot » 24 фев 2008, 02:38

Обсуждение статьи "Реализация определяющей выборки в Mapserver"

http://gis-lab.info/qa/mapserver-query.html

Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

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

Сообщение arzobispo » 20 ноя 2008, 08:38

Добрый день!
Уважаемые коллеги! Продолжаю тему по Реализации определяющей выборке, почему то никто не касался этой темы, а тема очень актуальная!!!
Вот писал скрипт и вроде скрипт похож, как у Sim'а, но что то не работает, может кто поможет.

Исходные данные: таблицы prostokarta_region (геометрия) , animals (данные о животных), html и мар-файл.

Задача: из выпадающего списка выбираем Волк, а из второго списка выбираем Пол, потом нажимаем Выбор и на карте отображаются звери, соответствующие запросу, а также если выбираем только Волка, а Пол - нет, то отображаются на карте все Волки не зависимо от пола.

Код: Выделить всё

<script language="JavaScript" type="text/javascript">
<!--
function create_query() {
 nam=form.nam.value;
 sex=form.sex.value;
 query="('[Name]' == '"+nam+"')";
 query1="('[Pol]' == '"+sex+"')";
 if (query !="" && query1 ="") {
  query="("+query+")"
  form.qitem.value="Name";
  form.qlayer.value="prostokarta";
 else
  query="("+query+")"
  query1="("+query1+")"
  form.qitem.value="Name";
  form.qitem.value="Pol";
  form.qlayer.value="prostokarta";
 };
}

function on_submit_form(){
 create_query(document.mapserv);
 document.mapserv.mode.value="itemnquery"
 document.mapserv.target = "_self";
 document.mapserv.submit();
}
//-->
</script>
<html>
<head>
<title>Laot</title>
</head>
<body bgcolor="#CCCFFF" charset="windows-1251">
<table width="840" height="100" border="0" align="center" cellpadding="0" cellspacing="0">
    <tr>
     <td width="120" height="50">
                 <form name="mapserv" method="GET" action="/cgi-bin/mapserv.exe">
     <td width="120" height="50">
                       <text><b>Название животного</b></text><br>
                   <input type="hidden" name="map" value="[map]">
                     <select name ="nam" size=1>
                      <option  selected></option>
                       <option value='Волк'>Волк</option>
                      <option value='Заяц'>Заяц</option>
                      <option value='Лиса'>Лиса</option>
                     </select>
                     <select name ="sex" size=1>
                      <option  selected></option>
                      <option value='Муж'>Муж</option>
                      <option value='Жен'>Жен</option>
                     </select>
                   <input type="hidden" name="layer" value="prostokarta_region">
                   <input type="hidden" name="layer" value="base">
                   <input type="hidden" name="qitem" value="">
                   <input type="hidden" name="qlayer" value="">
                   <input type="hidden" name="qstring" value="">
                   <input type="hidden" name="layer" value="prostokarta">
                   <input type="hidden" name="mode" value="browse">                 
                   <a href="javascript:on_submit_form()">QUERY</a>
                 </form>
               </td>
           </tr>
        </table>
       </td>
        <td width="680" height="612">
         <div align="center">
          <input type="image" name="img" src="[img]" width="680" height="612">
         </div>
       </td>
       </tr>
</table>
</body>
</html>
Мар-файл:

Код: Выделить всё

MAP
IMAGETYPE GIF
EXTENT -0.384 -0.383 0.217 -0.245
SIZE 680 612
WEB 
   TEMPLATE   "/ms4w/apps/mslocal/templates/index2.html"
   IMAGEPATH   "/ms4w/tmp/ms_tmp/"
   IMAGEURL   "/ms_tmp/"
END
QUERYMAP
 STATUS ON
 SIZE 680 612
 STYLE SELECTED
END
LAYER 
  NAME "base" 
  CONNECTIONTYPE postgis
  CONNECTION "user=postgres password=1234 dbname=postgis host=localhost"
  DATA "the_geom FROM prostokarta_region USING SRID=4326"
  TYPE POLYGON
   CLASS
    COLOR 125 234 100
    OUTLINECOLOR 100 100 100
  END
END
LAYER
  NAME "prostokarta_region"
  CONNECTIONTYPE postgis
  CONNECTION "user=postgres password=1234 dbname=postgis host=localhost"
  DATA "the_geom FROM 
         (
            SELECT prostokarta_region.the_geom AS the_geom,
            prostokarta_region.oid AS oid,
         animals.name AS aname, animals.sex AS asex
            from prostokarta_region, animals
            where (animals.id=prostokarta_region.id) and (animals.name='%nam%') and (animals.sex='%sex%') 
            )
            AS new_table USING SRID=4326"
  TYPE POLYGON
  CLASSITEM "aname"
  METADATA
   QSTRING_VALIDATION_PATTERN '.'
  CLASS
   NAME "Волк"
   EXPRESSION 'Волк'
   COLOR 100 100 100
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Заяц"
   EXPRESSION 'Заяц'
   COLOR 0 0 0
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Лиса"
   EXPRESSION 'Лиса'
   COLOR 255 255 0
   OUTLINECOLOR 100 100 100
  END
END
LAYER
  NAME "prostokarta"
  CONNECTIONTYPE postgis
  CONNECTION "user=postgres password=1234 dbname=postgis host=localhost"
  DATA "the_geom FROM 
         (
            SELECT prostokarta_region.the_geom AS the_geom,
            prostokarta_region.oid AS oid,
         animals.name AS aname
            from prostokarta_region, animals
            where (animals.id=prostokarta_region.id) and (animals.name='%nam%') 
            )
            AS new_table USING SRID=4326"
  TYPE POLYGON
  CLASSITEM "aname"
  CLASS
   NAME "Волк"
   EXPRESSION 'Волк'
   COLOR 100 100 100
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Заяц"
   EXPRESSION 'Заяц'
   COLOR 0 0 0
   OUTLINECOLOR 100 100 100
  END
  CLASS
   NAME "Лиса"
   EXPRESSION 'Лиса'
   COLOR 255 255 0
   OUTLINECOLOR 100 100 100
  END
END
END
В итоге, МапСервер выдает ошибку, что запрос слоя не верный.
С Уважением, Антон

KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

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

Сообщение KolesovDmitry » 20 ноя 2008, 14:52

Во-первых, насколько я помню, MapServer берет только один запрос query, поэтому все операции выбора нужно поместить в одну строковую переменную, например:

Код: Выделить всё

query="([NAME]=...) and ([POL]=...)" // выбрано сразу два select
query="([NAME]=...)" // выбран только один select
Другими словами, MapServer в качестве параметров ожидает подобные строки. Весь вопрос как их сформировать.

Я не силен в JS, поэтому могу дать только общее направление, в котором нужно копать:

Конечно, можно создать большое число блоков с if и проверять, выбран соответствующий select или нет, однако, даже для 2 select, различных вариантов будет 4, для 3-х -- уже 8 и так далее. Поэтому такой способ не годится.

Упрощаем идею: будем перебирать все select в цикле. Сначала берем первый из них
и если он не пустой, пишем

Код: Выделить всё

query= '(Name_of_Select1 = выбранное_значение)'
Если пустой, то в query ничего не пишем

Для второго и последующих непустых select'ов будем просто дописывать

Код: Выделить всё

query= query + 'and (Name_of_Select2 = выбранное_значение)'
----
Точно помню, что JS поддерживает итерацию по объектам, то есть в цикле можно записать что-то вроде (не помню синтаксис точно -- см. справочник)

Код: Выделить всё

for val in form.objects {
какие-то операции с val
}
Таким образом, конечный код должен быть каким-то таким:

Код: Выделить всё

<script language="JavaScript" type="text/javascript">
<!--
function create_query() {
  query=""
    for val in [...здесь идет перебор всех объектов типа select на форме...] {
        zapros='('+name_select+ '=' + val + ')'
        if (query ="" )
          query=zapros
        else {
          query=query + 'and (' + zapros +')'
 };
}
Уф... Сколько вспомнил, столько и рассказал. Надеюсь, более грамотные товарищи меня дополнят и решение в конце-концов родится.

Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

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

Сообщение arzobispo » 20 ноя 2008, 14:56

Спасибо! Дома буду пробовать :)
С Уважением, Антон

Аватара пользователя
arzobispo
Активный участник
Сообщения: 230
Зарегистрирован: 10 сен 2008, 10:28
Репутация: 3
Контактная информация:

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

Сообщение arzobispo » 20 ноя 2008, 15:00

А вот в этом месте, будет так, как у меня написано:

Код: Выделить всё

<input type="hidden" name="layer" value="слой в мар-файле">
                   <input type="hidden" name="layer" value="слой в мар-файле">
                   <input type="hidden" name="qitem" value="">
                   <input type="hidden" name="qlayer" value="">
                   <input type="hidden" name="qstring" value="">
                   <input type="hidden" name="layer" value="слой в мар-файле">
                   <input type="hidden" name="mode" value="browse">   
С Уважением, Антон

Ответить

Вернуться в «Материалы сайта»

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

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