计算一个坐标是否在另一个坐标的范围内

6
我正在编写一款Windows Phone 7应用程序,需要了解当前位置。具体来说,当手机进入特定位置的固定范围内时(如0.5英里),我想要运行一些(c#)代码。我已经将所有物理位置的纬度/经度数据保存在内存中。我将使用Geo Coordinate Watcher class 来获取设备的当前坐标。现在唯一的问题是如何计算用户是否在任何位置的范围内。

谢谢!

更新:如承诺所述,这是一个使用余弦定理球面法计算距离的小型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;
    }

出于好奇,为什么你没有使用同一页面提供的更简单(而且更快)的余弦球面定律来计算距离呢?作者指出,对于大于1米的距离,这种方法是推荐且准确的。 - ctacke
我刚刚重新阅读了文章,你说得对,球面余弦定理更简单。事实上,我实现了两个算法来比较它们的运行效果 - 我也会发布那段代码。谢谢... - will
2个回答

6

既然你正在使用GeoCoordinate,为什么不直接使用该类中已经存在的功能,而要自己实现呢?

var distance = coordinateA.GetDistanceTo(coordinateB);

(其中coordinateA和B的类型为GeoCoordinate)

请参阅MDSN文档


1
我不知道这里有这个。我喜欢stackoverflow...谢谢! - will
哇!我也不知道这里面还有这个! - Dylan Hayes
在 .NET Core 中不存在。但是还没有。 - mshsayem

3

快速搜索找到了这个页面,其中有一个计算地球上两点之间距离的公式。直接引用该链接页面上的内容:

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,即这两个点之间的距离(以公里为单位)。


1
这个方法很可靠,只要确保理解它的局限性。它并不是完全准确的,如果你在山区,那么剧烈的高度变化也会影响结果。但对于大多数情况来说,这应该已经足够了。 - Brad
谢谢大家。暂且不考虑高度问题,关于精度方面有哪些限制?你们是说我想要更细的粒度,那么它就越不准确吗?例如,50英里的范围相当准确,但50米的范围就不太准确了? - will
1
这是一个很棒的圆形计算。计算本身没有错误,但你的估计位置可能有误。你的GPS接收器知道你的位置,误差范围在+/-一定数量(取决于接收器、卫星数量等)。举个例子,假设它是+/-25米。如果你要计算50英里的距离,那么从百分比上来说,误差并不大。但如果你要计算50米的距离,那么误差就非常大了。 - ctacke
非常感谢您的澄清。我会尽快翻译上面的内容并发布C#代码,以便其他人也能受益。 - will

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接