2

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

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

我想做的是有一个按钮,它可以让你在不改变相机位置的情况下自动看向原始地标的方向。

在 Google Earth API 中,用户的视口由 Camera 对象表示,该对象具有纬度和经度以及航向(从左到右轴)和倾斜(上下轴)。

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

4

2 回答 2

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();
于 2013-02-27T22:12:06.190 回答
1

这是将任意高度的当前相机转向任意高度的另一个纬度/经度点的完整的最终实现。它不是非常漂亮(获得 lats 和 lngs 两次,因为一次我使用的是弧度,另一次我没有)但它可以工作,并导致 Google 地球相机面对您希望它面对的任何东西:

//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);
于 2013-03-06T01:34:33.880 回答