2011-12-14 5 views
17

Я работаю над «компасом» для мобильного устройства. У меня есть следующие пункты:Получить направление (компас) с двумя точками долготы/широты

point 1 (current location): Latitude = 47.2246, Longitude = 8.8257 
point 2 (target location): Latitude = 50.9246, Longitude = 10.2257 

Также у меня есть следующая информация (из моего андроида телефона):

The compass-direction in degree, wich bears to the north. 
For example, when I direct my phone to north, I get 0° 

Как я могу создать «компас типа» стрелка Wich показывает мне направление к точке?

Есть ли математическая проблема для этого?

спасибо!

EDIT: Хорошо, я нашел решение, это выглядит следующим образом:

/** 
* Params: lat1, long1 => Latitude and Longitude of current point 
*   lat2, long2 => Latitude and Longitude of target point 
*   
*   headX  => x-Value of built-in phone-compass 
* 
* Returns the degree of a direction from current point to target point 
* 
*/ 
function getDegrees(lat1, long1, lat2, long2, headX) { 

    var dLat = toRad(lat2-lat1); 
    var dLon = toRad(lon2-lon1); 

    lat1 = toRad(lat1); 
    lat2 = toRad(lat2); 

    var y = Math.sin(dLon) * Math.cos(lat2); 
    var x = Math.cos(lat1)*Math.sin(lat2) - 
      Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon); 
    var brng = toDeg(Math.atan2(y, x)); 

    // fix negative degrees 
    if(brng<0) { 
     brng=360-Math.abs(brng); 
    } 

    return brng - headX; 
} 

Это работает для меня большой!

+1

Не публикуйте решение, о котором даже вы не поняли. – Sameer

+0

@Sameer, в чем проблема с решением? Если бы кто-нибудь еще один, я могу быть единственным. Это только для справки, если кому-то это нужно. Получение голосования по этой «причине». Не могу понять. – eav

+0

@eav Как выглядит функция toRad, созданная вами? – gohnjanotis

ответ

-1

Вам нужно будет вычислить вектор евклидова между начальной точкой и конечной точкой, а затем вычислить его угол (скажем, относительно положительного X), который будет углом, по которому вы хотите повернуть свою стрелку.

+1

или вы можете исходить из фантазии и учитывать кривизну Земли. – StaWho

+3

Это отличное описание ответа, попробуйте, может быть, дать реальный пример. – efwjames

+0

@liquified - если вы смотрите сообщение, даже перед редактированием, он не помечен каким-либо языком, и заданный вопрос: «Есть ли математическая проблема для этого?». Также нет кода, и кроме тега 'math' нет другого указания, если OP захочет разрешить его (среди многих) через, скажем, тригонометрию реальных чисел или тригонометрию сложных чисел. Учитывая неоднозначные параметры вопроса, я думаю, что ответа достаточно. – StaWho

14

О забыл сказать, что я нашел ответ в конце концов. Приложение должно определить направление компаса транзитного транспортного средства и его пункта назначения. По существу, фантастическая математика для получения кривизны Земли, нахождения угла/компаса, а затем сопоставление этого угла с общим значением компаса. Конечно, вы можете просто сохранить compassReading и применить это как количество вращения для вашего изображения. Обратите внимание, что это усредненное определение направления движения к конечной точке (автобусная станция), означающее, что он не может знать, что делает дорога (так что это, вероятно, лучше всего относится к самолетам или роллер-дерби).

//example obj data containing lat and lng points 
//stop location - the radii end point 
endpoint.lat = 44.9631; 
endpoint.lng = -93.2492; 

//bus location from the southeast - the circle center 
startpoint.lat = 44.95517; 
startpoint.lng = -93.2427; 

function vehicleBearing(endpoint, startpoint) { 
    endpoint.lat = x1; 
    endpoint.lng = y1; 
    startpoint.lat = x2; 
    startpoint.lng = y2; 

    var radians = getAtan2((y1 - y2), (x1 - x2)); 

    function getAtan2(y, x) { 
     return Math.atan2(y, x); 
    }; 

    var compassReading = radians * (180/Math.PI); 

    var coordNames = ["N", "NE", "E", "SE", "S", "SW", "W", "NW", "N"]; 
    var coordIndex = Math.round(compassReading/45); 
    if (coordIndex < 0) { 
     coordIndex = coordIndex + 8 
    }; 

    return coordNames[coordIndex]; // returns the coordinate value 
} 

т.е. vehicleBearing (MyBus, автобусная остановка) может вернуться "NW" означает его путешествие в северо-западное направление

+1

простой и работает. спасибо! – quape

+0

@ liquified, извините, не могу понять, почему (compassReading/45) делается. Не могли бы вы дать мне знать. Благодарю. – user2071152

+0

45 - 45-градусные интервалы компаса, соответствующие 9 именам кодов (человеческим именам) массива компаса (NSEW и т. Д.). Разделение вашего компасаРазрешение на 45 дает вам в диапазоне 360 градусов, как близко ваше чтение к одному из этих интервалов (Math.round). 360/45, например, дает вам 8, который является 8-м индексом в массиве или «N». Вы можете изменить это, если хотите только NSEW, разделив на 90 вместо – efwjames

1

Я нашел некоторые полезные GPS координаты формулы в математике here. Для этого случая, здесь мое решение

private double getDirection(double lat1, double lng1, double lat2, double lng2) { 

    double PI = Math.PI; 
    double dTeta = Math.log(Math.tan((lat2/2)+(PI/4))/Math.tan((lat1/2)+(PI/4))); 
    double dLon = Math.abs(lng1-lng2); 
    double teta = Math.atan2(dLon,dTeta); 
    double direction = Math.round(Math.toDegrees(teta)); 
    return direction; //direction in degree 

} 
0

Я не мог понять ваше решение хорошо, вычисляя наклон работал для меня. Изменить на efwjames и ваш ответ. Это должно быть сделано -

import math 
def getDegrees(lat1, lon1, lat2, lon2,head): 
    dLat = math.radians(lat2-lat1) 
    dLon = math.radians(lon2-lon1) 
    bearing = math.degrees(math.atan2(dLon, dLat)) 
    return head-bearing 

 Смежные вопросы

  • Нет связанных вопросов^_^