Пара вопросов по MapServer
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 фев 2009, 17:30
- Репутация: 0
Пара вопросов по MapServer
Меня интересуют следующие вопросы:
1. Как реализовать поиск объекта и поиск маршрута?
2. Как сделать чтобы при малом масштабе карты подписи не отображались, а при увеличении до определенного масштаба они включались?
1. Как реализовать поиск объекта и поиск маршрута?
2. Как сделать чтобы при малом масштабе карты подписи не отображались, а при увеличении до определенного масштаба они включались?
- wmk
- Активный участник
- Сообщения: 102
- Зарегистрирован: 11 янв 2009, 17:38
- Репутация: 0
- Откуда: Казань
- Контактная информация:
Ответ на вопрос 2
На второй вопрос:
Там в классе слоя надо выставить
Это соответственно минимальный и максимальный маштаб при котором виден слой
Там в классе слоя надо выставить
Код: Выделить всё
CLASS
NAME "Здания"
...
...
MINSCALEDENOM 1
MAXSCALEDENOM 10000
END
OurGuns.ru - пневматическое оружие России и мира
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 фев 2009, 17:30
- Репутация: 0
Re: Пара вопросов по MapServer
Первый вопрос все еще актуален.
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Расскажите подробнее, что имеется в виду под словами "поиск объектов" и "поиск маршрутов" (можно понимать по разному).
-
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 фев 2009, 17:30
- Репутация: 0
Re: Пара вопросов по MapServer
Под поиском объекта понимается поик объекта на карте по атрибуту. А маршрут - кратчайший путь между пунктами.
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Для поиска по атрибутам проще всего использовать фильтры, в которых могут быть заданы достаточно сложные условия поиска.hawk1 писал(а):Под поиском объекта понимается поик объекта на карте по атрибуту. А маршрут - кратчайший путь между пунктами.
А вот то, что можно будет штатными средствами MS найти кратчайший маршрут между двумя пунктами, я сильно сомневаюсь... Скорее всего, без программирования на MapScript не обойтись. Если у вас получится - отпишитесь, интересно посмотреть.
-
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
А меня интересует, возможен ли поиск объектов такого рода: на странице, куда выгружается карта, сформированная на основе map-файла (можно и через шейп-файл и есть привязка к бд в постгисе) , имеется текстовое поле, куда вводится имя (или идентификатор) объекта и кнопка "найти", при нажатии на которую на карте неоходимо показать (выделить др. цветом, например) требуемый объект? то есть не просто показать только этот объект, а просто его отметить? Если это возможно, не могли бы подсказать как?
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Это все можно, нужно передавать параметр MODE=*QUERY в адресной строке (подробности в документации, раздел MODE), кроме того, понадобится настроить параметры QLAYER, QITEM, QSTRING (также передаваемые в адресной строке). Одино из применений этих параметров можно посмотреть тут.di@mond писал(а):А меня интересует, возможен ли поиск объектов такого рода: на странице, куда выгружается карта, сформированная на основе map-файла ... имеется текстовое поле, куда вводится имя (или идентификатор) объекта и кнопка "найти", при нажатии на которую на карте неоходимо показать (выделить др. цветом, например) требуемый объект? то есть не просто показать только этот объект, а просто его отметить? Если это возможно, не могли бы подсказать как?
-
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
Спасибо за наводку!:) Но может у кого-нибудь еще есть примеры, как это можно реализовать?? 

