0

緯度/経度のホットスポットを360x180度のパノラマ画像に投影する方法は?
javascriptを使用していますか?

実際のデータ:
小数度の緯度/経度とメートル単位の高度:
カメラ座標:49.994249、8.66539、2
ホットスポット座標:49.994163、8.665388、2

カメラからホットスポットまでの距離(メートル):9.55
コンパス方角カメラからホットスポットまでの角度(0-360):170
画像の方向:130度(x画像の中央)これはまったく必要ですか?
地平線は画像の真ん中です。

画像サイズ幅:1024、高さ:512ピクセル

私が必要としているのは、ホットスポットのx、yピクセル画像座標を決定するためのjavascriptコードです。
0は左上隅です。

精度は重要ではありません。距離は常に100メートル未満になります。

ありがとう、
Jan
janmartin AT diy-streetview DOT org

4

1 に答える 1

0

GPS 座標を相対的な方位 (および距離) に変換するという難しい作業は既に完了しているようです。

360° 画像の中心が北から 130° を指し (コンパスの周りを時計回りであると仮定)、カメラの位置とホットスポットからの方位が北から 170° の場合、ホットスポットは北から 40° にあるように見えます。画像の中心を基準にします。また、画像には水平方向に 360° と 1024px が含まれているため、ホットスポットは画像の中心から 1024px / 360° * 40° = 114 px にあるように見えます。

カメラとホットスポットは両方とも同じ高度にあるため、相対ピッチはゼロです。

これをまとめると、座標が得られます: 512 + 114, 256 + 0 = 座標: 626, 256.

ホットスポットの高度がカメラと同じでない場合は、単純な三角関数を使用してピッチを計算する必要があります。

ground distanceまず、カメラの位置とホットスポットの位置の間の地上での距離 =と仮定しましょう。これは、それぞれの高度に関係なく同じです。

したがって、ピッチは atan [ (ホットスポットの高度 - カメラの高度) / 地上距離 ] になります。

たとえば、地上距離が 100m で、ホットスポットが 10.75m で、カメラがまだ高度 2m の場合、ピッチは次のように計算されます。

ピッチ = atan [ (10.75m - 2m) / 100m ] = atan (8.75m / 100m) = atan (0.0875) = 5°

これをパノラマにプロットするには: 512px / 180° * 5° = 中央より 14px 高くなります。中央が 256px で画像の左上が 0,0 であるため、256 から 14px を引くと 242px になります。

あなたが要求したように、これをすべて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);

これが役立つことを願っています!

于 2010-09-10T08:42:33.200 に答える