Страница 1 из 1
OL - Мультимасштабное отображение растров
Добавлено: 31 мар 2011, 15:13
dravig
Доброго времени суток.
Апгрейд веток
этой и
этой
Появилась задача сделать растровую подложку для OL, причем такую, чтобы растры менялись в зависимости от масштаба. Решил использовать TMS. Подмену растров настроил следующим образом:
Код: Выделить всё
var tmsoverlay = new OpenLayers.Layer.TMS( "TMS Overlay", "",
{ // url: '', serviceVersion: '.', layername: '.',
type: 'png', getURL: overlay_getTileURL, alpha: true,
isBaseLayer: false
});
В функцию overlay_getTileURL запихнул условие:
Код: Выделить всё
if (mapBounds.intersectsBounds( bounds ) && z >= 4 && z <= 7 ) {
//console.log( this.url + z + "/" + x + "/" + y + "." + this.type);
return "путь к тайлам растра 1" + z + "/" + x + "/" + y + "." + this.type;
}else if (mapBounds.intersectsBounds( bounds ) &&z >= 8 && z <= 11) {
//alert(bounds)
return "путь к тайлам растра 2" + z + "/" + x + "/" + y + "." + this.type;
}else {
return "http://www.maptiler.org/img/none.png";
}
Но тут возникла проблема: охват растров разный, и при зумировании территории где охваты не совпадают, остаются торчать куски предыдущего растра.
В JavaSctrpt не силен, поэтому не знаю какие поставить ограничивающие условия, чтобы при изменении масштаба, перерисовка происходила во всем окне карты, а не только внутри охвата соответствующего масштабу растра...
Re: OL - Мультимасштабное отображение растров
Добавлено: 31 мар 2011, 20:56
Denis Rykov
Вариант каждый растр - отдельный слой, при изменении масштаба просто делать один слой невидимым, другой видимым не подходит?
Re: OL - Мультимасштабное отображение растров
Добавлено: 01 апр 2011, 15:57
dravig
Попробовал написать функцию, которая бы возвращала true или false в зависимости от значения зума... и вставить ее на параметр visibility. Результат оказался нулевым, потому как при открытии страницы она считывается уже после того, как загрузится вся карта.... в то время как функция получение адреса тайла загружается в первую очередь... Входные параметры я им задал абсолютно одинаковые...
Firebug ничего путного не говорит.
Примечание: HTML-страница с картой была сгенерирована автоматически, когда создавались тайлы с помощью gdal2tiles. И функция определения адреса там уже стояла.
Кто-нибудь сталкивался с подобными вещами?
Или же лучше пойти другим путем, например использовать WMS и долбаться с оптимизацией отображения растров через MapServer?
Re: OL - Мультимасштабное отображение растров
Добавлено: 01 апр 2011, 17:58
Denis Rykov
Честно говоря мало что понял, не могли бы вы показать упрощенный вариант того, что не работает, а то так на пальцах объяснять очень непродуктивно.
Re: OL - Мультимасштабное отображение растров
Добавлено: 04 апр 2011, 09:46
dravig
поподробнее: у слоя TMS есть парметр GetURL - он задается с помощью функции overlay_getTileURL. Вот сама функция:
Код: Выделить всё
function overlay_getTileURL(bounds) {
var res = this.map.getResolution();
var x = Math.round((bounds.left - this.maxExtent.left) / (res * this.tileSize.w));
var y = Math.round((bounds.bottom - this.tileOrigin.lat) / (res * this.tileSize.h));
var z = this.map.getZoom();
if (this.map.baseLayer.name == 'Virtual Earth Roads' || this.map.baseLayer.name == 'Virtual Earth Aerial' || this.map.baseLayer.name == 'Virtual Earth Hybrid') {
z = z + 1;
}
if (mapBounds.intersectsBounds( bounds ) && z >= 4 && z <= 7 ) {
return "Путь к файлу" + z + "/" + x + "/" + y + "." + this.type;
}else {
return "http://www.maptiler.org/img/none.png";
}
}
Решил написать по ее образу и подобию другую функцию:
Код: Выделить всё
function overlay_display (bounds) {
var z = this.map.getZoom();
if( z >= 4 && z <= 7 ){return true;
}else{return false;
}
}
И поместил ее на параметр visibility или displayInLayerSwitcher.
В итоге свойства слоя TMS стали выглядить так:
Код: Выделить всё
var tmsoverlay = new OpenLayers.Layer.TMS( "TMS Overlay", "",
{
type: 'png', getURL: overlay_getTileURL, alpha: true,
isBaseLayer: false, displayInLayerSwitcher: overlay_display
});
В итоге getTileURL работает, а overlay_display - нет. Теряюсь в догадках почему...
Re: OL - Мультимасштабное отображение растров
Добавлено: 05 апр 2011, 07:13
Denis Rykov
displayInLayerSwitcher - свойство типа {Boolean}, а вы определяете его как функцию. Если хотите менять значение этого свойства, то ваша функция должна выглядеть как-то так (не проверял):
Код: Выделить всё
function overlayDisplay (layer) {
var z = layer.map.getZoom();
if( z >= 4 && z <= 7 ){
layer.displayInLayerSwitcher = true;
}
else {
layer.displayInLayerSwitcher = false;
}
}
А в объект map добавьте listener:
Код: Выделить всё
eventListeners: {
"zoomend": overlayDisplay(layer)
}
На самом деле я не совсем понимаю зачем все это

Объясните чем вас не устраивает вариант с использованием свойств minScale и maxScale слоев?
Re: OL - Мультимасштабное отображение растров
Добавлено: 05 апр 2011, 12:10
dravig
Я хочу добиться чтобы в менеджере слоев их подмена выглядела как один слой: перестал отображаться - убрался из каталога, а на его место встал другой с таким же названием... и юзер ничего не заметит...
Попробую применить Ваши рекомендации...
Re: OL - Мультимасштабное отображение растров
Добавлено: 05 апр 2011, 14:16
Mavka
min/max масштаб слоя, вариант #3 и измените функцию под свои реалии.
P.S. Хотя _DR_ такой же совет и дал.
Re: OL - Мультимасштабное отображение растров
Добавлено: 06 апр 2011, 12:48
dravig
Вариант #3 попробовал не работает... Возможно я неправильно понял что писать...
Код: Выделить всё
function Myzoom() {
var zo = this.map.getZoom
if (zo >= 4 && zo <= 7) {
this.mergeNewParams({displayInLayerSwitcher: true});
}
else {
this.mergeNewParams({displayInLayerSwitcher: false});
}
}
карта грузится как и грузилась.
Совет _DR_ тоже попробовал в разных вариациях, но тут возникли вопросы:
1. function overlayDisplay (layer). Здесь layer - это название моего слоя, или слой в целом?
2. eventListeners: {
"zoomend": overlayDisplay(layer)
}
С синтаксисом и архитектурой javascript я только начал знакомиться, поэтому не совсем понял в какое место кода помещать... Различные вариации приводили к тому что карта вообще не грузилась...