好像栅格瓦片已经开始过时,但是,我仍然需要一种解决方案以某种方式针对我的QGIS Server的WMS做到这一点。

到现在为止,我已经尝试了TileCache,但是我无法使其在OL3中工作,而且似乎还有些“过时”。

那么,如果以后我想在OL3应用程序中使用缓存的层,那是我的最高出价? TileStache,Mapproxy,MapCache?

我的QGIS Server在CentOS 7下运行。

最佳答案

QGIS Server与MapProxy配合良好。使用QGIS Server + MapProxy,您将获得最佳的QGIS样式以及图块缓存的速度。

MapProxy用Python编写,您可能已经在服务器上安装了Python。您可以(并且应该)在虚拟环境中运行MapProxy。 MapProxy的说明非常清楚,从QGIS Server中获取数据并使其启动并运行实际上是几分钟的问题。

  • 比GeoWebCache
  • 轻得多
  • 缓存并提供图块(只需在WMS请求中使用tiled: true)
  • 它与OpenLayers一起很好地工作。安装后,您将获得一个演示页面,其中包含OpenLayers示例。
  • 您可以针对缓存的源
  • 调用GetFeatureInfo请求
  • 您可以针对缓存的源
  • 调用GetLegendGraphic请求
  • 它可以处理自定义定义的网格(只要您在OpenLayers中使用相同的网格即可)
  • 您可以并行请求多个图块,并利用QGIS Server并行渲染支持(如果启用)。
  • 由于QGIS Server可以在Postgis上存储项目,因此您可以轻松地更新项目而无需上传任何内容。 MapProxy将使用QGIS Server中更新的样式。

  • 例子

    MapProxy文档中有非常好的小示例。

    这是最复杂的示例之一,因为它使用自定义网格和除EPSG:3857之外的CRS。如果您使用常规的GLOBAL_MERCATOR网格,则它要简单得多(在MapProxy端和OpenLayers端)。

    这是带有自定义网格的mapproxy.yaml配置文件的一个小示例。来源是QGIS Server。我在鼠标单击上添加了GetFeatureInfo请求,以显示如何将这些请求转发到QGIS Server。我还添加了图层的图例(使用service=WMS&REQUEST=GetLegendGraphic&VERSION=1.3.0)。
    layers:
      - name: caop
        title: CAOP by QGIS Server
        sources: [caop_cache_continente]
    caches:
      caop_cache_continente:
        meta_size: [4, 4]
        meta_buffer: 20
        # 20+4x256+20
        # width=1064&height=1064
        use_direct_from_level: 14
        concurrent_tile_creators: 2
        link_single_color_images: true
        grids: [continente]
        sources: [continente_wms]
    sources:
      continente_wms:
        type: wms
        wms_opts:
          featureinfo: true
          legendgraphic: true
        req:
          url: http://continente.qgis.demo/cgi-bin/qgis_mapserv.fcgi
          layers: freguesia
          transparent: true
    grids:
      continente:
        srs: 'EPSG:3763'
        bbox_srs: 'EPSG:3763'
        bbox: [-127104, -301712, 173088, 278544]
        origin: nw
        res: [ 1172.625, 586.3125, 293.15625, 146.578125, 73.2890625, 36.64453125, 18.322265625, 9.1611328125, 4.58056640625, 2.290283203125, 1.1451416015625, 0.57257080078125, 0.286285400390625, 0.1431427001953125, 0.07157135009765625 ]
    

    以下OpenLayers文件能够从MapProxy中获取切片。

    <!DOCTYPE html>
    <html>
    
    <head>
      <meta content="text/html;charset=utf-8" http-equiv="Content-Type">
      <link rel="stylesheet" href="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/css/ol.css"
        type="text/css">
      <style>
        .map {
          height: 600px;
          width: 100%;
        }
      </style>
      <script src="https://cdn.rawgit.com/openlayers/openlayers.github.io/master/en/v5.3.0/build/ol.js"></script>
      <script src="resources/js/proj4js/proj4.js"></script>
      <title>OpenLayers example using QGIS Server and MapProxy</title>
    </head>
    
    <body>
      <div id="map" class="map"></div>
      <p><image src="http://mapproxy.qgis.demo/mapproxy/service?service=WMS&REQUEST=GetLegendGraphic&VERSION=1.3.0&style=default&FORMAT=image/png&LAYER=caop&transparent=true"></image></p>
      <div id="nodelist"><em>Click on the map to get feature info</em></div>
      <script>
        proj4.defs("EPSG:3763", "+proj=tmerc +lat_0=39.66825833333333 +lon_0=-8.133108333333334 +k=1 +x_0=0 +y_0=0 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=m +no_defs");
        ol.proj.proj4.register(proj4);
        var projection = new ol.proj.Projection({
          code: 'EPSG:3763',
          extent: [-127104, -301712, 173088, 278544]
        });
    
        var projectionExtent = projection.getExtent();
    
        var size = ol.extent.getWidth(projectionExtent) / 256;
        var newresolutions = new Array(15);
        var newmatrixIds = new Array(15);
        for (var z = 0; z < 15; ++z) {
          newresolutions[z] = size / Math.pow(2, z);
          newmatrixIds[z] = z;
        }
    
        var tileGrid = new ol.tilegrid.WMTS({
          origin: ol.extent.getTopLeft(projectionExtent), // [ 270000, 3650000 ]
          resolutions: newresolutions,
          matrixIds: newmatrixIds,
          tileSize: [256, 256]
        });
    
        var caop = new ol.layer.Tile({
          source: new ol.source.TileWMS({
            url: 'http://mapproxy.qgis.demo/mapproxy/service?',
            params: { layers: 'caop', tiled: true, srs: "EPSG:3763" },
            format: 'image/png',
            projection: projection,
            tileGrid: tileGrid
          })
        });
    
        var map = new ol.Map({
          layers: [caop],
          target: 'map',
          view: new ol.View({
            projection: projection,
            center: [0, 0],
            zoom: 1
          })
        });
    
        map.on('singleclick', function (evt) {
          document.getElementById('nodelist').innerHTML = "Loading... please wait...";
          var view = map.getView();
          var viewResolution = view.getResolution();
          var url = caop.getSource().getGetFeatureInfoUrl(
            evt.coordinate, viewResolution, view.getProjection(),
            { 'INFO_FORMAT': 'text/html', 'FEATURE_COUNT': 50 });
          if (url) {
            document.getElementById('nodelist').innerHTML = '<iframe seamless src="' + url + '" style="width:100%"></iframe>';
          }
        });
      </script>
    </body>
    
    </html>
    

    关于openlayers-3 - 如何缓存QGIS Server WMS?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31672659/

    10-11 06:47