我正在研究一个C#脚本来做一些映射。我有一个功能,我正在给我一个纬度和经度,一个距离和一个旋转角度。
然后我要创建一个矩形,它具有传入的距离的宽度(长度取决于其他东西),这个方块的纬度和经度点位于它的中心,并且可以从0开始旋转任何角度 - 360。
传入的距离double可以是英尺,也可以是米,单位是使用isMetric布尔值确定的。
我认为问题与我正在使用的公式有关,因为当它从4个点绘制正方形时,正方形的大小太大。当你将角度传递给0.0时,旋转角似乎也设定为45度。
这是我到目前为止所做的:
参数:纬度,经度(十进制格式),(双倍)距离,(双倍)角度
double diagonal = Math.Sqrt(Math.Pow((distance / 2), 2) * 2); //a^2 + b^2 = d^2
if (isMetric) //Convert meters to km.
{
diagonal = diagonal / 1000;
}
else //Convert feet to km.
{
diagonal = diagonal * 0.0003048;
}
MessageBox.Show("Diagonal: " + diagonal, "DEBUG"); //DEBUG
double pt1_lat = latDistance(diagonal * Math.Sin(angle), latitude);
double pt1_long = longDistance(diagonal * Math.Cos(angle), latitude, longitude);
double pt2_lat = latDistance(diagonal * Math.Cos(angle), latitude);
double pt2_long = longDistance(-diagonal * Math.Sin(angle), latitude, longitude);
double pt3_lat = latDistance(-diagonal * Math.Sin(angle), latitude);
double pt3_long = longDistance(-diagonal * Math.Cos(angle), latitude, longitude);
double pt4_lat = latDistance(-diagonal * Math.Cos(angle), latitude);
double pt4_long = longDistance(diagonal * Math.Sin(angle), latitude, longitude);
其余方法如下:
private double latDistance(double distance, double latitude)
{
return latitude + degToRad(distance / EARTH_RADIUS);
}
private double longDistance(double distance, double latitude, double longitude)
{
return longitude + degToRad(distance / EARTH_RADIUS / Math.Cos(latitude));
}
private double degToRad(double degrees)
{
return (degrees * Math.PI) / 180;
}
public double radToDeg(double radians)
{
return (180.0 * radians) / Math.PI;
}
非常感谢任何帮助:)
答案 0 :(得分:0)
首先,我假设你有一个关于EARTH半径的“小”方格。在这种情况下,如果distance是边的长度而angle是旋转角,你应该计算dx,dy,这是一个顶点相对于正方形中心的笛卡尔坐标:
dx = 0.5 * Math.Sqrt(2.0) * distance * Math.Cos(angle+0.25*Math.PI);
dy = 0.5 * Math.Sqrt(2.0) * distance * Math.Sin(angle+0.25*math.PI);
(这里我假设角度是弧度,否则你应该转换它) 其他3个顶点的笛卡尔坐标分别为:( - dy,dx),( - dx,-dy),(dy,-dx)
要将笛卡尔坐标转换为(经度,纬度),您可以使用公式:
pt_lat = latDistance(latitude,dy)
pt_long = longDistance(dx,latitude,longitude)