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

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
seddi
Новоприбывший
Сообщения: 4
Зарегистрирован: 05 мар 2014, 22:44
Репутация: 0

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

Сообщение seddi » 05 мар 2014, 23:32

Здравствуйте !

Вот такой вопрос: Есть слой "населенные пункты", что применить чтобы данный слой отображался при зуме от 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 видел такой вариант, где при увеличении зума, вместо значков заправок остаются точки, если кто знает как это реализовано, плиз расскажите.
Последний раз редактировалось seddi 06 мар 2014, 06:39, всего редактировалось 1 раз.

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 06 мар 2014, 05:25

Просто при создании слоя указываете параметры 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
Spatial is now, more than ever, just another column- The Geometry Column.

seddi
Новоприбывший
Сообщения: 4
Зарегистрирован: 05 мар 2014, 22:44
Репутация: 0

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

Сообщение seddi » 06 мар 2014, 06:46

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

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 06 мар 2014, 07:36

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

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

mapPanel.map.getZoom()
то будет либо 2, либо 9. Посмотрел код - minResolution и maxResolution можно указывать прямо в конструкторе OpenLayers.Layer.Vector, alwaysInRange вообще трогать не нужно.
Spatial is now, more than ever, just another column- The Geometry Column.

seddi
Новоприбывший
Сообщения: 4
Зарегистрирован: 05 мар 2014, 22:44
Репутация: 0

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

Сообщение seddi » 06 мар 2014, 15:00

с зумами на основе 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]); 

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 06 мар 2014, 17:11

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

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

znaki_layer = new OpenLayers.Layer.Vector("Знаки", {
    maxResolution: 13.077456530637445,
    minResolution: 377.615894448522,
    styleMap: ...
});
Spatial is now, more than ever, just another column- The Geometry Column.

seddi
Новоприбывший
Сообщения: 4
Зарегистрирован: 05 мар 2014, 22:44
Репутация: 0

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

Сообщение seddi » 06 мар 2014, 20:35

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

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

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

Ответить

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

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

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