我需要找到位于一条线上的一组两个坐标之间的插值点。 我想到的伪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
,其中基本上是纬度和经度坐标。
我需要知道这是插入折线的两个坐标点的正确方法,还是有其他方法可以做到这一点?
答案 0 :(得分: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.