2个地理坐标之间的中间点

时间:2016-08-04 12:15:29

标签: c# coordinates

我正在尝试开发一种涉及标准化GPS坐标(纬度/经度)的算法。这意味着,给出两个点A(lat1,lon1)和B(lat2,lon2)我想插入一个与AB(相同弧)线性相关的点C,并放置在距离A和B的特定距离处(例如:A到B的距离是0.5km,我希望C点距离A,在AB弧上为0.1 km。如何计算C点的坐标? 出于给定的目的,将地球近似为完美的球形物体就足够了。 我找到了这篇文章,但它只给出了中点的公式(我不完全理解它,为了适应)。 midpoint between two latitude and longitude 谢谢。

编辑:我尝试了这个,但它给出了错误的答案

public static void normalizedPoint(double lat1, double lon1, double lat2, double lon2, double dist){
        double constant=Math.PI/180;
        double angular = dist/6371;
        double a = Math.Sin( 0* angular )/Math.Sin(angular);
        double b = Math.Sin(1*angular)/Math.Sin(angular);
        double x = a * Math.Cos(lat1) * Math.Cos(lon1) + b * Math.Cos(lat2) * Math.Cos(lon2);
        double y = a * Math.Cos(lat1) * Math.Sin(lon1) + b * Math.Cos(lat2) * Math.Sin(lon2);
        double z = a * Math.Sin(lat1) + b * Math.Sin (lon2);
        double lat3 = Math.Atan2(z, Math.Sqrt( x*x + y*y ));
        double lon3 = Math.Atan2(y, x);
        Console.WriteLine(lat3/constant + " " + lon3/constant );
    }

据我了解原始公式,这应该返回2个原始点中的一个,但它不会(因为使用的分数是1)。此外,变量dist是距离2点的距离,并且已正确计算(使用相同的网站进行检查)。

编辑2:我提供2个地理点(lat1,lon1,lat2 lon2)的坐标和它们之间的距离。我正试图获得一个中间点(lat3,lon3)。

2 个答案:

答案 0 :(得分:1)

不确定原始作者是否找到了答案,但是由于我有类似的问题并开发了可行的解决方案,因此我认为将其张贴在此处会很好。

问题

有两个地理点A和B,找到中间点C,该点正好位于从A到B的直接路径上,并且距A的距离为N公里(其中N小于A和B的距离,否则C = B )。

我的背景

我正在开发基于微服务架构的小型宠物项目。想法是从给定的部署平台(点A)向选定的目标位置(点B)发射导弹。我必须创建某种模拟器,以便在发射后发送有关当前导弹地理位置的一些消息,因此我必须以某种方式找到A和B之间的中间点。

解决方案上下文

最终,我基于这个很棒的网页https://www.movable-type.co.uk/scripts/latlong.html开发了基于C#的解决方案。

该网页的底部包含所有说明,公式和JavaScript代码。如果您不熟悉C#,则可以使用其JavaScript实现。

我的C#实现

您输入的是位置A,位置B和距离。

  1. 您需要找到从A到B的方位角(请参见该站点上的“轴承”部分)
  2. 您需要从具有方位角的A找到位置C(请参见该站点上的“目标点给定距离和距起点的方位角”)

代码

我的宠物项目中有有效的解决方案,可以在这里找到-https://github.com/kakarotto67/mlmc/blob/master/src/Services/MGCC.Api/ChipSimulation/CoordinatesHelper.cs。 (由于将来可能会更改原始课程,因此您可能需要参考此要点-https://gist.github.com/kakarotto67/ef682bb5b3c8bd822c7f3cbce86ff372

用法

// 1. Find bearing between A and B    
var bearing = CoordinatesHelper.FindInitialBearing(pointA, pointB);

// 2. Find intermediate point C having bearing (above) and any distance in km
var pointC = CoordinatesHelper.GetIntermediateLocation(pointA, bearing, distance);

我希望有人会对此有所帮助。

答案 1 :(得分:0)

正如我在问题链接的答案中指出的那样,您需要更改所有输入以使用弧度而不是

我相信您使用z而不是lon2的{​​{1}}也出现了错误。

通过这些更正,我得到了您正在寻求的答案:

lat2

当然,只需转换角度1,避免重复计算相同的 public static void normalizedPoint(double lat1, double lon1, double lat2, double lon2, double dist) { double constant = Math.PI / 180; double angular = dist / 6371; double a = Math.Sin(0 * angular) / Math.Sin(angular); double b = Math.Sin(1 * angular) / Math.Sin(angular); double x = a * Math.Cos(lat1* constant) * Math.Cos(lon1* constant) + b * Math.Cos(lat2* constant) * Math.Cos(lon2* constant); double y = a * Math.Cos(lat1* constant) * Math.Sin(lon1* constant) + b * Math.Cos(lat2* constant) * Math.Sin(lon2* constant); double z = a * Math.Sin(lat1* constant) + b * Math.Sin(lat2* constant); double lat3 = Math.Atan2(z, Math.Sqrt(x * x + y * y)); double lon3 = Math.Atan2(y, x); Console.WriteLine(lat3 / constant + " " + lon3 / constant); } / Sin值等,就可以大大简化上述内容。

通话:

Cos

我得到了输出:

normalizedPoint(47.20761, 27.02185, 47.20754, 27.02177, 1);