JavaScript: широта / долгота, широта / долгота1, азимут, расстояние до x, координаты экрана y? - PullRequest
0 голосов
/ 04 июля 2010

Как спроектировать точку доступа широта / долгота на панорамное изображение 360x180 градусов?
Используя javascript?

Реальные данные:
широта / долгота в десятичных градусах и высота в метрах:
Координаты камеры: 49,994249, 8,66539, 2
Координаты точек доступа: 49.994163, 8.665388, 2

Расстояние от камеры до точки доступа в метрах: 9,55
Компас, несущий камеру к точке доступа в градусах (0-360): 170
Направление изображения: 130 градусов (по середине изображения) Это вообще нужно?
Горизонт - середина изображения.

Размер изображения ширина: 1024, высота: 512 пикселей

Что мне нужно, так это код javascript для определения координаты пикселя x, y точки доступа.
0 - верхний левый угол.

Точность не имеет значения. Расстояние всегда будет меньше 100 метров.

Спасибо
Jan
janmartin AT diy-streetview DOT org

1 Ответ

0 голосов
/ 10 сентября 2010

Похоже, что вы уже выполнили сложную часть: преобразование координат GPS в относительную ось (и расстояние).

Если центр вашего изображения 360 ° указывает на 130 ° с севера (при условии, что вокруг компаса по часовой стрелке), а азимут от местоположения камеры и точки доступа находится на расстоянии 170 ° от севера, то может показаться, что точка доступа находится на 40 ° на вашем изображении относительно центра изображения. И, поскольку изображение содержит 360 ° и 1024 пикселя по горизонтали, то может показаться, что точка доступа расположена в 1024 пикселя / 360 ° * 40 ° = 114 пикселей от центра изображения.

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

Соединив это, вы получите координаты: 512 + 114, 256 + 0 = координаты: 626, 256.

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

Сначала предположим, что ground distance = расстояние на уровне земли между местоположением камеры и точкой доступа. Это будет одинаковым независимо от высоты каждого.

Таким образом, ваш шаг будет: atan [(высота точки доступа - высота камеры) / расстояние от земли].

Например, если у вас было расстояние от земли 100 м, а точка доступа была на 10,75 м, а камера все еще на высоте 2 м, то вы вычислили бы свой шаг следующим образом:

шаг = атан [(10,75 м - 2 м) / 100 м] = атан (8,75 м / 100 м) = атан (0,0875) = 5 °

Чтобы отобразить это на вашей панораме: 512px / 180 ° * 5 ° = 14px выше среднего. Поскольку середина составляет 256 пикселей, а верхний левый угол изображения - 0,0, мы вычли бы 14 пикселей из 256, чтобы получить 242 пикселя.

Собираем все это вместе в Javascript, как вы просили:

// We'll use degrees, but this would be simpler if
// everything were computed in radians, since that
// is how the Math methods work.
function getRelativePitch(cameraAlt, hsAlt, groundDistance)
{
   var degPerRad = 180 / Math.PI;

   if (groundDistance == 0) { return 0.0; } // fringe case

   var rad = Math.atan( ( hsAlt - cameraAlt) / groundDistance );

   // Convert to degress
   return rad * degPerRad;
}

// Pretty simply this one.
function getRelativeHeading(cameraHeading, hsHeading)
{
   return hsHeading - cameraHeading;
}

var cameraHeading = 130; // degrees
var hotspotHeading = 170; // degrees
var cameraAltitude = 2; // meters
var hotspotAltitude = 10.75; // meters
var groundDistance = 100; // meters

var panoWidth = 1024; // pixels
var panoHeight = 512; // pixels

var panoRangeX = 360; // degrees
var panoRangeY = 180; // degrees

var relativeHeading = getRelativeHeading(cameraHeading, hotspotHeading);
var relativePitch   = getRelativePitch(cameraAltitude, hotspotAltitude, groundDistance);

// Now convert to pixels
var hotspotX = Math.round( panoWidth / 2 + panoWidth / panoRangeX * relativeHeading );
var hotspotY = Math.round( panoHeight / 2 - panoHeight / panoRangeY * relativePitch );

// Just in case we endup out of range
while (hotspotX < 0) { hotspotX += panoWidth; }
while (hotspotX > panoWidth) { hotspotX -= panoWidth; }

while (hotspotY < 0) { hotspotY += panoHeight; }
while (hotspotY > panoHeight) { hotspotY -= panoHeight; }

alert("Hotspot is at: " + hotspotX + ", " + hotspotY);

Надеюсь, это поможет!

...