给定中心纬度/长度和半径的圆坐标

时间:2015-02-26 19:37:55

标签: c#

创建一个应用程序,在给定中心纬度/经度坐标的情况下创建任意半径的圆。我需要做的是获取初始纬度/经度坐标和半径并计算圆的点并将它们添加到字典列表中。

这是我到目前为止所做的事情,但有了这个,我得到一个错误,说“已经添加了具有相同密钥的项目”#39;这让我相信它并没有真正正确地转换圆形坐标。

private const double EARTH_RADIUS_NM = 3437.670013352;

private void plot(double lat, double lon, double radius)
{
    var coords = new Dictionary<double, double>();

    lat = ConvertToRadians(lat);
    lon = ConvertToRadians(lon);
    double d = radius / EARTH_RADIUS_NM;
    for(int x = 0; x <= 360; x++)
    {
        double brng = ConvertToRadians(x);
        var latRadians = Math.Asin(Math.Sin(lat) * Math.Cos(d) + Math.Cos(lat) * Math.Sin(d) * Math.Cos(brng));
        var lngRadians = lon + Math.Atan2(Math.Sin(brng) * Math.Sin(d) * Math.Cos(lat), Math.Cos(d) - Math.Sin(lat) * Math.Sin(latRadians));

        coords.Add(latRadians, lngRadians);
    }
}

public double ConvertToRadians(double angle)
{
    return (angle * Math.PI) / 180;
}

使用示例:

plot(33.9331486, -118.4320114, 0.5);

有人能指出我正确的方向吗?

2 个答案:

答案 0 :(得分:4)

您正确输入坐标。问题是Dictionary不是用于数据存储的正确数据类型。圆圈将始终在y轴的正负高度上达到相同的X坐标。

您需要创建一个简单的类来存储这两个坐标,并创建它们的列表:

public class Coordinate 
{
    public double Lat { get; set; }
    public double Lon { get; set; }

    public Coordinate(double lat, double lon) 
    {
        this.Lat = lat;
        this.Lon = lon;
    }
}

然后在你的方法中,var coords = new List<Coord>();。然后,您现在正在分配它们,只需执行以下操作:

coords.Add(new Coordinate(lat, lon));

答案 1 :(得分:0)

你不应该使用Dictionary<,>,因为它不允许两个具有相同第一坐标的点。

请改用List<Tuple<double, double>>List<Point>