Учитывая линию на поверхности земли, как я могу построить линию, перпендикулярную ей?

9

Учитывая линию на поверхности земли, как я могу построить линию, перпендикулярную ей?

Извиняюсь, если это очень простой вопрос. Я думал, что это будет простая задача, но она оказывается нелогичной.

Я начинаю с синей линии на рисунке ниже (см. Ссылку - я пока не могу загрузить цифры). Я нашел перпендикулярную линию, рассчитав градиент синей линии (м), а затем построив еще одну линию (зеленую) с градиентом -1 / м. Когда я строю линии в Matlab (используя 'plot' и 'axis равна'), они выглядят перпендикулярно, как и ожидалось.

http://imgur.com/7qMkx

Однако когда я экспортирую эти строки в Google Планета Земля (используя KML Toolbox), они больше не выглядят перпендикулярно (см. Ссылку ниже; более короткая линия - синяя линия с предыдущего рисунка).

http://imgur.com/ncJQ7

Я понимаю, что странные вещи случаются на изогнутых поверхностях, но я думал, что линии должны, по крайней мере, выглядеть перпендикулярно локально. Я подозреваю, что это как-то связано с проекцией в Google Earth - в частности, тот факт, что ячейки сетки имеют примерно одинаковую длину сторон, но продольный край имеет длину = 1 градус, тогда как широтный край имеет длину = 0,5 степень.

Итак, в итоге:

  • мой метод нахождения перпендикулярной линии действителен на изогнутой поверхности? (т.е. построение линии с градиентом -1 / м)
  • на изображении Google Планета Земля перпендикулярные линии выглядят так, как ожидалось, или происходит что-то странное?

ОБНОВИТЬ:

Чтобы обеспечить больше контекста: я смотрю на радиолокационные данные, взятые с самолета. Разноцветная область - это «полоса», где были записаны наблюдения. Синяя линия, с которой я начал в объяснении выше, параллельна полосе: это линия полета самолета (самолет двигался примерно в юго-западном направлении). Радар смотрит в направлении, перпендикулярном линии полета, слева. Я пытаюсь нарисовать линию, перпендикулярную линии полета; это должно быть направление, в котором смотрит радар, и должно аккуратно разрезать валок. Как видите, это не так.

введите описание изображения здесь

Пол Китинг
источник
2
На самом деле, Google правильно отображает угол, в то время как ваш сюжет Matlab не ...
whuber
Спасибо за ответ, whuber. Означает ли это, что рассчитанная мной линия на самом деле не перпендикулярна оригиналу? Или это означает, что то, как я вижу строки в Matlab, как-то не так? Я использовал команду 'ось равная' в Matlab, чтобы убедить себя, что линии перпендикулярны, но я ожидаю, что это не будет правильно представлять кривизну Земли.
Пол Китинг
2
Ваше первое толкование верно, Пол. Использование (lon, lat), как если бы они были декартовыми координатами, искажает направления настолько печально, что большинство углов заметно искажаются. Следовательно, использование декартовой формулы -1 / m даже не приблизит вас к правильному углу, за исключением пары счастливых направлений (или на экваторе). Чтобы предоставить альтернативный метод, было бы полезно узнать, какую «линию» вы хотите (например, геодезическую или прямолинейную линию), какую цель вы хотите построить, и какой длины она должна быть. (Короткие длины позволяют использовать простые приближения.)
whuber
2
Кстати, вы можете многое узнать об этих проблемах, прочитав некоторые темы на нашем сайте о конформных проекциях .
whuber
Большое спасибо, whuber. Очень интересно. Я предоставил больше контекста в описании проблемы выше. Длина, в которой я нуждаюсь, относительно короткая (ширина полосы, показанная выше, которая составляет несколько десятых градуса), поэтому любые предложения о допустимых приближениях будут высоко оценены. Спасибо также за ссылку - проверю.
Пол Китинг

Ответы:

10

Изящный принцип дает простой ответ:

Все точки на гладкой изогнутой поверхности являются плоскими в достаточно большом масштабе.

Это означает, что после аффинного изменения координат (обычно включающего только изменение масштаба одной из них) мы можем использовать формулы евклидовой геометрии, такие как теорема Пифагора для вычисления расстояний и формула отрицательного обратного наклона для нахождения перпендикуляров.

С координатами широты и долготы на сфере (вдали от полюсов, где долгота становится единичной), все, что нам нужно сделать, это изменить масштаб направления восток-запад, чтобы отразить уменьшающуюся длину градуса долготы при приближении к полюсам. В сферической модели Земли это сжатие определяется косинусом широты. Это просто изменение соотношения сторон сюжета, не более того.

Это работает для регионов, которые простираются не более чем на несколько градусов широты с севера на юг и не приближаются ни к одному полюсу.

Поэтому все, что вам нужно сделать, это:

  1. Умножьте все долготы на косинус типичной широты.

  2. Вычислить перпендикулярную линию.

  3. Отмените настройку координат.

Например, предположим, что траектория самолета взяла его от (lon, lat) = (-78, 40) до (-79, 41). Мы можем взять типичную широту, лежащую между 40 и 41, например 40,5.

Шаг 1 Скорректированные координаты (-78 * cos (40,5), 40) = (-59,31167, 40) и (-79 * cos (40,5), 41) = (-60,07207, 41).

Шаг 2 Вопрос предлагает сделать это, используя метод отрицательного обратного наклона. Это было бы правильно, но в некоторых случаях это не удастся (когда наклон бесконечен). Это более общее и более мощное использование векторной арифметики. Вот как идет расчет.

Вектор направления для траектории полета - это смещение от его начала до конца,

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

Поворот любого вектора (x, y) под прямым углом по часовой стрелке дает (y, -x), откуда перпендикулярное направление вправо

w = (1.0, 0.7604).

Согласно теореме Пифагора, длина этого вектора является корнем квадратным из суммы квадратов его коэффициентов,

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

Давайте сместимся, скажем, на 0,2 градуса по этому вектору от начальной точки полета самолета. Начало в (-59,31167, 40) и смещение 0,2 / | w | времена w, заканчивающиеся в

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

Шаг 3 Чтобы отменить корректировку, разделите первые координаты любых результирующих точек на тот же косинус, который использовался на шаге 1:

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

Если вы нанесете эти точки, используя соотношение сторон 1: 1, угол будет казаться тупым, а не прямым углом. Но если вы измените соотношение сторон на 1: cos (40,5) (около 4: 3), угол будет правильно составлять 90 градусов. При построении точек с использованием любой конформной проекции, в том числе Google Mercator, угол также будет правильным.

Whuber
источник
2
Это фантастика, ватер. Огромное спасибо. Это очень четкое объяснение того, где я иду не так, и как я могу решить проблему. В конечном итоге я использовал функции Matlab 'azimuth' и 'reckon', чтобы получить перпендикулярную линию, но приятно видеть более подробное объяснение, основанное на первых принципах, как это сделать. Большое спасибо.
Пол Китинг