Страница 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. Если открыть консоль на том уровне, на котором слой перестаёт отображаться и ввести в консоли
то будет либо 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}),