Рассчитать GPS-координаты, чтобы сформировать радиус заданного размера - PullRequest
9 голосов
/ 26 февраля 2010

Я придумал метод, который берет координату и диапазон (в милях) и возвращает список координат, которые образуют круг вокруг начала координат. Кажется, я достиг некоторого прогресса в этом, но у меня есть проблема с уменьшением диапазона.

private const Double LAT_MILE = 0.0144839;
private const Double LONG_MILE = 0.0190693;

public static List<Gps.Coordinate> GetRadius(Double OriginLatitude, Double OriginLongitude, Double Range, int Points)
{
    List<Gps.Coordinate> Result = new List<Coordinate>();

    //insert a new point
    for (int i = 0; i < Points; i++)
    {
        Result.Add(new Gps.Coordinate()
        {
            Latitude = ((Range * LAT_MILE) * System.Math.Cos(i)) + OriginLatitude,
            Longitude = ((Range * LONG_MILE) * System.Math.Sin(i)) + OriginLongitude
        });
    }

    //sort using nearest neighbor
    return SortCoords(ref Result);
}

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

EDIT: Я должен отметить, я ужасен в математике:)

Ответы [ 3 ]

5 голосов
/ 26 февраля 2010

посмотрите на это (включая пример кода): http://www.movable -type.co.uk / scripts / latlong.html

«Сферический закон косинусов» дает вам расстояние между двумя координатами. должна быть возможность изменить это, чтобы дать вам координаты вокруг указанного центра и указанного радиуса (расстояния).

1 голос
/ 26 февраля 2010

Вместо того, чтобы определять LONG_MILE как константу, вы должны вычислить ее внутри GetRadius функция: LONG_MILE = LAT_MILE / cos(OriginLatitude*PI/180.0)

Кроме того, выглядит немного странно, что вы берете sin() и cos() вашего целого числа индекс i. Если вы собираетесь генерировать точки с интервалом в 1 радиан, центральная точка, это будет работать. Но я подозреваю, что вы можете захотеть что-то более похожее на

angle_radians = i * 2.0*PI/Points; 

и заменить sin(angle_radians) на sin(i) и т. Д.

0 голосов
/ 26 февраля 2010

Выполните вычисления в сферическом координатном пространстве, а затем преобразуйте их в широту / долготу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...