Страница 1 из 1
OpenLayers - несколько WMS слоев
Добавлено: 26 авг 2011, 17:37
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 отображает карту с небольшой изометрией, слегка сплющивает ее что ли. Это как-то лечится?
Re: OpenLayers - несколько WMS слоев
Добавлено: 26 авг 2011, 19:45
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. Не правильно видимо указана проекция
Re: OpenLayers - несколько WMS слоев
Добавлено: 26 авг 2011, 20:12
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 должен уметь отдавать картинку в этой проекции.
Re: OpenLayers - несколько WMS слоев
Добавлено: 26 авг 2011, 22:07
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.
Re: OpenLayers - несколько WMS слоев
Добавлено: 27 авг 2011, 09:49
rim
Понял, что я есть ленивое существо с завышенными запросами.
На счет все слои карты в один слой OL знаю. Но хотелось такой фичи, как на лету включать/выключать слои, без перезагрузки карты на текущем зуме. Попробую поиграться с установкой базового слоя. Не получится, будем делать без изысков.
MapServer наверняка умеет менять проекции (может только Proj придется пересобрать). Но изменение проекции на лету не сильно сказывается на производительности? Хотя для данного проекта не критично. Была мысль вообще использовать displayProjection, но JS Proj уже совсем костыль на мой взгляд.
Всем большое спасибо.
Re: OpenLayers - несколько WMS слоев
Добавлено: 27 авг 2011, 23:50
Mavka
Запросы совсем не завышенные и легко осуществимые. Вы таки поиграйтесь с базовыми слоями, если пойдет то и allOverlays включить будет не сложно.
UMN MapServer умеет менять проекции. На производительности для векторных данных сильно не сказывается, на растровых - заметно. Библиотека proj4js небольшая (если работать только с 900913 то и необязательная), а математика несложная - так почему не пользоваться?
Re: OpenLayers - несколько WMS слоев
Добавлено: 30 авг 2011, 10:45
rim
Какие будут данные, векторные или растровые, честно говоря не знаю, это демонстрационный проект.
Все получилось с isBaseLayer, мог бы и сам додуматься, туплю. В итоге применил allOverlays, isBaseLayer всем в false.
С проекцией пока не пробовал.
Нет способа задавать все слои сразу, но чтобы не все отображались в LayerSwitcher?
Re: OpenLayers - несколько WMS слоев
Добавлено: 30 авг 2011, 10:52
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 });