在 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 示例的控制台日志
翻译矢量切片图层的推荐方法似乎是在预合成时翻译 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 示例的控制台日志