在 OpenLayers 中,有没有办法在翻译层中渲染 Mapbox 矢量切片?

In OpenLayers, is there a way to render Mapbox vector tiles in a translated layer?

翻译矢量切片图层的推荐方法似乎是在预合成时翻译 canvas 上下文(请参阅 OpenLayers 3: per-layer translation for tiled image layers)。如前所述,只有那些落在地图翻译前可见范围内的图块才会被渲染。

如何在不丢失边界瓦片的情况下达到平移的效果?

我还尝试使用带有原点的自定义图块网格 (https://github.com/openlayers/openlayers/issues/9514),但这似乎是对“原点”参数的误用,因此只绘制了部分图块。我猜测自定义原点需要落在瓷砖边界上;我的没有。

更新:Mike 的解决方案是正确的。我记得,在提交这个问题之前,我曾尝试过 Mike 的方法,尽管图层已翻译,但存在部分图块消失(或绘制在错误位置)的问题。但是在试验 Mike 的示例时,我注意到在我的应用程序中将 useInterimTilesOnError 设置为 false 解决了消失和错误绘制的图块问题。也许我使用的图块存在一些问题,但有趣的是,当图层未偏移时,无论 useInterimTilesOnError 如何设置,图块都会正确渲染。

似乎足以偏移 tilegrid 的范围(原点将默认为范围的左上角)。

var proj3857 = ol.proj.get('EPSG:3857');

var raster = new ol.layer.Tile({
  source: new ol.source.XYZ({
    url: 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}',
    maxZoom: 23
  })
});

var map = new ol.Map({
  layers: [raster],
  target: document.getElementById('map'),
  view: new ol.View({
      center: ol.proj.fromLonLat([0, 50]),
      maxZoom: 23,
      zoom: 5,
      projection: proj3857
  })
});

var dx = -200000;
var dy = -100000;

var extent = proj3857.getExtent();
offsetExtent = [extent[0] + dx, extent[1] + dy, extent[2] + dx, extent[3] + dy];

var layer = new ol.layer.VectorTile({
  source: new ol.source.VectorTile({
    format: new ol.format.MVT(),
    url: 'https://basemaps.arcgis.com/v1/arcgis/rest/services/World_Basemap/VectorTileServer/tile/{z}/{y}/{x}.pbf',
    tileGrid: ol.tilegrid.createXYZ({ extent: offsetExtent, maxZoom: 18 })
  }),
  //useInterimTilesOnError: false,
  style: new ol.style.Style({
    stroke: new ol.style.Stroke({
      width: 1,
      color: 'white'
    })
  })
});

map.addLayer(layer);
<script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
<link href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css" rel="stylesheet"/>
<div id="map" class="map"></div>

来自日本附近 OpenLayers 示例的控制台日志