我有一个 bing 地图和两个点:Point1,Point2,我想计算这两个点之间的距离?那可能吗?如果我想在point1和point2之间以及point2附近的路径的三分之二上放一个圆圈……我该怎么做?
4 回答
Microsoft 有一个GeoCoordinate.GetDistanceTo Method,它使用 Haversine 公式。
对我来说,其他实现对于太小的距离返回 NaN。我还没有遇到内置功能的任何问题。
参见Haversine甚至更好的Vincenty公式如何解决这个问题。
以下代码使用 hasrsines 方式获取距离:
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
}
你可以在这里找到一个有信息的好网站。
如果您需要更准确的结果或想要进行一些数学运算(例如将圆转换为类圆/投影),您可以使用地理库进行(重新)投影和计算操作。看看DotSpatial或SharpMap以及那里的示例/单元测试/源...这可能有助于解决您的问题。
无论如何,如果您知道测地线距离和方位,您还可以计算得到的目标位置(圆心)在哪里,例如参见Vincenty算法的“直接问题”。这里还有一些对 silverlight/.net有用的算法实现
您也可以考虑在GIS Stackexchange上发布您的问题。他们讨论像您这样的 GIS 相关问题。查看从点计算 lat long x-miles 的问题(因为您现在已经知道整个距离)或查看此处关于距离计算的讨论。这个问题与如何在给定距离的线上绘制一个点有关,并且几乎相同(因为你需要一个中心和半径)。
另一种选择是使用ArcGIS API for Silverlight,它也可以显示 Bing 地图。它是开源的,你可以在那里学习你需要的东西(或者只是使用它们,因为它们已经存在于 SDK 中)。请参阅示例中的实用程序示例选项卡。
正如我已经提到的:查看此页面以获取有关您的问题的更多信息。在那里,您会找到一个公式、Javascript 代码和一个 Excel 示例,用于按给定距离和从起点开始的方位计算目的地点(参见那里的标题)。
将代码“转换”到您的 c# 世界应该不难。