OpenLayers - несколько WMS слоев

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
rim
Интересующийся
Сообщения: 20
Зарегистрирован: 26 авг 2011, 16:51
Репутация: 0

OpenLayers - несколько WMS слоев

Сообщение rim »

Добрый день или ночь.

Бьюсь уже месяц с OpenLayers. Большую часть вопросов решил. Но уперся рогом в проблему с созданием нескольких WMS слоев. Видимо, чего-то не понимаю и так принципиально сделать нельзя, поэтому прошу помощи тут.

Для наглядности даю кусок кода, в котором добавляю слои:

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

            var l1 = new OpenLayers.Layer.WMS( 'LL1',
                        "http://10.255.2.65/cgi-bin/russia", {format: "image/gif", layers: 'russia-admin-a-2'},
                        {tileSize: new OpenLayers.Size(256, 256), projection: "EPSG:4326", buffer:2, gutter: 1});
            map.addLayer(l1)
            var l2 = new OpenLayers.Layer.WMS( 'LL2',
                        "http://10.255.2.65/cgi-bin/russia", {format: "image/gif", layers: 'russia-admin-a-3'},
                        {tileSize: new OpenLayers.Size(256, 256), projection: "EPSG:4326", buffer:2, gutter: 1});
            map.addLayer(l2)
В итоге запрос к mapserver идет только для слоя russia-admin-a-2. Остальные не запрашиваются. В чем подстава?

И второй вопрос до кучи. Openlayers отображает карту с небольшой изометрией, слегка сплющивает ее что ли. Это как-то лечится?
Аватара пользователя
dobeer
Активный участник
Сообщения: 199
Зарегистрирован: 25 дек 2009, 21:54
Репутация: 1
Откуда: Чита
Контактная информация:

Re: OpenLayers - несколько WMS слоев

Сообщение dobeer »

