Плитка 384x384px для воспроизведения на 384x384px на карте (сетчатка)

Я работаю с TMS плиткой в ​​двух вариантах: 256px или 384px через optiond scale scale=1.5. В Openlayers 3 единственный способ отобразить эти плитки размером 384 пикселя - это преобразовать контекст холста следующим образом:

map.getViewport().getElementsByTagName('canvas')[0].getContext("2d").setTransform(1.5, 0, 0, 1.5, -w, -h);

Я думаю, что это не правильный путь, так что будет правильным?

Я немного поиграл со специальным ol.tilegrid, но безуспешно, смотрите здесь: https://jsfiddle.net/yvecai/owwc5bo8/8/

Результат, к которому я стремлюсь, находится на правой карте.

2 ответа

Нет необходимости создавать специальную сетку плиток или применять масштабирование холста. Все, что вам нужно сделать, это установить 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 (справа) с hidpi 384px плитки (слева). Если вы просматриваете скрипку на дисплее hidpi, вы заметите разницу. https://jsfiddle.net/owwc5bo8/9/

Подвести итоги:

  • Если вы хотите отображать тайлы с высоким разрешением на мобильном устройстве с хорошей резкостью, используйте tilePixelRatio: https://jsfiddle.net/owwc5bo8/9/

  • Если вы хотите отобразить плитки с размером, отличным от 256x256, создайте правильный ol.tilegrid и правильный ol.view:

    https://jsfiddle.net/owwc5bo8/12/

    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
    });
    
Другие вопросы по тегам