Страница 1 из 1

mapserver, openlayers, wms и слой google

Добавлено: 19 сен 2011, 20:28
soilmsu
Здравствуйте!

Второй день бьюсь с проблемой...

Пытаюсь вывести слой WMS совместно со слоем google, безуспешно.. До этого вывел несколько слоев в другой карте в обычной проекции, все ок было.

Mapfile:

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

MAP
 NAME "wms_pgr"
 IMAGETYPE	PNG
 STATUS	ON
 EXTENT		15 12 195 111
 SIZE		800 600
 SHAPEPATH	"C:\ms4w\apps\pgr\data"
 IMAGECOLOR	255 255 255
  FONTSET "C:\ms4w\apps\pgr\fonts\fonts.txt"


 WEB
 TEMPLATE "C:\ms4w\apps\pgr\template.html"
 IMAGEPATH "C:\ms4w\apps\pgr\data\tmp"
 IMAGEURL "C:\ms4w\tmp"


	METADATA
	wms_title "pgr_google"
	wms_abstract "this is WMS of pgr"
	wms_onlineresource "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/pgr/pgr_google.map&"
	wms_srs  "epsg:4326 epsg:900913"
	wms_getfeatureinfo "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/pgr/pgr_google.map&" 
	wms_featureformat "text/plain"
	wms_enable_request "*"
	END
 END
 
	PROJECTION
   "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"
	END
 
LAYER
  NAME poias
  DATA pochv_rayony_Russia_region_google
  STATUS ON
  TYPE POLYGON
  CLASSITEM "ZONA"
  TEMPLATE "dummy"

	CLASS
      NAME       "Остальное"
	  EXPRESSION '' # Выражение, определяющее класс
      STYLE
		OUTLINECOLOR 0 0 0
      END
    END
	

		METADATA
		wms_title         "poias"
		wms_abstract      "poisa"
		wms_srs           "EPSG:4326 epsg:900913"
		wms_include_items "all"
		END

	PROJECTION
   "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"
   END
   
 END


template:

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

	   var lon = 55;
       var lat = 55;
       var zoom = 0;
	  
var map = new OpenLayers.Map('map', {'projection': new OpenLayers.Projection("EPSG:4326"), 
'maxExtent': new OpenLayers.Bounds(15,12,195,111), 'maxResolution': 'auto'})

		 
		 	var ghyb = new OpenLayers.Layer.Google("Google Hybrid", 
             {type: google.maps.MapTypeId.HYBRID, numZoomLevels: 20});

           var mappath="C:/ms4w/apps/pgr/pgr_google.map";
           var mapurl="http://localhost/cgi-bin/mapserv.exe";
           var soilmap = new OpenLayers.Layer.WMS("Soils",
            mapurl,    {map: mappath, layers: 'poias', format: 'png'}, 
			{isBaseLayer: false, 'reproject': true, opacity: 0.5});




map.addLayers([ghyb,soilmap]);
		 
		 var options = {
projection: new OpenLayers.Projection("EPSG:900913"),
units: "m"};
Ogrinfo:

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

Geometry: Polygon
Feature Count: 1378
Extent: (19.640703, 41.173838) - (190.297348, 81.890823)
Layer SRS WKT:
GEOGCS["GCS_WGS_1984",
    DATUM["WGS_1984",
        SPHEROID["WGS_1984",6378137,298.257223563]],
    PRIMEM["Greenwich",0],
    UNIT["Degree",0.017453292519943295]]
