2016-05-18 4 views
0

Мне нужно найти точки интерполяции между множеством двух координат, лежащих на линии. Псевдо C# код, который я имел в виду это:Как интерполировать координаты широты и долготы

private static List<Coordinate> SampleLine(Coordinate start, Coordinate end, int Samples) 
    { 

     List<Coordinate> LineStringSample = new List<Coordinate>(); 
     // Calculate equal interval between two points 
     var diff_X = start.X - end.X; //latitudes 
     var diff_Y = start.Y - end.Y; //longitudes 
     var length = Math.Sqrt(diff_X * diff_X + diff_Y * diff_Y); 
     var interval_X = diff_X/length; 
     var interval_Y = diff_Y/length; 

     Coordinate last = start; 
     for (int i = 1; i <= Samples; i++) 
     { 
      LineStringSample.Add(new Coordinate(start.X + interval_X * i, start.Y + interval_Y * i)); 
     } 
    } 

Где, например start = (49.13512,6.4321) end = (49.13515,6.4333) Samples=1000, которые являются в основном координаты широты и долготы. Мне нужно знать, является ли это правильным способом интерполирования двух координатных точек полилинии, или если есть другой способ сделать это?

ответ

1

Эта интерполяция не является точной, и при увеличении разности координат ошибки будут увеличиваться. Он может по-прежнему использоваться для небольших линий, например, вашего примера.

Лучший подход - найти точки интерполяции при большой окружности дуги. Посмотрите here в части «Промежуточная точка».

Formula: 
a = sin((1−f)⋅δ)/sin δ 
b = sin(f⋅δ)/sin δ 
x = a ⋅ cos φ1 ⋅ cos λ1 + b ⋅ cos φ2 ⋅ cos λ2 
y = a ⋅ cos φ1 ⋅ sin λ1 + b ⋅ cos φ2 ⋅ sin λ2 
z = a ⋅ sin φ1 + b ⋅ sin φ2 
φi = atan2(z, √x² + y²) 
λi = atan2(y, x) 
where 

f is fraction along great circle route (f=0 is point 1, f=1 is point 2), 
δ is the angular distance d/R between the two points. 
Смежные вопросы