Клуб API Карт

Найдено на тему «масштаб»:
Как увеличить Zoom карты более 19 (Решено)
kashoutin.s
21 октября 2017, 10:11

Приветствую!

Вопрос знатокам.

Документация на api карт говорит, что максимально доступный зум = 23, но при этом тайлы имеются только для масштаба 19 и увеличить далее не имеется возможности.

Проблема заключается в том, что на карту добавляется дополнительный слой wms, у которого детальное отображение информации начиается на 20-21 зуме, но сама карта блокирует увеличение дальше.

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

Решено.

Пример увеличенного масштабирования карты

ymaps.ready(function () {

    /*  получаем из хранилища встроенный тип слоя */
    let YandexMapLayer = ymaps.layer.storage.get('yandex#map');
    
    /*  Дочерний класс слоя с перекрытием метода getZoomRange */
    let CustomMapLayer = function () {
        /* Calling the parent's constructor */
        CustomMapLayer.superclass.constructor.call(this);
        
        /*  в служебных полях объявляем максимально доступный зум и интересующую нас степерь масштабирования слоя*/
        this._maxAvaliableZoom = 19; 
        this._zoomRange = [0, 23]; 
    }
    
    /*  выполняем наследование */
    ymaps.util.augment(CustomMapLayer, YandexMapLayer, {
        /* Переопределяем в наследнике метод getZoomRange */
        getZoomRange: function (point) {
            let _this = this;
            /* Вызываем асинхронный метод родительского класса. */
            CustomMapLayer.superclass.getZoomRange.call(this, point).then(function(zoomRange) {
                /* 
                 * на случай, если в какой-то местности доступный уровень зума отличается от значения 19 
                 * - делаем обновление локального поля (для дайльнейшего расчета степени искусственного увеличения тайлов) 
                 * но на практике - тайлы с уровнем зума 19 есть везде (Москва и любая степь...), более 19 - тайлов нет
                 */
                if (zoomRange[1] != _this._maxAvaliableZoom) {
                    _this._maxAvaliableZoom = zoomRange[1];
                }
            });
            return ymaps.vow.resolve(_this._zoomRange);
        }
    });
  
    let YCustomMapLayer = function () {

        let layer = new CustomMapLayer();
        let defaultTileUrlTemplate = layer.getTileUrlTemplate();
        
        /* перекрытие размера тайла */
        layer.getTileSize = function(zoom) {
            
            let pixelRatio = ymaps.util.hd.getPixelRatio();
            if(zoom > layer._maxAvaliableZoom) {
                /* считаем требуемую степень масштабирования тайла */
                let scale = 2**(zoom - layer._maxAvaliableZoom);
                let tailImageScale = scale * pixelRatio;
                
                /*  подменяем урл получения тайла - при запросе тайла требуемого масштаба - сохраняем качество отобржения карты */
                /*  фиксируем зум на уровне максимально доступного */
                /*  дополнительно делаем проверку на запрашиваемый масштаб тайла, т.к. максимально доступный масштаб изображения - 16 */
                let zoomOverTileUrlTemplate = defaultTileUrlTemplate
                    .replace("%c", "x=%x&y=%y&z="+layer._maxAvaliableZoom)
                    .replace("{{ scale }}", tailImageScale > 16 ? 16: tailImageScale);
                    
                console.log("zoomOverTileUrlTemplate", zoomOverTileUrlTemplate);
                
                layer.setTileUrlTemplate(zoomOverTileUrlTemplate);
                return [256 * scale, 256 * scale];
            }
    
            /* установка дефотного шаблона url */
            layer.setTileUrlTemplate(defaultTileUrlTemplate);
            
            /* возвращем дефолтный размер тайла */
            return [256, 256];
        };
        
        return layer;
    };

    /* регистрируем новый тип слоя */
    ymaps.layer.storage.add('custom#map', YCustomMapLayer);

    /* создаем новый тип карты с кастомным слоем */
    let customMapType = new ymaps.MapType('Схема +', ['custom#map']);

    /* регистрируем новый тип карты */
    ymaps.mapType.storage.add('custom_map#map', customMapType);

    /* выполняем инициализацию карты, с указанием вновь созданного типа */
    myMap = new ymaps.Map(
        // ID DOM-элемента, в который будет добавлена карта.
        'map',
        // Параметры карты.
        {
            // Географические координаты центра отображаемой карты.
            center: [55.76, 37.64], // Москва
            // Масштаб.
            zoom: 19,
            controls: ["zoomControl"],
            type: 'custom_map#map'
        }
    );

    /* добавляем на карту контрол выбора типа с указанием стандартных карт и вновь созданной */    
    myMap.controls.add(new ymaps.control.TypeSelector({
        mapTypes: ['custom_map#map','yandex#map', 'yandex#hybrid', 'yandex#satellite'],
    }));
    
    

});

