给定中心点的纬度/经度和半径,创建圆形坐标

9
我正在创建一个应用程序,以创建任何半径的圆,给定中心纬度/经度坐标。 我需要做的是获取初始纬度/经度坐标和半径,计算圆的点并将它们添加到字典列表中。
以下是我目前所拥有的代码,但是出现了错误,提示“已经添加了具有相同键的项”,这让我认为它实际上没有正确地转换圆形坐标。
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);

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


错误在哪一行被抛出的? - krillgar
@krillgar coords.Add(latRadians, lngRadians); -> coords.Add(latRadians, lngRadians); - Nicholas
为什么这是一个字典?肯定应该是一个点列表,这样你就可以绘制一个圆了吧? - Mike Wise
你确定这个算法正确吗?它似乎只在原点附近绘制。就像缺少一个纬度、经度偏移量一样。 - spy
必须在绘图之前将弧度转换为度数。问题已解决。原文链接:http://www.plux.co.uk/converting-radians-in-degrees-latitude-and-longitude/ - spy
我可以知道这个算法的任何参考资料吗? - Thida Tun
2个回答

6
您输入的坐标是正确的。问题在于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

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

应该使用类似于 List<Tuple<double, double>>List<Point> 的东西。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接