用于通过距离和方位从已知位置找到点坐标的地理算法

时间:2009-03-29 18:10:52

标签: coordinates distance bearing

我想使用Google地图静态API来显示带有指示边界的路径叠加层的地图。

AFAICT静态API不支持多边形,所以我打算通过使用路径绘制边界来避免这种情况。

要做到这一点,我需要确定绘制直线(路径)之间的点;所以我想要一个算法,它返回一个给定方位和距离已知点的距离(即WGS84坐标)。

任何人都可以指出我这样的算法。最好是在C#中,但其他语言是可以接受的吗?

5 个答案:

答案 0 :(得分:2)

我在C#中实现并测试了它,使用Degrees作为输入/输出而不是radians:

    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 :(得分:1)

您可以在KML文件上绘制多边形,然后在Google地图上显示KML。

Here's KML on Google maps(来自Google KML示例)查看内容中“Google Campus - Polygons”部分。

答案 2 :(得分:1)

在(我认为)我认识的每种语言中,弧度。请注意,我认为您的示例代码为您提供基于球体的坐标,而不是WGS84。这是Java code for converting between co-ordinate systems

答案 3 :(得分:1)

看看Gavaghan Geodesy C#库,它应该是您正在寻找的东西。它是免费的。

答案 4 :(得分:0)

找到这个(这里:http://williams.best.vwh.net/avform.htm#LL):

点{lat,lon}是距离点1的tc径向距离d out:

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