Клуб API Карт

IGeometry->getBounds() ведёт себя странно на больших масштабах

Пост в архиве.
Александр Рулёв
15 июля 2013, 13:10

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

Сегодня почти закончил страницу, которая позволяет добавлять маршруты непосредственно из файла (до этого добавлял в БД (как она появилась, до этого ещё страшнее было) руками) и столкнулся с проблемой.

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

Для этого я и сделал:

maps.setBounds(polyline.geometry.getBounds());

Но... не тут то было. Изначально я установил карту так, чтобы была видна вся евразия (zoom: 2).

Я ожидал, что оно сработает как положено и откроет мой маршрут. Но вместо этого оно сделало что-то сначала «странное». Показало пару линий зелёных и сказало, что на этом масштабе нет изображений.

Я отмотал, оказалось, что оно почему-то установило камеру в начало пути.

Глянул, что возвращает

polyline.geometry.getBounds();

и не понял, в чём прикол. Ибо обе точки границы совпадали. Причём когда я установил zoom = 4, они стали отличаться. Я не понимаю. Как это? Ведь границы географического объекта константны и не зависят от масштаба, нет?

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

Однако мне это категорически не нравится. Как-то хлюпко и там довольно большие числа, похоже оно варварски вносит большие погрешности (хотя на большинстве тестовых треков показало более или менее нормально, как минимум по всей Европе не нужно искать).

Что делать?

Спасибо.

P.S. Случайно нажал Ctrl+Enter, это было неожиданно, пришлось удалить первый пост.

P.P.S. А ещё меня волнует вопрос тепловых карт, вроде таких. Я придумал способ, как можно добавить такой слой для Яндекс.Карт, то это очень костыльно (рисовать в канвасе, добавить слой, сделать чтобы функция, получающая URL тайла вырезала кусок из канваса и через data: запихивала тайл в карту).

4 комментария
Александр Рулёв
28 января 2016, 01:49

Возможно я всё-таки ошибся, на другом пути оно работает, вроде бы: http://jsfiddle.net/fJ5Jf/1/

Сейчас ещё раз проверю у себя, что я мог сделать не так.

Александр Рулёв
28 января 2016, 01:49

А нет, я не шизофреник. На настоящем пути оно действительно ведёт себя так, как я написал: http://jsfiddle.net/fJ5Jf/2/

Спасибо за сообщение, будем смотреть, почему так

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