1. Немогу понять, почему вы делаете 2 WMS, если их источником является 1 (http://10.255.2.65/cgi-bin/russia)...
Может подключать нужно 1 wms:

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

var l1 = new OpenLayers.Layer.WMS( 'LL1',
                        "http://10.255.2.65/cgi-bin/russia", {format: "image/gif", layers: 'russia-admin-a-2, russia-admin-a-3'},
                        {tileSize: new OpenLayers.Size(256, 256), projection: "EPSG:4326", buffer:2, gutter: 1});
как я понял у вас 2 слоя а не 2 wms...

2. Не правильно видимо указана проекция
old_Bibigon
Участник
Сообщения: 78
Зарегистрирован: 25 янв 2010, 14:14
Репутация: 3

Re: OpenLayers - несколько WMS слоев

Сообщение old_Bibigon »

rim писал(а):Добрый день или ночь.

Бьюсь уже месяц с OpenLayers. Большую часть вопросов решил. Но уперся рогом в проблему с созданием нескольких WMS слоев. Видимо, чего-то не понимаю и так принципиально сделать нельзя, поэтому прошу помощи тут.

Для наглядности даю кусок кода, в котором добавляю слои:

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

            var l1 = new OpenLayers.Layer.WMS( 'LL1',
                        "http://10.255.2.65/cgi-bin/russia", {format: "image/gif", layers: 'russia-admin-a-2'},
                        {tileSize: new OpenLayers.Size(256, 256), projection: "EPSG:4326", buffer:2, gutter: 1});
            map.addLayer(l1)
            var l2 = new OpenLayers.Layer.WMS( 'LL2',
                        "http://10.255.2.65/cgi-bin/russia", {format: "image/gif", layers: 'russia-admin-a-3'},
                        {tileSize: new OpenLayers.Size(256, 256), projection: "EPSG:4326", buffer:2, gutter: 1});
            map.addLayer(l2)
В итоге запрос к mapserver идет только для слоя russia-admin-a-2. Остальные не запрашиваются. В чем подстава?
Скорее всего они у вас оба базовые, добавьте к карте контрой LayerSwitcher и тыкайтесь между ними, или если Вам надо чтобы оба WMS слоя были на одном слое OL'a, то последуйте совету doober.
И второй вопрос до кучи. Openlayers отображает карту с небольшой изометрией, слегка сплющивает ее что ли. Это как-то лечится?
Это фича проекции epsg:4326, если хотите как в гугле, то используйте сферический меркатор (epsg:3857 или читерскую epsg:900913), WMS должен уметь отдавать картинку в этой проекции.
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OpenLayers - несколько WMS слоев

Сообщение Mavka »

1. Как заметил old_Bibigon, скорее всего оба слоя базовые. Или добавьте LayerSwitcher или сделайте один из слоев не базовым (isBaseLayer):

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

var l1 = new OpenLayers.Layer.WMS( 'LL1',
    "http://10.255.2.65/cgi-bin/russia",
    {format: "image/gif", layers: 'russia-admin-a-2'},
    {buffer:2, gutter: 1});
map.addLayer(l1)

var l2 = new OpenLayers.Layer.WMS( 'LL2',
    "http://10.255.2.65/cgi-bin/russia",
    {format: "image/gif", layers: 'russia-admin-a-3', transparent: true},
    {buffer:2, gutter: 1, isBaseLayer: false});
map.addLayer(l2) 
На всякий случай добавил transparent, что бы слой были прозрачным (без фона).

Для производительности, по возможности, лучше слои с одного сервера объединять в один (см. пост dobeer).

2. Сплюснутая карта в Layer Preview
При создании карты укажите гугло-проекцию:

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

map = new OpenLayers.Map('map', {
    units: 'm',
    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,
    numZoomLevels: 19,
    controls: [
        new OpenLayers.Control.PanZoomBar(),
        new OpenLayers.Control.Navigation(),
        new OpenLayers.Control.LayerSwitcher()
    ]
}); 
В контроллерах подключен тот самый LayerSwitcher.
лангольеры под окном жрали время ом-ном-ном
rim
Интересующийся
Сообщения: 20
Зарегистрирован: 26 авг 2011, 16:51
Репутация: 0

Re: OpenLayers - несколько WMS слоев

Сообщение rim »

Понял, что я есть ленивое существо с завышенными запросами.
На счет все слои карты в один слой OL знаю. Но хотелось такой фичи, как на лету включать/выключать слои, без перезагрузки карты на текущем зуме. Попробую поиграться с установкой базового слоя. Не получится, будем делать без изысков.

MapServer наверняка умеет менять проекции (может только Proj придется пересобрать). Но изменение проекции на лету не сильно сказывается на производительности? Хотя для данного проекта не критично. Была мысль вообще использовать displayProjection, но JS Proj уже совсем костыль на мой взгляд.

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

Re: OpenLayers - несколько WMS слоев

Сообщение Mavka »

Запросы совсем не завышенные и легко осуществимые. Вы таки поиграйтесь с базовыми слоями, если пойдет то и allOverlays включить будет не сложно.

UMN MapServer умеет менять проекции. На производительности для векторных данных сильно не сказывается, на растровых - заметно. Библиотека proj4js небольшая (если работать только с 900913 то и необязательная), а математика несложная - так почему не пользоваться?
лангольеры под окном жрали время ом-ном-ном
rim
Интересующийся
Сообщения: 20
Зарегистрирован: 26 авг 2011, 16:51
Репутация: 0

Re: OpenLayers - несколько WMS слоев

Сообщение rim »

Какие будут данные, векторные или растровые, честно говоря не знаю, это демонстрационный проект.

Все получилось с isBaseLayer, мог бы и сам додуматься, туплю. В итоге применил allOverlays, isBaseLayer всем в false.

С проекцией пока не пробовал.

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

Re: OpenLayers - несколько WMS слоев

Сообщение Mavka »

Use the displayInLayerSwitcher, Luke:

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

var l2 = new OpenLayers.Layer.WMS( 'LL2',
    "http://10.255.2.65/cgi-bin/russia",
    {format: "image/gif", layers: 'russia-admin-a-3', transparent: true},
    {buffer:2, gutter: 1, isBaseLayer: false, displayInLayerSwitcher: false }); 
лангольеры под окном жрали время ом-ном-ном
Ответить

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

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

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