Геоалгоритм нахождения координат точки из известного местоположения по расстоянию и азимуту

Я хотел бы использовать статический API карт Google для отображения карты с наложением пути, указывающим границу.

AFAICT статический API не поддерживает многоугольники, поэтому я намерен обойти это, отрисовывая границу с помощью путей.

Для этого мне нужно определить точки, между которыми нужно провести прямые линии (пути); поэтому мне нужен алгоритм, который возвращает географическое положение (то есть координаты WGS84) с заданным азимутом и расстоянием от известной точки.

Может ли кто-нибудь указать мне на такой алгоритм. Желательно на C #, но допустимы и другие языки?


person Ben Aston    schedule 29.03.2009    source источник
comment
Это будут радианы. Все, что работает с пи в углах, - это радианы.   -  person Pete Kirkham    schedule 29.03.2009


Ответы (5)


Я реализовал и протестировал его на C #, используя градусы в качестве ввода / вывода вместо радианов:

    static readonly double FullCircleDegrees = 360d;
    static readonly double HalfCircleDegrees = FullCircleDegrees / 2d;
    static readonly double DegreesToRadians = Math.PI / HalfCircleDegrees;
    static readonly double RadiansToDegrees = 1 / DegreesToRadians;

    public LatLng GetPointGivenRadialAndDistance(LatLng center, double radius, double azimuth)
    {
        var lat1 = center.Lat * DegreesToRadians;
        var lng1 = center.Lng * DegreesToRadians;
        var lat = Math.Asin( (Math.Sin(lat1) * Math.Cos(radius)) + Math.Cos(lat1) * Math.Sin(radius) * Math.Cos(azimuth * DegreesToRadians));
        var lng = 0d;
        if (Math.Cos(lat) == 0)
        {
            lng = lng1;
        }
        else
        {
            lng = ((lng1 + Math.PI - Math.Asin(Math.Sin(azimuth * DegreesToRadians) * Math.Sin(radius) / Math.Cos(lat1))) % (2 * Math.PI)) - Math.PI;
        }
        return new LatLng(lat * RadiansToDegrees, lng * RadiansToDegrees);
    }
person Jader Dias    schedule 19.06.2009
comment
Он работает с точностью 80% по сравнению с Great Circle Distance. - person Jader Dias; 19.06.2009

Вы можете нарисовать многоугольник в файле KML, а затем отобразить KML на картах Google.

Вот KML на картах Google (из примеров Google KML). Проверьте раздел " Кампус Google - Многоугольники " в содержании.

person Shay Erlichmen    schedule 29.03.2009
comment
У меня очень ограниченный опыт работы с KML, но будет ли это работать со статическими картами? - person Ben Aston; 29.03.2009
comment
Вы можете передать файл KML как параметр статической карты. - person Shay Erlichmen; 29.03.2009

В (я думаю) на всех языках, которые я знаю, в радианах. Обратите внимание, что я думаю, что ваш пример кода дает вам координаты на основе сферы, а не на WGS84. Вот код Java для преобразования между системами координат.

person Jon Bright    schedule 29.03.2009

Взгляните на Gavaghan Geodesy C # библиотека, это должно быть то, что вы ищете. И это бесплатно.

person Igor Brejc    schedule 19.06.2009

Нашел это (здесь: http://williams.best.vwh.net/avform.htm#LL):

Точка {lat, lon} - это расстояние d по радиалу tc от точки 1, если:

lat=asin(sin(lat1)*cos(d)+cos(lat1)*sin(d)*cos(tc))
IF (cos(lat)=0)
    lon=lon1      // endpoint a pole
ELSE
    lon=mod(lon1-asin(sin(tc)*sin(d)/cos(lat))+pi,2*pi)-pi
ENDIF

Радиал будет в радианах или градусах?

Изменить:

радианы = градусы * PI / 180

person Ben Aston    schedule 31.03.2009