将相机转换为特定的纬度/经度(Google Earth API)

时间:2013-02-27 19:53:45

标签: maps google-earth google-earth-plugin cartography

这是一个Google Earth API问题,但任何可以适应它的一般地理解决方案也都可以。

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

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

在Google地球API中,用户的视口由一个Camera对象表示,该对象具有纬度和经度以及标题(从左到右的轴)和倾斜< / em>(上下轴)。

所以问题可以简化为:如果地球上有一个固定点(lat1,lng1,alt1),你如何计算(lat1,lng2,alt2)相机的航向和倾斜度,以便它正面临那个位置?

2 个答案:

答案 0 :(得分:1)

查看此链接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();

答案 1 :(得分:1)

这是将任意高度的当前相机转向另一个任意高度的纬度/经度点的完整最终实现。它并不是非常漂亮(因为其中一个我使用的是弧度而另一个我不是),但它确实有效,并使Google地球相机面对你想要它面对的任何东西:< / p>

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