2016-07-12 3 views
1

У меня есть набор точек долготы широты. Если бы я хотел проверить, будет ли новая точка в пределах х метров любой из существующих точек, это возможно? Было бы лучше, если я буду использовать этот способ?Координаты карты C#

ForEach(Coordinate coord in Coordinates) 
{ 
    var distance = GeoCoordinate.GetDistance(lat,lon); 
    if(distance <= x) 
    { 
     addToQualifyingList(coord); 
    } 
} 

и сравнить новую координату с каждой точкой в ​​комплекте и проверить, чтобы она находилась в пределах х метров?

ответ

2

Вот метод для вычисления расстояния между 2 точками (LAT1, lon1 и LAT2, lon2)

public enum DistanceUnit { miles, kilometers, nauticalmiles } 
public double GetDistance(double lat1, double lon1 , double lat2 , double lon2, DistanceUnit unit) 
{ 
    Func<double, double> deg2rad = deg => (deg * Math.PI/180.0); 
    Func<double, double> rad2deg = rad => (rad/Math.PI * 180.0); 
    double theta = lon1 - lon2; 
    double dist = Math.Sin(deg2rad(lat1)) * Math.Sin(deg2rad(lat2)) + Math.Cos(deg2rad(lat1)) * Math.Cos(deg2rad(lat2)) * Math.Cos(deg2rad(theta)); 
    dist = Math.Acos(dist); 
    dist = rad2deg(dist); 
    dist = dist * 60 * 1.1515; 

    if (unit == DistanceUnit.kilometers) 
    { 
     dist = dist * 1.609344; 
    } 
    else if (unit == DistanceUnit.nauticalmiles) 
    { 
     dist = dist * 0.8684; 
    } 
    return (dist); 
} 

Для того, чтобы определить, все координаты с расстоянием менее 1 км:

List<Coordinate> result = Coordinates.Where(x => GeoCoordinate.GetDistance(lat,lon, x.lan, x.lon, DistanceUnit.kilometers) < 1).ToList(); 
0

Широта и Долгота - это то, что необходимо знать положение на земле или любой другой объект в форме сферы. Они даются в степени от их нулевой линии/точки.

http://www.movable-type.co.uk/scripts/latlong.html

имеет решение в Java

> var R = 6371e3; // metres 
>  var φ1 = lat1.toRadians(); 
>  var φ2 = lat2.toRadians(); 
>  var Δφ = (lat2-lat1).toRadians(); 
>  var Δλ = (lon2-lon1).toRadians(); 
> 
>  var a = Math.sin(Δφ/2) * Math.sin(Δφ/2) + 
>    Math.cos(φ1) * Math.cos(φ2) * 
>    Math.sin(Δλ/2) * Math.sin(Δλ/2); 
>  var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
> 
>  var d = R * c; 

Видимо, это это один из лучших решений для малых расстояний.

Вы должны просто скопировать и вставить его в C#, вы должны изменить имена переменных.

+0

возможно дубликат с http://stackoverflow.com/questions/365826/calculate-distance-between-2-gps-coordinates?rq=1 – gismo

+0

@MikaelPuusaari У него либо есть фиксированная точка для проверки, уже рассчитанная и спрашивает, может ли он сохранить результаты в списке, или он спрашивает, как правильно рассчитать расстояние между точками. Что более вероятно для вас? – gismo

+0

Во-первых: Он уже получил свой ответ. 2. У него был список результатов в его примере – gismo

Смежные вопросы