2016-12-09 2 views
0

Я пытаюсь сделать ту же карту, как здесь:Geowebcache + Openlayers3 с источником XYZ: ошибка при масштабировании карты

Openlayers3: tile grid incorrect with pixelratio=3 using Geoserver/Geowebcache as backend

, но с использованием протокола TMS вместо WMS.

Карта работает хорошо, но есть небольшая проблема, если изменить масштаб, только изменив уровень масштабирования 4 на уровень увеличения 5: карта, кажется, «прыгает вверх». Проблема возникает со всем соотношением пикселей.

Это мой исходный код. Любая помощь приветствуется:

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
    <title>WMS Tiles</title> 
 
    <link rel="stylesheet" href="https://openlayers.org/en/v3.19.1/css/ol.css" type="text/css"> 
 
    <!-- The line below is only needed for old environments like Internet Explorer and Android 4.x --> 
 
    <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=requestAnimationFrame,Element.prototype.classList,URL"></script> 
 
    <script src="https://openlayers.org/en/v3.19.1/build/ol.js"></script> 
 
</head> 
 
<style type="text/css"> 
 
    body { font-family: sans-serif; font-weight: bold; font-size: .8em; } 
 
    body { border: 0px; margin: 0px; padding: 0px; } 
 
</style> 
 
<body> 
 
<div id="map" class="map" style="width: 85%; height: 85%;border: 0px; padding: 0px"> </div> 
 
<script> 
 
    console.log("DOMContentLoaded"); 
 
    try { 
 
     var config = { 
 
      "bounds": { 
 
       "left" : 475279.2689196961, 
 
       "bottom" : 5473193.572300382, 
 
       "right" : 476655.1750108673, 
 
       "top" : 5474594.636365802 
 
      } 
 
     }; 
 

 
     var bounds = [config.bounds.left, config.bounds.bottom, config.bounds.right, config.bounds.top]; 
 
     var resolutions = [ 
 
      1.4, 
 
      0.7, 
 
      0.35, 
 
      0.175, 
 
      0.0875, 
 
      0.04375, 
 
    ]; 
 

 
     var tilePixelRatio = 1; 
 
     if (ol.has.DEVICE_PIXEL_RATIO > 2.5) { 
 
      tilePixelRatio = 3; 
 
     } else if (ol.has.DEVICE_PIXEL_RATIO > 1.5) { 
 
      tilePixelRatio = 2; 
 
     } 
 

 
     var matrixSet = 'unihd15'; 
 
     // available gridsets in backend: unihd15, unihd15_512 and unihd15_768    
 
     if (tilePixelRatio > 1){ 
 
      matrixSet = matrixSet + '_' + (256 * tilePixelRatio).toString(); 
 
     } 
 

 

 
     var res_length = resolutions.length; 
 
     var matrixIds = new Array(res_length); 
 
     for (var z = 0; z < res_length ; ++z) { 
 
      matrixIds[z] = matrixSet + ':'+ z; 
 
     } 
 

 
     console.log('matrixSet is: ' + matrixSet); 
 
     console.log(matrixIds); 
 
     console.log(matrixIds[0] + ' '+ resolutions[0]); 
 
     console.log('Center: ' + ol.extent.getCenter(bounds)); 
 
     console.log('Pixel ratio: ' + window.devicePixelRatio); 
 
     console.log('Bounds: ' + bounds); 
 
     console.log('TopLeft: ' + ol.extent.getTopLeft(bounds)); 
 

 
     var projection = new ol.proj.Projection({ 
 
      code: 'EPSG:32632', 
 
      units: 'm', 
 
      extent: [166021.4431, 0.0000, 833978.5569, 9329005.1825] 
 
     }); 
 

 
     var tileGrid = new ol.tilegrid.TileGrid({ 
 
      extent: bounds, 
 
      resolutions: resolutions, 
 
      origin: ol.extent.getTopLeft(bounds), 
 
      tileSize: [256, 256] 
 
     }); 
 

 
     var view = new ol.View({ 
 
      extent: bounds, 
 
      zoom: 0, 
 
      center: ol.extent.getCenter(bounds), 
 
      projection: projection, 
 
      resolutions: resolutions 
 
     }); 
 

 
     var layerName = 'unihd15:unihd15_0_basemap'; 
 

 
     var tms_source = new ol.source.XYZ({ 
 
      projection: projection, 
 
      tileGrid: tileGrid, 
 
      tilePixelRatio: tilePixelRatio, 
 
      url: 'http://ssp.deepmap.de/geo/gwc/service/tms/1.0.0/' + layerName + '@' + matrixSet + '@png/{z}/{x}/{-y}.png' 
 
     }); 
 

 
     var layer = new ol.layer.Tile({ 
 
      source: tms_source, 
 
      extent: bounds 
 
     }); 
 

 
     var map = new ol.Map({ 
 
      projection: projection, 
 
      controls: ol.control.defaults(
 
       { 
 
        rotate: false, 
 
        attributionOptions: { 
 
         collapsible: false 
 
        } 
 
       } 
 
      ), 
 
      view: view, 
 
      layers: [layer], 
 
      target: 'map' 
 
     }); 
 
     console.log("no error"); 
 
    } catch (error) { 
 
     console.log("error"); 
 
     console.log(error); 
 
    } 
 
</script> 
 
</body> 
 
</html>

+0

Ваш 'tileGrid' выглядит некорректно для меня. Попробуйте установить 'origin' в' ol.extent.getBottomLeft (bounds) 'или удалить конфигурацию« origin »в целом. – ahocevar

+0

Без эффекта ... Проблема должна быть связана с уровнями масштабирования, потому что это происходит только при переключении с уровня масштабирования 4 на 5. –

+0

PS: Я исправил ошибку в исходном коде, теперь вы можете запустить фрагмент. –

ответ

1

Обычно такого рода проблема возникает от неправильного степени. Чтобы получить правильную степень, перейдите к http://ssp.deepmap.de/geo/gwc/service/tms/1.0.0/unihd15:[email protected]:[email protected] (в настоящее время он не работает на вашем GeoServer, но это URL-адрес) и оттуда используйте <BoundingBox>.

Смежные вопросы