首页 > 解决方案 > forEachTileCoord() 返回错误的 y 坐标

问题描述

我正在使用此功能以当前缩放来获取视图图块中的所有坐标。我正在这样做:

...
this.map.getLayers().forEach((layer) => {
    if (layer.get('name') === 'randomLayer') {
        let extent = this.map.getView().calculateExtent(this.map.getSize());
        let zoom = this.map.getView().getZoom();

        layer.getSource().tileGrid.forEachTileCoord(extent, i, tileCoord => {
            console.log(tileCoord);
        });
    }
});

这是在我的视图中加载图块的方式(z/x/y),缩放 12:

12/1474/2376    12/1475/2376    12/1476/2376
12/1474/2377    12/1475/2377    12/1476/2377
12/1474/2378    12/1475/2378    12/1476/2378

这就是函数返回的内容:

12/1474/2377    12/1475/2377    12/1476/2377
12/1474/2378    12/1475/2378    12/1476/2378
12/1474/2379    12/1475/2379    12/1476/2379

不返回位于屏幕顶部的第一行坐标,并返回甚至不在视图中的底部行 (2379)。这是故意的吗?也许我以错误的方式划定范围?

我也试图得到程度this.map.getView().calculateExtent();,但同样的情况发生了。



作为一种解决方法,我可以执行以下操作:

...
layer.getSource().tileGrid.forEachTileCoord(extent, i, tileCoord => {
    let z = Math.abs(tileCoord[2]) - 1;
});

但这似乎不太正确。

标签: openlayers

解决方案


正如@Mike 在对我的问题的评论中提到的,我在问题末尾建议的解决方法是通常用于在 OpenLayers 版本 6 之前获取图块坐标的方法。较新的版本不需要这样做来获得相同的结果。

@麦克风:

如果您使用的是 OpenLayers 5 或更早版本,并且您的 y 值是预期的负数。但是 OpenLayers 6 使用与 XYZ 相同的系统。在版本 6 之前,解决方法是正常过程,因为 OpenLayers 网格向上编号,而 XYZ 源向下编号。它在“新的内部瓷砖坐标”下的升级说明中进行了说明。

提到的例子

提到的升级说明


推荐阅读