2014-01-25 4 views
0

Я работаю над приложением Windows Phone 8 и выполняю поиск по местоположению. Я использую этот example, чтобы найти мое текущее местоположение, которое работает нормально. У меня также есть список широт и долготы. То, что я хочу сделать, это узнать из этого списка координат широты и долготы, который ближе всего к моему текущему местоположению. Я также могу изменить это, чтобы узнать ближайшие 5 или 10 или что-то в этом роде.Как определить ближайшую координату

Похоже, это должно быть легко узнать, но я не знаю, как это сделать.

Как узнать, какие координаты ближе всего к другому?

Любая помощь будет оценена по достоинству.

Спасибо!

+0

вы можете рассчитать расстояние между двумя точками (имеющие их долготы и широты), используя [Haversine] (HTTP : //en.wikipedia.org/wiki/Haversine_formula). После того, как вы подсчитали, что довольно легко сортировать свои точки по расстоянию до желаемого места. – Yuriy

ответ

1

Фактическое расстояние требует геодезических функций:

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

Это довольно дорого, так что вы хотите, чтобы первый фильтр с другой функцией, которая поможет вам обрезки вниз кандидатов и заказав их позже в вашем коде ,

В этом известном проходе вы можете использовать евклидово расстояния:

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

Это два прохода подход значительно снижает затраты вычислений (от факторов 10000, если необходимо) и описывается в Программировании Pearls (глава 8):

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

+1

Могу ли я не просто использовать http://msdn.microsoft.com/en-us/library/system.device.location.geocoordinate.getdistanceto(v=vs.110).aspx и отсортировать результаты по возрастанию? – irldev

+0

Абсолютно верно! Вы даже должны, потому что эта реализация, безусловно, лучше, чем все, что вы можете реализовать. Но «внутри» он все равно будет основываться на сложной тригонометрии. Вышеуказанный двухпроходный подход - это улучшение производительности, которое может или не может быть применено к вашему делу. – pid

+0

Спасибо, я использовал этот метод GetDistanceTo и, похоже, работает нормально. – irldev

0

Поскольку ваши расстояния, вероятно, очень короткий (например, < 25 км), вы можете использовать дистанционное приближение по сравнению с гаверсинусом для мул. Я бы предложил использовать теорему Пифагора на равноугольной проекции, которая исправит кривизну вдоль долготы. Ниже представлена ​​реализация 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; 
} 
+0

не уверен, почему кто-то будет склонен без объяснения причин, поскольку это, как правило, исключенный подход на короткие расстояния, и я адаптировал его к C#, используя встроенную библиотеку геокодирования. –

0

Радиус земли на экваторе = 6 371 км. Экватор разделен на 360 градусов долготы, поэтому каждая степень на экваторе составляет приблизительно 111,32 км. Отход от экватора в направлении полюса это расстояние уменьшается до нуля на pole.To вычислить расстояние на разных широтах умножить на косинус широты

3 знаков после запятой, 0,001 градусов aproximates до 111,32 метров в экватору
96.41meters при 30 ° N/S
78.71 метров на 45 градусов Н/S
55,66 метров на 60 градусов Н/S
28,82 метров на 75 градусов Н/С

Для малых расстояний (100 метров) теорему Пифагора можно использовать на equirectangular projection для расчета расстояния. Это менее сложно, чем Haversine или Spherical Law of Cosines, но все же допускает сходимость к полюсам.

var R = 6371; // км
лат/LNG в радианах

В псевдокоде, как я не знаю, C#

var x = (lng2-lng1) * cos((lat1+lat2)/2); 
var y = (lat2-lat1); 
var d = sqrt(x*x + y*y) * R; 
Смежные вопросы