Openlayers 3 384x384px瓷砖在地图(视网膜)上以384x384px倾斜

Openlayers 3 384x384px瓷砖在地图(视网膜)上以384x384px倾斜,openlayers-3,highdpi,hidpi,Openlayers 3,Highdpi,Hidpi,我提供两种口味的TMS瓷砖:256px或384px,通过renderd选项比例=1.5。 使用Openlayers 3,我发现要显示这些384px平铺的原始大小,唯一的方法是如下转换画布上下文: map.getViewport().getElementsByTagName('canvas')[0].getContext("2d").setTransform(1.5, 0, 0, 1.5, -w, -h); 我认为这不是正确的方式,那么什么才是正确的方式呢 我玩了一点特殊的ol.tilegrid

我提供两种口味的TMS瓷砖:256px或384px,通过renderd选项比例=1.5。 使用Openlayers 3,我发现要显示这些384px平铺的原始大小,唯一的方法是如下转换画布上下文:

map.getViewport().getElementsByTagName('canvas')[0].getContext("2d").setTransform(1.5, 0, 0, 1.5, -w, -h);
我认为这不是正确的方式,那么什么才是正确的方式呢

我玩了一点特殊的ol.tilegrid,但没有成功,请参见:


我的目标输出在右侧地图上。

无需创建特殊的平铺网格或应用任何画布缩放。您只需正确设置源代码的
tilePixelRatio
,在您的情况下为
1.5

  source: new ol.source.XYZ({
    url: "http://www5.opensnowmap.org/base_snow_map_high_dpi/{z}/{x}/{y}.png?debug",
    attributions: [/* ... */],
    tilePixelRatio: 1.5
  })
还要注意,您对结果的预期是错误的。我更新了你的提琴,比较了标准的256px瓷砖(右边)和HIDPI384px瓷砖(左边)。如果您在hidpi显示器上查看小提琴,您会注意到差异

总结一下:

  • 如果您想在移动设备上以良好的清晰度显示高dpi图像块,请使用tilePixelRatio:

  • 如果要显示大小不同于256x256的平铺,请创建适当的ol.tilegrid和ol.view:

    var-extent=ol.proj.get('EPSG:3857').getExtent();
    var tileSizePixels=384;
    var tileSizeMtrs=ol.extent.getWidth(extent)/384;
    var分辨率=[];
    
    对于(var i=-1;我并不是说我对结果的预期是错误的,我可能只是表达得很糟糕:)我希望用户能够选择x1或x1.5放大地图,无论他/她的设备的像素比率是多少。也许这是一个值得怀疑或不寻常的设计选择,但它是我的。我不是在追求尖锐。我用pixelratio=2在我的设备上试用了更新的JSFIDLE,或者用pixelratio为1.5的chromium开发工具,但实际可见比例“Paris”在屏幕上没有差异。是否无法以1:1的像素比显示384*384 px平铺?这是可能的,但您需要自定义平铺网格和视图配置。
    var extent = ol.proj.get('EPSG:3857').getExtent();
    var tileSizePixels = 384;
    var tileSizeMtrs = ol.extent.getWidth(extent) / 384;
    var resolutions = [];
    for (var i = -1; i <= 20; i++) {
    resolutions[i] = tileSizeMtrs / (Math.pow(2, i));
    }
    
    var tileGrid = new ol.tilegrid.TileGrid({
    extent: extent,
    resolutions: resolutions,
    tileSize: [384, 384]
    });
    
    var center = ol.proj.fromLonLat(
    ol.proj.toLonLat([2, 49], 'EPSG:4326'),
    'EPSG:3857');
    var zoom = 5;
    
    var view1 = new ol.View({
    center: center,
    zoom: zoom,
    maxResolution: 40075016.68557849 / 384
    });