Клуб API Карт

Добавление нескольких слоев

Пост в архиве.
Андрей Болдырев
18 декабря 2013, 14:36

Не могу разобраться в чем проблема. В JavaScript я еще пока не очень хорошо разбираюсь.

Проблема следующая есть вот такой код:

  

type_map = {
    1: {
        name: 'topo',
        name_ru: 'Высотная',
        path: 'Topograph'
    },
    2: {
        name: 'color',
        name_ru: 'Высотная (цвет)',
        path: 'Color'
    },
    3: {
        name: 'grey',
        name_ru: 'Высотная (ч/б)',
        path: 'Grey'
    },
    4: {
        name: 'slope',
        name_ru: 'Склоны',
        path: 'Slope'
    },
    5: {
        name: 'biome',
        name_ru: 'Биомы',
        path: 'Biome'
    }
},
Layers = {};
function init() {
    for(var key in type_map) {
        Layers[key] = function () {
            return new ymaps.Layer(default_path + "/%z/tile-%x-%y.png", {
                notFoundTile: default_path + 'Logo_01.png'
            });
        }
        ymaps.layer.storage.add(type_map[key].name + '#layer', Layers[key]);
        ymaps.mapType.storage.add(type_map[key].name + '#type', new ymaps.MapType(type_map[key].name_ru, [type_map[key].name + '#layer']));
    }
    var myProjection = new ymaps.projection.Cartesian([
        [-180, -180],
        [180, 180]
    ]),
        myMap = new ymaps.Map('myMap', {
            center: [0, 0],
            zoom: 1,
            behaviors: ['default', 'scrollZoom'],
            type: 'topo#type'
        }, {
            maxZoom: 5,
            minZoom: 0,
            projection: myProjection
        });
}

 

все хорошо но при создании карты какой бы тип карты (из мною созданных) я не выбрал всегда отображается последний. в чем я ошибаюсь?

4 комментария
return new ymaps.Layer(default_path + "/%z/tile-%x-%y.png", {        notFoundTile: default_path + 'Logo_01.png'});Путь к тайлам у всех ваших слоев один и тот же?
Андрей Болдырев
28 января 2016, 00:58

забыл дописать, в коде он выглядет вот так:

ymaps.Layer(default_path+type_map[key].path+"/"+planets[planet_num].name+"/%z/tile-%x-%y.png", {notFoundTile: default_path+'Logo_01.png'});

Т.е. в конечном итоге он быдет выглядеть приблизительно вот так:

/images/Topograph/Mars/1/tile-0-0.png

Тогда у вас типичная ошибка начинающего с циклами и замыканием.

Layers[key] = function () {

    ...

};

Эта функция будет вызвана асинхронно, и "key" в ней будет равен своему последнему значению, т.к. передается по ссылке

Андрей Болдырев
28 января 2016, 00:58

Все, спасибо большое, нашел по вашим подсказкам решение проблемы.