Dada una línea en la superficie de la tierra, ¿cómo trazo una línea perpendicular a ella?

9

Dada una línea en la superficie de la tierra, ¿cómo trazo una línea perpendicular a ella?

Disculpas si esta es una pregunta muy simple. Pensé que esta sería una tarea sencilla, pero está resultando contra intuitiva.

Comienzo con la línea azul en la figura a continuación (vea el enlace: todavía no puedo cargar las cifras). Encontré una línea perpendicular calculando el gradiente de la línea azul (m), luego dibujando otra línea (verde) con gradiente -1 / m. Cuando trazo las líneas en Matlab (usando 'trama' y 'eje igual'), se ven perpendiculares, como se esperaba.

http://imgur.com/7qMkx

Sin embargo, cuando exporto estas líneas a Google Earth (usando el KML Toolbox), ya no se ven perpendiculares (vea el enlace a continuación; la línea más corta es la línea azul de la figura anterior).

http://imgur.com/ncJQ7

Entiendo que suceden cosas extrañas en superficies curvas, pero pensé que las líneas al menos deberían verse perpendiculares localmente. Sospecho que esto tiene algo que ver con la proyección en Google Earth, en particular, el hecho de que las celdas de la cuadrícula parecen tener longitudes laterales más o menos similares, pero el borde longitudinal tiene longitud = 1 grado, mientras que el borde latitudinal tiene longitud = 0.5 la licenciatura.

Entonces, en resumen:

  • ¿Es válido mi método para encontrar una línea perpendicular en una superficie curva? (es decir, trazar una línea con gradiente -1 / m)
  • en la imagen de Google Earth, ¿las líneas perpendiculares se ven como se espera o está sucediendo algo extraño?

ACTUALIZAR:

Para proporcionar más contexto: estoy mirando datos de radar tomados de un avión. El área multicolor es la 'franja', donde se han registrado observaciones. La línea azul con la que comencé en la explicación anterior es paralela a la franja: esta es la línea de vuelo del avión (el avión se movía en la dirección más o menos sudoeste). El radar mira en la dirección ortogonal a la línea de vuelo, a la izquierda. Estoy tratando de dibujar una línea perpendicular a la línea de vuelo; Esta debería ser la dirección en la que mira el radar, y debería cortar la franja perfectamente. Como puede ver, este no es el caso.

ingrese la descripción de la imagen aquí

Paul Keating
fuente
2
En realidad, Google retrata el ángulo correctamente, mientras que su diagrama de Matlab no ...
whuber
Gracias por la respuesta, whuber. ¿Significa eso que la línea que he calculado no es, de hecho, perpendicular al original? ¿O significa que la forma en que veo las líneas en Matlab es de alguna manera incorrecta? Utilicé el comando 'eje igual' en Matlab para convencerme de que las líneas son perpendiculares, pero espero que esto no represente adecuadamente la curvatura de la tierra.
Paul Keating
2
Tu primera interpretación es correcta, Paul. Usar (lon, lat) como si fueran coordenadas cartesianas distorsiona las direcciones de manera tan grave que la mayoría de los ángulos están visiblemente distorsionados. Por lo tanto, usar la fórmula cartesiana -1 / m ni siquiera lo acercará a un ángulo recto, excepto en un par de direcciones afortunadas (o en el ecuador). Para proporcionar un método alternativo, sería útil saber qué tipo de "línea" desea (línea geodésica o de rumbo, por ejemplo), su propósito al trazarla y cuánto tiempo debería ser. (Las longitudes cortas permiten utilizar aproximaciones simples).
whuber
2
Por cierto, puede aprender mucho sobre estos problemas leyendo algunos de los hilos en nuestro sitio sobre proyecciones conformes .
whuber
Muchas gracias, whuber. Muy interesante. He proporcionado más contexto en la descripción del problema, arriba. La longitud que necesito es relativamente corta (el ancho de la franja, que se muestra arriba, que es unas pocas décimas de grado), por lo que cualquier sugerencia sobre aproximaciones válidas sería muy apreciada. Gracias también por el enlace. Lo comprobaré.
Paul Keating

Respuestas:

10

Un principio elegante proporciona una respuesta simple:

Todos los puntos en una superficie curva lisa son planos a una escala suficientemente grande.

Esto significa que después de un cambio afinado de coordenadas (que generalmente involucra solo un cambio de escala de una de ellas), podemos usar fórmulas de geometría euclidiana, como el Teorema de Pitágoras para calcular distancias y la fórmula de pendiente recíproca negativa para encontrar perpendiculares.

Con las coordenadas de latitud y longitud en la esfera (lejos de los polos, donde la longitud se vuelve singular), todo lo que tenemos que hacer es reescalar la dirección este-oeste para reflejar la longitud cada vez menor de un grado de longitud a medida que uno se acerca a los polos. Con un modelo esférico de la tierra, esa contracción está dada por el coseno de la latitud. Esto es simplemente un cambio en la relación de aspecto de la trama, nada más.

Esto funciona para regiones que se extienden no más de unos pocos grados de latitud norte-sur y no se acercan a ninguno de los polos.

Por lo tanto, todo lo que tienes que hacer es:

  1. Multiplique todas las longitudes por el coseno de una latitud típica.

  2. Calcule la línea perpendicular.

  3. Deshacer el ajuste de coordenadas.

Por ejemplo, suponga que la trayectoria del avión lo tomó de (lon, lat) = (-78, 40) a (-79, 41). Podemos tomar una latitud típica para estar entre 40 y 41, como 40.5.

Paso 1 Las coordenadas ajustadas son (-78 * cos (40.5), 40) = (-59.31167, 40) y (-79 * cos (40.5), 41) = (-60.07207, 41).

Paso 2 La pregunta propone hacer esto usando un método de pendiente recíproca negativa. Eso sería correcto, pero fallará en algunos casos (donde la pendiente es infinita). Es más general y más poderoso usar aritmética vectorial. Así es como va el cálculo.

El vector de dirección para la trayectoria del vuelo es el desplazamiento desde el principio hasta el final,

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

Girar cualquier vector (x, y) en ángulo recto en el sentido de las agujas del reloj produce (y, -x), por lo que una dirección perpendicular a la derecha es

w = (1.0, 0.7604).

Según el teorema de Pitágoras, la longitud de este vector es la raíz cuadrada de la suma de los cuadrados de sus coeficientes,

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

Movámonos, digamos, 0.2 grados a lo largo de este vector desde el punto de partida del vuelo del avión. El inicio es en (-59.31167, 40) y el desplazamiento es 0.2 / | w | veces w, terminando en

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

Paso 3 Para deshacer el ajuste, divida las primeras coordenadas de los puntos resultantes por el mismo coseno utilizado en el Paso 1:

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

Si traza estos puntos usando una relación de aspecto 1: 1, el ángulo parecerá obtuso en lugar de un ángulo recto. Pero si cambia la relación de aspecto a 1: cos (40.5) (aproximadamente 4: 3), el ángulo aparecerá correctamente en 90 grados. Cuando traza los puntos usando cualquier proyección conforme, incluido el Mercator de Google, el ángulo también será correcto.

whuber
fuente
2
Esto es fantástico, whuber. Muchas gracias. Es una explicación muy clara de dónde me estoy equivocando y cómo puedo solucionar el problema. Terminé usando las funciones 'azimut' y 'cálculo' de Matlab para obtener la línea perpendicular, pero es bueno ver una explicación más detallada de los primeros principios de cómo hacer esto. Muchas gracias.
Paul Keating