ссылки на документацию:
1. Создание собственного типа карты
2. Наследование [ util.augment ]
3. Определение плотности пикселей клиента [ util.hd ]

Дополнительно:

1. При реализации увеличенного зума для 'yandex#satellite' - в запросе тайла от сервера Яндекса параметр scale не фигурирует и не несет смысла. Качество спутникового снимка не увеличится =)

2. Карта 'yandex#hybrid' состоит из двух слоев - подложка спутниковых снимков и наложение поверх нее векторного слоя с улицами и надписями (с прозрачным фоном). Векторый слой надписей успешно поддается масштабированию с сохранением качества изображения, как и с простым типом карты, рассмотренном выше

13 комментариев
масштаб,API 2.1
Почему иногда масштабирует карту на самое дальное расстояние?
Удалённый пользователь
8 июля 2016, 17:23

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

Имеем карту с кластерами.

function init() {
    var bigMap = new ymaps.Map('bigMap', {
            center: [55.82, 37.64],
            zoom: 10
        }, {
            searchControlProvider: 'yandex#search'
        }),
        objectManager = new ymaps.ObjectManager({
            clusterize: true,
            gridSize: 32,
        }),
        myPlacemark0 = new ymaps.Placemark([59.924194, 30.350233], {
            hintContent: 'Вы находитесь здесь',
            iconContent: 'Я',
        }, {
            balloonPanelMaxMapArea: 0,
            preset: 'islands#blueStretchyIcon',
            iconCaptionMaxWidth: '70'
        });

    objectManager.objects.options.set({
        preset: 'islands#greenDotIcon',
        //balloonPanelMaxMapArea: 'Infinity'
    });
    objectManager.clusters.options.set('preset', 'islands#greenClusterIcons');
    bigMap.geoObjects.add(objectManager);
    //bigMap.geoObjects.add(myPlacemark0);
    $.ajax({
        url: 'db/data.json',
        error: function() {
            alert('Error on load data!');
        }
    }).done(function(data) {
        objectManager.add(data);
        bigMap.setBounds(bigMap.geoObjects.getBounds()); // <-- Этим методом устанавливаем масштаб
    });
}

ymaps.ready(init);

Иногда карта масштабируется нормально (захватывает все точки), а иногда на самое дельнее расстояние.

В чём может быть проблемма?
Заранее спасибо.

5 комментариев
кластеризация,масштаб
Изменение вида ползунка zoom
GoodManDima
26 июля 2015, 02:16

Здравствуйте. Как можно перейти от обычного zoom к компактному, если карта загружена и инциализирована?

1 комментарий
масштаб,элементы управления,контролы,API 2.1
Как отцентровать карту и сделать зум по региону с известным osmid
rock666
23 июля 2015, 17:05

В примере не розобрался, код выбора региона по осм такой

 

var regions = result.geoObjects;

 regions.each(function (reg) {

        if (reg.properties.get('osmId') == $('select[name=map_region] option:selected').attr('rel')) {

       

            reg.options.set('fillColor', '');                                     

        }

    });

 

Соответственно получаю свой регион безцветным, необходимо отцентровать карту по нему и зум. 

3 комментария
масштаб,регионы,API 2.1,область видимости
Масштабирование собственной метки при смене масштаба карты ?
anstrem
13 июля 2015, 20:48

Сделали карту для сайта. На стационарном компьютере все хорошо, а вот на смартфонах с не очень большим экраном - крайне сложно попасть по меткам - маленькие они для пальцев.

 

И проблема в том что при любом масштабировании карты размер меток то не меняется - они остаются такими же маленькими.

 

Есть какой то вариант решения, чтобы при увеличении карты, начиная с какой то величины масштаба, метка тоже увеличивалась ?

(или как задать несколько разных размеров (экземпляров) меток для разных масштабов карты ?)

 

 

5 комментариев
масштаб,метка,API 2.1
Исчезают метки с карты при изменении масштаба пальцами на телефоне
Удалённый пользователь
2 июля 2015, 15:41

Пример: http://map.comepay.ru/

2 комментария
масштаб,метка,API 2.1
Область показа объекта на заданном приближении
maxnesterenko
2 июля 2015, 06:21

Приветствую!

Идея такова - есть объекты карты, которые нужно показывать например только на приближении свыше 10... На других - они должны  быть скрыты.

Вопрос такой: использовалась версия API 2.0, следующий код работал:

 

var myObjectManager = new ObjectManager();

