2010-07-04 2 views
0

위도/경도 핫스팟을 360x180도 파노라마 이미지에 투영하는 방법은 무엇입니까?
자바 스크립트 사용?javascript : lat/lon, lat1/lon1, 베어링, x, y 좌표까지의 거리?

실제 데이터 :
진수도, 미터 고도에서 위도/경도 :
카메라 좌표 : 49.994249, 8.66539, 2
핫스팟 좌표 : 49.994163, 8.665388, 미터에 핫스팟이

거리 카메라 : 9.55
온도가 핫스팟 (0-360) 인 나침반 베어링 카메라 : 170
이미지 방향 : 130도 (x 중간 이미지) 이것이 필요합니까?
수평선은 이미지 중간입니다. 이미지 크기 폭

: 1024, 높이 512 픽셀 제가

필요한 것은 X, Y 픽셀 이미지 핫스팟의 좌표를 결정하는 자바 스크립트 코드

.
0은 왼쪽 상단입니다.

정확도는 중요하지 않습니다. 거리는 항상 100 미터보다 작습니다. GPS를 변환하는 상대 베어링 (거리)로 좌표 :

감사합니다,
월은
은 DIY - 스트리트 뷰 DOT AT janmartin는

답변

0

그것은 당신이 이미 어려운 부분을했을 것 같습니다 ORG.

360 ° 이미지의 중심이 북쪽에서 130 ° (나침반 주위로 시계 방향으로 가정)이고 카메라 위치에서의 방위와 핫스팟이 북쪽에서 170 ° 인 경우 핫스팟이 이미지의 중심을 기준으로 이미지에서 40 °. 그리고 이미지가 수평으로 360 °와 1024px를 포함하고 있기 때문에 핫스팟은 이미지 중앙에서 1024px/360 * 40o = 114px 위치에있는 것처럼 보입니다.

카메라와 핫 스폿이 모두 같은 고도에 있기 때문에 상대 피치는 0입니다. 512 + 114 256 + 0 = 좌표 :

함께 이러는하면 좌표 얻을 626, 핫스팟의 고도가 카메라와 같은 아니라면 256

를 그럼 거라고 몇 가지 간단한 방법을 사용하여 피치를 계산할 수 있습니다. :

먼저 ground distance = 카메라 위치와 핫스팟 위치 사이의 지상 거리를 가정합니다. 이것은 각각의 고도에 관계없이 동일합니다.

따라서 피치는 atan [(핫스팟 고도 - 카메라 고도)/지상 거리]입니다. 예를 들어

, 당신은 100m의 지상 거리를했고 핫스팟은 당신이 당신의 피치를 계산하는 것, 아직도 2m 높이에서 카메라와 10.75m에서와 같은 인 경우 :

피치 = ATAN [(10.75m - 2m)/100m] = atan (8.75m/100m) = atan (0.0875) = 5 °

이 사진을 파노라마에 표시하려면 중간보다 512px/180o * 5o = 14px 높게 설정하십시오.가운데가 256 픽셀이고 이미지의 왼쪽 상단이 0,0이므로 256 픽셀에서 14 픽셀을 뺀 다음 242 픽셀에 도달합니다. 당신이 요청에 따라

자바 스크립트로 모두 함께이 퍼팅 :

// 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); 

난이 도움이되기를 바랍니다!

관련 문제