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

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

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

Сообщение KolesovDmitry »

Дело в том, что вы создаете сразу три отдельных слоя, при этом каждый из слоев получается базовым. Можно, например, сделать так, чтобы часть слоев были "прозрачными", т.е. могли помещаться поверх базовых и включаться-выключаться галочками. Для этого нужно передать параметр в слой:

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

{"isBaseLayer":false} 
Если вы хотите поместить все в один, тогда нужно и указвать все в одном слое:

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

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: 'all', 
                    transparent: 'TRUE', 
                    srs: 'EPSG:4326' }
    );
Или так:

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

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,buildings,parkings', 
                    transparent: 'TRUE', 
                    srs: 'EPSG:4326' }
    );
di@mond
Интересующийся
Сообщения: 47
Зарегистрирован: 13 апр 2009, 14:34
Репутация: 0
Откуда: Астрахань
Контактная информация:

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

Сообщение di@mond »

Дело в том, что вы создаете сразу три отдельных слоя, при этом каждый из слоев получается базовым.
Почему каждый получается базовым, если я это свойство явно задаю только для одного слоя grass в строчке

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

grass.setIsBaseLayer(true);
Konstantin Tokar
Активный участник
Сообщения: 178
Зарегистрирован: 16 июл 2008, 09:56
Репутация: 1
Откуда: Москва

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

Сообщение Konstantin Tokar »

di@mond писал(а):и еще вопрос возник:почему карта создается не одной цельной картинкой, а состоит из нескольких частей??
Если имеется ввиду tile механизм, то это для организации кэширования у клиента и на сервере. Генерация и передача карт - очень затратные операции.
KolesovDmitry
Гуру
Сообщения: 810
Зарегистрирован: 22 авг 2007, 14:58
Репутация: 123
Откуда: Казань

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

Сообщение KolesovDmitry »

di@mond писал(а):
Дело в том, что вы создаете сразу три отдельных слоя, при этом каждый из слоев получается базовым.
Почему каждый получается базовым, если я это свойство явно задаю только для одного слоя grass в строчке

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

grass.setIsBaseLayer(true);
Прошу прощения, я не обратил на это внимание... Действительно, слои не должны получаться базовыми.
di@mond
Интересующийся
Сообщения: 47
Зарегистрирован: 13 апр 2009, 14:34
Репутация: 0
Откуда: Астрахань
Контактная информация:

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

Сообщение di@mond »

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

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

Сообщение wmk »

Чего же делать-то теперь?)))
Что то заработался даже на форум не захожу ... как диплом ???
Не знаю может разобралась уже , но напишу.
Вот он ... в смысле ответ :)

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

    
<script type="text/javascript">
        var map;
        function init(){
        map = new OpenLayers.Map('map');

        var jpl_wms = new OpenLayers.Layer.KaMap( "Satellite",
                "http://www.openlayers.org/world/index.php", {g: "satellite", map: "world"});
        var dm_wms = new OpenLayers.Layer.WMS( "Canada",
                "http://www2.dmsolutions.ca/cgi-bin/mswms_gmap",
                {layers: "bathymetry,land_fn,park,drain_fn,drainage",
                transparent: "true", format: "image/png" });

        map.addLayers([jpl_wms, dm_wms]);
        map.addControl(new OpenLayers.Control.LayerSwitcher());
        map.zoomToMaxExtent();
        }
</script>
Попробуй ... это пример кстати из Examples ОпенЛэйерса (KaMap.html). Только сервер dm_wms лежит по моему.
А параметры которые нужны были они вот : transparent: "true", format: "image/png"
То есть на выходе ты получишь не Jpeg а Png с прозрачностью.
OurGuns.ru - пневматическое оружие России и мира
Пневматическое оружие , Страйкбольное оружие , Пейнтбольное оружие
di@mond
Интересующийся
Сообщения: 47
Зарегистрирован: 13 апр 2009, 14:34
Репутация: 0
Откуда: Астрахань
Контактная информация:

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

Сообщение di@mond »

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

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

Сообщение di@mond »

Попробуйте сначала отладить так, чтобы все работало в чистом MapServer, без OL, а потом уже натягивайте на это остальное.
Не скажу, что у меня идеально все работает на чистом MapServer (но там проблемы кодировок)..вот попробовала "натянуть" OL на код с поиском..ошибок не выдает, но и карту не грузит... Вот код (сократила кол-во слоев...это не принципиально):

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

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
<HEAD>
<meta http-equiv=Content-Type content="text/html;  charset=windows-1251">
<link rel="stylesheet" type="text/css" rev="stylesheet" href="style.css">
<title>Карта АГТУ</title>


</HEAD>

<BODY>
<div id="main">
	<div id="top"><a href="http://www.astu.org"><img src="images/astu.jpg" name="astu" width="92" height="93" border="0" id="astu"></a></div>
<table cellpadding="0" cellspacing="0">
			<tr>
				<td valign="top">
		<div id="menu">
			<a href="index.htm">Карта</a>
			<div id="elem">Поиск</div>
			<a href="event.htm">Мероприятия</a>
			<a href="help.htm">Помощь</a>
		</div>
		<div id="poisk">

<script LANGUAGE="JavaScript"> 
floors = new Array(6);
floors[0] = new Array("0", "1000", " ","001", "001", "003", "003", "010", "010");
floors[1] = new Array("1", "1000", " ","89", "101", "102","105","105","108", "108", "102", "112", "112", "122", "122",  "124","124","128","128","134", "134","136","136");
floors[2] = new Array("2", "1000", " ","202", "202", "222", "222", "204", "204", "215а", "215а");
floors[3] = new Array("3", "1000", " ","305", "305", "323", "323", "324", "324");
floors[4] = new Array("4", "1000", " ","403", "403", "418", "418", "424", "424");
floors[5] = new Array("5", "1000", " ","501", "501", "502", "502", "504", "504");