-
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
Воспользовалась вашими советами и примерами, но ничего не получается...
вот код map-файла:
Вот код страницы :
Если в строке браузера прописать полностью адрес со всеми параметрами, то есть
то выдается вот такая вот ошибка
prepare_database(): Query error. Error declaring cursor: ERROR: syntax error at or near "SELECT" LINE 2: SELECT the_geom FROM buildings WHERE id=%... ^ With query string: DECLARE mycursor BINARY CURSOR FOR SELECT "id"::text,asbinary(force_collection(force_2d(the_geom)),'NDR'),gid::text from SELECT the_geom FROM buildings WHERE id=%name_obj%) AS newtable WHERE (8) and (the_geom && setSRID( 'BOX3D(48.0572574798619 46.3718620828539,48.0637574798619 46.3763425201381)'::BOX3D,4326) )
а если нажимать на кнопку на странице, то просто пишет
loadMap():Web application error.CGI variable "map" is not set.
Ну это видимо краткое содержание первой ошибки
Что не так в коде? или в map-файле??
Спасибо за помощь!!!
вот код map-файла:
Код: Выделить всё
MAP
STATUS ON
IMAGETYPE GIF
EXTENT 48.054 46.3745 48.0605 46.3782
SIZE 870 600
SHAPEPATH "/ms4w/apps/example/sait/shape/"
IMAGECOLOR 255 255 255
FONTSET "./fonts/fonts.list"
SYMBOLSET "./symbols/symbols35.sym"
WEB
TEMPLATE './map.html'
IMAGEPATH '/ms4w/tmp/ms_tmp/'
IMAGEURL '/ms_tmp/'
END
QUERYMAP
STATUS ON
SIZE 870 600
STYLE SELECTED
END
LAYER
NAME "buildings"
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=123 dbname=postgis host=localhost"
DATA "the_geom FROM buildings WHERE id=%name_obj% using unique gid using srid=4326"
STATUS on
TYPE POLYGON
TRANSPARENCY ALPHA
MAXSCALEDENOM 6760
MINSCALEDENOM 1
TEMPLATE 'dummy'
DUMP TRUE
METADATA
qstring_validation_pattern '.'
END
CLASS
NAME "Учебные корпуса"
STYLE
COLOR 0 146 221
END
END
END
end
Код: Выделить всё
<html>
<head>
<title>Карта</title>
<script src="D:\ms4w\apps\example\sait\Openlayers.js"></script>
</head>
<body>
<div style="width:1000px; height:640px;" id="map"></div>
<script language="Javascript">
function create_query(){
name_obj=mapserv.object.value;
query="('[id]'=='"+name_obj+"')";
if(query !=""){
query="("+query+")"
mapserv.qstring.value=query;
mapserv.qitem.value="id";
mapserv.qlayer.value="buildings";
};
}
function on_submit_form(){
create_query(document.mapserv);
document.mapserv.mode.value="itemnquery";
document.mapserv.target="_self";
document.mapserv.submit();
}
</script>
<script defer="defer" type="text/javascript">
var bounds = new OpenLayers.Bounds(
// 48.05489804143945, 46.37459778237466,
// 48.060344115989466, 46.37774420521199
48.054, 46.3745, 48.0605, 46.3782
);
var options = {
maxExtent:bounds,
controls: [],
maxResolution: "auto",
projection: "EPSG:4326"};
var map = new OpenLayers.Map('map',options);
var buildings = new OpenLayers.Layer.WMS(
"Учебные корпуса",
"http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/sait/aaa.map&service=WMS",
{
height: '1000px',
width: '640px',
layers: 'buildings',
transparent: 'TRUE',
srs: 'EPSG:4326' }
);
buildings.setIsBaseLayer(true);
map.addLayer(buildings);
map.addControl(new OpenLayers.Control.PanZoomBar({
position: new OpenLayers.Pixel(2, 15)
}));
map.addControl(new OpenLayers.Control.Navigation());
map.addControl(new OpenLayers.Control.Scale($('scale')));
map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.zoomToMaxExtent(bounds);
</script>
<FORM name=mapserv action="http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/sait/aaa.map" method=get>
Введите объект для поиска:<INPUT TYPE="text" size=50 name="object"><HR>
<INPUT type="button" value="Find" name="poisk"
onClick="on_submit_form();">
<INPUT type=hidden name=qlayer value="">
<INPUT type=hidden name=qitem value="">
<INPUT type=hidden name=qstring value="">
<INPUT type=hidden name=mode value=browse>
</form>
</body>
</html>
Код: Выделить всё
http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/sait/aaa.map&mode=itemnquery&imgext=...&imgxy=...&layer=buildings&qlayer=buildings&qiitem=id&qstring=8
то выдается вот такая вот ошибка
prepare_database(): Query error. Error declaring cursor: ERROR: syntax error at or near "SELECT" LINE 2: SELECT the_geom FROM buildings WHERE id=%... ^ With query string: DECLARE mycursor BINARY CURSOR FOR SELECT "id"::text,asbinary(force_collection(force_2d(the_geom)),'NDR'),gid::text from SELECT the_geom FROM buildings WHERE id=%name_obj%) AS newtable WHERE (8) and (the_geom && setSRID( 'BOX3D(48.0572574798619 46.3718620828539,48.0637574798619 46.3763425201381)'::BOX3D,4326) )
а если нажимать на кнопку на странице, то просто пишет
loadMap():Web application error.CGI variable "map" is not set.
Ну это видимо краткое содержание первой ошибки

