web-dev-qa-db-fra.com

Obtenir la direction (boussole) avec deux points de longitude/latitude

Je travaille sur une "boussole" pour un appareil mobile. J'ai les points suivants:

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

J'ai aussi les informations suivantes (de mon téléphone Android):

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

Comment créer une flèche ressemblant à une boussole qui me montre la direction à suivre?

Y a-t-il un problème mathématique pour cela?

merci!

EDIT: Ok j'ai trouvé une solution, ça ressemble à ça:

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

Cela fonctionne très bien pour moi!

19
eav

O oublié de dire que j'ai finalement trouvé la réponse. L'application sert à déterminer la direction du compas d'un véhicule de transport en commun et sa destination. Essentiellement, des calculs mathématiques sophistiqués permettent d’acquérir la courbure de la Terre, de rechercher un angle/une lecture de boussole, puis de faire correspondre cet angle à une valeur de boussole générique. Vous pouvez bien sûr simplement garder la lecture à la boussole et l'appliquer comme une quantité de rotation pour votre image. Veuillez noter qu’il s’agit d’une détermination moyenne de la direction du véhicule jusqu’au point final (gare routière), ce qui signifie qu’elle ne peut pas savoir ce que fait la route (elle est donc probablement mieux adaptée aux avions ou au roller 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
}

c'est-à-dire: vehicleBearing (mybus, station de bus) pourrait retourner "NW" signifie son déplacement vers le nord-ouest

16
efwjames

J'ai trouvé des formules de coordonnées GPS utiles en maths ici . Pour ce cas, voici ma solution

 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

}
1
deya tri

Je ne comprenais pas bien votre solution, calculer la pente fonctionnait pour moi. Modifier sur efwjames 's et votre réponse. Cela devrait faire - 

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
0
Vivek