Клуб API Карт

Найдено на тему «область видимости»:
Ещё раз про видимость переменных внутри modules.require
delite86
25 июля 2016, 23:52

Доброго времени суток! Прошу уделить мне минуту времени и попробовать повторно разъяснить про видимость переменных, ибо эта базовая вещь до меня с первого раза никак не дошла, и я делаю неправильно.

Взять, к примеру, Heatmap Module.

ymaps.ready(init);
function init(){
    myMap = {......};

    ymaps.modules.require(['Heatmap'], function (Heatmap) {
        heatmap = new Heatmap({}, {
            gradient: gradients[0],
            radius: radiuses[1],
            opacity: opacities[2]
        });
        heatmap.setMap(myMap);

    }); //heatmap

} //init

Работает, показывает. Нужна кнопка вкл/выкл.

Куда бы и в какой бы последовательности я ни запихнул это

 var heatmap = new ymaps.control.Button({
     data: {
         content: 'ВКЛ/ВЫКЛ'
         } 
     });

    myMap.controls.add(heatmap);

    heatmap.events.add('press', function () {
         heatmap.setMap(
         heatmap.getMap() ? null : myMap
         );
    });

Я получу разную ошибку. Либо heatmap.setMap is not a function, либо heatmap is not defined. При размещении всего этого внутри function (Heatmap) { ошибок не выдаёт до клика по кнопке, затем heatmap.setMap is not a function.

Хотя я посмотрел на этот heatmap внутри:

heatmap.events.add('press', function () {
  explain(heatmap); //смотрю в консоль
);

function explain(obj) {for (var i in obj) { console.log(i); }  console.log(obj);}

Консоль:
state
data
options
events
_itemImplementation
eventProxy
_layout
_layoutDeferred
_selected
_enabled
_toolBarButtonComponent
id_14694794915907087
_layoutCancelableCallback
_visibilityMonitor
constructor
_setupLayoutEventRules
_onClick
select
deselect
isSelected
enable
disable
isEnabled
_onStateChange
_setupSelectableEventRules
getLayout
getLayoutSync
onAddToMap
onRemoveFromMap
_setupLayout
_destroyLayout
_createLayout
_onVisibilityChange
_setVisibleState
_fireLayoutChangeEvent
getParent
setParent
getMap
createOptionManager
_onParentChange
_onMapChange

и никакого setMap не вижу.

Я очень долго мучался, и до меня никак не дошло, как сделать эту кнопку. До этого я так же бесполезно мучался с PieChart, и мучения будут бесконечны, пока я чего-то не пойму. Можно ли эту ситуацию объяснить на уровне "чайника", так сказать, ибо я уверен, что какая-то простейшая банальщина.

Конечно, я могу вместо  var heatmap= написать просто  heatmap= внутри функции, и область видимости станет глобальной, кнопка заработает, но такое решение выпилят из JS в самом ближайшем будущем, и всё сломается. Я бы хотел понять, как правильно.

4 комментария
область видимости,модули
Вопрос к разработчикам: boundschange и sizechange
Иван
10 февраля 2016, 10:22

Обнаружил интересную особенность работы boundschange. Это событие отслеживает изменение области просмотра карты. В документации написано «в результате изменения центра или уровня масштабирования». Но в случае изменения размера окна карты тоже срабатывает событие boundschange, так как при изменении размера окна карты область просмотра карты тоже меняется (проверено).

Есть также событие sizechange, которое отслеживает только изменения размера окна карты. Там доступны поля oldSize и newSize.

Но если мне нужно отследить только изменение масштаба и перетаскивание карты? Я бы мог слушать boundschange и проверять, меняется ли размер окна, но в boundschange не доступны поля oldSize и newSize.

На мой взгляд, с этим нужно что-то делать.

6 комментариев
boundschange,sizechange,область видимости,events
Как отцентровать карту и сделать зум по региону с известным 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,область видимости
Проблема масштабирования через setBounds
M.Program
8 июля 2015, 22:58

Добрый день!

Мне надо выводить город, город и улицу, город и улицу с домом. При этом масшабирование должно соответвовать области объекта. У меня возникает проблема с методом setBounds. Ниже приведен код примера, в котором при нажатии на кнопку появляется карта, но масштабируется с zoom 0, если убрать setBounds, то происходит масштаб с zoom 14 (отмечен при создании карты), но мне он не подходит для отображения города или города с большой улицей. Пожалуйста, подскажите, что делаю не так и как решить эту задачу?!

 

 

<!DOCTYPE html>
<html>
<head>
<script src="https://api-maps.yandex.ru/2.1/?lang=ru_RU"></script>
<script>
    ymaps.ready(init);
    function init(){
        var myMap;
        // Поиск координат центра
        ymaps.geocode('Краснодар, Адыгейская Набережная', {
            results: 1 //только один результат
        }).then(function (res) {
            myMap = new ymaps.Map("map", {
                center: res.geoObjects.get(0).geometry.getCoordinates(),
                zoom: 14
            });
           
            var firstGeoObject = res.geoObjects.get(0),    // Выбираем первый результат геокодирования
                coords = firstGeoObject.geometry.getCoordinates(),  // Координаты геообъекта
                bounds = firstGeoObject.properties.get('boundedBy'); // Область видимости геообъекта

            // Добавляем первый найденный геообъект на карту
            myMap.geoObjects.add(firstGeoObject);
            // Масштабируем карту на область видимости геообъекта
            myMap.setBounds(bounds, {
                checkZoomRange: true // проверка наличия тайлов на данном масштабе
            });
        });
    }
    function mapD(){
        document.getElementById("map").style.display='';
    }
</script>
</head>
<body>
<div>
    <div>Адыгейская Набережная, 71 <input class="sortbut" value="Показать на карте" onclick="mapD()" type="button"></div>
    <div id="map" style="width:100%;height:400px;margin:20px 0;display:none"></div>
</div>
</body></html>

 

4 комментария
API 2.1,область видимости
Кластеризация и метки центрирующиеся при открытии
Удалённый пользователь
29 июня 2015, 21:05

Добрый день, ребята! Помогите решить вопрос

 

Есть карта : http://take.ms/3sxLM

 

Уже сделал, чтобы при клике на точке с несколькими метками они центрировались в видимой области.

 

Сейчас стал ребром вопрос, чтобы при клике на метку и при ее открытии она показывалась вся в видимой области. (см. рисунок)

2 комментария
метка,API 2.1,область видимости,балун
Как расчитать координаты объекта ?
talgautb
19 июня 2015, 11:55

Есть объект с координатой, которая определена в центре объекта. Можно ли узнать крайние координаты объекта ?

Например, координата города - центр города. А кооординаты города с запада на восток и с севера на юг можно узнать ?
покопался в документации - ничего не нашел.

Может есть какой-то алгоритм ? или готовый функционал/библиотека ?

1 комментарий
область видимости,геокодирование
Как удалить метки за пределами видимой области карты (2.1)
Кирюха Вот
5 июня 2015, 14:30

Собственно в теме вся суть вопроса и указана.

 

Метки подтягиваются с сервера и по событию boundschange выводятся на карту в цикле через map.geoObjects.add, но все то, что за ее пределами - не плохо было бы удалить.

 

Смотрел в сторону map.geoObjects.each(...), но что-то не соображу как выудить координаты метки. Да и думаю есть какое-то встроенное решение этого вопроса, просто я его в упор не вижу.

3 комментария
метка,API 2.1,область видимости
Отображение области всех меток на карте
WikiJournal
5 июня 2015, 11:54

В общем у меня отображаются метки на карте из БД - пользователи сами добавляют метки на карте и они отображаются следующим образом:


Дело в том, что в коде идёт строгая привязка отображения центра карты: center: [48.41,66.73],

Нигде не могу найти, чтобы отображалась область карты всех размещённых на ней меток. Спасибо за помощь!

7 комментариев
метка,API 2.1,область видимости
Ограничить поиск ('searchControl') Ленинградской областью
akon1982
2 июня 2015, 15:48

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

Например, пытался сделать так: 

var LenOblBounds = new YMaps.GeoBounds(new YMaps.GeoPoint(58.42032164, 27.75087718),new YMaps.GeoPoint(61.49507945, 35.74420556));
 var searchControl = new ymaps.control.SearchControl({
     options: {
         //boundedBy : [58.42032164,27.75087718][61.49507945,35.74420556],
         boundedBy : LenOblBounds,
         strictBounds : true
     }
    });
    globus.controls.add(searchControl);

 http://jsfiddle.net/dmfp8jj6/

 globus.controls.add('searchControl',{boundedBy : [58.42032164,27.75087718][61.49507945,35.74420556],strictBounds : true});

 

Но ничего не меняется. Например, ввожу "улица" - выдаёт Приморскую улицу в Одессе

 Ссылка на изображение подтверждающее это

Заранее спасибо.

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

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

3 комментария
масштаб,метка,API 2.1,область видимости
Делаю динамическую загрузку данных, как узнать видимые границы в координатах?
CRAMAC
7 мая 2015, 12:58

Всем привет.

Делаю переход карты с АПИ 1 на последнюю.

Раньше работало так:

 



YMaps.Events.observe(map, [map.Events.BoundsChange, map.Events.TypeChange],  function () {
var idtekcat=$('input:checkbox').serialize();
Agetmetca('&'+idtekcat);
});
function Agetmetca(param)
{
map.removeOverlay(gCollection);

var bounds1 = map.getBounds(),
pointLb1 = bounds1.getLeftBottom(),
pointPt1 = bounds1.getRightTop(),
span1 = bounds1.getSpan();

gCollection = new YMaps.GeoObjectCollection();

var data=\"getmetka=1&lb=\"+pointLb1+\"&pt=\"+pointPt1+param;

$.ajax({
type: 'POST',
url: \"map.html\",
async : false,
data: data,
dataType: \"script\"
});

for(var i = 0; i < arr_x.length; i++)
{
gCollection.add(createPlacemark(arr_x[i], arr_y[i], arr_tip[i], arr_name[i], arr_descr[i]));
}

map.addOverlay(gCollection);
}

 

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

 UPD: забыл добавить что загружать хочу не только метки, но и ломаные, LoadingObjectManager вроде как не может такого.

1 комментарий
API 2.1,менеджер объектов,область видимости,API 1.x
Как приблизить кластер
ngs-leto
30 апреля 2015, 13:41

Подскажите пожалуйста как программно приблизить кластер, как это делается по клику на нем но при clusterDisableClickZoom=true?

Пробую так:

            objectManager.clusters.events.add('click', function onObjectEvent (e) {
               var objectId = e.get('objectId');

               var obj = ObjectManager.clusters.getById(objectId);
     
                if (myMap.getZoom()<16)
                {
                    //приближаем кластер
                    map.setBounds( obj.getBounds() );
                }else{
                    //Показываем балун
                }

}

не хочет... obj.getBounds() - дает ошибку

6 комментариев
кластеризатор,менеджер объектов,область видимости,API 2.1
Центрирование карты с кластерами
sweelemk
3 апреля 2015, 08:59

Доброго дня. Необходимо на карте создать кластеры. Этот вопрос получилось решить. Однако, на часть карты сверху накладывается хидер, соответственно, все метки распологаются на всю доступную ширину карты и тем самым подъезжают по хидер. Помогите решить вопрос с тем, чтобы катра отображалась только в выбраной области.

 

http://take.ms/Zyxo2

 

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

 

Использую карты 2.0

 

Инициализация иммет следующий вид:

 

ymaps.ready(init);
var myMap;
function init(){
myMap = window.map = new ymaps.Map ("map", {
center: [53.90614, 27.54849],
zoom: 12
}),
clusterer = new ymaps.Clusterer({
preset: 'twirl#blueClusterIcons',
groupByCoordinates: false,
clusterDisableClickZoom: true
});

myMap.controls
.add('zoomControl', {
right: '35',
top: '350'
})

getPointOptions = function () {
return {
preset: 'twirl#blueIcon'
};
},
points = [
[53.90672, 27.52199], [53.93099, 27.54069], [53.90614, 27.54849]
],
geoObjects = [];

for(var i = 0, len = points.length; i < len; i++) {
geoObjects[i] = new ymaps.Placemark(points[i], getPointOptions());
}
clusterer.options.set({
gridSize: 80,
clusterDisableClickZoom: false
});
clusterer.add(geoObjects);
clusterer.events.once('objectsaddtomap', function () {
myMap.setBounds(clusterer.getBounds());
});
myMap.geoObjects
.add(clusterer);
}

 

6 комментариев
API 2.0,кластеризатор,область видимости
Автоматический зум карты
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
Как изменить зум определенный через myMap.setBounds(myCollection.getBounds())
testingmywork
30 марта 2015, 23:13

На странице http://votum-vu.ru/ при клике "Показать на карте" отображается карта с метками коллекции.Однако, верхняя метка заходит под элемент управления. Зум определяется через myMap.setBounds(myCollection.getBounds(),{checkZoomRange:true}); 

Можно ли его изменить на n% или n единиц?

 

2 комментария
API 2.1,область видимости
исчезают метки при установке видимой области карты
amarieea91
21 марта 2015, 12:50

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

Добавляю метки через objectManager. В objectManager включена кластеризация. После добавления меток хочу установить видимую область карты по добавленым меткам таким образом:

 var bounds = ymaps.geoQuery(objectManager.objects).getBounds();

    myMap.setBounds(bounds);

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

 

function initMap() {

    objectManager = new ymaps.ObjectManager({

        clusterize: true,

        groupByCoordinates: true,

        gridSize: 32,

    });

 

    var coords = { Lat: 53.8993, Lng: 27.5622, Zoom: 6 };

    myMap = new ymaps.Map("map", {

        center: [coords.Lat, coords.Lng],

        zoom: coords.Zoom,

        behaviors: ['default', 'scrollZoom']

    });

}

 

function addPlacesToMap(places) {

    objectManager.add(places);

    objectManager.objects.options.set({

        iconLayout: 'default#image',

        iconOffset: [0, 0],

        balloonCloseButton: true,

        balloonPanelMaxMapArea: 'Infinity',

        preset: ''

    });

    myMap.geoObjects.add(objectManager);

    var bounds = ymaps.geoQuery(objectManager.objects).getBounds();

    myMap.setBounds(bounds);

}

 

10 комментариев
метка,API 2.1,менеджер объектов,область видимости,geoQuery
Определения координат области показа карты
Удалённый пользователь
17 марта 2015, 15:04

Подскажите пожалуйста. Я задал карте начальные параметры: геокоординаты центра и zoom.

Определил style="width:1510px; height:845px". Каким образом можно получить координаты левого нижнего угла и верхнего правого угла области показа карты ?

Спасибо.

 

9 комментариев
API 2.1,координаты,область видимости
динамический список видимых объектов на карте
Алексей
16 марта 2015, 14:32

Друзья, может у кого есть пример реализации вывода результатов отображения видимых объектов карты (точек) в виде списка.

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

Заранее спасибо.

4 комментария
метка,API 2.1,область видимости
Как получить границы объектов добавленных в objectManager
Сергей
13 марта 2015, 13:51

В objectManager отсутствует метод getBounds(). Как можно получить границы добавленных в менеджер точек, чтобы затем установить видимую область карты в этих границах?

2 комментария
API 2.1,менеджер объектов,область видимости
Не работает callback в Map.setBounds
Сергей
11 марта 2015, 15:34

Подскажите, почему может не срабатывать callback в методе Map.setBounds():

var map = new ymaps.Map('ID', {
                center: [0,0],
                zoom: 0,
                controls: ['zoomControl', 'fullscreenControl']
            });

map.setBounds([[60,-40], [20,60]], {
                checkZoomRange: true,
                callback: function(err) {
                    alert(1)
                    console.log(1)
                }
            });

 

Почему то ни алерта, ни записи в консоль не появляется. В чем тут может быть дело?

2 комментария
API 2.1,область видимости