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

Опять про LayerSwitcher

Добавлено: 18 дек 2013, 11:46
Serp
Всем добрый день!
Изучаем MapServer.
Создали карту, добавили штук 5 слоев (из шейпов). Проверили отрисовку на html-шаблонах (как в инструкции) - всё путём. Слои включаются/выключаются как надо.
Теперь решили прикрутить к нему OpenLayers и тут началось.
Сначала в LayerSwitcher-е все слои помещались в радио-баттоны и переключались по очереди. Потом догадались убрать у них статус базовых и они начали отображаться чек-боксами. Но они всё равно рисуются только попеременно. Пробовали назначить transparent: "true", хотя это как-то странно, особенно для линейных слоёв.
Тем не менее, одновременно виден только какой-то один слой, который перекрывает даже базовый.
Помогите, кто чем может...

Re: Опять про LayerSwitcher

Добавлено: 18 дек 2013, 11:52
Denis Rykov
Слои опубликованы и подключаются в OpenLayers по WMS? Что странного в transparent? Так оно и работает.

Re: Опять про LayerSwitcher

Добавлено: 19 дек 2013, 05:34
Serp
А мы делаем OpenLayers.Layer.MapServer. Или это уже "устаревший" подход и надо делать WMS? Или вообще Vector Layer?
Просто мы думали, что OpenLayers отправляет MapServer-у запрос на новую карту при смене видимости слоев и возвращает одну (как при работе с html-шаблоном), а он, судя по всему, запрашивает каждый слой отдельно и перекрывает все нижние. Так что ли?

Re: Опять про LayerSwitcher

Добавлено: 19 дек 2013, 05:42
ericsson
Если вы изучаете OpenLayers (а не MapServer, как написано в первом сообщении, т.к. OL не является частью MS, а только является распространенным клиентом к нему), то смею предложить вам вооружиться Firefox+Firebug или любой другой связкой browser+debugger чтобы наглядно увидеть, как происходит общение клиента с сервером в виде HTTP-запросов, а также как устроен front-end (код, выводящий слои и т.п.) самого OpenLayers во время работы. Уверяю, это очень добавляет понимания и избавляет от восприятия любого HTML+JS фреймворка, как этакого "черного ящика", которому на вход скармливают параметры, а он делает с ними неизвестно что.

Re: Опять про LayerSwitcher

Добавлено: 19 дек 2013, 06:04
Denis Rykov
Если вы используете класс MapServer, то вы завязываетесь на конкретный рендерер, поэтому я бы все-таки советовал использовать WMS. Да, каждый отмеченный в списке слой запрашивается отдельно - это вполне ожидаемое поведение и чтобы слои не перекрывали друг друга используйте в WMS-запросе параметр прозрачности, в OpenLayer он будет добавлен автоматически, если в настройках WMS-слоя указать transparent:true.

Re: Опять про LayerSwitcher

Добавлено: 19 дек 2013, 06:33
ericsson
Вспомнилось - по-моему, у GeoExt есть какая-то конструкция, позволяющая из коробки без дописывания запрашивать разные слои WMS склеенными вместе.

Re: Опять про LayerSwitcher

Добавлено: 19 дек 2013, 06:45
Denis Rykov
ericsson писал(а):Вспомнилось - по-моему, у GeoExt есть какая-то конструкция, позволяющая из коробки без дописывания запрашивать разные слои WMS склеенными вместе.
Может я что-то не так понял, но зачем GeoExt, когда это делается простым указанием имен слоев через запятую в свойстве layers, например, layers: "modis,global_mosaic". Но тогда мы теряем возможность управлять видимостью отдельных слоев из контрола управления слоями.

Re: Опять про LayerSwitcher

Добавлено: 19 дек 2013, 07:19
ericsson
Про GeoExt просто вспомнилось, в том смысле, что не везде слои по одному грузятся все же.
Там вроде (сейчас что-то не могу найти это) была опция для запроса слоев отдельно или вместе.
Что дописать такое можно в любом фреймворке, который это сам по себе не умеет - это понятно.

Re: Опять про LayerSwitcher

