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

Openlayers и BBOX, искажение карты

Добавлено: 30 май 2012, 20:21
rim
Проблема с Openlayers. Я писал уже о ней год назад, тогда правда были другие исходные данные (и тогда она не была решена).

Дано: MS4W с Mapserver 6.0.3 и Openlayers 2.10, карта в формате Mapinfo. Исходно карта была в СК Пулково 42, перепроецировал в EPSG:4326. Код map-файла:

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

MAP
  NAME "Test map"
  EXTENT 29.424952 59.633724 30.758989 60.245014
  UNITS DD
   
  IMAGETYPE PNG
  IMAGECOLOR 255 255 255
  STATUS ON
  SIZE 200 200
  
  DATAPATTERN ".*"

  WEB
    METADATA
      ows_enable_request "*"
      "wms_title"           "Test map" 
      "ows_srs"             "epsg:4326"
      WMS_BBOX_EXTENDED "TRUE"
    END
  END

  PROJECTION
   "init=epsg:4326"
   "proj=latlong"
   "ellps=WGS84"
   "datum=WGS84"

  END

  LAYER
    NAME "Peterburg_hydrography_a"
    TYPE POLYGON
    STATUS ON
    CONNECTIONTYPE OGR
    CONNECTION "C:\Tools\Map\ms4w\apps\mmap\htdocs\map\4326\Peterburg_hydrography_a.tab"
    STYLEITEM "AUTO" 
    CLASS
        NAME "Hydro"
    END
  END
  
END

Значение EXTENT было взято из Peterburg_hydrography_a.tab с помощью ogrinfo.

Код настроек Openlayers:

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

        // Map options
        var options = {
            size: new OpenLayers.Size(660, 660), // map div size is 660x660
            maxExtent: new OpenLayers.Bounds(29.424952, 59.633724, 30.758989, 60.245014), 
            minResolution: "auto",
            minExtent: new OpenLayers.Bounds(-1, -1, 1, 1),
            maxResolution: "auto",
            numZoomLevels: 11,
            projection: "EPSG:4326",
            controls: [],
            allOverlays: true,
            SphericalMercator: false
        }
        var map = new OpenLayers.Map( 'map', options );
        
        var mapserv = 'http://127.0.0.1:8010/cgi-bin/mapserv.exe'

        // Create layer
        var layer_params = {format: 'image/png', 'LAYERS': 'Peterburg_hydrography_a', transparent: true}
        var layer_options = {isBaseLayer: false, visibility: true, SphericalMercator: false, projection: "EPSG:4326"}
        var layer = new OpenLayers.Layer.WMS( 'Hydro', mapserv, layer_params, layer_options)
        map.addLayer(layer)

        var zoom = 0
        // map center 
        var lon = 59.939369 
        var lat = 30.0919705 
        map.setCenter(new OpenLayers.LonLat(lon, lat), zoom);
Карта рисуется. Только растянута по горизонтали. Если сделать запрос к Mapserver руками, прописав в урле BBOX=29.424952,59.633724,30.758989,60.245014 (т.е. точно такое же, как прописано в map-файле) и задать равную высоты и ширину картинки (те же 660х660), то с картой все в порядке.

Как заставить Openlayers слать корректное значние BBOX, чтобы карта не расстягивалась?

P.S. Не покидает стойкое ощущение, что я чего-то очевидное упускаю из виду. Только нащупать никак не могу.

Re: Openlayers и BBOX, искажение карты

Добавлено: 31 май 2012, 05:20
Denis Rykov
В 4326 карта и будет казаться вытянутой. Во-первых, нужно настроить MapServer, чтобы он мог отдавать данные в спроецированном виде, например в проекции EPSG:900913, для этого исходные данные изменять не нужно. В этом случае ваш map-файл будет выглядеть следующим образом:

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

MAP
    IMAGETYPE PNG
    IMAGECOLOR 255 255 255
    SIZE 512 512

    OUTPUTFORMAT
        NAME        "png"
        EXTENSION   "png"
        MIMETYPE    "image/png"
        DRIVER         AGG/PNG
        IMAGEMODE  RGBA
        FORMATOPTION "INTERLACE=OFF"
    END

    EXTENT 29.424952 59.633724 30.758989 60.245014
    PROJECTION
        "init=epsg:4326"
    END
  
    DATAPATTERN ".*"

    WEB
        METADATA
            ows_title                   "Test map"
            wms_enable_request          "*"
            wms_srs                     "epsg:4326 epsg:3857 epsg:900913"
        END
    END

    LAYER
        NAME "Peterburg_hydrography_a"
        TYPE POLYGON
        STATUS ON
        CONNECTIONTYPE OGR
        CONNECTION "C:\Tools\Map\ms4w\apps\mmap\htdocs\map\4326\Peterburg_hydrography_a.tab"
        STYLEITEM "AUTO" 
        CLASS
            NAME "Hydro"
        END
    END
  
END
Ну и соответствующим образом отредактировать скрипт OpenLayers.

Re: Openlayers и BBOX, искажение карты

Добавлено: 31 май 2012, 12:33
rim
"Семён Семёныч..."

Все поехало, большое спасибо. Почва вернулась под ноги. Только думаю, что переведу карты в проекцию 3857, для ускорения построения изображений (кэширование тоже будет, но без предварительного построения всех тайлов).

Re: Openlayers и BBOX, искажение карты

Добавлено: 17 авг 2012, 20:26
Gdevpo
Здравствуйте. С OpenLayers 2.12 та же проблема?