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

OpenLayers. Отображать слой в определенном зуме

Добавлено: 05 мар 2014, 23:32
seddi
Здравствуйте !

Вот такой вопрос: Есть слой "населенные пункты", что применить чтобы данный слой отображался при зуме от 3 до 8?
Вроде распрастраненный вопрос и много перепробовал но не работает.
Вот слой:

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

//Слой населенные пункты
goroda_layer = new OpenLayers.Layer.Vector("Населенные пункты", {
styleMap: new OpenLayers.StyleMap({
            "default":   new OpenLayers.Style( { 
      pointRadius: 3,
      strokeColor: "gray",
      strokeWidth: 2,
      fillColor: "lime",
      label: "${NAME}", 
	  labelYOffset: 10,
      fontSize: 11 
      
   }),
       } ),                         
               
                  protocol: new OpenLayers.Protocol.HTTP({
                url: "./leaf/npLOD.js",
                format: new OpenLayers.Format.GeoJSON()
            }),
            strategies: [new OpenLayers.Strategy.Fixed()]
             });
     
            map.addLayers([ goroda_layer]); 
Ссылка на тестовую страницу

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

Re: OpenLayers. Отображать слой в определенном зуме

Добавлено: 06 мар 2014, 05:25
Denis Rykov
Просто при создании слоя указываете параметры minResolution и maxResolution, соответствующие разрешениям нужных масштабных уровней. Сейчас у вас таких параметров нет и поэтому параметр слоя alwaysInRange автоматически выставлен в значение true и слой отображается во всём диапазоне масштабов. Всё что вам нужно - это указать minResolution и maxResolution в настройках слоя.

Если вы хотите попробовать в интерактивном режиме посмотреть что получится, то так как все переменные у вас доступны в глобальной области видимости, можно открыть консоль и написать там:

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

goroda_layer.alwaysInRange = false;
goroda_layer.minResolution = map.getResolutionForZoom(8);
goroda_layer.maxResolution = map.getResolutionForZoom(3);
Теперь ваши слои буду доступны только в пределах 3 - 8 масштабных уровней.

Что касается вашего второго примера, то это сделано на стороне WMS-сервера, OpenLayers тут ни при чем, просто WMS-сервер в зависимости от масштаба изображения применяет разные символики. Сравните два запроса: они отличаются только размером охвата (BBOX):

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

http://data1.geo.indorsoft.ru/geoserver/geoportal/wms?TRANSPARENT=true&LAYERS=geoportal%3ARoadGasStation&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS=EPSG%3A900913&BBOX=4148390.3985156,7435794.1105469,4226661.9154687,7514065.6275&WIDTH=256&HEIGHT=256

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

http://data1.geo.indorsoft.ru/geoserver/geoportal/wms?TRANSPARENT=true&LAYERS=geoportal%3ARoadGasStation&SERVICE=WMS&VERSION=1.1.1&REQUEST=GetMap&STYLES=&FORMAT=image%2Fpng&SRS=EPSG%3A900913&BBOX=4148390.3985156,7357522.5935938,4187526.1569922,7396658.3520703&WIDTH=256&HEIGHT=256

Re: OpenLayers. Отображать слой в определенном зуме

Добавлено: 06 мар 2014, 06:46
seddi
Денис, спасибо за ответ, то что искал, теперь красоту наведу, только на тебя и рассчитывал, но почему то работает наоборот, расскажи в чем причина вот : http://lpdrsu.ru/010.html

Re: OpenLayers. Отображать слой в определенном зуме

Добавлено: 06 мар 2014, 07:36
Denis Rykov
В смысле наоборот? Слой отображается на зумах 3 - 8. Если открыть консоль на том уровне, на котором слой перестаёт отображаться и ввести в консоли

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

mapPanel.map.getZoom()
то будет либо 2, либо 9. Посмотрел код - minResolution и maxResolution можно указывать прямо в конструкторе OpenLayers.Layer.Vector, alwaysInRange вообще трогать не нужно.

Re: OpenLayers. Отображать слой в определенном зуме

Добавлено: 06 мар 2014, 15:00
seddi
с зумами на основе alwaysInRange разобрался, (у меня было перепутаны мин макс), а вот minResolution и maxResolution если прописываю то не отображает слой, может грамматика у меня страдает

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

 // Слой знаки

znaki_layer = new OpenLayers.Layer.Vector("Знаки",{
maxResolution:13.077456530637445,
minResolution:377.6158944485226
},
{
           styleMap: new OpenLayers.StyleMap( {"default":styleImage}),  
                           strategies: [
       new OpenLayers.Strategy.BBOX(),
       new OpenLayers.Strategy.Cluster({distance: 550, threshold: 3})
   ] ,  
        
               protocol: new OpenLayers.Protocol.HTTP({
                url: "./leaf/znaki.js",
                format: new OpenLayers.Format.GeoJSON()
            }),
            strategies: [new OpenLayers.Strategy.Fixed()]  
    } );
      map.addLayers([ znaki_layer]); 

Re: OpenLayers. Отображать слой в определенном зуме

Добавлено: 06 мар 2014, 17:11
Denis Rykov
Посмотрите сигнатуру конструктора OpenLayers.Layer.Vector - там две переменные: name и options, а в вашем примере три. Должно быть так:

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

znaki_layer = new OpenLayers.Layer.Vector("Знаки", {
    maxResolution: 13.077456530637445,
    minResolution: 377.615894448522,
    styleMap: ...
});

Re: OpenLayers. Отображать слой в определенном зуме

Добавлено: 06 мар 2014, 20:35
seddi
Спасибо за помощь, грамматика и синтаксис у меня конечно хромает, но ещё и в диапозоне больше меньше напутал
дожно быть:

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

znaki_layer = new OpenLayers.Layer.Vector("Знаки",
{      maxResolution:40.120433057685865,
minResolution:13.077456530637445,
           styleMap: new OpenLayers.StyleMap( {"default":styleImage}),