MapServer & OpenLayers: проблема с проекциями

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
Abstraction
Новоприбывший
Сообщения: 4
Зарегистрирован: 10 дек 2009, 19:47
Репутация: 0

MapServer & OpenLayers: проблема с проекциями

Сообщение Abstraction » 14 дек 2009, 22:11

Доброго всем времени суток.
При создании проекта с использованием связки MapServer+OpenLayers возникла проблема с отображением карты в проекции отличной от epsg:4326. В частности, при использовании приведённого кода пропорции карты не изменяются по сравнению со случаем, когда настройки проекции слоя отсутствуют - только уменьшается изображение в целом (по всей видимости, отображаясь в прямоугольнике 180х360 метров). Собственно, первый вопрос такой: написанный код так и должен отрабатывать (и как тогда отобразить карту в проекции Меркатора), или должно быть по-другому?
html-файл:

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

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Test page</title>
    <script src="js/OpenLayers/OpenLayers.js" type="text/javascript"></script>
    <script src="js/jQuery/jquery.js" type="text/javascript"></script>

    <script type="text/javascript">
		// начальное позиционирование карты
		var lon = 37.622975;
		var lat = 55.746071;
		var zoom = 5;

        // переменные для карт и слоев
        var map, layer;

        //Начальная проекция:
        var defaultProjection="EPSG:3395";
		
		function init(){
        	map = new OpenLayers.Map({
	        	div: 'map',
		        controls: [], 
		        //projection: new OpenLayers.Projection(defaultProjection),
		        //displayProjection: new OpenLayers.Projection(defaultProjection),
	        	tileSize: new OpenLayers.Size(256,256) //размер фрагмента карты
	        });
	
	        window.onunload = function (){ map.unloadDestroy();}; //функция принудительной отчистки памяти при выгрузке
	
	        layer = new OpenLayers.Layer.WMS( "Web MapServer", 
		    	"http://127.0.0.1:8080/cgi-bin/mapserv.exe", 
		    	{
			    	format: 'aggpng24',
				    //map: '/ms4w/apps/example/wms_4mln_shp_200k.map', 
				    map: '/ms4w/apps/example/wms_4mln_shp_200k_shp.map', 
				    //map: '/ms4w/apps/example/wms_4mln_shp_200k_projection.map', 
				    layers: 'sea,rga_color,dna,vga2,vga1,isl,ppa,coast,dnl,road,rrl,boundary,names,ppp,200k_ecw_all'
			    },
			    { 
			    	gutter: 0, 
		    		transitionEffect: 'resize',
			    	//resolutions: [0.256,0.128,0.064,0.032,0.016,0.008,0.004,0.002,0.001,0.0005],
				    projection: new OpenLayers.Projection(defaultProjection),
				    units: 'meters',
				    maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
				    maxResolution: 10000
				});
	        map.addLayer(layer);

        	map.addControl(new OpenLayers.Control.LayerSwitcher());
	        map.addControl(new OpenLayers.Control.PanZoomBar());

	        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
		    
		}
    </script>

</head>
<body onload="init();">
    <div id="map" class="mymap">
    </div>
</body>
</html>
.map-файл:

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

MAP
	SIZE           256 256
	
	SHAPEPATH      "/ms4w/apps/example/4mln/shp/"
	
	IMAGECOLOR     255 255 255
	SYMBOLSET      "./symbols/symbols35.sym"
	FONTSET        "./fonts/fonts.list"
	PROJECTION
		"init=epsg:3395"
	END
	
	WEB
		METADATA
			"wms_srs" "epsg:4326 epsg:3395"
		END
	END
	
	OUTPUTFORMAT
		NAME aggpng24
		DRIVER AGG/PNG
		MIMETYPE "image/png"
		IMAGEMODE RGB
		EXTENSION "png"
	END
#<...> код отображения слоёв, проекции слоёв не заданы
END
Заранее спасибо.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: MapServer & OpenLayers: проблема с проекциями

Сообщение Mavka » 15 дек 2009, 11:47

У вас перепутаны свойства карты (map) и слоя (layer). Попробуйте так:

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

