纬度/经度地图上的圆半径

发布于 2024-10-09 14:53:40 字数 1034 浏览 3 评论 0原文

我正在尝试在 CloudMade 地图上画一个圆圈。圆心以纬度/经度表示,半径以米为单位。下面是我使用的 JavaScript,但一些测试似乎表明我用于半径的转换给了我一个太短的半径。有人明白我做错了什么吗?

function DrawCircle (center, radius)
{
    var circlePoints = Array();

    with (Math)
    {
        var d = radius/6371000; // radians
        var lat1 = (PI/180) * center.lat(); // radians
        var lng1 = (PI/180) * center.lng(); // radians

        for (var a = 0; a <= 360; a++)
        {
            var tc = (PI/180) * a;
            var y = asin(sin(lat1) * cos(d) + cos(lat1) * sin(d) * cos(tc));
            var dlng = atan2(sin(tc) * sin(d) * cos(lat1), cos(d) - sin(lat1) * sin(y));
            var x = ((lng1 - dlng + PI) % (2 * PI)) - PI ; // MOD function
            var point = new CM.LatLng(parseFloat(y * (180/PI)), parseFloat(x * (180/PI)));
            circlePoints.push(point);
        }

        circle = new CM.Polygon(circlePoints, circleBorderColor, circleBorderWidth, circleBorderOpacity, circleFillColor, circleFillOpacity);
        map.addOverlay(circle);
    }
}

I am trying to draw a circle on a CloudMade map. The center of the circle is expressed in Lat/Lng, while the radius is in meters. Here following is the JavaScript I use, but some tests seem to indictae that the conversion I'm using for the radius gives me a too short radius. Does somebody understand what I', doing wrong?

function DrawCircle (center, radius)
{
    var circlePoints = Array();

    with (Math)
    {
        var d = radius/6371000; // radians
        var lat1 = (PI/180) * center.lat(); // radians
        var lng1 = (PI/180) * center.lng(); // radians

        for (var a = 0; a <= 360; a++)
        {
            var tc = (PI/180) * a;
            var y = asin(sin(lat1) * cos(d) + cos(lat1) * sin(d) * cos(tc));
            var dlng = atan2(sin(tc) * sin(d) * cos(lat1), cos(d) - sin(lat1) * sin(y));
            var x = ((lng1 - dlng + PI) % (2 * PI)) - PI ; // MOD function
            var point = new CM.LatLng(parseFloat(y * (180/PI)), parseFloat(x * (180/PI)));
            circlePoints.push(point);
        }

        circle = new CM.Polygon(circlePoints, circleBorderColor, circleBorderWidth, circleBorderOpacity, circleFillColor, circleFillOpacity);
        map.addOverlay(circle);
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文