Яндекс API Панорама - Как автоматически установить взгялд в центр здания?
Использую Яндекс JavaScript API 2.1 для получение панорамы на сайт.
По примеру подставляю координаты здания (123308, г.Москва, 3-я Хорошёвская улица, 20), (55.787644, 37.500477):
ymaps.ready(function () {
// Для начала проверим, поддерживает ли плеер браузер пользователя.
if (!ymaps.panorama.isSupported()) {
// Если нет, то просто ничего не будем делать.
return;
}
// Ищем панораму в переданной точке.
ymaps.panorama.locate([55.787644, 37.500477]).done(
function (panoramas) {
// Убеждаемся, что найдена хотя бы одна панорама.
if (panoramas.length > 0) {
// Создаем плеер с одной из полученных панорам.
var player = new ymaps.panorama.Player(
'player1',
// Панорамы в ответе отсортированы по расстоянию
// от переданной в panorama.locate точки. Выбираем первую,
// она будет ближайшей.
panoramas[0],
// Зададим направление взгляда, отличное от значения
// по умолчанию.
{ direction: [0, 0] }
);
}
},
function (error) {
// Если что-то пошло не так, сообщим об этом пользователю.
alert(error.message);
}
);
Получаю панораму на сайте, но направление взгляда в панораме не в нужное здание. В direction можно менять направление, но как это сделать автоматически, чтобы подставляя координаты здания, получать панораму с взглядом на нужное здание?
Ответы (2 шт):
Такой возможности нет и не будет. Здания имеют сложную форму и высоту, координаты панорам могут быть близко к зданию или между ними и домом будут препятствия.
В какую точку и на какой высоте вы бы направили камеру тут: https://yandex.ru/maps/-/CCUFbFsQtD ? А здесь: https://yandex.ru/maps/-/CCUFbFDxoC ? Почему?
Никакая автоматика не определит, куда вы бы хотели направить взгляд пользователя. И в целом не следует использовать панорамы "просто до кучи". Они тратят в 5 раз больше тарифицируемых запросов. Нужные координаты и угол поворота вы должны задавать специально для заданных вами точек вашей базы объектов.
У меня тоже возникла необходимость направлять взгляд панорамы в направлении нужной точки. По счастью, объекты можно считать точечными. Вот решение:
if (panoramas.length > 0) {
var pan = panoramas[0];
var position = pan.getPosition();
var az = azimuth(position[0], position[1], coordinates[0], coordinates[1]);
var player = new ymaps.panorama.Player(
'player1',
pan,
{
direction: [az, 0],
}
);
}
...
function azimuth(x1, y1, x2, y2) {
let a = Math.atan2(y2 - y1, x2 - x1) * 180 / Math.PI;
if (a < 0) {
a += 360;
}
return a;
}