OL - Мультимасштабное отображение растров

Mapserver, GeoServer, MapGuide, Google и другое ПО для веб-картографии
Ответить
dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

OL - Мультимасштабное отображение растров

Сообщение 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 не силен, поэтому не знаю какие поставить ограничивающие условия, чтобы при изменении масштаба, перерисовка происходила во всем окне карты, а не только внутри охвата соответствующего масштабу растра...
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OL - Мультимасштабное отображение растров

Сообщение Denis Rykov »

Вариант каждый растр - отдельный слой, при изменении масштаба просто делать один слой невидимым, другой видимым не подходит?
Spatial is now, more than ever, just another column- The Geometry Column.
dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

Re: OL - Мультимасштабное отображение растров

Сообщение dravig »

Попробовал написать функцию, которая бы возвращала true или false в зависимости от значения зума... и вставить ее на параметр visibility. Результат оказался нулевым, потому как при открытии страницы она считывается уже после того, как загрузится вся карта.... в то время как функция получение адреса тайла загружается в первую очередь... Входные параметры я им задал абсолютно одинаковые...

Firebug ничего путного не говорит.

Примечание: HTML-страница с картой была сгенерирована автоматически, когда создавались тайлы с помощью gdal2tiles. И функция определения адреса там уже стояла.

Кто-нибудь сталкивался с подобными вещами?

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

Re: OL - Мультимасштабное отображение растров

Сообщение Denis Rykov »

Честно говоря мало что понял, не могли бы вы показать упрощенный вариант того, что не работает, а то так на пальцах объяснять очень непродуктивно.
Spatial is now, more than ever, just another column- The Geometry Column.
dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

Re: OL - Мультимасштабное отображение растров

Сообщение 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 - нет. Теряюсь в догадках почему...
Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

Re: OL - Мультимасштабное отображение растров

Сообщение 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 слоев?
Spatial is now, more than ever, just another column- The Geometry Column.
dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

Re: OL - Мультимасштабное отображение растров

Сообщение dravig »

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

Попробую применить Ваши рекомендации...
Аватара пользователя
Mavka
Гуру
Сообщения: 2060
Зарегистрирован: 14 мар 2008, 17:36
Репутация: 9

Re: OL - Мультимасштабное отображение растров

Сообщение Mavka »

min/max масштаб слоя, вариант #3 и измените функцию под свои реалии.

P.S. Хотя _DR_ такой же совет и дал.
лангольеры под окном жрали время ом-ном-ном
dravig
Участник
Сообщения: 54
Зарегистрирован: 18 мар 2010, 16:58
Репутация: 0

Re: OL - Мультимасштабное отображение растров

Сообщение 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 я только начал знакомиться, поэтому не совсем понял в какое место кода помещать... Различные вариации приводили к тому что карта вообще не грузилась...
Ответить

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

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

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