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

3
我正在尝试开发一个涉及GPS坐标(纬度/经度)归一化的算法。这意味着,给定两个点A(lat1,lon1)和B(lat2,lon2),我想插入一个点C,该点与AB(相同弧线)是线性的,并且距离A和B有特定的距离(例如:从A到B距离为0.5公里,我希望点C位于AB弧上距离A 0.1公里)。如何计算点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 );
    }

根据我理解原始公式,这应该返回两个原始点中的一个,但由于使用的分数为1,它并没有返回。变量dist是两点之间的距离,已经正确计算(与同一网站进行了比较验证)。
编辑2:我提供了两个地理点的坐标(lat1,lon1,lat2 lon2)和它们之间的距离作为输入。我试图得到一个中间点(lat3,lon3)。

你看过链接的网站吗?在“中间点”下面有你想要的公式。 - Nico Schertler
谢谢,我查看了链接,但我想我没有注意到他们的大段文字中有这个。我会尝试写下来并查看它是否正常工作 :) - Dante
1
不要在评论中发布您的代码,这是不可能阅读的。请编辑您的问题并将代码插入其中。 - Nico Schertler
1
假设我们不知道您提供给该代码的输入,您期望什么以及产生了什么。您认为您能否添加这些信息? - Damien_The_Unbeliever
1
不是“你的参数名称和你正在寻找的名称是什么”,而是具体的、实际的数字,你正在通过这个过程,检查输出,将它们与其他数字进行比较,并能够说“那是错误的”——你有这些实际的例子在你面前。我们没有。 - Damien_The_Unbeliever
显示剩余4条评论
3个回答

2

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

我认为您还有一个错误,即在z处使用了lon2而不是lat2

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

    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);

我得到的输出是:
47.20754 27.02177

2

不确定原作者是否找到了答案,但由于我遇到了类似的问题并开发出了可行的解决方案,我认为在这里发布它会很好。

问题

给定两个地理点 A 和 B,找到恰好位于从 A 到 B 的直线路径上且距离 A 为 N 公里的中间点 C(其中 N 小于 A 和 B 之间的距离,否则 C = B)。

我的背景

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

解决方案背景

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

该网页在底部提供了所有的解释、公式和 JavaScript 代码。如果您不熟悉 C#,可以使用它们的 JavaScript 实现。

我的 C# 实现

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

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

代码

我有一个作为我的小型项目一部分的可行解决方案,可以在这里找到 - https://github.com/kakarotto67/mlmc/blob/master/src/Services/MGCC.Api/ChipSimulation/CoordinatesHelper.cs。 (由于原始类将来可能会发生更改,因此您可能需要参考此 Gist - 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);

我希望有人能从中受益。

0
def get_intermediate_point(lat1 , lon1 , lat2 , lon2 , d):
    constant = np.pi / 180
    R = 6371
    φ1 = lat1 * constant
    λ1 = lon1 * constant
    φ2 = lat2 * constant
    λ2 = lon2 * constant
    y = np.sin(λ21) * np.cos(φ2);
    x = np.cos(φ1)*np.sin(φ2) -  np.sin(φ1)*np.cos(φ2)*np.cos(λ21)
    θ = np.arctan2(y, x)
    brng = (θ*180/np.pi + 360) % 360;  #in degrees
    brng = brng * constant

    φ3 = np.arcsin( np.sin(φ1)*np.cos(d/R ) + np.cos(φ1)*np.sin(d/R )*np.cos(brng) )
    λ3 = λ1 + np.arctan2(np.sin(brng)*np.sin(d/R )*np.cos(φ1),  np.cos(d/R )-np.sin(φ1)*np.sin(φ2));

    return φ3/constant , λ3/constant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接