tile=10;
myObjectManager.add(myPlacemark[key], tile, Infinity); 
...
myMap.geoObjects.add(myObjectManager);
Обновился до версии 2.1, этот код не работает... Пытался сделать вида:
myMap.geoObjects.add(myPlacemark[key], tile, Infinity);
- все отображается, но не учитывается, на каком зуме показывать...
Как можно сделать поставленную задану на api 2.1? В примерах что-то не нашел такого (((
2 комментария
масштаб,метка,API 2.1,менеджер объектов,коллекции
Определение положения пользователя + масштаб
mail@spark.ms
1 июля 2015, 18:39

Можно ли показать карту так, чтобы по умолчанию был виден целиком город (или населенный пункт), в котором находится пользователь? Координаты с помощью ymaps.geolocation получить могу, но не понимаю, как задать автоопределение масштаба.

3 комментария
масштаб,геолокация,API 2.1,геокодирование
Зумирование только в центр.
e.mail.of.denis
16 июня 2015, 22:48

Здравствуйте! Подскажите пожалуйста: у меня в центре карты линия, я отключил скрулинг и оставил только зуминг. Как сделать так, что бы зумирование было возможно только в центр вне зависимости в какой точке происходит зумирование?

6 комментариев
масштаб,API 2.1,поведения карты
Просмотр кары на мобильном устройстве
ironosmail.ru
9 июня 2015, 11:34

Добрый день. Столкнулся с такой проблемой - если просматривать карту на мобильном и увеличить масштаб страницы таким образом, что всю область просмотра заполнит карта, то нет возможности вернуться к нормальному масштабу страницы, т.к. попытка масштабирования двумя пальцами приводит к масштабированию карты. Если отключить масштабирование карты через map.behaviors.disable('multiTouch'), то не происходит вообще ничего. Т.е. карта не масштабируется, но и масштаб страницы не изменяется. Как быть?

3 комментария
масштаб,API 2.1,события
текущий зум во время зумирования
e.mail.of.denis
31 мая 2015, 15:58

Здравствуйте. Имеется следующая функция: 

myMap.events.add('multitouchmove', function (e) {     

      var eMap = e.get('target');

      var zoom = eMap.getZoom();

});

 

В этой функции в процессе зумирования переменная zoom не меняется, а мне хотелось бы получать текущий зум при каждом вызове этой функции. Подскажите, как мне решить эту задачу?

2 комментария
масштаб,API 2.1,события
Масштабирование собственной метки
Игорь Воробьёв
20 мая 2015, 20:11

Все доброго вечера!

Такой вопрос возможно ли реализовать мастабируемый макет метки с приминением svg. Те у меня есть иконки, и хотелось их задавать не пиксельно, а чтобы при разных зумах иконка отоброжалась по разному, на большой карте маленькая, при увеличении она немного увеличивалась.

3 комментария
масштаб,метка,API 2.1,макеты
Как узнать "оптимальный" зум при добавлении метки на карту?
paranul
14 мая 2015, 17:30

Возник такой вопрос. Добавляю карту москвы с зумом 10. Через поиск ищу например какое-то метро, оно находится и показывается уже с зумом 14. Каким образом добавлять на карту метку, что бы она принимала некий оптимальный зум? Как вычислить этот зум при добавлении метки? Если просто добавить метку на карту, она добавляется без изменения зума, то есть с дефолтным зумом карты. А хочется, что бы использовался тот же принцип, что и при поиске.

3 комментария
масштаб,метка,API 2.1,область видимости
Не активны элементы управления масштабом
Михаил
24 апреля 2015, 09:39

Добрый день.

У меня 2 проблемы, помоги те найти решение :(

 

1. У меня проблема с Элементами управления масштабом. Сайт.

Они почему то не активны, но если крутануть колесом и изменить масштаб они становяться активны.

 

2. В консоле Хрома ошибка

Uncaught TypeError: Cannot read property '0' of undefined

 

Скажите куда капать, спасибо.

2 комментария
масштаб,элементы управления,контролы,API 2.1
Динамическое изменение содержимого метки при изменении масштаба
Open Sansara
24 апреля 2015, 02:49
Доброго времени суток!

При малых масштабах карты метка должна отображаться в виде пресета islands#redStretchyIcon. Когда масшаб увеличивается вместо стандартной метки должно отображаться html содержимое.

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

this.map.geoObjects.each(function (geoObject) {

if(ev.get('newZoom') >= 5){//big placemarks

//тут как-то нужно отключить стандартную иконку

geoObject.options.set('iconLayout', ymaps.templateLayoutFactory.createClass('<div>content....</div>');//выводим нужный нам контент

}else{//small placemarks

//тут как-то нужно отключить iconLayout

geoObject.options.set('preset', 'islands#redStretchyIcon');//выводим стандартную иконку

}

});

2 комментария
масштаб,метка,API 2.1
Прямое геокодирование - Принудительное зуммирование на 2 порядка
Удалённый пользователь
14 апреля 2015, 13:44

ДД! Все сделал как в этом примере https://tech.yandex.ru/maps/jsbox/2.1/direct_geocode

Только вот проблемка, при поиска адреса с указанным в нем, доме,  ( Пример, ул. Ленина дом 1  ),  идет зум общий 

т.е для меня хотелось бы чтобы зум был еще крупнее ( такой если бы я на интерфейсе нажал 2 раза на ZOOM ),

Вопрос! как добиться зуммирования программным путем, пробывал использовать myMap.setZoom(myMap.getZoom() + 2 ), ничего не происходит

 

p.s Насколько я понял, вот засчет этой строчки кода идет автозуммирование по региону bounds
 

 

myMap.setBounds(bounds, {

    checkZoomRange: true // проверяем наличие тайлов на данном масштабе.           

});

 

4 комментария
масштаб,API 2.1,геокодирование
Автоматический зум карты
Drm-a
31 марта 2015, 16:10

Здравствуйте, имется карта с несколькими балунами. Как мне сделать так, чтобы масштаб карты высчитывался автоматически, т.е на карту всегда влезали все балуны

 

var map = new YMaps.Map(document.getElementById("test-map")); // создаем объект карты в элементе с айди 'test-map'

map.setCenter(new YMaps.GeoPoint(37.64, 55.76), 12); // центр карты (широта, долгота) и текущий уровень увеличения

 

// Включаем масштабирование скроллингом мыши

map.enableScrollZoom();

// Добавляем метку в координаты, полученные по указанному адресу

var geocoder = new YMaps.Geocoder("Россия, Москва, ул. Тверская, д. 43"); 

YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {

   var geoCoords = geocoder.get(0).getGeoPoint(),

       geoPlacemark = new YMaps.Placemark(geoCoords);

geoPlacemark.name = "Имя метки";

geoPlacemark.description = "Описание метки";

map.addOverlay(geoPlacemark); 

});

 

// Добавляем метку в координаты, полученные по указанному адресу

var geocoder = new YMaps.Geocoder("Россия, Москва, ул. Тверская, д. 54"); 

YMaps.Events.observe(geocoder, geocoder.Events.Load, function (geocoder) {

   var geoCoords = geocoder.get(0).getGeoPoint(),

       geoPlacemark = new YMaps.Placemark(geoCoords);

geoPlacemark.name = "Имя метки";

geoPlacemark.description = "Описание метки";

map.addOverlay(geoPlacemark); 

});

 

// Создаем собственную метку

var s = new YMaps.Style(); // Создаем стиль

s.iconStyle = new YMaps.IconStyle(); // Создает стиль значка метки

s.iconStyle.href = "online_instruction_manuals.png"; // Указываем путь к картинке

s.iconStyle.size = new YMaps.Point(16, 16); // Размеры картинки

s.iconStyle.offset = new YMaps.Point(-8, -8); // Сдвиг

var ownPlacemark = new YMaps.Placemark(coords, { 

style: s // Указываем какой стиль применить

});

map.addOverlay(ownPlacemark);

4 комментария
масштаб,область видимости,API 1.x
Балун исчезает
vctr78
30 марта 2015, 15:39

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


Жмём на любую метку, видим внизу балун. Затем зумируем в сторону от метки так, чтобы она скрылась. Балун исчезает. Как исправить такое поведение?
Метки добавлены в кластеризатор, кластеризатор на карту.

Вот пример http://jsbin.com/zataha/1/ 

Как можно устранить такое поведение?  

3 комментария
масштаб,API 2.1,балун
Как отключить изменение масштаба карты колесом прокрутки мыши?
locman5555
26 марта 2015, 17:07

Конструкция

myMap.behaviors.disable('ScrollZoom');  не работает.

Проверено на своем сайте и на https://tech.yandex.ru/maps/jsbox/2.1/behaviors (если изменить 16 строку на  .disable(['ScrollZoom', 'drag', 'rightMouseButtonMagnifier'])) ничего не меняется

Проверено в MacOS Firefox, Opera, Safari

 

З.Ы. Очень раздражжает, когда прокручивается страница, а в середине вставлена карта. При достижении карты прокрутка останавливается, а масштаб карты улетает в заоблачные выси. :-(

45 комментариев
масштаб,API 2.1,поведения карты
Как отключить зум карты колесиком мыши?
threezero
16 марта 2015, 11:15

Приветствую, можно как-то реализовать сабж?

16 комментариев
масштаб,API 2.1,поведения карты