Google maps v3 - 绘制多边形以显示照片拍摄角度

时间:2013-03-26 19:13:33

标签: google-maps convex-polygon

我在谷歌地图(v3)标记中显示拍摄照片的位置和拍摄对象的位置,并描绘一条线以显示拍摄照片的方向。我还计算了相机位置的距离和角度。

我现在正在尝试的是显示相机的视图,其中三角形打开,让我们说30度朝向主体。对我来说似乎是一个三年级的数学,但25年后无法弄清楚,我知道如何绘制多边形/三角形,但不知道如何计算两个方向上主体距离约30度的点,当然接受注意标题角度。

差不多......

使用下面回答的公式Red来创建一个函数(发现我需要转换:lat1,lon1和轴承到数学前的弧度。
每次标记更改时,我都会调用此函数再次计算三角形的pos1和pos2,并更改路径以重绘它。

现在的情况是,三角形出现但面对各种方向,但正确的方向。

现在的问题是:

Google将标题返回到负数为西方,向东方向返回正数(-180/180),似乎该公式需要360度的方位(标题)?现在功能CameraView(75)正确显示,但我将角度传递为75度而不是15度(左侧为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); }

2 个答案:

答案 0 :(得分:0)

从起始位置(lat1,lon1)(也以弧度表示)获得终点纬度和经度(纬度2,lon2)(以弧度表示)的公式,范围(d),地球半径(R)和轴承(brng)is

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

您的起点将是三角形多边形的一个点。另外两个可以使用此代码片段找到,将轴承放入+/- 15度(对于30度三角形示例)和一个完全取决于您想要三角形大小的范围。

答案 1 :(得分: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];
  }