Вычислить, находится ли одна координата в пределах диапазона другой - PullRequest
5 голосов
/ 10 сентября 2010

Я пишу приложение для Windows Phone 7, которое должно учитывать местоположение.В частности, я хочу, чтобы какой-нибудь (c #) код запускался, когда телефон находится в пределах (фиксированного) диапазона определенного местоположения, скажем, 0,5 мили.У меня есть все данные широты / долготы для физических мест в памяти.Я буду использовать класс Geo Coordinate Watcher для получения текущих координат устройств.Теперь единственная хитрость - вычислить, находится ли пользователь в зоне действия любого из местоположений.

Спасибо!

Обновление : как и обещано, вот небольшая функция 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;
    }

Ответы [ 2 ]

5 голосов
/ 02 февраля 2011

Поскольку вы используете GeoCoordinate, зачем реализовывать его самостоятельно, если он уже присутствует в этом классе?

var distance = coordinateA.GetDistanceTo(coordinateB);

(где координаты A и B имеют тип GeoCoordinate)

См. Документация MDSN .

2 голосов
/ 10 сентября 2010

Быстрый поиск вызвал эту страницу с формулой для вычисления расстояния между двумя точками на земле.Цитируется непосредственно со связанной страницы:

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, которое является расстоянием в километрах между этими двумя точками.

...