我在谷歌地图(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); }
答案 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];
}