计算一个坐标是不是在另一个坐标范围内
Posted
技术标签:
【中文标题】计算一个坐标是不是在另一个坐标范围内【英文标题】:Calculate whether one coordinate is within range of another计算一个坐标是否在另一个坐标范围内 【发布时间】:2011-04-10 12:31:51 【问题描述】:我正在编写一个需要感知位置的 Windows Phone 7 应用。具体来说,我希望在手机进入特定位置的(固定)范围内(例如 0.5 英里)时运行一些(c#)代码。我拥有内存中物理位置的所有纬度/经度数据。我将使用Geo Coordinate Watcher class 来获取设备的当前坐标。现在唯一的技巧是计算用户是否在任何位置的范围内。
谢谢!
更新:正如所承诺的,这里是使用Spherical Law of Cosines 计算距离方法的小C# 函数。希望它可以帮助别人。注意:我正在编写一个 Windows Phone 7 应用程序,因此使用了 GeoLocation 类。如果您使用的是“常规”c#,那么您可以更改函数以接受函数所需的两个坐标对。
internal const double EarthsRadiusInKilometers = 6371;
/// <summary>
/// The simple spherical law of cosines formula
/// gives well-conditioned results down to
/// distances as small as around 1 metre.
/// </summary>
/// <returns>Distance between points "as the crow flies" in kilometers</returns>
/// <see cref="http://www.movable-type.co.uk/scripts/latlong.html"/>
private static double SpericalLawOfCosines(GeoCoordinate from, GeoCoordinate to)
return ( Math.Acos (
Math.Sin(from.Latitude) * Math.Sin(to.Latitude) +
Math.Cos(from.Latitude) * Math.Cos(to.Latitude) *
Math.Cos(to.Longitude - from.Longitude)
) * EarthsRadiusInKilometers)
.ToRadians();
/// <summary>
/// To a radian double
/// </summary>
public static double ToRadians(this double d)
return (Math.PI / 180) * d;
【问题讨论】:
出于好奇,您为什么不使用更简单(更快)的余弦空间定律,在您访问haversine 的Java 源代码的同一页面上提供?作者指出,对于> 1m的距离,推荐且准确。 我刚刚重读了这篇文章,你是对的,余弦球定律更简单。事实上,我实现了两者以查看它是如何完成的 - 我也会发布该代码。谢谢... 【参考方案1】:既然您使用的是 GeoCoordinate,为什么当它已经存在于该类中时自己实现它?
var distance = coordinateA.GetDistanceTo(coordinateB);
(其中坐标A和B的类型为地理坐标)
请参阅MDSN documentation。
【讨论】:
我不知道它在那里。我喜欢***...谢谢! 哇!我也不知道它在里面! 在 .NET Core 中不存在。然而。【参考方案2】:通过快速搜索找到this page,其中包含计算地球上两点之间距离的公式。直接从链接页面引用:
Haversine formula:
R = earth’s radius (mean radius = 6,371km)
Δlat = lat2− lat1
Δlong = long2− long1
a = sin²(Δlat/2) + cos(lat1).cos(lat2).sin²(Δlong/2)
c = 2.atan2(√a, √(1−a))
d = R.c
(Note that angles need to be in radians to pass to trig functions).
只需插入您当前位置和另一个位置的纬度/经度值,您应该会得到d
,即这两点之间的距离(以公里为单位)。
【讨论】:
这种方法是可靠的,只是一定要了解它的局限性。这无论如何都不准确,如果你在山区,那么剧烈的海拔变化也会发挥作用。不过,对于大多数用途来说,这应该没问题。 谢谢大家。暂时不考虑海拔问题,关于准确性的限制是什么?你是说我想走的越细粒度越不准确?即 50 英里的范围相当准确,但 50 米的范围不是很准确? 这是一个很棒的圆计算。计算本身没有错误,你估计的位置。您的 GPS 接收器知道您在哪里 +/- 一些量(取决于接收器、卫星数量等)。比方说,例如,它是 +/-25m。好吧,如果您说的是 50 英里的距离,那么按百分比计算,它并没有那么远。如果你说的是 50m 的距离,那么这是一个非常大的距离。 非常感谢您的澄清。翻译完上述内容后,我将尝试发布 c#,以便其他人可以从中受益..以上是关于计算一个坐标是不是在另一个坐标范围内的主要内容,如果未能解决你的问题,请参考以下文章