2011-12-14 8 views
17

Pracuję nad "kompasem" dla urządzenia mobilnego. Mam następujące punkty:Uzyskaj kierunek (kompas) z dwoma punktami długości/szerokości geograficznej

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

Mam także następujące informacje (z mojego Android telefon):

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

Jak mogę stworzyć „kompasu-like” strzałka Wich pokazuje mi kierunek do momentu?

Czy istnieje problem matematyczny?

dziękuję!

EDIT: Dobra znalazłem rozwiązanie, wygląda to tak:

/** 
* 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; 
} 

Działa to dla mnie super!

+1

Nie publikuj rozwiązania, o którym nawet nie wiesz. – Sameer

+0

@ Sameer jaki jest twój problem z rozwiązaniem? Jeśli nobodoy inny umieści jeden, mogę być tym jedynym. To tylko w celach informacyjnych, jeśli ktoś inny tego potrzebuje. Uzyskanie głosowania oddającego na to "powód". Nie mogę zrozumieć. – eav

+0

@eav Jak wygląda twoja funkcja toRad? – gohnjanotis

Odpowiedz

-1

Musisz obliczyć wektor euklidesowy między punktem początkowym a punktem końcowym, a następnie obliczyć jego kąt (powiedzmy względny względem dodatniego X), który byłby kątem, o który chcesz obrócić strzałkę.

+1

lub możesz pójść na całość i opisać krzywiznę Ziemi – StaWho

+3

To świetny opis odpowiedzi, spróbuj podać prawdziwy przykład. – efwjames

+0

@liquified - jeśli spojrzysz na post, nawet przed edycją, nie jest on oznaczony żadnym językiem, a pytanie brzmi: "Czy istnieje jakiś problem matematyczny?". Nie ma również podanego kodu i oprócz tagu 'matematycznego 'nie ma też innego wskazania, czy OP chciałby go rozwiązać (pośród wielu) za pomocą, powiedzmy, trygonometrii liczb rzeczywistych lub liczb zespolonych trygonometrii. Biorąc pod uwagę niejednoznaczne parametry pytania, uważam, że odpowiedź jest wystarczająca. – StaWho

14

Nie zapomniałem powiedzieć, że znalazłem odpowiedź w końcu. Wniosek ma na celu określenie kierunku kompasu pojazdu tranzytowego i jego miejsca przeznaczenia. Zasadniczo, fantazyjna matematyka do zdobywania krzywizny Ziemi, znajdowanie odczytu kąta/kompasu, a następnie dopasowanie tego kąta do ogólnej wartości kompasu. Oczywiście można po prostu zachować kompas i zastosować to jako obrót dla obrazu. Należy pamiętać, że jest to uśrednione określenie kierunku pojazdu do punktu końcowego (przystanek autobusowy), co oznacza, że ​​nie wie, co robi droga (więc to prawdopodobnie najlepiej odnosi się do samolotów lub derby).

//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 
} 

tj vehicleBearing (mybus, busstation) może zwracać "NW" oznacza jego rozjazd północno-zachodnim

+1

proste i działa. dzięki! – quape

+0

@liquified, przepraszam nie jestem w stanie zrozumieć, dlaczego jest wykonywany (compassReading/45). Czy mógłbyś proszę dać mi znać. Dzięki. – user2071152

+0

45 to przedziały 45-stopniowe kompasu, skorelowane z 9 współrzędnymi nazw (nazwami ludzkimi) z tablicy kompasu (NSEW itp.). Dzielenie kompasuCena przez 45 daje, w zakresie 360 ​​stopni, jak blisko jest twój odczyt do jednego z tych przedziałów (Math.round). 360/45 na przykład daje 8, który jest ósmym indeksem w tablicy lub "N". Możesz zmodyfikować to, jeśli chcesz tylko NSEW dzieląc przez 90 zamiast tego – efwjames

1

że stwierdzono pewne przydatne GPS współrzędne wzoru w matematyce here. W tym przypadku, tutaj moje rozwiązanie

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

nie mogłem zrozumieć swoje rozwiązanie dobrze, obliczając nachylenie pracował dla mnie. Aby zmodyfikować na efwjames i odpowiedzi. To powinno zrobić -

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 
Powiązane problemy