2013-03-26 50 views
0

我在谷歌地圖(v3)標記中顯示拍攝照片的位置和拍攝對象的位置,並追蹤顯示照片拍攝方向的線條。我也計算了相機位置的距離和角度。谷歌地圖v3 - 繪製多邊形以顯示拍照角度

我現在正在嘗試的是用相機打開一個三角形來展示視角,讓我們說出朝向主體30度。在我看來,這是一個三年級的數學,但25年後無法弄清楚,我知道如何繪製多邊形/三角形,但不知道如何在兩個方向上計算主體距離約30度的點,當然,介意方位角。

幾乎沒有...

使用的公式紅色如下回答創建一個函數(找到我需要轉換:LAT1,lon1和軸承爲弧度數學之前
我每次打電話這個功能時間標記的變化來計算再次POS1和POS2三角形的,改變路徑重新繪製。

事情現在是三角形顯示出來,但面臨着所有類型的方向,但在合適的值。

現在的問題是:

谷歌返回負向西方和負向東(-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

的公式得到從起始位置地球的一個端點的緯度和經度(LAT 2,lon2)(弧度)(LAT1,lon1)(也以弧度表示),範圍(d),半徑(R)和軸承(方位角)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度三角形的例子)和一個完全取決於你想要三角形的區域的範圍。

+0

謝謝紅,它的工作原理。我花了一段時間才意識到座標lat1,lon1應該在之前轉換爲弧度,結果顯然是弧度,並且必須轉換爲十進制。然而我錯過了公式中沒有看到的範圍(r)的東西(如果真的可以給出點2和3的長度以達到主題範圍,那麼老實說並不是真正的想法),現在我正在使用d * 1.5使三角形顯示超出主題點。 – user2033838 2013-03-27 10:41:55

+0

哎呀,忘了指定弧度。也搞砸了我的符號。我已經修復它。公式中的範圍是d,而不是r。如果您試圖將三角形從當前可見的地圖的邊緣移開,則必須查看當前地圖的位置和大小才能計算出它,並且在極點附近或放大時進行大量檢查出。 – RedPeasant 2013-03-27 17:39:43

+0

沒問題紅色,這是一個大推動。很高興知道(r)不是這樣的事情。我編輯了我的問題,以瞭解爲什麼三角形顯示方向相反或錯誤,最終以某種方式糾正了它,因爲我使用的是Google地圖提供的標題,當從Camera到Object的方向爲-180/180時,所以我將其轉換爲它的弧度,然後必須提供-75/+ 75度而不是-15/+ 15的方位,以使得triagle顯示在正確的方向上(我想我應該先做一些事情,例如減去將標題轉換爲360度角或所以,這是正確的嗎?) – user2033838 2013-03-27 18:28:53

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]; 
    }