【问题标题】:How to determine a scale factor for geographical point drawing如何确定地理点绘制的比例因子
【发布时间】:2015-10-12 20:44:51
【问题描述】:

我正在尝试计算比例因子,以便在伪地图中粗略放置一些点。地图以某个(纬度,经度)点为中心。我要放置的点在一个设定距离d(半径)的区域内,也用经纬度表示。

现在我的问题是,为了让我在“地图”(固定尺寸的 SVG 元素)中缩放这些点的位置,我需要一个“比例因子”。例如,如果 SVG 元素代表一个半径为 5 公里的区域,而我的 SVG 是一个 500 像素的正方形,我该如何以 some 精度放置这些点? 一些精度就足够了,因为对于我的目标来说,假设一个完美的球形行星就足够了。

我提出这个问题的原因与here 解释的事实有关。据我了解,这意味着以纬度和经度表示的两点之间的小数差异在地球的不同区域会有所不同。

因此,如果我想知道how many pixels does 5km represent in this area of the globe 以便放置知道它们的纬度和经度的点,我该如何计算?

我现在只有这个公式来计算知道它们的纬度和经度的两点之间的距离:

function distance(lat1, lat2, lon1, lon2){

    var R = 6371; // km
    var dLat = (lat2-lat1).toRad();
    var dLon = (lon2-lon1).toRad();
    var lat1 = lat1.toRad();
    var lat2 = lat2.toRad();

    var a = Math.sin(dLat/2) * Math.sin(dLat/2) +
    Math.sin(dLon/2) * Math.sin(dLon/2) * Math.cos(lat1) * Math.cos(lat2); 
    var c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a)); 
    var d = R * c;
    return d;

}

在给定点和距离的情况下,我可以更改它以告诉我小数差异(即纬度)吗?

【问题讨论】:

    标签: javascript svg geospatial


    【解决方案1】:

    地理地图是代表伪球体的二维平面。 要获得这样的地图,您需要应用投影。 周围使用了很多投影,但 Google Maps 和 Open Street Map 使用 Mercator 投影。

    在这个投影中,纬度更容易转换。假设您的 2D 地图中有 W 个像素。您希望经度 -180° 为 X=0,经度 180° 为 X=W。

    function lng2x(lng, W) {
        lng = ((lng + 180) % 360) - 180;
        return W * lng / 360;
    }
    

    现在您想要获得 Y=0 对应 Lat=90 和 Y=H 对应 Lat=-90。 这种情况不是线性的,函数稍微复杂一些:

    function lat2y(lat, H) {
        // The deformation is very intense at the poles.
        // Mercator projection is suitable only for lat in [-85, 85].
        lat = Math.min(lat, 85);
        lat = Math.max(lat, -85);
        var y = lat * Math.PI / 180;
        return H * (
            1 - Math.log(
                Math.tan(y) + 1 / Math.cos(y)
            ) / Math.PI
        ) / 2;
    };
    

    【讨论】:

    • 对不起,我没有关注。在我的特殊情况下,我需要在我的 SVG 中放置关于中心位置(已经居中)的点,因此需要相对于该点具有负 X/Y。另外你能解释一下你从哪里得到lat2y函数的数学吗?
    • 居中不是问题:只需通过 -W/2 和 -H/2 进行翻译。在此处查看有关数学的详细信息:wiki.openstreetmap.org/wiki/Mercator
    猜你喜欢
    • 2011-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 1970-01-01
    • 2021-08-30
    相关资源
    最近更新 更多