将摄像头转换为特定的经度/纬度(Google Earth API)

问题描述:

这实际上是一个Google Earth API问题,但任何可以适应的地理解决方案都可以。将摄像头转换为特定的经度/纬度(Google Earth API)

我正在使用Google Earth API在地球上的某处动态放置地标。像所有地标一样,它具有固定的经度和纬度。在这种情况下,高度基本上始终为0.在放置地标后,用户可以将相机绕过其他地方并且地标可能不可见。

我希望能够做的是有一个按钮,可以让您自动查看原始地标的方向,而无需更改相机的位置

在谷歌地球API,用户的视口是由一个摄像机对象,其具有纬度和经度,以及一个标题(左到右轴)和倾斜(向上和向下的表示轴)。 (lat1,lng1,alt2)如何在地球上有一个固定点(lat1,lng1,alt1),那么如何计算(lat1,lng2,alt2)的相机的航向和倾斜如此它正面临着这个位置?

退房在这个环节http://www.movable-type.co.uk/scripts/latlong.html

这里的“轴承”部分是他提出了计算轴承(或标题)的JavaScript。

var y = Math.sin(lng1-lng2) * Math.cos(lat2); 
var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(lng1-lng2); 
var brng = Math.atan2(y, x).toDeg(); 
+0

谢谢!这很有帮助,但由于某些原因,它仍然不起作用。 (上面有一个错字 - 它应该是lng2-lng1,在两个地方都应该是lng1-lng2)。我无法弄清楚错误是在我的代码中,还是在我的方法中,或者是与Google Earth有关的东西。我得到的结果不会导致根本没有正确排列的标题。奇怪的是,将相同的值粘贴到他的界面上给我的值不同于他的Javascript代码。令人沮丧! – nucleon 2013-03-01 20:34:32

+0

这是我目前使用的: var dLon = lng2-lng1; var y = Math.sin(dLon)* Math.cos(lat2); (lat1)* Math.sin(lat2)-Math.sin(lat1)* Math.cos(lat2)* Math.cos(dLon); var brng = Math.atan2(y,x).toDeg(); ...应该工作。但是使用所有十进制度每次都会让我的结果稍微有点错误。嗯... – nucleon 2013-03-01 20:35:07

+0

@nucleon - 你必须将十进制度转化为弧度来做计算。即'lat2-lat1 * Math.PI/180' – Fraser 2013-03-02 05:30:58

下面是将任意高度的当前摄像机转向另一个任意高度的纬度/经度点的完整最终实现。它不是非常漂亮(两次获得lats和lng,因为在我使用弧度而另一个我不是),但它可以工作,并使Google Earth相机面对任何你想要面对的东西:

//calculate heading/bearing 
var lat1 = parseFloat(camera.getLatitude())* Math.PI/180; 
var lng1 = parseFloat(camera.getLongitude())* Math.PI/180; 
var lat2 = parseFloat(target_lat)* Math.PI/180; 
var lng2 = parseFloat(target_lng)* Math.PI/180; 

var dLon = lng2-lng1; 
var y = Math.sin(dLon) * Math.cos(lat2); 
var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon); 
var brng = Math.atan2(y, x).toDeg(); 

//calculate tilt 
lat1 = parseFloat(camera.getLatitude()); 
lng1 = parseFloat(camera.getLongitude()); 
lat2 = parseFloat(target_lat); 
lng2 = parseFloat(target_lng); 
var camera_alt = camera.getAltitude(); 
var target_alt = your_target_altitude; //meters! 

//this uses the distVincenty function and geo.js library here: http://www.movable-type.co.uk/scripts/latlong.html 
var distance = parseFloat(distVincenty(Geo.parseDMS(lat1),Geo.parseDMS(lng1),Geo.parseDMS(lat2),Geo.parseDMS(lng2))); 
var height_diff = (camera_alt-target_alt); 

if(height_diff<0) { //target is above camera, invert equation 
    height_diff = (target_alt-camera_alt); 
    var tilt = Math.atan(height_diff/distance).toDeg()+90; //the +90 is because of the way Google Earth calculates tilt in such circumstances 
} else { 
    var tilt = Math.atan(distance/height_diff).toDeg(); 
} 

camera.setTilt(tilt); 
camera.setHeading(brng);