<script type="text/javascript">
    // начальное позиционирование карты
    var lon = 37.622975;
    var lat = 55.746071;
    var zoom = 5;

    // переменные для карт и слоев
    var map, layer;

    function init(){
        map = new OpenLayers.Map('map', {
            projection: new OpenLayers.Projection("EPSG:3395"),
            units: 'm',
            transitionEffect: 'resize',
            controls: []
            maxExtent: new OpenLayers.Bounds(-20037508.34,-20037508.34,20037508.34,20037508.34),
            maxResolution: 10000
        });

        window.onunload = function (){ map.unloadDestroy();}; //функция принудительной отчистки памяти при выгрузке

        layer = new OpenLayers.Layer.WMS( "Web MapServer", 
            "http://127.0.0.1:8080/cgi-bin/mapserv.exe",
            {
                map: '/ms4w/apps/example/wms_4mln_shp_200k_shp.map', 
                format: 'png',
                layers: 'sea,rga_color,dna,vga2,vga1,isl,ppa,coast,dnl,road,rrl,boundary,names,ppp,200k_ecw_all'
            },
            {gutter: 0}
        );
        map.addLayer(layer);

        map.addControl(new OpenLayers.Control.LayerSwitcher());
        map.addControl(new OpenLayers.Control.PanZoomBar());

        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
    }
</script>
P.S. Если я не ошибаюсь, до "maxResolution: 10000" соответствует масштабу "1:28'346'472".
лангольеры под окном жрали время ом-ном-ном

Abstraction
Новоприбывший
Сообщения: 4
Зарегистрирован: 10 дек 2009, 19:47
Репутация: 0

Re: MapServer & OpenLayers: проблема с проекциями

Сообщение Abstraction » 15 дек 2009, 15:08

Попробовал, картинка не изменилась. Квадрат О-36 по-прежнему прямоугольник, а не трапеция.

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: MapServer & OpenLayers: проблема с проекциями

Сообщение Mavka » 15 дек 2009, 15:43

1. В QGis как отображается?
2. Смотрите параметры запросов на MapServer.
лангольеры под окном жрали время ом-ном-ном

Abstraction
Новоприбывший
Сообщения: 4
Зарегистрирован: 10 дек 2009, 19:47
Репутация: 0

Re: MapServer & OpenLayers: проблема с проекциями

Сообщение Abstraction » 15 дек 2009, 16:18

Строка запроса к серверу для 3395:

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

http://127.0.0.1:8080/cgi-bin/mapserv.exe?
FORMAT=aggpng24&
MAP=%2Fms4w%2Fapps%2Fexample%2Fwms_4mln_shp_200k_shp.map&
LAYERS=sea%2Crga_color%2Cdna%2Cvga2%2Cvga1%2Cisl%2Cppa%2Ccoast%2Cdnl%2Croad%2Crrl%2Cboundary%2Cnames%2Cppp%2C200k_ecw_all&
SERVICE=WMS&
VERSION=1.1.1&
REQUEST=GetMap&
STYLES=&
EXCEPTIONS=application%2Fvnd.ogc.se_inimage&
SRS=epsg%3A3395&
BBOX=85.410000000149,69.785000000149,101.03500000015,85.410000000149&
WIDTH=256&
HEIGHT=256
Для 4326 отличаются только параметры SRS и, естественно, BBOX:

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

SRS=EPSG%3A4326&
BBOX=22.5,67.5,28.125,73.125&
QGis сейчас скачаю, буду осваивать...

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: MapServer & OpenLayers: проблема с проекциями

Сообщение Mavka » 15 дек 2009, 16:24

Вот всю строку запроса (поправьте bbox до полного охвата) откройте в браузере (IE, Firfox, Opera) и посмотрите на картинку. Она как выглядит?
лангольеры под окном жрали время ом-ном-ном

Abstraction
Новоприбывший
Сообщения: 4
Зарегистрирован: 10 дек 2009, 19:47
Репутация: 0

Re: MapServer & OpenLayers: проблема с проекциями

Сообщение Abstraction » 15 дек 2009, 16:50

Открыл. Результат для проекции 3395:
Во-первых, полный охват территории России+СНГ - BBOX=10,20,200,80
Во-вторых, квадрат О36 отображается как прямоугольник, хотя, насколько понимаю, должна быть трапеция.

Полагаете, что проблема в map-файле?

Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: MapServer & OpenLayers: проблема с проекциями

Сообщение Mavka » 15 дек 2009, 17:33

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

Ответить

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

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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей