2012-04-16 286 views
3

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

回答

10

请参阅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一个很好的网站。

+4

+1。半胱氨酸是最常见的,非常适合确定任何两点之间的大致距离。 Vincenty给出了一个更好的近似值,因为它假定地球的形状是一个球体而不是一个完美的球体。最后的选择是导入Microsoft.SqlServer.Types.dll库并使用SqlGeography数据类型的STDistance()方法。这将给出最准确的结果,因为它使用椭球体模型(例如WGS84) - 就像SQL Server为地理数据类型所做的一样。 – 2012-04-16 14:56:27

+0

非常感谢它的距离部分,但我怎么能显示在点1和点2之间的距离2/3的圆? – AboKevo 2012-04-16 15:36:34

+0

结果是米,KM ....? – toroveneno 2013-04-02 17:58:49

2

如果您需要更准确的结果或想要执行一些数学运算(例如将圆形转换为sperioid /投影),则可以使用地理库进行(重新)投影和计算操作。看看DotSpatialSharpMap和samples/unittests/sources there ...这可能有助于解决您的问题。

无论如何,如果您知道geodesic distancebearing,那么您还可以计算得出的目标位置(圆的中心)的位置,例如,请参阅Vincenty's算法的“直接问题”。这里也有一些用于silverlight的useful algorithm implementations/.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,它还可以显示Bing地图。它是开源的,你可以在那里了解你需要的东西(或者只是使用它们,因为它们已经存在于SDK中)。请参阅示例中的Utilities示例选项卡。

0

正如我已经提到:看看this page以获得更多有关您的问题的信息。在那里你会找到一个公式,Javascript代码和一个Excel样本,用于根据给定的距离和从起始点的方位计算目的地点(请参见标题)。

将代码“转换”到c#-world应该不难。

12

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

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

+0

哦,没有注意到之前。 Thanx – Beachwalker 2012-10-03 20:51:42

+0

API正在变得越来越大!不知道那个,我在我自己的公共库中添加了一个Haversine实现来支持我的项目。猜猜我可以删除它知道,甜! – Depechie 2013-02-06 11:56:48

+1

Windows应用商店应用似乎不支持... – LowDev1 2013-04-29 17:17:07