【问题标题】:How to convert radius in metres to pixels in mapbox leaflet?如何将米的半径转换为mapbox传单中的像素?
【发布时间】:2015-08-22 13:39:49
【问题描述】:

我正在开发一个应用程序,我正在尝试在地图上运行一些算法并计算坐标,但它们略有偏差,因为我正在对纬度和经度进行计算,最终结果会失真。

现在我正在尝试将所有坐标转换为 EPSG3857 Web Mercator 坐标,如下所示:

var crs = L.CRS.EPSG3857;
var zoom = terrainAnalysisMap.getZoom();

markerToPoint = crs.latLngToPoint(marker.getLatLng(), zoom);
markerOnRadiusToPoint = crs.latLngToPoint(markerOnRadius.getLatLng(), zoom);

现在我还有一个半径,我必须将其从米转换为像素,但我不知道如何。 1米等于多少像素?我的意思是它也取决于缩放级别,对吧?那么如何在mapbox和leaflet中将半径转换为像素呢?

【问题讨论】:

    标签: javascript math leaflet mapbox mercator


    【解决方案1】:

    如果您碰巧有将半径转换为像素的地方的纬度,您可以使用http://wiki.openstreetmap.org/wiki/Zoom_levels 中描述的“每像素米”功能。这是我的 javascript 实现:

    var metersPerPixel = function(latitude, zoomLevel) {
      var earthCircumference = 40075017;
      var latitudeRadians = latitude * (Math.PI/180);
      return earthCircumference * Math.cos(latitudeRadians) / Math.pow(2, zoomLevel + 8);
    };
    
    var pixelValue = function(latitude, meters, zoomLevel) {
      return meters / metersPerPixel(latitude, zoomLevel);
    };
    

    【讨论】:

    • 这会是使用返回 512x512 像素图块的 Mapbox 的不同计算吗?
    • @theartofbeing 是的,应该是zoomlevel + 9
    【解决方案2】:

    米就是米,无论您的缩放级别是多少。您需要将米转换为度数,因为 long/lat 是 polar coordinate system。地球的周长为 40,075 公里,您会得到 0.00000898315 deg/m,您需要将其乘以对象的大小 (1 m) 以获得必须添加到坐标中的度数,以获得与半径相交的点您要绘制的圆圈。

    但通常,在中心坐标周围绘制一个半径为 10 px 的圆会更容易(在将其从世界转换到屏幕之后),确保无论缩放级别如何,圆始终是相同的大小.这样一来,人们查看和/或点击它就不会有问题。

    [编辑]您的问题与Parametric equation to place a leaflet marker on the circumference of a circle is not precise?有关

    我的建议是忘记拖放问题的世界坐标。显然,您已经有了一个圆(这意味着您必须知道中心点和以像素为单位的半径 - 否则,您无法绘制它)。

    您需要的是仅在屏幕坐标中实现标记的拖动。这应该很容易实现。

    当用户松开鼠标时,你只需要获取屏幕坐标并转换成long/lat一次即可。

    要记住一个问题:如果您使用的是Mercator projection 之类的东西,当您靠近两极时,坐标将会关闭。要解决这个问题,您需要使用椭圆(比高宽)而不是圆形。

    【讨论】:

    • 实际上我正在寻找一种将半径转换为像素的方法,因为我陷入了这个问题:stackoverflow.com/questions/30690952/… 我已经为圆设置了米的半径。
    • 尝试仅在屏幕坐标中解决问题。查看我的编辑。
    • 如何解决您描述的关于椭圆的问题?
    • 您可以忽略它(有时会得到稍微超出圆圈的坐标),或者您需要将圆圈正确投影到地图上。为此,您需要以米为单位计算半径,然后计算圆上的两个点(x+r,y 和 x,y+r),将它们投影到屏幕上,然后绘制一个穿过这两个点的椭圆。
    【解决方案3】:

    我曾经使用这个数组进行像素/真实世界米的转换

    pixelMeterSizes: {
        10: 1 / 10,
        11: 1 / 9,
        12: 1 / 8,
        13: 1 / 7,
        14: 1/ 5,
        15: 1 / 4.773,
        16: 1 / 2.387,
        17: 1 / 1.193,
        18: 1 / 0.596,
        19: 1 / 0.298
    }
    

    请注意,在缩放级别超过 15 时,我简化了一些事情,因为符号变得太小并且不再可见。

    我将此作为基本参考http://wiki.openstreetmap.org/wiki/Zoom_levels

    这对我来说效果很好,但我不确定在处理高分辨率显示器等时会发生什么。猜猜它在这些情况下可能会失败。

    【讨论】:

    • 所以基本上 1 像素 = 10 米缩放级别 10?这是解释这个的正确方法吗?
    • 1 像素 = 1/10m。等等。注意倒置。
    • 这对我不起作用,我怀疑是因为没有纬度规范。我们可能在世界上非常不同的地方。
    猜你喜欢
    • 2023-01-31
    • 2021-02-08
    • 2017-11-20
    • 2014-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-04
    • 2018-04-10
    相关资源
    最近更新 更多