Спасибо за помощь!!!
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Попробуйте в map-файле выбирать все записи из PostgreSQL, а фильтровать в другом месте, т.е.
(Похожая задача была вот здесь)
---
У вас получается путаница вот в чем: все эти itemnquery и т.п. используются в "голом" MapServer, а вы пытаетесь смешать между собой вызовы команд MapServer из OpenLayers (например, в OL никакие QueryMap из MapServer не используются). Смешение этих двух механизмов запутывает... Попробуйте сначала отладить так, чтобы все работало в чистом MapServer, без OL, а потом уже натягивайте на это остальное.
Кстати, если вы используете внутренние механизмы MS, то в OL лучше создавать не слой WMS, а слой MapServer.
Код: Выделить всё
LAYER
NAME "buildings"
CONNECTIONTYPE postgis
CONNECTION "user=postgres password=123 dbname=postgis host=localhost"
DATA "the_geom FROM buildings using unique gid using srid=4326"
...
CLASS
EXPRESSION '[id]'=%id%
NAME "Учебные корпуса"
STYLE
COLOR 0 146 221
END
END
END
---
У вас получается путаница вот в чем: все эти itemnquery и т.п. используются в "голом" MapServer, а вы пытаетесь смешать между собой вызовы команд MapServer из OpenLayers (например, в OL никакие QueryMap из MapServer не используются). Смешение этих двух механизмов запутывает... Попробуйте сначала отладить так, чтобы все работало в чистом MapServer, без OL, а потом уже натягивайте на это остальное.
Кстати, если вы используете внутренние механизмы MS, то в OL лучше создавать не слой WMS, а слой MapServer.
-
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
Я, конечно же, попробую так, как Вы говорите. Хотя всю эту красоту я писала на основе тех примеров, которые приводили здесь другие.Соответственно,есть вероятность, что у них-то все это работает)KolesovDmitry писал(а): Попробуйте сначала отладить так, чтобы все работало в чистом MapServer, без OL, а потом уже натягивайте на это остальное.
Кстати, если вы используете внутренние механизмы MS, то в OL лучше создавать не слой WMS, а слой MapServer.
-
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
А вот если добавлять не WMS-слои, а MapServer - слои, как Вы говорите, то в map-файле нужно убирать все, что касалось WMS??? Потому что если оставить все как есть и добавлять MapServer - слои,то на карте они все отражаются отдельно, все являются базовыми, и включаются\отключаются не check' ами, а option'ами, поэтому отразить на карте можно только один слой...
-
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Покажите, пожалуйста, htmldi@mond писал(а):А вот если добавлять не WMS-слои, а MapServer - слои, как Вы говорите, то в map-файле нужно убирать все, что касалось WMS??? Потому что если оставить все как есть и добавлять MapServer - слои,то на карте они все отражаются отдельно, все являются базовыми, и включаются\отключаются не check' ами, а option'ами, поэтому отразить на карте можно только один слой...
-
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
Код страницы следующий (сократила количество слоев)
и еще вопрос возник:почему карта создается не одной цельной картинкой, а состоит из нескольких частей??
Код: Выделить всё
<html>
<head>
<title>Карта</title>
<script src="D:\ms4w\apps\example\sait\Openlayers.js"></script>
</head>
<body>
<div style="width:1000px; height:640px;" id="map"></div>
<script defer="defer" type="text/javascript">
var bounds = new OpenLayers.Bounds(
48.054, 46.3745, 48.0605, 46.3782
);
var options = {
maxExtent:bounds,
controls: [],
maxResolution: "auto",
projection: "EPSG:4326"};
var map = new OpenLayers.Map('map',options);
var grass = new OpenLayers.Layer.MapServer(
"Зеленые насаждения",
"http://localhost/cgi-bin/mapserv.exe? map=/ms4w/apps/example/sait/astu1.map&service=WMS&",
{
height: '1000px',
width: '640px',
layers: 'grass',
transparent: 'TRUE',
srs: 'EPSG:4326' }
);
grass.setIsBaseLayer(true);
var buildings = new OpenLayers.Layer.MapServer(
"Учебные корпуса",
"http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/sait/astu1.map&service=WMS&",
{
height: '1000',
width: '640',
layers: 'buildings',
transparent: 'TRUE',
srs: 'EPSG:4326' }
);
var parkings = new OpenLayers.Layer.MapServer(
"Парковки",
"http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/sait/astu1.map&service=WMS&",
{
height: '1000',
width: '640',
layers: 'parkings',
transparent: 'TRUE',
srs: 'EPSG:4326' }
);
map.addLayers([grass,other,buildings]);
map.addControl(new OpenLayers.Control.PanZoomBar({
position: new OpenLayers.Pixel(2, 15)
}));
map.addControl(new OpenLayers.Control.Navigation());
map.addControl(new OpenLayers.Control.Scale($('scale')));
map.addControl(new OpenLayers.Control.MousePosition({element: $('location')}));
map.addControl(new OpenLayers.Control.LayerSwitcher());
map.zoomToMaxExtent(bounds);
</script>
</td>
</tr>
</form>
</body>
</html>
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость