Клуб API Карт

Найдено на тему «setBounds»:
Прошу помощи с setBounds - показывает на максимальном отдалении карты (с серыми полями)
biohazard-87
2 февраля 2016, 16:12

Не давно начал изучать ya.maps и потребовалось динамически масштабировать карту в зависимости от удаленности объектов друг от друга - чтобы всегда на карте отображалить все объекты (были видны пользователю).

Использую следующий код:

        ymaps.ready(markicons);
        var oMap;
        function init() {
            var cData = data.MapCenter;
            var CenterPoint = [cData[0].longi, cData[0].lati]
            var ZoomV = data.ZoomValue; //попытка установить расчетное значение зума
            oMap = new ymaps.Map("map", {
                center: CenterPoint,
                zoom: ZoomV, //расчетное значение равно 8
                controls: ["typeSelector", "zoomControl"]
            });
        }
        function markicons() {
            init();
            var markers = [];
            var aData = data.poi;
            for (var i = 0, poiData; poiData = aData[i]; i++) {
                var marker =
                    new ymaps.GeoObject({
                        geometry: {
                            type: "Point",
                            coordinates: [poiData.longi, poiData.lati]
                        },
                        properties: {
                            iconContent: '',
                            hintContent: '<b>' + poiData.Info + '</b>',
                            id: poiData.id,
                            projectId: data.projectId,
                            anketaId: data.anketaId
                        }
                    },
                {
                    preset: 'islands#darkOrangeIcon',
                    draggable: false
                });
                oMap.geoObjects.add(marker);
            }
            oMap.setBounds(oMap.geoObjects.getBounds(), { checkZoomRange: true });
        }

По итогу, если выключить

oMap.setBounds(oMap.geoObjects.getBounds(), { checkZoomRange: true });

то отображается правильно, но расчетное значение зума не то, что нужно (пока не очень понял как пересчитать зум правильно и стоит ли это делать самому, или же лучше использовать готовое решение)

Если же включить - то вот такая картинка:

Что делаю не так?

1 комментарий
setBounds
Правильная ли конструкция с точки зрения производительности?
p13mm
14 января 2015, 22:34

Данные на карту выводятся через ObjectManager по требованию


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

$.ajax({
            url: '/points.php',
            dataType: 'json'
        })
        .done(function (data) {
            // Если всё ок - добавим метки на карту
            objectManager.add(data);
   
            // Теперь надо бы найти максимальные и минимальные координаты точек
            // Для этого определим изначальные "координаты"
            var maxLat = 0,
                maxLon = 0,
                minLat = 100,
                minLon = 100;
            // пройдёмся в цикле по всем координатам
            objectManager.objects.each(function (object) {
                var lat = object.geometry.coordinates[0],
                    lon = object.geometry.coordinates[1];
                // Определим максимальные и минимальные результаты
                maxLat = (lat <= maxLat) ? maxLat : lat;
                maxLon = (lon <= maxLon) ? maxLon : lon;
                minLat = (lat >= minLat) ? minLat : lat;
                minLon = (lon >= minLon) ? minLon : lon;
            }, myMap);
   
            // Установим границы карты в соответсвии с полученными данными
            myMap.setBounds([[minLat, minLon], [maxLat, maxLon]]);
        })
        .fail(function () {
            console.log("error");
        });

 

Вопрос:
Правильная ли это конструкция с точки зрения производительности, или возможно как то проще это реализовать?

7 комментариев
метка,API 2.1,setBounds,ObjectManager