Как я вычисляю Азимут (угол на север) между двумя координатами WGS84

Вы можете сделать что-то вроде этого:

with open('Fastfile', 'r') as f_orig, open('Fastfile_new', 'w') as f_new:
    skipping = False
    for line in f_orig:
        if 'Validate repo test2' in line:
            skipping = True
        if not skipping:
            f_new.write(line)
        if line[:3] == 'end':
            skipping = False
10
задан David Segonds 13 March 2009 в 13:25
поделиться

5 ответов

Формулы, к которым Вы обращаетесь в тексте, должны вычислить большое круговое расстояние между 2 точками. Вот то, как я вычисляю угол между точками:

uses Math, ...;
...

const
  cNO_ANGLE=-999;

...

function getAngleBetweenPoints(X1,Y1,X2,Y2:double):double;
var
  dx,dy:double;
begin
  dx := X2 - X1;
  dy := Y2 - Y1;

  if (dx > 0) then  result := (Pi*0.5) - ArcTan(dy/dx)   else
  if (dx < 0) then  result := (Pi*1.5) - ArcTan(dy/dx)   else
  if (dy > 0) then  result := 0                          else
  if (dy < 0) then  result := Pi                         else
                    result := cNO_ANGLE; // the 2 points are equal

  result := RadToDeg(result);
end;
  • Не забудьте обрабатывать ситуацию, где 2 точки равны (проверка, если результат равняется cNO_ANGLE, или измените функцию для выдачи исключения);

  • Эта функция предполагает, что Вы находитесь на плоской поверхности. С маленькими расстояниями, которые Вы упомянули, это - весь штраф, но если Вы собираетесь быть вычислением заголовка между городами во всем мире, Вы могли бы хотеть изучить что-то, что принимает форму земли в количестве;

  • Лучше предоставлять этой функции координаты, которые уже отображаются на плоской поверхности. Вы могли подать Широту WGS84 непосредственно в Y (и lon в X) для получения грубого приближения все же.

10
ответ дан 3 December 2019 в 19:35
поделиться

Я нашел эту ссылку

http://williams.best.vwh.net/avform.htm

данный в ответе на

Lat/Lon + Расстояние + Направляющийся-> Lat/Lon

Это выглядит многообещающим, особенно плоское наземное приближение, данное около конца.

3
ответ дан 3 December 2019 в 19:35
поделиться

Я рекомендовал бы реализовать поправочный коэффициент на основе долготы. Я реализовал стандартную программу средства моделирования однажды для возврата всех геокодируемых записей в x милях определенного места и столкнулся с проблемами средства моделирования. К сожалению, я больше не имею кода и, может казаться, не вспоминаю, как я добрался до числа исправления, но Вы на правильном пути.

0
ответ дан 3 December 2019 в 19:35
поделиться

Вот решение C #. Протестировано для углов 0, 45, 90, 135, 180, 225, 270 и 315.

Править Я заменил свое предыдущее уродливое решение на перевод решения Воутера на C #:

public double GetAzimuth(LatLng destination)
{
    var longitudinalDifference = destination.Lng - this.Lng;
    var latitudinalDifference = destination.Lat - this.Lat;
    var azimuth = (Math.PI * .5d) - Math.Atan(latitudinalDifference / longitudinalDifference);
    if (longitudinalDifference > 0) return azimuth;
    else if (longitudinalDifference < 0) return azimuth + Math.PI;
    else if (latitudinalDifference < 0) return Math.PI;
    return 0d;
}

public double GetDegreesAzimuth(LatLng destination)
{
    return RadiansToDegreesConversionFactor * GetAzimuth(destination);
}
5
ответ дан 3 December 2019 в 19:35
поделиться

Это будет работать только для небольших различий. В противном случае вы не можете просто использовать "latitudinalDifference / longitudinalDifference".

2
ответ дан 3 December 2019 в 19:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: