繁体   English   中英

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

[英]Trying to draw a square around a latitude and longitude point

我正在使用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;
    }

任何帮助是极大的赞赏 :)

首先,我假设您相对于EARTH半径有一个“小”正方形。 在这种情况下,如果距离是边的长度,角度是旋转角度,则应计算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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM