Геоалгоритм для нахождения координат точки из известного местоположения по расстоянию и азимуту - PullRequest
3 голосов
/ 29 марта 2009

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

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

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

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

Ответы [ 5 ]

2 голосов
/ 19 июня 2009

Я реализовал и протестировал его в 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);
    }
1 голос
/ 20 июня 2009

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

1 голос
/ 29 марта 2009

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

1 голос
/ 29 марта 2009

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

Вот KML на картах Google (из примеров Google KML) отметьте в содержании раздел "Google Campus - Polygons" .

0 голосов
/ 31 марта 2009

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

Точка {широта, долгота} - это расстояние d в радиальной плоскости от точки 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

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

Edit:

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

...