Pano2VR и Google Maps API - Вычисление расстояния между узлами виртуального тура

 Работа в Pano2VR | Встраивание карт и планов
 03.02.2017    09:05    3.1k    07.12.2018
 Время на чтение: ...    Комментировать    Напечатать
Содержание статьи
 Пользователи Pano2VR

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

 Нас уже ...
Как с использованием Google Maps API вычислить и отобразить пользователю информацию о географическом расстоянии до определенного узла тура.

Pano2VR и Google Maps API - Вычисление расстояния между узлами виртуального тура

Изображение

В виртуальных турах, особенно если это туры по улицам города, в которых панорамы чаще сделаны в местах на значительных расстояниях друг от друга, возникает необходимость сообщать зрителю это расстояние в привычных единицах измерения.

Эту возможность я реализовал в новой версии тура Мозырь на все 360 градусов. При наведении на стрелку перехода (хотспот), отображается превью с названием локации, а также расстояние до неё от текущей локации. Это реализовано с помощью Google Maps API и, прочитав эту статью, вы узнаете, как это сделать.

Рисунок 1. Структура шаблона хотспота.

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

В оформлении тура (скине) необходимо предусмотреть текстовое поле для отображения расстояния. На рисунке 1 текстовое поле с ID "hotspot_node_text". В моем примере оно отображается в превью хотспота (рис. 2).

Экспорт тура необходимо произвести в формате HTML5. В примере используется версия Pano2VR 5.0.1.

Расстояние будет отображаться в том же текстовом поле, что и заголовок узла тура. На рис. 2 текстовое поле находится в низу элемента «Node Image». Поле содержит текстовую строку «<p class="hotspot-node-name">$hs</p>». Использование CSS класса позволит изменить дизайн текстового поля. Об этом будет чуть ниже.

Рисунок 2. Внешний вид хотспота.

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

В событии Mouse Enter (курсор над объектом) в текстовое поле будет помещаться вышеуказанная строка, а в событии Mouse Leave (уход курсора с объекта) текстовое поле будет обнуляться.

Вы спросите, зачем нужно в каком-то действии вставлять такую же строку, какая уже введена в текстовом поле? Не лишние ли это действия?

Нет, действия не лишние. После экспорта тура данная строка будет модифицирована. В ней помимо заголовка будет вставляться и числовое значение расстояния.

Рисунок 3. Сценарии изображения (стрелки) хотспота.

Экспортируем тур и проверим, как работают хотспоты. Должно получиться что-то похожее, как на рис. 4.

Рисунок 4. Так выглядит превью хотспота в запущенном туре.

После завершения экспорта тура откроем в текстовом редакторе HTML-файл и подключим Google Maps API. Для этого после тега <body> добавим следующую строку.

<script type="text/javascript" 
src="https://maps.google.com/maps/api/js?sensor=false&v=3&libraries=geometry">
</script>

Таким образом мы подключили библиотеку Geometry, в которой находится функция для вычисления расстояния.

Сохраним изменения в HTML-файле и откроем в текстовом редакторе файл skin.js.

Рисунок 5. Объявление новых переменных в файле skin.js

Над имеющимся исходным кодом объявим две переменные (рис. 5): selectedLatLng, которая будет хранить координаты выбранного узла по nodeId, связанного с хотспотом, и Distance, куда будет записан результат вычисления расстояния. Зададим первоначальное значение 0.

Рисунок 6. Добавление кода, отвечающего за вычисления

Затем перейдем к месту кода, где описана реализации события onmouseover (Рис. 6) и вставим следующие строчки кода.

//Определение координат выбранного узла
selectedLatLng = pano.getNodeLatLng(nodeId);
//Определение координат текущего узла
var currentLatLng = pano.getNodeLatLng(pano.getCurrentNode());
//Создание переменных класса LatLng для использования
// в качестве аргументов функции computeDistanceBetween
var latLngA = new google.maps.LatLng(selectedLatLng[0], selectedLatLng[1]);
var latLngB = new google.maps.LatLng(currentLatLng[0], currentLatLng[1]);
//Вычисление расстояния
Distance = google.maps.geometry.spherical.computeDistanceBetween(latLngA, latLngB);

Немного ниже нужно будет найти ту самую строку, о которой говорилось в начале статьи (рис. 7). В ней вместо $hs подставлено me.hotspot.title.

Рисунок 7. Реализация вставки заголовка узла в текстовое поле.

Добавим в найденную строку вывод значения расстояния,обернув его тегами <span> для управления стилями CSS (Рис. 8). Значение расстояния измеряется в метрах. Функция toFixed(0) выводит число с фиксированной точкой. В качестве аргумента указывается количество знаков после запятой. В моем примере выводится целое число, то есть без знаков после запятой.

