计算GPS坐标以形成给定大小的半径

时间:2010-02-26 19:12:08

标签: c# gps

我想出了一个方法,它采用坐标和范围(以英里为单位)并返回围绕原点形成圆的坐标列表。我似乎已经取得了一些进展,但我有一个问题,让范围部分失效。

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);
}

我发现的问题是,我用来表示距离以英里为单位的常数会根据位置而改变。有没有人有任何解决这个问题的建议,或者更好的捕鼠器?

编辑: 我应该注意,我在数学上很可怕:)。

3 个答案:

答案 0 :(得分:5)

看看这个(包含示例代码):http://www.movable-type.co.uk/scripts/latlong.html

“余弦球面定律”给出了两个坐标之间的距离。应该可以修改它以给出围绕指定中心和指定半径(距离)的坐标。

答案 1 :(得分:1)

不是将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)

答案 2 :(得分:0)

在球面坐标空间中进行计算,然后将其转换为纬度/经度。