Реализация определяющей выборки в Mapserver
-
- Bot
- Сообщения: 276
- Зарегистрирован: 03 фев 2008, 23:13
- Репутация: 3
Реализация определяющей выборки в Mapserver
Обсуждение статьи "Реализация определяющей выборки в Mapserver"
http://gis-lab.info/qa/mapserver-query.html
http://gis-lab.info/qa/mapserver-query.html
- arzobispo
- Активный участник
- Сообщения: 230
- Зарегистрирован: 10 сен 2008, 10:28
- Репутация: 3
- Контактная информация:
Re: Реализация определяющей выборки в Mapserver
Добрый день!
Уважаемые коллеги! Продолжаю тему по Реализации определяющей выборке, почему то никто не касался этой темы, а тема очень актуальная!!!
Вот писал скрипт и вроде скрипт похож, как у Sim'а, но что то не работает, может кто поможет.
Исходные данные: таблицы prostokarta_region (геометрия) , animals (данные о животных), html и мар-файл.
Задача: из выпадающего списка выбираем Волк, а из второго списка выбираем Пол, потом нажимаем Выбор и на карте отображаются звери, соответствующие запросу, а также если выбираем только Волка, а Пол - нет, то отображаются на карте все Волки не зависимо от пола.
Мар-файл:
В итоге, МапСервер выдает ошибку, что запрос слоя не верный.
Уважаемые коллеги! Продолжаю тему по Реализации определяющей выборке, почему то никто не касался этой темы, а тема очень актуальная!!!
Вот писал скрипт и вроде скрипт похож, как у 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
С Уважением, Антон
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Реализация определяющей выборки в Mapserver
Во-первых, насколько я помню, MapServer берет только один запрос query, поэтому все операции выбора нужно поместить в одну строковую переменную, например:
Другими словами, MapServer в качестве параметров ожидает подобные строки. Весь вопрос как их сформировать.
Я не силен в JS, поэтому могу дать только общее направление, в котором нужно копать:
Конечно, можно создать большое число блоков с if и проверять, выбран соответствующий select или нет, однако, даже для 2 select, различных вариантов будет 4, для 3-х -- уже 8 и так далее. Поэтому такой способ не годится.
Упрощаем идею: будем перебирать все select в цикле. Сначала берем первый из них
и если он не пустой, пишем
Если пустой, то в query ничего не пишем
Для второго и последующих непустых select'ов будем просто дописывать
----
Точно помню, что JS поддерживает итерацию по объектам, то есть в цикле можно записать что-то вроде (не помню синтаксис точно -- см. справочник)
Таким образом, конечный код должен быть каким-то таким:
Уф... Сколько вспомнил, столько и рассказал. Надеюсь, более грамотные товарищи меня дополнят и решение в конце-концов родится.
Код: Выделить всё
query="([NAME]=...) and ([POL]=...)" // выбрано сразу два select
query="([NAME]=...)" // выбран только один select
Я не силен в JS, поэтому могу дать только общее направление, в котором нужно копать:
Конечно, можно создать большое число блоков с if и проверять, выбран соответствующий select или нет, однако, даже для 2 select, различных вариантов будет 4, для 3-х -- уже 8 и так далее. Поэтому такой способ не годится.
Упрощаем идею: будем перебирать все select в цикле. Сначала берем первый из них
и если он не пустой, пишем
Код: Выделить всё
query= '(Name_of_Select1 = выбранное_значение)'
Для второго и последующих непустых 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
- Контактная информация:
- arzobispo
- Активный участник
- Сообщения: 230
- Зарегистрирован: 10 сен 2008, 10:28
- Репутация: 3
- Контактная информация:
Re: Реализация определяющей выборки в Mapserver
А вот в этом месте, будет так, как у меня написано:
Код: Выделить всё
<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">
С Уважением, Антон
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость