Клуб API Карт

7 комментариев
Алексей Yarrr!
28 января 2016, 04:07

Кому будет интересно: provide('util.math.bounds', mbr);

Ищется в полученных исходниках при debug=true по fromPoints

Вроде бы, скоро должны вынести math, чтобы было, как описано в доках по ссылке выше.

Далеко не все функции описаны( math сейчас специально @ignore)

К тому же эти модули не входят в package.full как системные.

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

Алексей Yarrr!
28 января 2016, 04:07
Ах вон оно что.
imports.util.dom.style.position - криво считает позицию, не учитывает marginы, в следствие чего криво работает autoPan и ух.
Тоже по этой же причине не доступен?

Криво работает где?

Вообще оффсет элемента возврашает dom.style.offset, а position - именно эффективную позицию.

 

Алексей Yarrr!
28 января 2016, 04:07
Да, видимо, это не он. Маржин там не нужен. Кажется нашел, в чем у меня проблема.
в autoPan, при расчете clientBounds, плюсуется clientPosition:
clientPosition = imports.util.dom.style.position(this._overlay.getBalloonElement()),
            clientBounds = [
                [clientPosition[0] + bounds[0][0], clientPosition[1] + bounds[0][1]],
                [clientPosition[0] + bounds[1][0], clientPosition[1] + bounds[1][1]]
            ],
В моем случае, когда используется кастомный балун у кластера, при размещении карты так, чтобы кластер находился сверху или справа, autoPan сдвигал карту так, что она уезжала слишком далеко от верхней/правой границы, и в некоторых случаях даже закрывала балун, т.к. кластер уползал из зоны видимости.
При создании балуна я выставляю высоту и ширину балуна, и сдвигаю его отрицательными маржинами, чтобы указатель смотрел четко в точку кластера.
Я отключил автоПан и начал переписывать все методы поочереди, чтобы добиться правильного размещения, в итоге наткнулся на то, что есть не прибавлять клиентскую позицию к clientBoundingRect, то все позиционируется верно. С маржином я погорячился.
Возникает вопрос, а зачем её там надо прибавлять эту клиентскую позицию?
Еще внутри наткнулся на код с Math.max, он очень сомнительный, я не смог на бумаге смоделировать, в каких случаях этот код должен выправлять, судя по комментарию, позицию, чтобы карта не уезжала слишком далеко влево. Она точно также слишком уезжает вниз, и не по причине неверных расчетов оффсета, а, насколько я понимаю, по причине неверных исходных данных в clientBoundingRect+position.
Судя по всему вышеизложенному, и по тому, как ровно теперь встает балун от границ - думаю проблема именно в нем.
Повторить ошибку, думаю, проблем не вызовет - нужно просто относительно большой балун (с больше половины вьюпорта) и можно, для удобства, небольшой viewport. Двигаем карту так, чтобы геоОбъект находился справа-сверху в самом углу, жмакаем, автопан срабатывает и карта улетает.
Заранее спасибо за ответы ;-)
Алексей Yarrr!
28 января 2016, 04:07
Это потому, что overlay.getBalloonElement() и overlay.getBalloonLayout().getParentElement() возвращают одно и то же. И ни один из них не элемент, который нарисован шаблоном. Видимо, getBalloonElement должен возвращать элемент балуна, тогда его position будет 0, и все должно позиционироваться окейно.
Алексей Yarrr!
28 января 2016, 04:07
А есть ли возможность выставить balloon._element из build шаблона? ;-)