142 votes

Calcul de la nouvelle longitude et latitude à partir de l'ancienne + n mètres

Je veux créer 2 nouvelles longitudes et 2 nouvelles latitudes basées sur une coordonnée et une distance en mètres, je veux créer une belle boîte de délimitation autour d'un certain point. Il s'agit d'une partie d'une ville et d'une distance maximale de ±1500 mètres. Je ne pense donc pas que la courbure de la terre doive être prise en compte.

J'ai donc 50.0452345 (x) et 4.3242234 (y) et je veux connaître x + 500 mètres, x - 500 mètres, y - 500 mètres, y + 500 mètres

J'ai trouvé de nombreux algorithmes, mais presque tous semblent traiter de la distance entre les points.

172voto

nibot Points 5057

Le nombre de kilomètres par degré de longitude est approximativement de

(pi/180) * r_earth * cos(theta*pi/180)

donde theta est la latitude en degrés et r_earth est d'environ 6378 km.

Le nombre de kilomètres par degré de latitude est à peu près le même à tous les endroits, soit environ 1,5 million d'euros.

(pi/180) * r_earth = 111 km / degree 

Vous pouvez donc le faire :

new_latitude  = latitude  + (dy / r_earth) * (180 / pi);
new_longitude = longitude + (dx / r_earth) * (180 / pi) / cos(latitude * pi/180);

Tant que dx y dy sont faibles par rapport au rayon de la terre et on ne s'approche pas trop des pôles.

42voto

Numan Karaaslan Points 244

La réponse acceptée est parfaitement correcte et fonctionne. J'ai apporté quelques modifications et j'ai obtenu ceci :

double meters = 50;

// number of km per degree = ~111km (111.32 in google maps, but range varies
// between 110.567km at the equator and 111.699km at the poles)
//
// 111.32km = 111320.0m (".0" is used to make sure the result of division is
// double even if the "meters" variable can't be explicitly declared as double)
double coef = meters / 111320.0;

double new_lat = my_lat + coef;

// pi / 180 ~= 0.01745
double new_long = my_long + coef / Math.cos(my_lat * 0.01745);

J'espère que cela vous aidera aussi.

40voto

ssten Points 851

Pour la latitude, faire :

var earth = 6378.137,  //radius of the earth in kilometer
    pi = Math.PI,
    m = (1 / ((2 * pi / 360) * earth)) / 1000;  //1 meter in degree

var new_latitude = latitude + (your_meters * m);

Pour la longitude, faire :

var earth = 6378.137,  //radius of the earth in kilometer
    pi = Math.PI,
    cos = Math.cos,
    m = (1 / ((2 * pi / 360) * earth)) / 1000;  //1 meter in degree

var new_longitude = longitude + (your_meters * m) / cos(latitude * (pi / 180));

La variable your_meters peut contenir une valeur positive ou négative.

14voto

mshwf Points 1911

J'ai dû passer environ deux heures pour trouver la solution de @nibot, j'avais simplement besoin d'une méthode pour créer une boîte de délimitation à partir de son point central et de sa largeur/hauteur (ou rayon) en kilomètres :

Je ne comprends pas bien la solution d'un point de vue mathématique/géographique. J'ai modifié la solution (par essais et erreurs) pour obtenir les quatre coordonnées. Distances en km, étant donné la position actuelle et la distance à laquelle nous nous déplaçons vers la nouvelle position dans les quatre coordonnées :

Nord :

private static Position ToNorthPosition(Position center, double northDistance)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_latitude = center.Lat + (northDistance / r_earth) * (180 / pi);
    return new Position(new_latitude, center.Long);
}

Est :

private static Position ToEastPosition(Position center, double eastDistance)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_longitude = center.Long + (eastDistance / r_earth) * (180 / pi) / Math.Cos(center.Lat * pi / 180);
    return new Position(center.Lat, new_longitude);
}

Sud :

private static Position ToSouthPosition(Position center, double southDistance)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_latitude = center.Lat - (southDistance / r_earth) * (180 / pi);
    return new Position(new_latitude, center.Long);
}

Ouest :

private static Position ToWestPosition(Position center, double westDistance)
{
    double r_earth = 6378;
    var pi = Math.PI;
    var new_longitude = center.Long - (westDistance / r_earth) * (180 / pi) / Math.Cos(center.Lat * pi / 180);
    return new Position(center.Lat, new_longitude);
}

10voto

Ryan Ternier Points 3371

Avez-vous vérifié : Comment trouver la latitude/longitude qui est à x km au nord d'une latitude/longitude donnée ? ?

Ces calculs sont au mieux ennuyeux, j'en ai fait beaucoup. La formule de haversine sera votre amie.

Quelques références : http://www.movable-type.co.uk/scripts/latlong.html

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X