2013-02-27 40 views
2

這實際上是一個Google Earth API問題,但任何可以適應的地理解決方案都可以。將攝像頭轉換爲特定的經度/緯度(Google Earth API)

我正在使用Google Earth API在地球上的某處動態放置地標。像所有地標一樣,它具有固定的經度和緯度。在這種情況下,高度基本上始終爲0.在放置地標後,用戶可以將相機繞過其他地方並且地標可能不可見。

我希望能夠做的是有一個按鈕,可以讓您自動查看原始地標的方向,而無需更改相機的位置

在谷歌地球API,用戶的視口是由一個攝像機對象,其具有緯度和經度,以及一個標題(左到右軸)和傾斜(向上和向下的表示軸)。 (lat1,lng1,alt2)如何在地球上有一個固定點(lat1,lng1,alt1),那麼如何計算(lat1,lng2,alt2)的相機的航向和傾斜如此它正面臨着這個位置?

回答

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(); 
+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

1

下面是將任意高度的當前攝像機轉向另一個任意高度的緯度/經度點的完整最終實現。它不是非常漂亮(兩次獲得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);