2

これは具体的には Google Earth API の質問ですが、それに適応できる一般的な地理的ソリューションでも問題ありません。

Google Earth API を使用して、地球上のどこかに目印を動的に配置しています。すべての目印と同様に、緯度と経度が固定されています。この場合、高度は基本的に常に 0 です。目印を配置した後、ユーザーがカメラを別の場所に移動すると、目印が表示されない場合があります。

私ができるようにしたいのは、カメラの位置を変更せずに元の目印の方向を自動的に見ることができるボタンがあることです。

Google Earth API では、ユーザーのビューポートはカメラ オブジェクトで表されます。このオブジェクトには、緯度と経度、方位(左から右の軸) と傾き(上下の軸) があります。

したがって、質問は次のように要約できます。地球上の固定点が (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

これは、任意の高度の現在のカメラを任意の高度の別の緯度/経度ポイントに向けるための完全で最終的な実装です。それは非常に美しいものではありません (1 つはラジアンを使用し、もう 1 つは使用していないため、緯度と経度を 2 回取得します) が、機能し、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);
于 2013-03-06T01:34:33.880 に答える