0

写真が撮られた位置と被写体の位置をグーグルマップ(v3)マーカーで表示し、写真が撮られた方向を示すために線をトレースしています。カメラ位置からの距離と角度も計算しました。

私が今試しているのは、被写体に向かって30度とすると、三角形が開いた状態でカメラからのビューを表示することです。私には3年生の数学のようですが、25年経ってもわかりません。多角形/三角形の描き方は知っていますが、被写体の両方向の距離が約30度の点を計算する方法はわかりません。もちろん取り入れています。方位角に注意してください。

もうすぐです...

以下で答えた式Redを使用して、関数を作成しました(lat1、lon1、およびベアリングを数学の前にラジアンに変換する必要がありました。
マーカーが変更されるたびにこの関数を呼び出して、三角形のpos1とpos2を再度計算し、パスを変更します再描画します。

今のところ、三角形が表示されますが、適切な方向を除いてすべての種類の方向を向いています。

今の質問は:

Googleは、方位を西に負、東に正(-180/180)で返します。数式には、360度の方位(方位)が必要なようです。現在、CameraView(75)関数は正しく表示されますが、角度を15度ではなく75度として渡します(左に15度、右に15度のビューを表示するため)。

function getVertex(brng) {

var R = 6366.707;
var d = parseFloat( getObj('GPSDestDistance').value ) * 1.5  //distance on form field

//position of Camera
var lat1 = deg2rad( markerCam.getPosition().lat() )
var lon1 = deg2rad( markerCam.getPosition().lng() )

var lat2 = Math.asin( Math.sin(lat1) * Math.cos(d/R) + Math.cos(lat1) * Math.sin(d/R) * Math.cos(brng) );
var lon2 = lon1 + Math.atan2( Math.sin(brng) * Math.sin(d/R) * Math.cos(lat1), Math.cos(d/R) - Math.sin(lat1) * Math.sin(lat2) );

lat2 = rad2deg( lat2 )
lon2 = rad2deg( lon2 )

var pos = new google.maps.LatLng(lat2, lon2)
return pos;
}
function CameraView(angle) {
var brng = deg2rad( parseFloat( getObj('GPSDestBearing').value ) );  //get heading from form
if(brng<0){
    //brng = Math.round(-brng / 360 + 180)
    }
var pos1 = markerCam.getPosition();
var pos2 = getVertex(brng - angle);
var pos3 = getVertex(brng + angle);
var paths = [ pos1, pos2, pos3 ];
poly.setPath(paths);
}

function deg2rad(x)     { return x * (Math.PI / 180); }
function rad2deg(x)     { return x * (180 / Math.PI); }
4

2 に答える 2

0

開始位置(lat1、lon1)(これもラジアン)、範囲(d)、地球半径(R)、方位(brng)から終点の緯度と経度(lat 2、lon2)(ラジアン)を取得する式)

var lat2 = Math.asin( Math.sin(lat1)*Math.cos(d/R) + Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng) );
var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2));

開始点は、三角形ポリゴンの点の1つになります。他の2つは、このコードスニペットを使用して見つけることができます。方位は+/- 15度(30度の三角形の例の場合)で、範囲は三角形の大きさに完全に依存します。

于 2013-03-26T19:40:57.413 に答える
0

より簡単な方法:グーグルマップジオメトリライブラリを使用する

  calculateAngle: function(subjectMarker, cameraMarker, angle) {
    var distance, heading, left, right;

    // Get the heading between two markers
    heading = google.maps.geometry.spherical.computeHeading(subjectMarker.getPosition(), cameraMarker.getPosition());

    // convert heading range from [-180,180] to [0,360]
    heading = ((heading - -180) * 360) / 360;

    // Get the distance between two markers
    distance = google.maps.geometry.spherical.computeDistanceBetween(cameraMarker.getPosition(), subjectMarker.getPosition());

    // Calculate angle
    left = new google.maps.geometry.spherical.computeOffset(cameraMarker.getPosition(), distance / Math.cos(Math.PI * (angle / 2) / 180), heading - (angle / 2));
    right = new google.maps.geometry.spherical.computeOffset(cameraMarker.getPosition(), distance / Math.cos(Math.PI * (angle / 2) / 180), heading + (angle / 2));

    // Return an array of `google.maps.LatLng` objects for use when drawing a polygon.
    return [cameraMarker.getPosition(), left, right];
  }
于 2015-03-19T16:56:25.877 に答える