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

Космоснимки API, Openlayers, Mapserver

Добавлено: 18 дек 2013, 13:45
Rumato
Добрый день, у меня вопрос, состоящий из нескольких вопросов.

Я для реализации в web-геосервисе основного слоя карты я использую OpenstreetMap и карту космоснимков, поверх нужно наложить данные со спутникового прибора, но не получается объединить в один работающий пример всё это. Вот js-код:

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

var map, layer;
        function init(){
         	var mod07temperature = "http://localhost/cgi-bin/mapserv?map=/home/diver/geolocal/maps/altai.map&layer=prod&mode=map";
         	
            map = new OpenLayers.Map({
                    div: "map",
                    allOverlays: true
                });
            layer = new OpenLayers.Layer.OSM( "Simple OSM Map");
            
            var oam = new OpenLayers.Layer.XYZ(
         	 	"Express Base",
         	 	"http://maps.kosmosnimki.ru/TileService.ashx?Request=gettile&layerName=04C9E7CE82C34172910ACDBF8F1DF49A&apikey=L5VW1QBBHJ&z=${z}&x=${x}&y=${y}",
         	{
            sphericalMercator: true,
            isBaseLayer: true,
			  visibility: false,
         	}
     		);
            var mod07temperature = new OpenLayers.Layer.MapServer("Temperature",
    		      temperature,
		          { layers: 'image',
			    format: 'png24',      
			   sphericalMercator: true,
			    visibility: false
});
            map.addLayer(layer);
            map.addLayer(oam);
            map.addLayer(temperature);
            map.setCenter(
                new OpenLayers.LonLat(82.6167, 52.7667).transform(
                    new OpenLayers.Projection("EPSG:4326"),
                    map.getProjectionObject()
                ), 11
            );    
    map.addControl(new OpenLayers.Control.LayerSwitcher());
    map.addControl(new OpenLayers.Control.Permalink());
    map.addControl(new OpenLayers.Control.MousePosition());
        }


Т.е. есть слои OSM, Космоснимки и слой Mapserver-a.

Вот содержимое map-файла:

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

  FONTSET "./fonts/fonts.list"
  SYMBOLSET './symbols/symbols35.sym'
  OUTPUTFORMAT
    NAME pnggd
    DRIVER "GD/PNG"
    MIMETYPE "image/png"
    #IMAGEMODE PC256
    EXTENSION "png24"
  END
 
    WEB
    TEMPLATE  '/home/geolocal/example/templates/template1.html'
    IMAGEPATH '/home/geolocal/maps/images/'
    IMAGEURL  '/maps/images/'



    # WMS server settings
    METADATA
      'ows_title'           'QGIS-MAP'
      'ows_onlineresource'  'http://localhost/cgi-bin/mapserv?map=/home/diver/geolocal/map/data/temp.map'
      'ows_srs'             'WGS84'
    END

    
  END

  LAYER
    NAME 'prod'
    TYPE RASTER
    DUMP true
    #TEMPLATE fooOnlyForWMSGetFeatureInfo
    #EXTENT 62.2289530630876442 49.9969740071353286 120.0024212413648002 59.9999999949999889
    #DATA "/home/diver/geolocal/mod072.tif"
    DATA "/home/diver/geolocal/data/tiff/234.tif"
       STATUS ON
    TYPE RASTER
   PROJECTION
    'proj=sphericalMercator'
    'datum=WGS84'
    'no_defs'
    END
   PROCESSING "RESAMPLE=AVERAGE"
   PROCESSING "RESAMPLE=BILINEAR"
   PROCESSING "NODATA=0"
   PROCESSING "SCALE=AUTO" 
   PROCESSING "SCALE_BUCKETS=256" 
   PROCESSING "DITHER=YES"

OFFSITE 71 74 65
TRANSPARENCY 100
OPACITY 100
  END
 END
Какие сейчас проблемы: между слоями OSM и Космоснимков заметна раздница в виде смещения объектов относительно друг-друга.
Mapserver-й слой не отображается, хотя если отключить два других слоя то отображается.

Подскажите, пожалуйста, где у меня ошибки.

Заранее большое спасибо!

Re: Космоснимки API, Openlayers, Mapserver

Добавлено: 19 дек 2013, 06:41
Denis Rykov
Если отталкиваться от того кода, что вы привели, то вот пара проблем, которые сразу бросаются в глаза:
1. У вас в js-коде имя слоя MapServer - mod07temperature, а в addLayer - temperature.
2. Имя слоя в map-файле - prod, а в OpenLayers - image.
3. Что за странное описание проекции в map-файле, вы сами такой способ придумали? Достаточно просто написать

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

PROJECTION
   "init=epsg:3857"
END
4. Настройте нормально WMS на стороне MapServer, пользуйтесь OpenLayers.Layer.WMS вместо OpenLayers.Layer.MapServer.

Re: Космоснимки API, Openlayers, Mapserver

Добавлено: 25 дек 2013, 10:28
Rumato
Извиняюсь, что долго не отвечал. Вот смотрите.