Сейчас, если прав. клик мышкой на ошибку ( http://localhost/cgi-bin/mapserv.exe?MA ... HEIGHT=256 ), пишет Invalid values for BBOX



Перепробовал все что только можно, по форумам шерстил.. Проекцию 900913 в proj прописал. extent определял (перепроецировал карту в 900913 для этого) и менял и так и сяк. EXTENT 19.640703, 41.173838) - (190.297348, 81.890823 пробовал, не помолго.

До того, как поменял проекцию в мапфайле на 900913, все работало, (хотя гугл карты все равно отображались на заднем фоне уменьшенные, когда как wms слой был на переднем и все с ним было ок).

Скриншот прилагаю.


Спасибо!

Re: mapserver, openlayers, wms и слой google

Добавлено: 20 сен 2011, 14:46
soilmsu
Поменял центровку карты и зум (lat lon) на zoomtoMaxExtent и слой начал показываться. И даже в нужном месте!

см. скриншот
Изображение


Однако, когда приближаю карту (увеличиваю), слой пропадает и картина примерно та же, что и в скриншоте, который в первом сообщении этого топика:
Изображение

Из access.log:

Первый раз обращаюсь к карте, когда слой отображается:

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

127.0.0.1 - - [20/Sep/2011:15:41:17 +0400] "GET /cgi-bin/mapserv.exe?MAP=C%3A%2Fms4w%2Fapps%2Fpgr%2Fpgr_google.map&
LAYERS=poias&FORMAT=png&SERVICE=WMS&VERSION=1.1.1&
REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&
SRS=EPSG%3A900913&BBOX=0.0000024996697902679,3.9953738451004e-7,5009377.0848025,5009377.0848004&WIDTH=256&
HEIGHT=256 HTTP/1.1" 200 758
Приближаю карту, слой не отображается:

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

127.0.0.1 - - [20/Sep/2011:15:44:31 +0400] "GET /cgi-bin/mapserv.exe?MAP=C%3A%2Fms4w%2Fapps%2Fpgr%2Fpgr_google.map&
LAYERS=poias&FORMAT=png&SERVICE=WMS&VERSION=1.1.1&
REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&
SRS=EPSG%3A900913&BBOX=0,0,20037508.3392,20037508.3392&
WIDTH=256&HEIGHT=256 HTTP/1.1" 200 33286

127.0.0.1 - - [20/Sep/2011:15:45:50 +0400] "GET /cgi-bin/mapserv.exe?MAP=C%3A%2Fms4w%2Fapps%2Fpgr%2Fpgr_google.map&
LAYERS=poias&FORMAT=png&SERVICE=WMS&VERSION=1.1.1&
REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&
SRS=EPSG%3A900913&BBOX=0,0,5009377.0848,5009377.0848&WIDTH=256&HEIGHT=256 HTTP/1.1" 200 758

127.0.0.1 - - [20/Sep/2011:15:45:50 +0400] "GET /cgi-bin/mapserv.exe?MAP=C%3A%2Fms4w%2Fapps%2Fpgr%2Fpgr_google.map&
LAYERS=poias&FORMAT=png&SERVICE=WMS&VERSION=1.1.1&
REQUEST=GetMap&STYLES=&EXCEPTIONS=application%2Fvnd.ogc.se_inimage&
SRS=EPSG%3A900913&BBOX=0,0,10018754.1696,10018754.1696&
WIDTH=256&HEIGHT=256 HTTP/1.1" 200 34981
Поможите, люди добрые!!

Re: mapserver, openlayers, wms и слой google

Добавлено: 22 сен 2011, 16:09
soilmsu
Никак не пойму в чем проблема... У кого-нибудь есть идеи?

Re: mapserver, openlayers, wms и слой google

Добавлено: 23 сен 2011, 16:32
soilmsu
Мытарства продолжаются :)

Однако есть прогресс - карта выводится. Но выводится в какой-то странной проекции, близкой к нужной, но границы не совпадают - они на несколько десятков километров севернее, чем слой гугл (см. скриншот)
ggggggggggg.jpg
ggggggggggg.jpg (62.23 КБ) 7439 просмотров
мапфайл

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

MAP
 NAME "wms_pgr"
 IMAGETYPE	PNG
 STATUS	ON
 EXTENT		15 12 195 111
 SIZE		800 600
 SHAPEPATH	"C:\ms4w\apps\pgr\data"
 IMAGECOLOR	255 255 255
  FONTSET "C:\ms4w\apps\pgr\fonts\fonts.txt"


 WEB
 TEMPLATE "C:\ms4w\apps\pgr\template.html"
 IMAGEPATH "C:\ms4w\apps\pgr\data\tmp"
 IMAGEURL "C:\ms4w\tmp"


	METADATA
	wms_title "pgr_google"
	wms_abstract "this is WMS of pgr"
	wms_onlineresource "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/pgr/pgr_google.map&"
	wms_srs  "epsg:4326"
	wms_getfeatureinfo "http://localhost/cgi-bin/mapserv.exe?map=/ms4w/apps/pgr/pgr_google.map&" 
	wms_featureformat "text/plain"
	wms_enable_request "*"
	END
 END
 
	PROJECTION
   "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"
	END
 
LAYER
  NAME poias
  DATA pochv_rayony_Russia_region_google
  STATUS ON
  TYPE POLYGON
  CLASSITEM "ZONA"
  TEMPLATE "dummy"

 	CLASS
      NAME       "Остальное"
	      STYLE
		OUTLINECOLOR 255 0 0
      END
    END
	


		METADATA
		wms_title         "poias"
		wms_abstract      "poisa"
		wms_srs           "EPSG:4326"
		wms_include_items "all"
		END

	PROJECTION
   "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"
   END
 END
END
шаблон

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

var map = new OpenLayers.Map('map', {'projection': new OpenLayers.Projection("EPSG:4326"), 
'maxExtent': new OpenLayers.Bounds(15,12,195,111), maxResolution: 'auto'});

		 
		 	var ghyb = new OpenLayers.Layer.Google("Google Hybrid", 
             {'type': G_HYBRID_MAP, numZoomLevels: 20});

           var mappath="C:/ms4w/apps/pgr/pgr_google.map";
           var mapurl="http://localhost/cgi-bin/mapserv.exe";
		   
           var soilmap = new OpenLayers.Layer.WMS("Soils",
            mapurl,    {map: mappath, layers: 'poias', format: 'image/png', transparent: "true"}, 
			{isBaseLayer: false, 'reproject': true, opacity: 0.6});


