Étant donné une ligne à la surface de la terre, comment puis-je tracer une ligne perpendiculaire à celle-ci?

9

Étant donné une ligne à la surface de la terre, comment puis-je tracer une ligne perpendiculaire à celle-ci?

Toutes mes excuses si c'est une question très simple. Je pensais que ce serait une tâche simple, mais cela se révèle contre-intuitif.

Je commence par la ligne bleue dans la figure ci-dessous (voir le lien - je ne peux pas encore télécharger de chiffres). J'ai trouvé une ligne perpendiculaire en calculant le gradient de la ligne bleue (m), puis en traçant une autre ligne (verte) avec un gradient -1 / m. Lorsque je trace les lignes dans Matlab (en utilisant «plot» et «axis equal»), elles semblent perpendiculaires, comme prévu.

http://imgur.com/7qMkx

Cependant, lorsque j'exporte ces lignes vers Google Earth (à l'aide de la boîte à outils KML), elles ne semblent plus perpendiculaires (voir le lien ci-dessous; la ligne la plus courte est la ligne bleue de la figure précédente).

http://imgur.com/ncJQ7

Je comprends que des choses étranges se produisent sur des surfaces courbes, mais je pensais que les lignes devraient au moins sembler perpendiculaires localement. Je soupçonne que cela a quelque chose à voir avec la projection dans Google Earth - en particulier, le fait que les cellules de la grille semblent avoir des longueurs latérales à peu près similaires, mais le bord longitudinal a une longueur = 1 degré, tandis que le bord latitudinal a une longueur = 0,5 diplôme.

Donc, en résumé:

  • ma méthode de recherche d'une ligne perpendiculaire est-elle valable sur une surface courbe? (c.-à-d. tracer une ligne avec un gradient -1 / m)
  • dans l'image de Google Earth, les lignes perpendiculaires semblent-elles comme prévu ou quelque chose d'étrange se passe-t-il?

MISE À JOUR:

