Пара вопросов по MapServer
- 
				hawk1
- Интересующийся
- Сообщения: 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
ENDOurGuns.ru - пневматическое оружие России и мира
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие
			
						Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие
- 
				hawk1
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 фев 2009, 17:30
- Репутация: 0
Re: Пара вопросов по MapServer
Первый вопрос все еще актуален.
			
			
									
						
										
						- 
				KolesovDmitry
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Расскажите подробнее, что имеется в виду под словами "поиск объектов" и "поиск маршрутов" (можно понимать по разному).
			
			
									
						
										
						- 
				hawk1
- Интересующийся
- Сообщения: 38
- Зарегистрирован: 28 фев 2009, 17:30
- Репутация: 0
Re: Пара вопросов по MapServer
Под поиском объекта понимается поик объекта на карте по атрибуту. А маршрут - кратчайший путь между пунктами.
			
			
									
						
										
						- 
				KolesovDmitry
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Для поиска по атрибутам проще всего использовать фильтры, в которых могут быть заданы достаточно сложные условия поиска.hawk1 писал(а):Под поиском объекта понимается поик объекта на карте по атрибуту. А маршрут - кратчайший путь между пунктами.
А вот то, что можно будет штатными средствами MS найти кратчайший маршрут между двумя пунктами, я сильно сомневаюсь... Скорее всего, без программирования на MapScript не обойтись. Если у вас получится - отпишитесь, интересно посмотреть.
- 
				di@mond
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
А меня интересует, возможен ли поиск объектов такого рода: на странице, куда выгружается карта, сформированная на основе map-файла (можно и через шейп-файл и есть привязка к бд в постгисе) , имеется текстовое поле, куда вводится имя (или идентификатор) объекта и кнопка "найти", при нажатии на которую на карте неоходимо показать (выделить др. цветом, например) требуемый объект? то есть не просто показать только этот объект, а просто его отметить? Если это возможно, не могли бы  подсказать как?
			
			
									
						
										
						- 
				KolesovDmitry
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Это все можно, нужно передавать параметр MODE=*QUERY в адресной строке (подробности в документации, раздел MODE), кроме того, понадобится настроить параметры QLAYER, QITEM, QSTRING (также передаваемые в адресной строке). Одино из применений этих параметров можно посмотреть тут.di@mond писал(а):А меня интересует, возможен ли поиск объектов такого рода: на странице, куда выгружается карта, сформированная на основе map-файла ... имеется текстовое поле, куда вводится имя (или идентификатор) объекта и кнопка "найти", при нажатии на которую на карте неоходимо показать (выделить др. цветом, например) требуемый объект? то есть не просто показать только этот объект, а просто его отметить? Если это возможно, не могли бы подсказать как?
- 
				di@mond
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
Спасибо за наводку!:) Но может у кого-нибудь еще есть примеры, как это можно реализовать?? 
			
			
									
						
										
						
- 
				di@mond
- Интересующийся
- Сообщения: 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-файла:
Код: Выделить всё
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.
Ну это видимо краткое содержание первой ошибки
 Что не так в коде? или в map-файле??
  Что не так в коде? или в map-файле??Спасибо за помощь!!!
- 
				KolesovDmitry
- Гуру
- Сообщения: 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.
- 
				di@mond
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
Я, конечно же, попробую так, как Вы говорите. Хотя всю эту красоту я писала на основе тех примеров, которые приводили здесь другие.Соответственно,есть вероятность, что у них-то все это работает)KolesovDmitry писал(а): Попробуйте сначала отладить так, чтобы все работало в чистом MapServer, без OL, а потом уже натягивайте на это остальное.
Кстати, если вы используете внутренние механизмы MS, то в OL лучше создавать не слой WMS, а слой MapServer.
- 
				di@mond
- Интересующийся
- Сообщения: 47
- Зарегистрирован: 13 апр 2009, 14:34
- Репутация: 0
- Откуда: Астрахань
- Контактная информация:
Re: Пара вопросов по MapServer
А вот если добавлять не WMS-слои, а MapServer - слои, как Вы говорите, то в map-файле нужно убирать все, что касалось WMS??? Потому что если оставить все как есть и добавлять MapServer - слои,то на карте они все отражаются отдельно, все являются базовыми, и включаются\отключаются не check' ами, а option'ами, поэтому отразить на карте можно только один слой...
			
			
									
						
										
						- 
				KolesovDmitry
- Гуру
- Сообщения: 810
- Зарегистрирован: 22 авг 2007, 14:58
- Репутация: 123
- Откуда: Казань
Re: Пара вопросов по MapServer
Покажите, пожалуйста, htmldi@mond писал(а):А вот если добавлять не WMS-слои, а MapServer - слои, как Вы говорите, то в map-файле нужно убирать все, что касалось WMS??? Потому что если оставить все как есть и добавлять MapServer - слои,то на карте они все отражаются отдельно, все являются базовыми, и включаются\отключаются не check' ами, а option'ами, поэтому отразить на карте можно только один слой...
- 
				di@mond
- Интересующийся
- Сообщения: 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>Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 10 гостей
