IHAVE一个兵地图,和两点:点1,点2,我想计算这两个点之间的距离? 那可能吗? 如果我想提出一个圆上的两个点1第三和点2和近点2之间的路径...我如何能做到吗?
Answer 1:
见半正弦波或甚至更好的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
}
你可以找到相关信息的好发部位在这里 。
Answer 2:
微软有一个GeoCoordinate.GetDistanceTo方法 ,它使用haversine公式。
对我来说,其他实现收益为NaN的是太小的距离。 我还没有碰到有内置的功能还没有任何问题。
Answer 3:
如果你需要更精确的结果,您可以使用(再)投影和计算操作的地理库或想要做一些数学运算(例如,变换了一圈到sperioid /投影)。 看看DotSpatial或SharpMap中 ,样品/单元测试/来源有...这可能有助于解决你的问题。
无论如何,如果你知道的测地距离和轴承还可以计算,其中产生的目标位置(您圆的中心),例如,见“直接问题” Vincenty的算法。 这里也有一些有用的算法实现的Silverlight / .NET
你也可以考虑在发布您的问题GIS Stackexchange 。 他们讨论了像你这样的GIS相关的问题。 看看对这个问题从点计算经纬度长×英里 (因为你已经知道整个距离现在),或在这里看到有关的讨论距离计算 。 这个问题是有关这个问题如何绘制线路上的点在给定的距离 ,并几乎是相同的(因为你需要一个圆心和半径)。
另一种选择是使用的ArcGIS API Silverlight的也可以显示Bing地图。 它是开源的,你可以学到你需要的任何东西(或者只是使用他们,因为他们已经在SDK中存在)。 见样品中的实用程序的示例标签。
Answer 4:
正如我已经提到:看看这个页面来获得关于你的问题更多的相关信息。 在那里,你会发现一个公式,Javascript代码和给定距离计算目标点和起始点轴承(见标题有)一个Excel样品。
它不应该是困难的“改造”的代码到C#-world。