Question

Il existe un emplacement cible inconnu (coordonnées de latitude et de longitude). J'ai 3 paires de coordonnées de latitude et de longitude et pour chaque paire une distance en kilomètres à l'emplacement cible. Comment puis-je calculer les coordonnées de l'emplacement cible?

Par exemple, disons que j'ai les points de données suivants

37.418436,-121.963477   0.265710701754km
37.417243,-121.961889   0.234592423446km
37.418692,-121.960194   0.0548954278262km

Ce que j'aimerais, c'est ce que le tripes de la fonction qui prend cela comme entrée et retour 37.417959,-121.961954 Comme la sortie ressemble?

Je comprends comment calculer la distance entre deux points, de http://www.movable-type.co.uk/scripts/latlong.html Je comprends le principe général qu'avec trois cercles, vous obtenez exactement un point de chevauchement. Ce sur quoi je suis brumeux, c'est que les mathématiques nécessaires pour calculer ce point avec cette entrée.

Était-ce utile?

La solution

Wikipedia donne une discussion assez approfondie sur l'algèbre ici:http://en.wikipedia.org/wiki/trilateration

La première étape, pas vraiment couverte dans l'entrée Wikipedia, consiste à convertir vos coordonnées Lat / Long en coordonnées cartésiennes:

x0 = cos( lon0 ) * cos( lat0 ) , y0 = sin( lon0 ) * cos( lat0 ) , z0 = sin( lat0 )
x1 = cos( lon1 ) * cos( lat0 ) , y1 = sin( lon1 ) * cos( lat1 ) , z1 = sin( lat1 )
x2 = cos( lon2 ) * cos( lat0 ) , y2 = sin( lon2 ) * cos( lat2 ) , z2 = sin( lat2 )

(Pour garder les calculs simples, j'ai étouffé des choses, donc nous travaillons dans des unités de "rayons de terre" au lieu de kilomètres)

Pour vos données, je reçois

         p0            p1           p2
X   -0.420442596  -0.420430618  -0.42040255
Y   -0.67380418   -0.673826567  -0.673825967
Z    0.607631426   0.607614889   0.607634975

L'étape suivante, qui est couverte dans l'article de Wikipedia, consiste à simplifier les coordonnées, en traduisant les points de sorte que P0 est à l'origine, puis en rotation pour que P1 soit sur l'axe x, et P2 est dans le plan XY.

Pour la traduction, il suffit de soustraire P0 de P1 et P2:

    p0a      p1a          p2a
X   0    1.19779E-05   4.00462E-05
Y   0   -2.23864E-05  -2.17865E-05
Z   0   -1.65372E-05   3.5486E-06

La rotation n'est pas beaucoup plus difficile. p1b obtient (x, y) = (d, 0), où d est juste la distance de l'origine à p1a (théorème pythagorean)

Pour P2B, nous devons résoudre P2A en deux composants: un parallèle à P1A (qui va sur notre axe x), et un perpendiculaire à P1A (qui va sur notre axe Y dans le système de coordonnées "B").

Pour ce faire, nous avons besoin d'un vecteur unitaire en direction de P1A, qui est juste P1A * (1 / D). Prenez le produit DOT de ce vecteur d'unité (appelez-le P1A_HAT, si vous le souhaitez) avec P2A, et c'est la coordonnée X pour P2B. L'article Wikipedia appelle cette valeur "I"

Maintenant, la coordonnée Y est facile. La longueur de l'origine à P2 ne peut pas changer sous la transformation des coordonnées. Calculez donc la longueur de P2A à l'aide du théorème de Pythagore, puis utilisez le théorème de Pythagore "en arrière" pour obtenir ce que la coordonnée Y doit être pour garder la longueur la même. C'est la variable que Wikipedia appelle "J". (Remarque, il y a une ambiguïté que je vous laisse pour déterminer si J est positif ou négatif).

Maintenant, vous avez les trois variables D, I et J, que l'article Wikipedia utilise pour le calcul. Vous pouvez les convertir en kilomètres maintenant, en multipliant par le rayon de la Terre. Vous devriez être en mesure de faire le reste du calcul à partir d'ici

(Soit dit en passant, Wikipedia donne un calcul différent pour la transformation des coordonnées. J'aime éviter le trig dans la mesure du possible).

Autres conseils

J'ai posé cette question sur l'échange de pile GIS nouvellement formé, et j'ai également obtenu de bonnes réponses là-bas.

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-ongitude-poits-and-3-distances

La réponse acceptée il y a une solution de travail (vraisemblablement) dans Python:

https://gis.stackexchange.com/questions/66/trilateration-using-3-latitude-and-ongitude-poits-and-3-distances/415#415

Considérez les 9 cercles suivants Points A, B, C et distances D1, D2, D3

  • Centre de A, rayon D1
  • Centre de A, rayon D2
  • Centre de A, rayon D3
  • Centre de B, rayon D1
  • Centre de b, rayon d2
  • Centre de B, rayon D3
  • Centre de C, rayon D1
  • Centre de C, rayon D2
  • Centre de C, rayon D3

Ce sont vos cercles possibles. Maintenant, nous pouvons les réduire, car nous savons que si D1 est utilisé sur A, il ne sera pas utilisé sur B.

Cela rend vos entrées possibles, où A1 signifie cercle avec le centre A et le rayon D1:

  • {A1, b2, c3}
  • {A1, b3, c2}
  • {A2, B1, C3}
  • {A2, b3, c1}
  • {A3, B1, C2}
  • {A3, b2, c1}

Vous devriez être capable de convertir le lat / long en x, y, z connaissant le rayon de la terre, et les distances de la distance incurvée le long de la croûte terre un point commun. N'oubliez pas de permettre de petites marges d'erreur dues à l'imperfection flottante.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top