Pour fournir plus de contexte: je regarde les données radar prises d'un avion. La zone multicolore est la «bande», où les observations ont été enregistrées. La ligne bleue avec laquelle j'ai commencé dans l'explication ci-dessus est parallèle à l'andain: c'est la ligne de vol de l'avion (l'avion se déplaçait approximativement vers le sud-ouest). Le radar regarde dans la direction orthogonale à la ligne de vol, à gauche. J'essaie de tracer une ligne perpendiculaire à la ligne de vol; ce devrait être la direction que le radar regarde, et devrait couper l'andain proprement. Comme vous pouvez le voir, ce n'est pas le cas.

entrez la description de l'image ici

Paul Keating
la source
2
En fait, Google dépeint l'angle correctement, alors que votre tracé Matlab ne le fait pas ...
whuber
Merci pour la réponse, whuber. Est-ce à dire que la ligne que j'ai calculée n'est pas, en fait, perpendiculaire à l'original? Ou cela signifie-t-il que la façon dont je vois les lignes dans Matlab est en quelque sorte erronée? J'ai utilisé la commande d'axe égal dans Matlab pour me convaincre que les lignes sont perpendiculaires, mais je m'attends à ce que cela ne représente pas correctement la courbure de la terre.
Paul Keating
2
Votre première interprétation est correcte, Paul. Utiliser (lon, lat) comme s'il s'agissait de coordonnées cartésiennes déforme les directions si gravement que la plupart des angles sont visiblement déformés. Par conséquent, l'utilisation de la formule cartésienne -1 / m ne vous rapprochera même pas d'un angle droit, sauf dans quelques directions chanceuses (ou à l'équateur). Pour fournir une méthode alternative, il serait utile de savoir quel type de "ligne" vous voulez (ligne géodésique ou rhumb, par exemple), votre but en la traçant, et combien de temps elle devrait être. (Les courtes longueurs permettent d'utiliser des approximations simples.)
whuber
2
BTW, vous pouvez en apprendre beaucoup sur ces problèmes en lisant certains des fils de discussion de notre site sur les projections conformes .
whuber
Merci beaucoup, whuber. Très intéressant. J'ai fourni plus de contexte dans la description du problème ci-dessus. La longueur dont j'ai besoin est relativement courte (la largeur de l'andain, montrée ci-dessus, qui est de quelques dixièmes de degré), donc toute suggestion sur des approximations valables serait très appréciée. Merci aussi pour le lien - je vais le vérifier.
Paul Keating

Réponses:

10

Un principe élégant apporte une réponse simple:

Tous les points sur une surface courbe lisse sont plats à une échelle suffisamment grande.

Cela signifie qu'après un changement affiné de coordonnées (impliquant généralement juste un redimensionnement de l'une d'entre elles), nous pouvons utiliser des formules de géométrie euclidienne, telles que le théorème de Pythagore pour calculer les distances et la formule de pente réciproque négative pour trouver des perpendiculaires.

Avec les coordonnées de latitude et de longitude sur la sphère (loin des pôles, où la longitude devient singulière), tout ce que nous devons faire est de redimensionner la direction est-ouest pour refléter la longueur rétrécie d'un degré de longitude à l'approche des pôles. Avec un modèle sphérique de la terre, ce retrait est donné par le cosinus de la latitude. Ce n'est qu'un changement dans le rapport hauteur / largeur de l'intrigue, rien de plus.

Cela fonctionne pour les régions qui ne s'étendent pas sur plus de quelques degrés de latitude nord-sud et ne s'approchent d'aucun des pôles.

Par conséquent, tout ce que vous avez à faire est de:

  1. Multipliez toutes les longitudes par le cosinus d'une latitude typique.

  2. Calculez la ligne perpendiculaire.

  3. Annulez l'ajustement des coordonnées.

Par exemple, supposons que la trajectoire de l'avion l'a fait passer de (lon, lat) = (-78, 40) à (-79, 41). Nous pouvons prendre une latitude typique pour se situer entre 40 et 41, comme 40,5.

Étape 1 Les coordonnées ajustées sont (-78 * cos (40,5), 40) = (-59,31167, 40) et (-79 * cos (40,5), 41) = (-60,07207, 41).

Étape 2 La question propose de le faire en utilisant une méthode à pente réciproque négative. Ce serait correct, mais cela échouera dans certains cas (où la pente est infinie). Il est plus général et plus puissant d'utiliser l'arithmétique vectorielle. Voici comment se déroule le calcul.

Le vecteur de direction de la trajectoire du vol est le déplacement de son début à sa fin,

v =  (-60.07207, 41) - (-59.31167, 40)
  =  (-0.7604, 1.0).

La rotation de tout vecteur (x, y) à angle droit dans le sens horaire produit (y, -x), d'où une direction perpendiculaire à droite est

w = (1.0, 0.7604).

Selon le théorème de Pythagore, la longueur de ce vecteur est la racine carrée de la somme des carrés de ses coefficients,

|w| = sqrt(1^2 + 0.7604^2) = 1.256268

Déplaçons, disons, 0,2 degré le long de ce vecteur à partir du point de départ du vol de l'avion. Le début est à (-59.31167, 40) et le déplacement est de 0,2 / | w | fois w, se terminant à

(-59.31167, 40) + 0.2 / 1.256268 * (1.0, 0.7604) = (-59.15247  40.12106).

Étape 3 Pour annuler l'ajustement, divisez les premières coordonnées de tout point résultant par le même cosinus utilisé à l'étape 1:

(-59.15247/cos(40.5), 40.12106) = (-77.79064, 40.12106)

Si vous tracez ces points en utilisant un rapport d'aspect de 1: 1, l'angle semble être obtus plutôt qu'un angle droit. Mais si vous changez le rapport d'aspect à 1: cos (40,5) (environ 4: 3), l'angle apparaîtra correctement à 90 degrés. Lorsque vous tracez les points à l'aide de n'importe quelle projection conforme - y compris Mercator de Google - l'angle sera également correct.

whuber
la source
2
C'est fantastique, whuber. Merci beaucoup. C'est une explication très claire de l'endroit où je me trompe et de la façon de résoudre le problème. J'ai fini par utiliser les fonctions d'azimut et de calcul de Matlab pour obtenir la ligne perpendiculaire, mais il est bon de voir une explication plus détaillée des premiers principes sur la façon de procéder. Merci beaucoup.
Paul Keating