【问题标题】:Intermediate points between 2 geographic coordinates2个地理坐标之间的中间点
【发布时间】:2016-08-04 12:15:29
【问题描述】:

我正在尝试开发一种涉及标准化 GPS 坐标(纬度/经度)的算法。这意味着,给定两个点 A (lat1,lon1) 和 B(lat2,lon2) 我想插入一个与 AB 线性的点 C(相同的弧),并放置在与 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 );
    }

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

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

【问题讨论】:

  • 您查看链接的网站了吗?它在中间点下有你想要的公式。
  • 谢谢,我检查了链接,但我想我没有注意到他们拥有的文字墙。我会试着写下来看看它是否正常工作:)
  • 不要在评论中发布您的代码。这是不可能阅读的。改为编辑您的问题。
  • 暂时假装我们不知道您向该代码提供了什么输入,您期望什么,也不知道产生了什么。你认为你也可以添加这些信息吗?
  • 不是“您的参数名称和您正在寻找的名称是什么” - 具体您在此过程中运行的具体实际数字,检查输出,将它们与其他数字进行比较并能够说“那是错误的” - 你面前有这些实际例子。我们没有。

标签: c# coordinates


【解决方案1】:

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

我相信您在使用lon2 而不是lat2 时也遇到了z 错误。

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

    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,找到中间点 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);
    

    我希望有人会觉得这很有帮助。

    【讨论】:

      猜你喜欢
      • 2011-05-09
      • 2017-11-05
      • 2012-05-20
      • 1970-01-01
      • 1970-01-01
      • 2011-12-17
      相关资源
      最近更新 更多