javascript - 如何在 OpenLayers 4.2.0 中设置 VectorTile 图层的范围?

标签 javascript openlayers mapbox

我目前正在 Open Layers 4.2.0 中添加一系列 Mapbox VectorTile 图层。然而问题出现了;每当我缩小到很远的时候,我的整个 map 就会变成灰色,并且控制台中的网络选项卡将充满 404 错误,解释说在 Mapbox 端找不到某些图 block 。这当然是有道理的,因为并非所有加载的图 block 都会出现在 Mapbox 中。

用一点代码来详细说明:

这是加载 Mapbox 图层的位置:

var source = new ol.source.VectorTile({
    format: new ol.format.MVT(),
    tilePixelRatio: 16,
    url: 'https://{a-d}.tiles.mapbox.com/v4/' + layer.id + '/{z}/{x}/{y}.vector.pbf?access_token=' + this.mapboxGlToken
});

return new ol.layer.VectorTile({
    source:        source,
    minResolution: layer.minres,
    maxResolution: layer.maxres,
    style:         this.styles.normal,
    filter:        layer.filter,
    name:          layer.name
});

这实际上会显示 map (+矢量图 block ,即荷兰各省的红色边框):

enter image description here

万岁!但是,如果我查看 Firefox 网络选项卡:

enter image description here

Mapbox 存在大量 404 错误。起初,我以为我可以忽略这些,但它们导致我的整个应用程序停止渲染任何进一步的图 block ,这非常烦人。我认为发生这种情况是因为 Open Layers 尝试加载 Mapbox 图层边界之外的图 block 。

我用谷歌搜索了很多并且尝试了很多。这是我尝试过的:

开放层 4.2.0 中有关 VectorTile 的文档指定了一个名为 TileGrid 的选项 ( http://openlayers.org/en/latest/apidoc/ol.source.VectorTile.html )。我已经尝试了此功能的许多衍生产品,但这并不能解决我的问题。它要么不再渲染任何内容,要么卡住我的浏览器,让它保留原来的问题。我也不知道它是如何工作的,但是说它有一个范围选项,我想我可以尝试一下。

那么如何设置图层的范围呢?如何告诉图层仅加载从 {x1,y1}{x2,y2} 的图 block ?老实说,我不知道,如果有任何帮助,我们将不胜感激。

最佳答案

事实证明,我混淆了 ol.source.VectorTileol.layer.VectorTile (源或图层)。 ol.layer.VectorTile“类”确实有一个 extent选项,这是正确的设置方法。

设置范围有一些怪癖。每个 map 框图 block 集都有自己的范围(或称为边界):

bounds of mapbox

边界需要从 lat1, lng1, lat2, lng2 转换为像素(如果我错了,请纠正我)。执行此操作的方法是从网络控制台运行:

ol.proj.fromLonLat([lat1, lng1]).concat(ol.proj.fromLonLat([lat2, lng2]))

这将为您提供正确的范围。

这个范围需要这样实现:

new ol.layer.VectorTile({
    source:        source,
    extent:        [convertedlat1, convertedLng1, convertedLat2, convertedLng2], // <---
    minResolution: layer.minres,
    maxResolution: layer.maxres,
    style:         this.styles.normal,
    filter:        layer.filter,
    name:          layer.name
});

关于javascript - 如何在 OpenLayers 4.2.0 中设置 VectorTile 图层的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44907234/

相关文章:

javascript - 简单的 Javascript 更新 HTML 中的长计算进度

javascript - 如何在 openlayers 上显示缩放级别(仅限 js/html 文件)?

javascript - Vue 单文件组件中的相对路径不能正常使用

javascript - openlayers 如何检测标记是否在多边形内

javascript - 每个标记有多个类别选项在传单 map 中使用 GeoJSON

javascript - mapbox.js - 无法初始化 map ,除非它在全局范围内可用

javascript - 如何检查是否选择了表单选择以提交表单?

javascript - 删除文本字段中的功能不起作用

mapbox - 如何在 Mapbox GL JS 中制作 3D 模型运动的动画

javascript - 有没有办法在搜索栏中用 php 调用模式?