2011-12-14 16 views
17

Sto lavorando su una "bussola" per un dispositivo mobile. Ho i seguenti punti:Ottieni direzione (bussola) con due punti di latitudine/longitudine

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

anche io ho le seguenti informazioni (dal mio Android-phone): mi

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

Come posso creare una freccia wich "compasso" mostra la direzione al punto?

C'è un problema matematico per questo?

grazie!

EDIT: Ok ho trovato una soluzione, sembra che questo:

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

questo funziona per me grande!

+1

Non pubblicare la soluzione su cui anche tu non sei chiaro. – Sameer

+0

@Sameer qual è il tuo problema con la soluzione? Se nobodoy ne pubblica uno, posso essere io. È solo per riferimento, se qualcun altro ha bisogno. Ottenere un down-vote per quella "ragione". Non capisco – eav

+0

@eav Che aspetto ha la funzione toRad creata? – gohnjanotis

risposta

-1

Dovresti calcolare un vettore euclideo tra il punto iniziale e il punto finale, quindi calcolare il suo angolo (diciamo relativo rispetto a X positivo) che sarebbe l'angolo con cui vuoi ruotare la freccia.

+1

oppure puoi andare alla moda e considerare la curvatura della Terra – StaWho

+3

Questa è un'ottima descrizione di una risposta, prova forse a fornire un esempio reale. – efwjames

+0

@liquified: se si guarda il post, anche prima della modifica, non viene contrassegnato con alcuna lingua e la domanda è: "C'è un problema matematico per questo?". Non c'è nemmeno il codice fornito e, a parte il tag 'math', non ci sono altre indicazioni se OP vorrebbe risolverlo (tra molti) tramite, diciamo la trigonometria dei numeri reali o la trigonometria dei numeri complessi. Dati gli ambigui parametri della domanda, penso che la risposta sia sufficiente. – StaWho

14

O dimenticavo di aver trovato la risposta alla fine. L'applicazione è per determinare la direzione della bussola di un veicolo di transito e la sua destinazione. In sostanza, è una matematica elaborata per acquisire la curvatura della Terra, trovare una lettura angolo/bussola e poi abbinare quell'angolo con un valore generico di bussola. Ovviamente potresti semplicemente mantenere il compassoReading e applicarlo come una quantità di rotazione per la tua immagine. Si prega di notare che si tratta di una determinazione media della direzione del veicolo fino al punto finale (stazione degli autobus), il che significa che non può sapere cosa sta facendo la strada (quindi questo probabilmente si applica meglio agli aeroplani o al derby dei rulli).

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

cioè: vehicleBearing (MyBus, busstation) potrebbe restituire "NO" indica la sua traveling northwesterly

+1

semplice e funziona. grazie! – quape

+0

@liquified, mi dispiace non riesco a capire perché (bussolaReading/45) è stato fatto. Per favore, fammi sapere. Grazie. – user2071152

+0

45 è un intervallo di 45 gradi della bussola, correlato ai 9 coordNames (nomi umani) dell'array bussola (NSEW, ecc.). Dividere la bussolaLa lettura per 45 ti dà, nel raggio di 360 gradi, quanto la tua lettura è vicina a uno di quegli intervalli (Math.round). Ad esempio, 360/45 fornisce 8 che è l'ottavo indice dell'array o "N". È possibile modificare questo se si voleva solo NSEW dividendo per 90 invece – efwjames

1

ho trovato alcuni GPS utile coordinate formula matematica here. Per questo caso, ecco la mia soluzione

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

non riuscivo a capire la soluzione bene, calcolando la pendenza ha lavorato per me. Per modificare su efwjames e la tua risposta. Questo dovrebbe fare -

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 
Problemi correlati