function selMG() {

var sel_mt = document.search.mt.selectedIndex-1;

// clear mg select
floorlength = document.search.mg.options.length
for (i = floorlength; i > 0; i--) { 
document.search.mg.options[i] = null; 
} 

// create mg options
for (i = 1; i < floors[sel_mt].length; i=i+2) {
var opt = new Option(floors[sel_mt][i+1]); 
opt.value = floors[sel_mt][i];
ind = document.search.mg.options.length
document.search.mg.options[ind] = opt;
}

// set selected mg
document.search.mg.options[1].selected=true;

}
</script>

<script LANGUAGE="JavaScript">
  function room(){
  var room=89;
  //var  room=document.search.mg.value;
};
</script>
<font color=#4689a2>Формы для поиска</font>
<form ACTION="floors.asp" METHOD="get" NAME="search" >
<div align="left"><font color=#4689a2>Корпус:</font> <p>
  		         <select name="build"  style="width:200px"  value="100">
                        <option value="-1" selected>------------выберите-------------</option>
                        <option value="100"[build_100_select]>  </option>
                       	<option value="1" [build_1_select]>Главный корпус</option>
  		<option value="2" [build_2_select]>Учебный корпус №1</option>
  		<option value="3" [build_3_select]>Учебный корпус №6</option>
 		<option value="4" [build_4_select]>Учебный корпус №2</option>
 		<option value="5" [build_5_select]>Спорткомплекс</option>
 		<option value="6" [build_6_select]>Учебный корпус №7</option>
 		<option value="7" [build_7_select]>Учебный корпус №3</option>
                                <option value="8" [build_8_select]>Учебный корпус №5</option>
		<option value="9" [build_9_select]>Учебный корпус №4</option>
		<option value="10" [build_10_select]>Стадион</option> 
		<option value="11" [build_11_select]>Переход</option>
	               <option value="12" [build_12_select]>Учебный корпус №9</option>
			     </select>
  		   </div>

<div align="left"><font color=#4689a2>Этаж:</font> <p>
                        <select NAME="mt" style="width:200px" class="f10a" onChange="selMG();">
                               <option VALUE="-1" selected>------------выберите-------------</option>
                               <option value=0>Полуподвальные помещения</option>
                               <option value=1>Первый этаж</option>
                               <option value=2>Второй этаж</option>
                               <option value=3>Третий этаж</option>
		   <option value=4>Четвертый этаж</option>
	             <option value=5>Пятый этаж</option>	             
       </select>
     </div>

<div align="left"><font color=#4689a2>Аудитория:</font> <p>

   <select NAME="mg" style="width:200px" class="f10a">
<option VALUE="-1" selected>------------выберите------------</option>
<option VALUE></option>
<option VALUE></option>
<option VALUE></option>
<option VALUE></option>
<option VALUE></option>
<option VALUE></option>
<option VALUE></option>
  </select>  
</div> 
</form>

<form name="mapserv" method="GET" action="/cgi-bin/mapserv.exe" encoding=CP1251>
<!---Скрытые CGI-переменные -->
<input type="hidden" name="map" value="[map]">
<input type="hidden" name="imgext" value="[mapext]">
<input type="hidden" name="imgxy" value="[center]"> 
<input type="hidden" name="mode" value="browse"></form>

<div align="center">
<input type="submit" name="submit" value="Найти"
                               onClick="room();" >
</div>
		   
</div>
</td>

		<td valign="top">
			<div id="mep">
			<div style="width:950px; height:600px;" id="map" align="left"></div>
			<script  src="D:\ms4w\apps\example\sait\Openlayers.js" 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 grass = new OpenLayers.Layer.WMS(
		  "Зеленые насаждения",
		  "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/sait/astu_id.map&service=WMS&",
		  { 
                    height: '600px',
                    width: '870px',
                    layers: 'grass', 
                    transparent: 'TRUE',
                    srs: 'EPSG:4326' }, 
                    {singleTile:true}
	 );
 
     var buildings = new OpenLayers.Layer.WMS(
		  "Учебные корпуса",
		  "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/example/sait/astu_id.map&service=WMS&",
		  { 
                    height: '600',
                    width: '870',
                    layers: 'buildings', 
                    transparent: 'TRUE', 
                    
                    srs: 'EPSG:4326' }, 
                    {singleTile:true}
	 );

       grass.setIsBaseLayer(true);


    map.addLayers([grass,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></div>
			</td>
			</tr>
			</table>
	</div>
</BODY>
</HTML>

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

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

Сообщение arzobispo »

di@mond писал(а):Воспользовалась вашими советами и примерами, но ничего не получается...

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

Спасибо за помощь!!!
Кстати, с такой ошибкой мучаются многие на буржуйских форумах и пока никто ничего путнего не ответил, а в мануале на сайте по MapServer'у там мягко говоря по русски - ай-лю-лю балалайка. У меня тоже такая была, и пришел к выводу, что косяк в html-коде, когда идет передаче данных по методу Get с использованием JS, в итоге пришлось выкинуть JS и все сделать просто, как у Герасимовской табуретки :)
С Уважением, Антон
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

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

Сообщение Mavka »

А для того чтобы картинка была цельной, нужно задать singleTile [не запутайтесь в скобках]:

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

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'
    },
    {singleTile: true}
); 
По-умолчанию, слои MapServer создаются базовыми. К singleTile добавьте isBaseLayer:

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

    {singleTile: true, isBaseLayer: false} 
лангольеры под окном жрали время ом-ном-ном
Ответить

Вернуться в «Веб-картография»

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

Сейчас этот форум просматривают: Bing [Bot] и 3 гостя