如何确定最近的坐标

时间:2014-01-25 12:15:30

标签: c# windows-phone-8 geolocation location

我正在使用Windows Phone 8应用,我正在进行基于位置的搜索。我正在使用此example来查找我当前正常工作的位置。我还有一份纬度和经度坐标列表。我想要做的是从这个纬度和经度坐标列表中找出,它最接近我当前的位置。我也可能修改它来找出最近的5或10或类似的东西。

听起来应该很容易找到,但我不知道该怎么做。

如何找出哪个坐标最接近另一个?

任何帮助都将不胜感激。

谢谢!

3 个答案:

答案 0 :(得分:1)

实际距离需要测地函数:

http://en.wikipedia.org/wiki/Great-circle_distance

这是非常昂贵的,所以你想先用另一个函数进行过滤,这个函数可以帮助你减少候选人,并在你的代码中稍后对它们进行排序。

在此前通行证中,您可以使用欧几里德距离:

http://en.wikipedia.org/wiki/Euclidean_distance

这种双程方法大大降低了计算成本(如果需要,可以减少10,000倍),并在编程珍珠(第8章)中进行了描述:

http://www.cs.bell-labs.com/cm/cs/pearls/

答案 1 :(得分:0)

由于您的距离可能非常短(例如,<25km),因此您可以使用距离近似值与Haversine公式。我建议在Equirectangular投影上使用毕达哥拉斯定理,它将校正沿经度线的曲率。下面是C#实现:

// Convert Degress to Radians
//
private static double Deg2Rad( double deg ) 
{
   return deg * Math.PI / 180;
}

// Get Distance between two lat/lng points using the PythagorsTheorm (a*a = (b*b + c*c))
// on an equirectangular projection
//
private double PythagorasEquirectangular( Geoposition coord1, Geoposition coord2 )
{
    double lat1 = Deg2Rad( coord1.Coordinate.Latitude );
    double lat2 = Deg2Rad( coord2.Coordinate.Latitude );
    double lon1 = Deg2Rad( coord1.Coordinate.Longitude );
    double lon2 = Deg2Rad( coord2.Coordinate.Longitude );

    double R = 6371; // km
    double x = (lon2-lon1) * Math.Cos((lat1+lat2)/2);
    double y = (lat2-lat1);
    double d= Math.Sqrt(x*x + y*y) * R;
    return d;
}

// Find the closest point to your position
//
private Geoposition NearestPoint( List<Geoposition> points, Geoposition position  )
{
    double min_dist = 999999;
    Geoposition closest = null;

    // Calculate distance of each point in the list from your position
    foreach ( Geoposition point in points )
    {
        double dist = PythagorasEquirectangular( position, point );

        // keep track of which point is the current closest.
        if ( dist < min_dist )
        {
            min_dist = dist;
            closest = point;
        }
    }

    // return the closest point
    return closest;
}

答案 2 :(得分:0)

赤道地球半径= 6,371公里。赤道被划分为360度经度,因此赤道处的每个度数大约为111.32 km。从赤道移向极点,这个距离在极点处减小到零。计算不同纬度的距离乘以纬度的余弦

  

3位小数,0.001度近似值   赤道111.32米   在N / S 30度时96.41米
  N / S 45度78.71米
  55.66米,60度N / S
  在75度N / S时28.82米

对于小距离(100米),可以在equirectangular projection上使用毕达哥拉斯定理来计算距离。这比Haversine或余弦球面定律简单,但仍允许向极点的收敛。

var R = 6371; // km
lat / lng in radians

在伪代码中我不知道C#

var x = (lng2-lng1) * cos((lat1+lat2)/2);
var y = (lat2-lat1);
var d = sqrt(x*x + y*y) * R;