创建一个应用程序,在给定中心纬度/经度坐标的情况下创建任意半径的圆。我需要做的是获取初始纬度/经度坐标和半径并计算圆的点并将它们添加到字典列表中。
这是我到目前为止所做的事情,但有了这个,我得到一个错误,说“已经添加了具有相同密钥的项目”#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);
有人能指出我正确的方向吗?
答案 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>
。