2010-02-26 95 views
9

我想出了一种方法,它需要一个坐标和一个范围(以英里为单位),并返回围绕原点形成一个圆的坐标列表。我似乎已经取得了一些进展,但我有一个问题,就是让范围部分下降。计算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); 
} 

我发现的问题是,我使用的是告诉英里取决于位置度变化的距离不变..有没有人有完全解决这个问题,还是一个更好的捕鼠器任何建议?

编辑: 我要指出,我在数学:)

+1

请记住,如果您在一张方格纸上绘制它们的经纬度,那么从固定点开始指定一个恒定的距离会看起来像是一个椭圆而不是一个圆。这是因为(除赤道外)一单位纬度所涵盖的距离与一单位纬度不同。 – JonnyBoats 2010-02-26 19:24:54

回答

1

而不是定义LONG_MILE为常数,你应该计算它的 GetRadius函数中:LONG_MILE = LAT_MILE/cos(OriginLatitude*PI/180.0)

此外,它看起来有点怪异,你把你的整数 指数isin()cos()。如果您的目的是以围绕 中心点的1弧度间隔生成点,则它将起作用。但我怀疑你可能想要的东西更像

angle_radians = i * 2.0*PI/Points; 

并替换为sin(angle_radians)sin(i)

0

做你的球计算坐标空间,然后将其转换为纬度/经度。