这是一个Google Earth API问题,但任何可以适应它的一般地理解决方案也都可以。
我正在使用Google Earth API在地球上的某个地方动态放置地标。像所有地标一样,它具有固定的纬度和经度。在这种情况下,海拔高度基本上始终为0.放置地标后,用户可以将相机放在其他地方,并且地标可能不可见。
我希望能够做的是有一个按钮,可让您自动查看原始地标的方向,而无需更改相机的位置。
在Google地球API中,用户的视口由一个Camera对象表示,该对象具有纬度和经度以及标题(从左到右的轴)和倾斜< / em>(上下轴)。
所以问题可以简化为:如果地球上有一个固定点(lat1,lng1,alt1),你如何计算(lat1,lng2,alt2)相机的航向和倾斜度,以便它正面临那个位置?
答案 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);