У меня как сейчас обстоят дела. Есть JS код (это основная часть кода)

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

     var map, layer;
        
        function init(){
         var modname1 = "http://localhost/cgi-bin/mapserv?map=/home/diver/geolocal/maps/mod07.map&layer=prod";
            var maxResolution = 156543.0339;
            var maxExtent = new OpenLayers.Bounds(-20037508, -20037508, 20037508, 20037508);
            var restrictedExtent = maxExtent.clone();
            var maxResolution = 156543.0339;
            var options = {
                projection: new OpenLayers.Projection("EPSG:900913"),
                displayProjection: new OpenLayers.Projection("EPSG:4326"),
                numZoomLevels: 18,
                maxResolution: maxResolution,
                maxExtent: maxExtent,
                restrictedExtent: restrictedExtent,
                allOverlays: true
            };

    map = new OpenLayers.Map("map", options);//инициализация карты
    var mapnik = new OpenLayers.Layer.OSM();//создание слоя карты
    var modname = new OpenLayers.Layer.MapServer("Map Data",
    		modname1,
		     {layers: 'prod',
			  format: 'png24',      
			  isBaseLayer: true,
			  visibility: false
			 });
    
    var kosmo1 = new OpenLayers.Layer.XYZ(
        "Express Base",
        "http://maps.kosmosnimki.ru/TileService.ashx?Request=gettile&layerName=04C9E7CE82C34172910ACDBF8F1DF49A&apikey=L5VW1QBBHJ&z=${z}&x=${x}&y=${y}",
        {
            sphericalMercator: true
        }
    );
	var kosmo2 = new OpenLayers.Layer.XYZ(
        "Spot5",
        "http://maps.kosmosnimki.ru/TileService.ashx?Request=gettile&LayerName=ECAAA381886C4FDBBEB4C52B9E27A9AA&apikey=L5VW1QBBHJ&z=${z}&x=${x}&y=${y}",
        {
            sphericalMercator: true
        }
    );
    map.addLayer(mapnik);//добавление слоя
    map.addLayer(kosmo1);
    map.addLayer(kosmo2);
    map.addLayer(modname);
    map.setCenter(new OpenLayers.LonLat(82.6167, 52.7667) //(широта, долгота)
          .transform(
            new OpenLayers.Projection("EPSG:4326"), // переобразование в WGS 1984
            new OpenLayers.Projection("EPSG:900913") // переобразование проекции
          ), 10 // масштаб
        ); 
    var layerMarkers = new OpenLayers.Layer.Markers("Markers");//создаем новый слой маркеров
 
    map.addControl(new OpenLayers.Control.LayerSwitcher());
    map.addControl(new OpenLayers.Control.Permalink());
    map.addControl(new OpenLayers.Control.MousePosition());
Затем есть map-файл

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

MAP
  NAME "QGIS-MAP"
  # Map image size
  SIZE 600 600
  UNITS meters

  EXTENT 64.739581 31.740766 102.659263 60.102366
    FONTSET './fonts/fonts.list'
  SYMBOLSET './symbols/symbols35.sym'
  PROJECTION
    'proj=longlat'
    'datum=WGS84'
    'no_defs'
  END

  # Background color for the map canvas -- change as desired
  IMAGECOLOR 255 255 255
  IMAGEQUALITY 95
  IMAGETYPE png

   OUTPUTFORMAT
    NAME png
    DRIVER "GD/PNG"
    MIMETYPE "image/png"
    #IMAGEMODE PC256
    EXTENSION "png24"
  END
  # Legend
  LEGEND
      IMAGECOLOR 255 255 255
    STATUS ON
    KEYSIZE 18 12
    LABEL
      TYPE BITMAP
      SIZE MEDIUM
      COLOR 0 0 89
    END
  END

  # Web interface definition. Only the template parameter
  # is required to display a map. See MapServer documentation
  WEB
    # Set IMAGEPATH to the path where MapServer should
    # write its output.
    IMAGEPATH '/home/diver/geolocal/maps/images/'
    IMAGEURL  '/maps/images/'

    # Set IMAGEURL to the url that points to IMAGEPATH
    # as defined in your web server configuration
    

    # WMS server settings
    METADATA
      'ows_title'           'QGIS-MAP'
      'ows_onlineresource'  'http://localhost/cgi-bin/mapserv?map=/home/diver/api/maps9.map'
      'ows_srs'             'EPSG:4326'
    END

    #Scale range at which web interface will operate
    # Template and header/footer settings
    # Only the template parameter is required to display a map. See MapServer documentation
    TEMPLATE 'fooOnlyForWMSGetFeatureInfo'
  END

  LAYER
    NAME 'temperatura'
    TYPE RASTER
    DUMP true
    TEMPLATE fooOnlyForWMSGetFeatureInfo
  EXTENT 64.739581 31.740766 102.659263 60.102366
    DATA '/home/diver/geolocal/data/tiff/temperatura.tif'
    METADATA
      'ows_title' 'temperatura'
    END
    STATUS OFF
    TRANSPARENCY 100
    PROJECTION
    'proj=longlat'
    'datum=WGS84'
    'no_defs'
    END
  END

END

И в принципе-то это всё вместе работает за исключением того, что есть расхождение между слоями, видно что есть смещение. Но слой map-сервера отрисовывается, но ввиде вообще белого слоя без каких-либо изображений. При этом если я напрямую генерирую слой карты, мапсервером, то всё хорошо отображается.

В чём может быть проблема?