【问题标题】:Calculate distance between two points in bing maps计算 bing 地图中两点之间的距离
【发布时间】:2012-04-16 14:08:59
【问题描述】:

我有一个 bing 地图和一个两点: Point1,Point2 我想计算这两点之间的距离?那可能吗? 如果我想在point1和point2之间以及point2附近的路径的三分之二上放一个圆圈……我该怎么做?

【问题讨论】:

    标签: c#-4.0 silverlight-4.0 bing-maps


    【解决方案1】:

    Microsoft 有一个GeoCoordinate.GetDistanceTo Method,它使用Haversine 公式。

    对我来说,其他实现对于太小的距离返回 NaN。我还没有遇到内置函数的任何问题。

    【讨论】:

    • 哦,之前没注意到。谢谢
    • API 变得越来越大!也不知道那个,我已经在我自己的公共库中添加了一个 Haversine 实现,以便在我的项目中使用。我想我可以删除它知道,亲爱的!
    【解决方案2】:

    请参阅Haversine 甚至更好的Vincenty 公式如何解决此问题。

    以下代码使用haversines方式获取距离:

    public double GetDistanceBetweenPoints(double lat1, double long1, double lat2, double long2)
        {
            double distance = 0;
    
            double dLat = (lat2 - lat1) / 180* Math.PI;
            double dLong = (long2 - long1) / 180 * Math.PI;
    
            double a = Math.Sin(dLat / 2) * Math.Sin(dLat / 2)
                        + Math.Cos(lat1 / 180* Math.PI) * Math.Cos(lat2 / 180* Math.PI) 
                        * Math.Sin(dLong/2) * Math.Sin(dLong/2);
            double c = 2 * Math.Atan2(Math.Sqrt(a), Math.Sqrt(1 - a));
    
            //Calculate radius of earth
            // For this you can assume any of the two points.
            double radiusE = 6378135; // Equatorial radius, in metres
            double radiusP = 6356750; // Polar Radius
    
            //Numerator part of function
            double nr = Math.Pow(radiusE * radiusP * Math.Cos(lat1 / 180 * Math.PI), 2);
            //Denominator part of the function
            double dr = Math.Pow(radiusE * Math.Cos(lat1 / 180 * Math.PI), 2)
                            + Math.Pow(radiusP * Math.Sin(lat1 / 180 * Math.PI), 2);
            double radius = Math.Sqrt(nr / dr);
    
            //Calculate distance in meters.
            distance = radius * c;
            return distance; // distance in meters
        }
    

    你可以找到一个很好的网站,信息为here

    【讨论】:

    • +1。 Haversine 是最常见的,非常适合确定任意两点之间的近似距离。 Vincenty 给出了一个更好的近似值,因为它假设地球的形状是一个椭球体而不是一个完美的球体。最后一个选项是导入 Microsoft.SqlServer.Types.dll 库并使用 SqlGeography 数据类型的 STDistance() 方法。这将给出最准确的结果,因为它使用椭球模型(例如 WGS84) - 就像 SQL Server 对 geography 数据类型所做的一样。
    • 感谢它对距离部分很有效,但是我怎样才能在 point1 和 point2 之间距离的 2/3 处显示一个圆圈??
    • 我发现这个解决方案的一个问题是,由于试图取 -1 的平方根,它可能会返回 NaN。似乎需要对实施进行一些调整。如果我最终修复它,我会重新发布答案。
    • 这似乎有一个关闭 2 错误,例如所有距离都是应有的一半......
    【解决方案3】:

    如果您需要更准确的结果或想要进行一些数学运算(例如将圆转换为类圆/投影),您可以使用地理库进行(重新)投影和计算操作。看看DotSpatialSharpMap 以及那里的示例/单元测试/源...这可能有助于解决您的问题。

    无论如何,如果您知道geodesic distancebearing,您还可以计算得到的目标位置(您的圆心)在哪里,例如请参阅Vincenty's 算法的“直接问题”。这里还有一些useful algorithm implementationssilverlight/.net

    您也可以考虑在GIS Stackexchange 发布您的问题。他们讨论像您这样的 GIS 相关问题。看看calculating lat long x-miles from point 的问题(因为你现在已经知道了整个距离)或者在这里查看关于distance calculations 的讨论。这个问题与问题how to draw a point on a line in a given distance 相关并且几乎相同(因为您需要中心和半径)。

    另一个选项是使用ArcGIS API for Silverlight,它也可以显示必应地图。它是开源的,你可以在那里学习你需要的东西(或者只是使用它们,因为它们已经存在于 SDK 中)。请参阅示例中的实用程序示例选项卡。

    【讨论】:

      【解决方案4】:

      正如我已经提到的:查看this page 以获取有关您的问题的更多信息。在那里,您会找到一个公式、Javascript 代码和一个 Excel 示例,用于按给定距离和从起点开始的方位计算目标点(参见那里的标题)。

      将代码“转换”到您的 c# 世界应该不难。

      【讨论】:

        猜你喜欢
        • 2012-04-09
        • 1970-01-01
        • 2010-12-02
        • 2010-10-30
        • 2022-06-13
        • 2013-09-30
        相关资源
        最近更新 更多