2009-03-29 14 views
3

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

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

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

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

+0

Это будет радианы. Все, что работает с pi в углах, - это радианы. –

+0

Большое спасибо Пит. – Ben

ответ

0

Найдено этого (здесь: 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 

Будет радиальная в радианах или градусах?

Редактировать:

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

1

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

Here's KML on Google maps (Из образцов Google KML) проверьте «Google Campus - Polygons» раздел в содержании.

+0

У меня очень ограниченный опыт работы с KML, но будет ли это работать со статическими картами? – Ben

+0

Вы можете передать файл KML в качестве параметра статической карты. –

1

В (я думаю) каждый язык, который я знаю, радианы. Обратите внимание: я думаю, что ваш примерный код дает вам координаты на основе сферы, а не на WGS84. Вот Java code for converting between co-ordinate systems.

2

я реализовал и протестировал его в 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); 
    } 
+0

Он работает с точностью 80% по сравнению с расстоянием Великого круга –

1

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