Добавлено: 19 дек 2013, 09:51
Serp
С прозрачностью заработало, хотя конечно это не совсем то, что перекрытие реальных векторных слоев.

Про указание имен слоев через запятую мы догадались. Только нам нужно, чтобы юзер, как в обычных ГИС-ах слои выбрал и карта перерисовалась. Думали,что OL будет сам этот запрос формировать, но фиг-то. Похоже это придется нам как-то делать. Может с помощью html-менеджера слоев, который здесь на форуме раньше звучал.

Ладно, всем спасибо за помощь.

А напоследок еще вопрос - с OpenLayers.Layer.Vector вообще не стоит заморачиваться? При его использовании MapServer вообще где-то сбоку остается? И, я так понимаю, проблемы резки на тайлы и т.п. придется решать самостоятельно?
Пардон за беспокойство - никогда раньше веб-гисами не занимались.

Re: Опять про LayerSwitcher

Добавлено: 19 дек 2013, 10:41
Denis Rykov
Объясните что такое "перекрытие реальных векторных слоев" и чем вас не устроил вариант с прозрачностью?

Re: Опять про LayerSwitcher

Добавлено: 20 дек 2013, 04:35
Serp
Мы хотим создать замену ArcReader-у. Избавиться от его установки на каждую машину и т.д. В его проекте у нас может быть включено одновременно по 15-20 слоёв по выбору пользователей.
При работе по "устаревшей" схеме через html-шаблоны (я надеюсь, что все в курсе, кто читал "Начало работы с МС") все получается хорошо. Но, говорят, что не рационально - загружает сервер.
Если использовать прозрачность, допустим 0,5, то уже на 3-4 м слое видно разницу - всё, как сквозь кальку. Этот способ подходит только для отображения 1-2 слоев поверх базового. Мы его тоже будем использовать. Только сначала получим от МС карту со сгруппированными слоями.

А векторный слой, уже сам себе отвечаю, больше подходит, судя по всему, для рисования поверх карты. Тоже пригодится.

Re: Опять про LayerSwitcher

Добавлено: 20 дек 2013, 05:06
Denis Rykov
Стоп. Вы наверное что-то не так делаете - прозрачность в случае WMS - это не процент прозрачности слоя, а признак того, что слой имеет прозрачный фон. Вот посмотрите нашу систему по Таймырскому заповеднику - там все слои (за исключением спутниковой съемки) - WMS и ничто никого не перекрывает.

Re: Опять про LayerSwitcher

Добавлено: 21 дек 2013, 15:12
Serp
Понятно. Спасибо за интересную ссылку. В общем, рецепты собрали, будем сейчас комбинировать. Я думаю, совместим прозрачность с запросом группы слоев.

Re: Опять про LayerSwitcher

Добавлено: 23 дек 2013, 20:12
Sergey Astakhov
Denis Rykov писал(а):это делается простым указанием имен слоев через запятую в свойстве layers, например, layers: "modis,global_mosaic". Но тогда мы теряем возможность управлять видимостью отдельных слоев из контрола управления слоями.
Это тоже можно сделать, просто придётся немного попрограммировать на JavaScript. Типа такого:

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

var wmsLayer = new OpenLayers.Layer.WMS("WMS", url,
  {
    transparent: true,
    format: "image/png"
  },
  {
   displayInLayerSwitcher: false,
   visibility: false
  });

mapControl.addLayer(wmsLayer);

var allLayers = [];

function applyLayerVisibility()
{
  var layers = [];
  for( var i = 0; i < allLayers.length; i++ )
  {
    var layer = allLayers[i];
    if( vehicleLayer.getVisibility() )
      layers.push(layer.layer_id);
  }

  if( layers.length > 0 )
  {
     wmsLayer.mergeNewParams(
     {
       layers: layers.join()
     });

    wmsLayer.setVisibility(true);
  }
  else
  {
    wmsLayer.setVisibility(false);
  }
}

var layer1 = new OpenLayers.Layer("Layer 1",
  {
     layer_id: "layer1",
     eventListeners: {
       "visibilitychanged": applyLayerVisibility
     };
 });

mapControl.addLayer(layer1);

allLayers.push(layer1);