2010-07-04 90 views
0

如何將經緯度熱點投影到360x180度全景圖像上?
使用javascript?javascript:lat/lon,lat1/lon1,方位,距離x,y屏幕座標?

真實數據:
十進制度和米高空 經/緯度:
攝像機座標:49.994249,8.66539,2
熱點座標:49.994163,8.665388,2

距離相機米熱點:9.55
指南針軸承攝像機以度(0-360)爲熱點:170
圖像方向:130度(圖像中間x)這是否需要?
Horizo​​n是圖像的中間部分。

圖像大小寬度:1024,高度:512像素

我需要的是JavaScript代碼,以確定熱點的X,Y像素圖像座標。
0是左上角。

準確性不重要。距離總是小於100米。

感謝,

janmartin AT DIY-街景DOT ORG

回答

0

看起來你已經完成了艱難的部分:轉換GPS座標到相對軸承(和距離)。

如果360°圖像的中心指向北方130度(假設指南針爲順時針方向),並且來自攝像機位置和熱點的方位距北方170度,則看起來熱點位於相對於圖像中心的圖像40°。而且,由於圖像水平包含360°和1024像素,因此熱點位於距圖像中心1024像素/ 360度* 40度= 114像素處。

而且由於相機和熱點都在相同的高度,所以相對音高爲零。

把這個在一起,你得到的座標:512 + 114,256 + 0 =座標:626,256

如果熱點的高度是不一樣的相機,那麼你就必須使用一些簡單的三點法來計算音調:

首先讓我們假設ground distance =相機位置和熱點位置之間的地平線距離。無論每個海拔高度如何,這都是一樣的。

所以,你的音高應該是:atan [(熱點高度 - 相機高度)/地面距離]。

舉例來說,如果你有100米地距離和熱點都在10.75米用相機仍然2m處的高度,那麼你會計算你的間距:

間距= ATAN [(10.75米 - 2m)/ 100m] = atan(8.75m/100m)= atan(0.0875)= 5°

要在全景圖上顯示:512px/180°* 5°= 14px高於中間。由於中間是256像素,圖像的左上角是0,0,因此我們將從256減去14像素以達到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); 

我希望這有助於!