Пара вопросов по MapServer

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
hawk1
Интересующийся
Сообщения: 38
Зарегистрирован: 28 фев 2009, 17:30
Репутация: 0

Пара вопросов по MapServer

Сообщение hawk1 » 19 май 2009, 14:14

Меня интересуют следующие вопросы:
1. Как реализовать поиск объекта и поиск маршрута?
2. Как сделать чтобы при малом масштабе карты подписи не отображались, а при увеличении до определенного масштаба они включались?

Аватара пользователя
wmk
Активный участник
Сообщения: 102
Зарегистрирован: 11 янв 2009, 17:38
Репутация: 0
Откуда: Казань
Контактная информация:

Ответ на вопрос 2

Сообщение wmk » 20 май 2009, 09:58

На второй вопрос:
Там в классе слоя надо выставить

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

CLASS 
   NAME "Здания"
   ...
   ...
   MINSCALEDENOM 1
   MAXSCALEDENOM 10000
END
Это соответственно минимальный и максимальный маштаб при котором виден слой
OurGuns.ru - пневматическое оружие России и мира
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие

hawk1
Интересующийся
Сообщения: 38
Зарегистрирован: 28 фев 2009, 17:30
Репутация: 0

Re: Пара вопросов по MapServer

Сообщение hawk1 » 24 май 2009, 12:56

Первый вопрос все еще актуален.

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

Re: Пара вопросов по MapServer

Сообщение KolesovDmitry » 24 май 2009, 18:47

Расскажите подробнее, что имеется в виду под словами "поиск объектов" и "поиск маршрутов" (можно понимать по разному).

hawk1
Интересующийся
Сообщения: 38
Зарегистрирован: 28 фев 2009, 17:30
Репутация: 0

Re: Пара вопросов по MapServer

Сообщение hawk1 » 24 май 2009, 20:25

Под поиском объекта понимается поик объекта на карте по атрибуту. А маршрут - кратчайший путь между пунктами.

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

Re: Пара вопросов по MapServer

Сообщение KolesovDmitry » 25 май 2009, 08:35

hawk1 писал(а):Под поиском объекта понимается поик объекта на карте по атрибуту. А маршрут - кратчайший путь между пунктами.
Для поиска по атрибутам проще всего использовать фильтры, в которых могут быть заданы достаточно сложные условия поиска.
А вот то, что можно будет штатными средствами MS найти кратчайший маршрут между двумя пунктами, я сильно сомневаюсь... Скорее всего, без программирования на MapScript не обойтись. Если у вас получится - отпишитесь, интересно посмотреть.

di@mond
Интересующийся
Сообщения: 47
Зарегистрирован: 13 апр 2009, 14:34
Репутация: 0
Откуда: Астрахань
Контактная информация:

Re: Пара вопросов по MapServer

Сообщение di@mond » 26 май 2009, 01:11

А меня интересует, возможен ли поиск объектов такого рода: на странице, куда выгружается карта, сформированная на основе map-файла (можно и через шейп-файл и есть привязка к бд в постгисе) , имеется текстовое поле, куда вводится имя (или идентификатор) объекта и кнопка "найти", при нажатии на которую на карте неоходимо показать (выделить др. цветом, например) требуемый объект? то есть не просто показать только этот объект, а просто его отметить? Если это возможно, не могли бы подсказать как?

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

Re: Пара вопросов по MapServer

Сообщение KolesovDmitry » 26 май 2009, 08:54

di@mond писал(а):А меня интересует, возможен ли поиск объектов такого рода: на странице, куда выгружается карта, сформированная на основе map-файла ... имеется текстовое поле, куда вводится имя (или идентификатор) объекта и кнопка "найти", при нажатии на которую на карте неоходимо показать (выделить др. цветом, например) требуемый объект? то есть не просто показать только этот объект, а просто его отметить? Если это возможно, не могли бы подсказать как?
Это все можно, нужно передавать параметр MODE=*QUERY в адресной строке (подробности в документации, раздел MODE), кроме того, понадобится настроить параметры QLAYER, QITEM, QSTRING (также передаваемые в адресной строке). Одино из применений этих параметров можно посмотреть тут.

di@mond
Интересующийся
Сообщения: 47
Зарегистрирован: 13 апр 2009, 14:34
Репутация: 0
Откуда: Астрахань
Контактная информация:

Re: Пара вопросов по MapServer

Сообщение di@mond » 26 май 2009, 13:28

Спасибо за наводку!:) Но может у кого-нибудь еще есть примеры, как это можно реализовать?? :roll:

di@mond
Интересующийся
Сообщения: 47
Зарегистрирован: 13 апр 2009, 14:34
Репутация: 0
Откуда: Астрахань
Контактная информация:

Re: Пара вопросов по MapServer

Сообщение di@mond » 27 май 2009, 00:06

Воспользовалась вашими советами и примерами, но ничего не получается...

вот код 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-файле??

Спасибо за помощь!!!

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

Re: Пара вопросов по MapServer

Сообщение KolesovDmitry » 27 май 2009, 08:55

Попробуйте в map-файле выбирать все записи из PostgreSQL, а фильтровать в другом месте, т.е.

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

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

Сообщение di@mond » 27 май 2009, 09:14

KolesovDmitry писал(а): Попробуйте сначала отладить так, чтобы все работало в чистом MapServer, без OL, а потом уже натягивайте на это остальное.
Кстати, если вы используете внутренние механизмы MS, то в OL лучше создавать не слой WMS, а слой MapServer.
Я, конечно же, попробую так, как Вы говорите. Хотя всю эту красоту я писала на основе тех примеров, которые приводили здесь другие.Соответственно,есть вероятность, что у них-то все это работает)

di@mond
Интересующийся
Сообщения: 47
Зарегистрирован: 13 апр 2009, 14:34
Репутация: 0
Откуда: Астрахань
Контактная информация:

Re: Пара вопросов по MapServer

Сообщение di@mond » 29 май 2009, 13:56

А вот если добавлять не WMS-слои, а MapServer - слои, как Вы говорите, то в map-файле нужно убирать все, что касалось WMS??? Потому что если оставить все как есть и добавлять MapServer - слои,то на карте они все отражаются отдельно, все являются базовыми, и включаются\отключаются не check' ами, а option'ами, поэтому отразить на карте можно только один слой...

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

Re: Пара вопросов по MapServer

Сообщение KolesovDmitry » 30 май 2009, 08:27

di@mond писал(а):А вот если добавлять не WMS-слои, а MapServer - слои, как Вы говорите, то в map-файле нужно убирать все, что касалось WMS??? Потому что если оставить все как есть и добавлять MapServer - слои,то на карте они все отражаются отдельно, все являются базовыми, и включаются\отключаются не check' ами, а option'ами, поэтому отразить на карте можно только один слой...
Покажите, пожалуйста, html

di@mond
Интересующийся
Сообщения: 47
Зарегистрирован: 13 апр 2009, 14:34
Репутация: 0
Откуда: Астрахань
Контактная информация:

Re: Пара вопросов по MapServer

Сообщение di@mond » 30 май 2009, 09:00

Код страницы следующий (сократила количество слоев)

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

<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 гость