Вы можете сделать что-то вроде этого:
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
Формулы, к которым Вы обращаетесь в тексте, должны вычислить большое круговое расстояние между 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) для получения грубого приближения все же.
Я нашел эту ссылку
http://williams.best.vwh.net/avform.htm
данный в ответе на
Lat/Lon + Расстояние + Направляющийся-> Lat/Lon
Это выглядит многообещающим, особенно плоское наземное приближение, данное около конца.
Я рекомендовал бы реализовать поправочный коэффициент на основе долготы. Я реализовал стандартную программу средства моделирования однажды для возврата всех геокодируемых записей в x милях определенного места и столкнулся с проблемами средства моделирования. К сожалению, я больше не имею кода и, может казаться, не вспоминаю, как я добрался до числа исправления, но Вы на правильном пути.
Вот решение 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);
}
Это будет работать только для небольших различий. В противном случае вы не можете просто использовать "latitudinalDifference / longitudinalDifference".