2013-03-26 2 views
0

Я показываю в маркерах google maps (v3) с положением, в котором была сделана фотография, и положением объекта и отслеживанием строки, чтобы показать направление, в котором была сделана фотография , Я также вычислил расстояние и угол от положения камеры.Google maps v3 - Нарисуйте многоугольник, чтобы показать снимок фотографии.

Теперь я пытаюсь показать вид с камеры с открывающимся треугольником, скажем, 30 градусов к объекту. Кажется, это математика третьего класса, но я не могу понять через 25 лет, я знаю, как рисовать многоугольник/треугольник, но на самом деле не так, как рассчитать точки на расстоянии предмета около 30 градусов в обоих направлениях, конечно, принимая обратите внимание на угол заголовка.

Почти там ...

Используется формула Red ответил ниже, чтобы создать функцию (нашел мне нужно преобразовать:. LAT1, lon1 азимут и радианы перед математикой
Я называю эту функцию каждый раз, когда изменения маркеров для расчета снова Pos1 и pos2 треугольника и изменить пути к перерисовке.

Thing теперь, что треугольник показывает вверх, но перед всеми видами направлений, но правильные один.

Вопрос сейчас:

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

Формула, чтобы получить конечную точку широты и долготы (LAT 2, lon2) (в радианах) от исходного местоположения (LAT1, lon1) (также в радианах), диапазон (д), радиус Земли (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

Спасибо Red, это работает. Мне потребовалось некоторое время, чтобы понять, что координаты lat1, lon1 должны быть преобразованы в радианы раньше, и результаты, очевидно, являются радианами и должны быть преобразованы в десятичные. Однако мне не хватает вещи с диапазоном (r), который я не вижу в формуле (и, честно говоря, не имею реальной идеи, может ли это дать длину для точек 2 и 3, чтобы достичь предметного горизонта), сейчас я использую d * 1,5, чтобы треугольник показывался за пределами объекта. – user2033838

+0

Упс, забыли указать радианы. Также прищурилась моя нотация. Я исправил его выше. Диапазон равен d в формулах, а не r. Если вы пытаетесь получить треугольник с края видимой на данный момент карты, вам нужно будет посмотреть текущую позицию и размер карты, чтобы вычислить ее, и делать много проверок, когда рядом с полюсами или когда масштабируется вне. – RedPeasant

+0

Без проблем Красный, это был большой толчок. Приятно знать, что (r) это не так.Я отредактировал свой вопрос, чтобы узнать, почему треугольник показывался в противоположном направлении или неправильно, и, наконец, исправил его каким-то образом, так как я использую заголовок, который карты google обеспечивают при направлении трассировки от Camera to Object до -180/180, поэтому я конвертирую в он радианы, но затем должен обеспечить подшипник как -75/+ 75 градусов вместо -15/+ 15, чтобы показать триагле в правильном направлении (думаю, я должен что-то сделать до того, как вычесть, чтобы преобразовать заголовок в угол 360 или так, это правильно?) – user2033838

0

Более простой способ: использовать Google библиотека карты геометрии

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]; 
    } 
Смежные вопросы