javascript:lat/lon,lat1/lon1,方位,到x,y屏幕坐标的距离?

javascript:lat/lon,lat1/lon1,方位,到x,y屏幕坐标的距离?,javascript,screen,latitude-longitude,panoramas,cartesian,Javascript,Screen,Latitude Longitude,Panoramas,Cartesian,如何将lat/lon热点投影到360x180度全景图像上? 使用javascript 真实数据: 纬度/经度(十进制度数)和高度(米): 摄像机坐标:49.994249,8.66539,2 热点坐标:49.994163,8.665388,2 摄像机到热点的距离(米):9.55 罗盘方位相机到热点的角度(0-360):170 图像方向:130度(图像的x中间)是否需要此角度? 地平线是图像的y形中间 图像大小宽度:1024,高度:512像素 我需要的是javascript代码来确定热点的x,y像素

如何将lat/lon热点投影到360x180度全景图像上?
使用javascript

真实数据:
纬度/经度(十进制度数)和高度(米):
摄像机坐标:49.994249,8.66539,2
热点坐标:49.994163,8.665388,2

摄像机到热点的距离(米):9.55
罗盘方位相机到热点的角度(0-360):170
图像方向:130度(图像的x中间)是否需要此角度?
地平线是图像的y形中间

图像大小宽度:1024,高度:512像素

我需要的是javascript代码来确定热点的x,y像素图像坐标。
0是左上角

准确性并不重要。距离将始终小于100米

谢谢,
一月

diy streetview.org的janmartin看起来你已经完成了最困难的部分:将GPS坐标转换成相对方位(和距离)

如果360°图像的中心指向北面130°(假设围绕指南针顺时针旋转),且方位与相机位置成反差,且热点与北面成170°,则热点似乎位于图像上相对于图像中心的40°。并且,由于图像在水平方向上包含360°和1024px,因此热点似乎位于距离图像中心1024px/360°*40°=114 px的位置

由于相机和聚光区都在同一高度,相对螺距为零

把这些放在一起,就得到了坐标:512+114256+0=坐标:6262256

如果热点的高度与相机的高度不同,那么您必须使用一些简单的触发器来计算俯仰:

首先让我们假设
地面距离
=摄像机位置和热点位置之间的地面距离。这将是相同的,无论每个高度

所以,你的音高应该是:atan[(热点高度-摄像机高度)/地面距离]

例如,如果您的地面距离为100米,而热点位于10.75米,而相机仍处于2米的高度,则您可以将俯仰计算为:

螺距=阿坦[(10.75米-2米)/100米]=阿坦(8.75米/100米)=阿坦(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);
//我们将使用度,但如果
//从那以后,一切都是用弧度计算的
//这就是数学方法的工作原理。
函数GetRelativeTech(cameraAlt、hsAlt、接地距离)
{
var degperad=180/Math.PI;
如果(接地距离==0){返回0.0;}//边缘情况
var rad=数学atan((hsAlt-cameraAlt)/接地距离);
//换算成度
返回rad*degPerRad;
}
//这件很简单。
函数getRelativeHeading(cameraHeading,hsHeading)
{
返回hs标题-摄影机标题;
}
变量cameraHeading=130;//度
var热点标题=170;//度
var cameraAltitude=2;//米
var热峰度=10.75;//米
var接地距离=100;//米
var PANOWITH=1024;//像素
var PANOHEIGH=512;//像素
var panoRangeX=360;//度
变量panoRangeY=180;//度
var relativeHeading=getRelativeHeading(cameraHeading、hotspotHeading);
var RelativeItch=GetRelativeItch(摄像机高度、热点高度、地面距离);
//现在转换为像素
var hotspotX=数学圆整(全景宽度/2+全景宽度/panoRangeX*相对标题);
var hotspotY=数学圆(全景高度/2-全景高度/panoRangeY*相对高度);
//以防万一我们最终超出范围
而(hostpotx<0){hostpotx+=panoWidth;}
而(热点>全景宽度){hostpotx-=全景宽度;}
而(hostpoty<0){hostpoty+=panoHeight;}
while(热点>全景高度){hostpoty-=全景高度;}
警报(“热点位于:“+热点X+”,“+热点Y”);
我希望这有帮助