尝试在纬度和经度点周围绘制一个正方形

本文关键字:正方形 一个 绘制 周围 纬度 经度 | 更新日期: 2023-09-27 17:57:12

我正在开发一个C#脚本来做一些映射。我正在研究一个函数,其中给了我一个纬度和经度、一个距离和一个旋转角度。

然后我想创建一个矩形,它具有传入的距离的宽度(长度取决于其他内容),该正方形的中心将具有纬度和经度点,并且可以从 0 - 360 旋转任何角度。

传入的距离双精度可以以英尺为单位,也可以以米为单位,单位使用 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;
    }

任何帮助都非常感谢:)

尝试在纬度和经度点周围绘制一个正方形

首先,我假设你有一个关于地球半径的"小"正方形。在这种情况下,如果距离是边的长度,角度是旋转角度,你应该计算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)