map.addLayers([ghyb,soilmap]);
map.setCenter(new OpenLayers.LonLat(105,65), 3);		
Пробовал накладывать эту же карту на гугл в qgis 1.7 - границы совпадают... Значит косяк в коде.

Пробовал перепроецировать слой в другие проекции в qgis и mapinfo - не помогает ( http://pastebin.com/ZRpXYpxL тут код, который прописывал для 900913 проекции)...

Подскажите, пожалуйста, в чем может быть дело?

Re: mapserver, openlayers, wms и слой google

Добавлено: 23 сен 2011, 23:41
Mavka
В map-файле добавьте выходные проекции:

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

wms_srs "epsg:4326 epsg:3857 epsg:900913" 
В коде для soilmap уберите reproject, а в слой ghyb добавьте sphericalMercator. Подробнее см. здесь.

P.S. Если UMN MapServer начнет ругаться на проекции, то найдите файл "epsg" и проверьте наличие в нем описания 900913. Если нет, то добавьте в начало файла:

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

<900913> +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext  +no_defs <> 
Под рукой MS4W чтобы проверить нету, но в OSGeo4W это проделывать необходимо.

Re: mapserver, openlayers, wms и слой google

Добавлено: 26 сен 2011, 17:56
soilmsu
Спасибо большое! Сделал все что Вы рекомендовали, но не помогло (900913 в proj давно прописал еще) :(


добавление sphericalMercator путает bbox -> ВМС не отображается.

Учитывая Ваши рекомендации и еще рекомендации человека из irc попробовал такой вариант:


var map = new OpenLayers.Map('map', {projection: new OpenLayers.Projection("EPSG:900913"), displayProjection: new OpenLayers.Projection("EPSG:4326"),
maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34), maxResolution: 156543.0399, units: 'm'})


var ghyb = new OpenLayers.Layer.Google("Google Hybrid",
{'type': G_HYBRID_MAP, sphericalMercator:true, numZoomLevels: 20});

var mappath="C:/ms4w/apps/pgr/pgr_google.map";
var mapurl="http://localhost/cgi-bin/mapserv.exe";

var soilmap = new OpenLayers.Layer.WMS("Soils",
mapurl, {map: mappath, layers: 'poias', format: 'image/png'},
{isBaseLayer: false, opacity: 0.6});

var A = new OpenLayers.Projection("EPSG:4326");
var B = new OpenLayers.Projection("EPSG:900913");

map.addLayers([ghyb,soilmap]);
map.setCenter(new OpenLayers.LonLat(105,65).transform(A,B), 3);

Гугл отображается, там где надо при чем, но нет слоя ВМС.

Сделал вмс не прозрачным и ПКМ на него, скопировал УРЛ в строку браузера:

http://localhost/cgi-bin/mapserv.exe?MA ... 28131.2536[/b]&WIDTH=256&HEIGHT=256

если руками ставлю в этой строке другой bbox, то слой отображается
http://localhost/cgi-bin/mapserv.exe?MA ... 12,195,111[/b]&WIDTH=256&HEIGHT=256

Каким-то образом надо исправить вывод верных координат..

Уважаемый Mavka, у Вас есть идеи?

з.ы.
обновил openlayers до последней версии, не помогло..

Re: mapserver, openlayers, wms и слой google

Добавлено: 26 сен 2011, 18:18
Mavka
soilmsu писал(а):добавление sphericalMercator путает bbox -> ВМС не отображается.
Разве я так написал? Может быть, все таки, наоборот?

Найдите на своей карте Гвинейский залив и под сильным увеличением поищите слой WMS в районе нулевых координат или чуть северо-восточнее.
soilmsu писал(а):если руками ставлю в этой строке другой bbox, то слой отображается
У меня в таком случае вызывает сильное подозрение правильность систем координат, заданная в map-файле.

Re: mapserver, openlayers, wms и слой google

Добавлено: 29 сен 2011, 19:53
soilmsu
Решил проблему так:

скачал новую мапинфо 10.5

там есть проекция EPSG:3857, в нее перевел карту.

в шаблоне указал

var map = new OpenLayers.Map('map', {projection: new OpenLayers.Projection("EPSG:3857"),
maxExtent: new OpenLayers.Bounds(2186393.04,5038076.91,21183803.90,16880990.90), units: 'm'});


var ghyb = new OpenLayers.Layer.Google("Google Hybrid",
{'type': G_HYBRID_MAP, sphericalMercator:true, numZoomLevels: 20});

var mappath="C:/ms4w/apps/pgr/pgr_google.map";
var mapurl="http://localhost/cgi-bin/mapserv.exe";

var soilmap = new OpenLayers.Layer.WMS("Soils",
mapurl, {map: mappath, layers: 'poias', format: 'image/png', transparent: "true"},
{isBaseLayer: false, opacity: 0.6});


map.addLayers([ghyb,soilmap]);
map.setCenter(new OpenLayers.LonLat(11762575, 9371255), 3);



В мапфайле:
PROJECTION
"init=epsg:900913"
END



И все встало на свои места :)

Mavka, спасибо Вам за ценные советы!