Рисунок 8. Модифицированная строка вставки заголовка.

Если в туре встречаются расстояния более 1000 метров, то можно сделать преобразование значения в километры. Код будет иметь следующий вид.

if (Distance > 1000) {
 Distance = Distance / 1000;
 me._hotspot_node_text.ggText="<p class=\"hotspot-node-name\">
 <span>"+Distance.toFixed(1)+"km "+me.hotspot.title+"<\/p>";
 } 
 else {
 me._hotspot_node_text.ggText="<p class=\"hotspot-node-name\">
 <span>"+Distance.toFixed(0)+"m "+me.hotspot.title+"<\/p>";
 } 

Сохраним изменения в файле skin.js и откроем страницу с виртуальным туром.

Рисунок 9. Так выглядит превью хотспота в запущенном туре после модификации.

Стили CSS для оформления строки вывода заголовка и расстояния выглядят. Их нужно подключить любым доступным способом: через CSS-файл или в секции <style> в теге <head>

.hotspot-node-name {
 font-family: Verdana,Arial,Helvetica,sans-serif; 
 font-size: 10px !important;
 margin: 4px 0 0 0;
 line-height: 11px; 
 letter-spacing: -1px;
}

.hotspot-node-name span {
 font-size: 13px !important;
 font-weight: bolder; 
 padding: 2px;
 margin: 0 3px 0 0;
 background: #4b4b4b;
 color: #ffffff;
}

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

Как вам материал?

0 реакции
👍
0
👎
0
😂
0
😱
0
😡
0
😢
0
Поделитесь материалом в социальных сетях

У Вас остались вопросы по статье? Задавайте. Буду рад ответить на них в комментариях.

Если этот материал совсем не то, куда Вас привел поисковик, попробуйте выполнить поиск по сайту или введите запрос в строку ниже. Также Вы можете посмотреть другие материалы в разделе статьи.

ТЕГИ МАТЕРИАЛА:
Об авторе

Сергей Дишук, фотограф-любитель и профессионал. Занимаюсь пейзажной, архитектурной, интерьерной, репортажной фотосъемкой, а также другими видами фотосъемки. Связал жизнь с IT, увлекаюсь программированием и разработкой программного обеспечения.

Занимаюсь панорамной фотосъемкой и созданием виртуальных 3D-туров более 8-ми лет. Имею опыт работы в программах Pano2VR, PTGui, Photomatix, Adobe Photoshop, Lightroom и других.

Реализовал некоторые фичи в проектах Pano2VR задолго до их официального появления. За всё время помог разобраться с Pano2VR более 5k пользователям, из них более 200 лично.

Материалы по теме статьи
Возможно, Вас заинтересуют эти материалы
Самое читаемое
Нет комментариев

Ранний доступ к материалам, эксклюзивный контент и другие бонусы от меня по подписке от 200 ₽ в месяц.

VK Donut
 
Платные темы OK
 
Boosty
 
Patreon
 
Сейчас просматривают
Опрос
Оцените ваши впечатления от сайта?
Всего проголосовавших: 49
Последние новости
Фотомарафон «Октябрь в объективе»

Объявляю о начале осеннего фотомарафона «Октябрь в объективе». Данный проект направлен на объединени...

 События
 07.10.2025    18:30    61    0
Мой сайт теперь можно установить, как приложение

Я постоянно работаю над тем, чтобы вам было удобнее и приятнее пользоваться моим сайтом sergeydishuk...

 Обновления сайта
 21.09.2025    08:10    78    0
Охота на лунное затмение провалилась и почему я все равно не жалею

Вчера, 7 сентября, должно было случиться лунное затмение. Я, как и многие фотографы, готовился его с...

 События
 08.09.2025    19:20    127    0
Последние статьи
Как я сделал виртуальный тур для музея академика П.Ф. Ракицкого

Иногда самые интересные проекты приходят неожиданно. Так случилось и с этим виртуальным туром: предл...

 О создании панорам
 04.10.2025    08:35    142    0
10 советов для начинающих фотографов

Фотография – это не только техника, но и умение видеть мир иначе. Для новичка путь к сильным кадрам ...

 Статьи по фотографии
 28.09.2025    12:32    80    0
30 вопросов и комментариев, которые бесят фотографа

В этой статье я привел десятки реальных примеров тех самых «болевых» вопросов, которые фотографы слы...

 Статьи по фотографии
 24.09.2025    10:32    84    0
Онлайн всего: 1
Гостей: 1
Пользователей: 0