我正在使用Windows Phone 8应用,我正在进行基于位置的搜索。我正在使用此example来查找我当前正常工作的位置。我还有一份纬度和经度坐标列表。我想要做的是从这个纬度和经度坐标列表中找出,它最接近我当前的位置。我也可能修改它来找出最近的5或10或类似的东西。
听起来应该很容易找到,但我不知道该怎么做。
如何找出哪个坐标最接近另一个?
任何帮助都将不胜感激。
谢谢!
答案 0 :(得分:1)
实际距离需要测地函数:
http://en.wikipedia.org/wiki/Great-circle_distance
这是非常昂贵的,所以你想先用另一个函数进行过滤,这个函数可以帮助你减少候选人,并在你的代码中稍后对它们进行排序。
在此前通行证中,您可以使用欧几里德距离:
http://en.wikipedia.org/wiki/Euclidean_distance
这种双程方法大大降低了计算成本(如果需要,可以减少10,000倍),并在编程珍珠(第8章)中进行了描述:
答案 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;