Я показываю в маркерах 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); }
Спасибо Red, это работает. Мне потребовалось некоторое время, чтобы понять, что координаты lat1, lon1 должны быть преобразованы в радианы раньше, и результаты, очевидно, являются радианами и должны быть преобразованы в десятичные. Однако мне не хватает вещи с диапазоном (r), который я не вижу в формуле (и, честно говоря, не имею реальной идеи, может ли это дать длину для точек 2 и 3, чтобы достичь предметного горизонта), сейчас я использую d * 1,5, чтобы треугольник показывался за пределами объекта. – user2033838
Упс, забыли указать радианы. Также прищурилась моя нотация. Я исправил его выше. Диапазон равен d в формулах, а не r. Если вы пытаетесь получить треугольник с края видимой на данный момент карты, вам нужно будет посмотреть текущую позицию и размер карты, чтобы вычислить ее, и делать много проверок, когда рядом с полюсами или когда масштабируется вне. – RedPeasant
Без проблем Красный, это был большой толчок. Приятно знать, что (r) это не так.Я отредактировал свой вопрос, чтобы узнать, почему треугольник показывался в противоположном направлении или неправильно, и, наконец, исправил его каким-то образом, так как я использую заголовок, который карты google обеспечивают при направлении трассировки от Camera to Object до -180/180, поэтому я конвертирую в он радианы, но затем должен обеспечить подшипник как -75/+ 75 градусов вместо -15/+ 15, чтобы показать триагле в правильном направлении (думаю, я должен что-то сделать до того, как вычесть, чтобы преобразовать заголовок в угол 360 или так, это правильно?) – user2033838