Suite

Comment calculer la distance entre une ligne et un point (en utilisant les coordonnées lat/lon)

Comment calculer la distance entre une ligne et un point (en utilisant les coordonnées lat/lon)


Dans mon application Android, je dois calculer la distance d'un point (l'emplacement de l'appareil, qui est une coordonnée lat/lon) à une ligne (définie par deux coordonnées lat/lon) et obtenir le résultat en mètres.

J'ai jeté un œil à cette page et au code Java qui s'y trouve, mais je me rends compte que je ne peux pas utiliser ce code (du moins pas avec les coordonnées lat/lon) car il me donnera la distance/différence en degrés entre le point et la ligne, et non en mètres, et si je devine juste, il n'est pas possible de convertir la différence en degrés en mètres, non ?

Par conséquent, je me demande comment je peux faire cela d'une autre manière, pour obtenir le distance en mètres entre un ligne et un point, tous deux définis avec des valeurs lat/lon.

ÉDITER: J'ai pris une autre approche au problème. Maintenant, j'ai plutôt une méthode qui trouve le point sur la ligne qui est le plus proche de l'emplacement de l'appareil.
Cependant, cette formule ne fonctionne pas exactement comme prévu lorsque vous l'alimentez avec des coordonnées lat/lon. Lorsque l'emplacement de l'appareil est sur la ligne, il pointe vers la droite, mais à mesure que l'appareil s'éloigne de la ligne, l'erreur devient de plus en plus grande, jusqu'à ce qu'elle s'arrête à la fin de la ligne.

Voici la fonction (basée sur le code de la première alternative de cette réponse):

/** * Obtient le point le plus proche sur une ligne. * * @param a Le premier point de la ligne. * @param b Le deuxième point de la ligne. * @param p Le point de départ. * * @return Le point sur la ligne a->b qui est le plus proche du point p. */ public static Location NearPointOnLine(Location a, Location b, Location p) { // Stocke le vecteur a->p Vector a_to_p = new Vector(a, p); // Stocke le vecteur a->b Vecteur a_to_b = new Vector(a, b); // Trouver la magnitude carrée de a->b double squareMagnitude = square(a_to_b.x) + square(a_to_b.y); // Calculer le produit scalaire de a->p et a->b double atp_dot_atb = a_to_p.x * a_to_b.x + a_to_p.y * a_to_b.y; // Calculer la distance normalisée de a au point le plus proche double t = clamp(atp_dot_atb / squareMagnitude, 0d, 1d); // Créer un nouvel emplacement pour stocker les valeurs de résultat dans Location location = new Location(LocationManager.PASSIVE_PROVIDER); // Définir les valeurs des coordonnées du résultat location.setLatitude(a.getLatitude() + a_to_b.x * t); location.setLongitude(a.getLongitude() + a_to_b.y * t); // Renvoie l'emplacement return location; }

leVecteurla classe est juste une classe qui détient deuxdoublevaleurs et représentent un vecteur.
lepince (double v, double min, double max)la méthode bloque une valeur (v) entre un minimum (min) et un maximum (max) valeur, dans ce cas 0 et 1.
lecarré (double v)méthode calcule le carré d'une valeur (simplementv * v).

Je serais heureux si quelqu'un pouvait m'aider à modifier un peu ce code pour renvoyer un point correct pour les coordonnées WGS84/lat-lon, ou suggérer une autre façon de le faire.
Le point de résultat doit être aussi précis que possible, disons, moins de 5 mètres d'erreur.


vous ne pouvez pas vraiment convertir les distances en degrés en mètres car la taille d'un degré varie à mesure que vous vous approchez des pôles. convertissez vos emplacements dans un système de coordonnées projetées, puis calculez vos distances.


J'ai réussi à résoudre le problème en convertissant toutes les coordonnées à contenir dans la formule en SWEREF99TM avant de calculer le point le plus proche. Ensuite, j'ai converti le point le plus proche trouvé avec la formule en WGS84.

J'ai utilisé SWEREF99TM car c'est un système de grille, donc la formule fonctionnera correctement.
Notez que cela ne fonctionnera probablement pas en dehors de la Suède, car le système de coordonnées SWEREF99TM, qui, je pense, ne fonctionne qu'en Suède, est utilisé.
Si le calcul ne doit fonctionner que dans un pays spécifique, la clé pour résoudre ce problème est de trouver un système de grille pour ce pays et de convertir les coordonnées dans ce système avant d'utiliser la formule.


Voir la vidéo: Pisteen etäisyys suorasta xy-koordinaatistossa