利用Geoserver自带GeoWebCache插件发布ArcGIS Server (Compact)紧凑型瓦片

背景:之所以有这篇文章也是实属无赖,很多时候个人技术的突破往往都是被逼的。为什么要发布紧凑型瓦片,而不老老实实用PNG?

下面是废话,想看技术直接跳到正文部分。

起初博主在查阅了GeoWebCache(version 1.8)
Serving Layers From Pre-Cached ArcGIS Tiling Schemes
(别问我为什么看的是1.8的文档,我特么也不知道是在哪里搜到的)
资料后发现,只支持PNG格式的瓦片。那好吧用现有的mxd文档,利用ags切PNG也轻轻松松。但事实证明越认为简单的事情,越有意向不到的收获。
博主切中国一个面积不大也不小的省图,用最常用的Google切片方案,EPSG:3857,层级最大切到19。服务器16核,内存32G,磁盘100G可用,操作系统CentOS6.5,ags版本 10.3.1。一切就绪只待切片完成,然而切到16级时报错了,当时的ags报错日志没记错的话报的是在切col:xx,row:xx,extent:xx时失败,没有报具体失败原因。起初以为是ags常规性抽风,以往也遇到过类似的错误,检查下数据没有问题重新开始切就能正常完成了。但这次,重新开始切片后到16级时又报同样的错,这次仔细检查了下ags日志还是没有发现什么有用的信息,又检查了下磁盘空间还有几十G的剩余,又检查了下数据也没有问题。不能一直耽搁时间,于是把整个服务和切都删了,彻底从头开始切。还是一样到16级报错,df -h同样还有十几个G的剩余空间,这个时候才想起Linux有磁盘inode限制,赶紧在服务器上df -i,果然还有几十个G剩余的那个挂载路径,inode 100%.怎么办?只能改切紧凑型了呗。但是GeoWebCache又不支持?赶紧又Google了下,在stackoverflow上有个帖子的老外说,其实从GeoWebCache V1.6以后就开始支持ags compact瓦片了,只是官方没有明确说明!!!!!!!!!!!!!!!没有明确说明?!。那还有什么好说的下面进入今天的主题。

正文部分:
环境:
服务器:16核,内存32G,CentOS6.5,可用磁盘空间100G
JDK:1.8
Tomcat:7.0.82
Geoserver:2.12.0 自带GeoWebCache 版本 1.12.0
中间下载过GeoWebCache 1.13.0版本
ArcGIS Server 10.3.1 compact切片

在初步阅读了GeoWebCache官方文档和几位前辈写的GeoWebCache 发布ags瓦片文档后,就开始干了。开始很顺利,直接在geoserver/gwc/下找到了geowebcache.xml文件,按几位前辈写的在

<layers></laysers>

节点里添加

<arcgisLayer>
	<name>tiles_test</name>
	<tilingScheme>/xx/tiles/tiles_test/Conf.xml</tilingScheme>
	<tileCachePath>/xx/tiles/tiles_test/_alllayers</tileCachePath>
	<hexZoom>true</hexZoom>
</arcgisLayer>

然后重启Geoserver.发现启不起来,错误日志大概说的是在gwc包里面找不到.arcgisLayer字段。尝试了很久,按各路神仙说的方法都试了个遍,什么删除Conf.xml里面的节点,删除conf.cdi文件里面的某些节点等等各种方法,还是启不来,但是如果把上面xml问里面加的部分注释掉,立马就启起来,但是瓦片肯定是没有发布成功的。

怎么办?现在是使用的Geoserver自带的GeoWebCache。那么我装一个独立的GeoWebCache吧,虽然不情愿,明明Geoserver里面已经有了为啥还要装一个?但还是没办法。

装好后按上面的配置过程搞一遍,GeoWebCache能正常启动,只是不能预览。还是心有不甘。

仔细检查了一遍GeoWebCache在Tomcat发布目录的文件夹.
在geowebcache/WEB-INF 目录下有这么个文件geowebcache-arcgiscache-context.xml.对比geoserver/WEB-INF/lib/gs-gwc-2.12.0.jar/WEB-INF 下面却没有。真是没有比较就没有伤害。好了不再啰嗦了(自己都觉得写文章很啰嗦了)。
解决办法:
1.从GeoWebCache目录中找到gwc-arcgiscache-1.12.2.jar,放到 geoserver/WEB-INF/lib/目录下去
2.把geowebcache/WEB-INF/geowebcache-arcgiscache-context.xml拷贝到geoserver/WEB-INF/lib/gs-gwc-2.12.0.jar/WEB-INF/里
3.在geoserver/WEB-INF/lib/gs-gwc-2.12.0.jar/WEB-INF/geowebcache-servlet.xml 文件里面 增加

更细于2019-5-25
基于GeoWebCache Github帖子 No ArcGISCacheGridsetConfiguration could be found
https://github.com/GeoWebCache/geowebcache/issues/696
这位外国老兄遇到的问题,我找到了解决方案
就是去1.10.5(最后一个可用版本)
里面把gwc-arcgiscache-1.10.5.jar包放到 你的geoserver lib目录里面
替换上文中提到的文件。

上述连招打完,把geoserver/gwc/geowebcache.xml里arcgisLayer节点重新放开,
把geowebcache从Tomcat目录里面移除掉,重启geoserver。这下再检查日志,整个世界都清净了。去http://ip:port/geoserver/gwc/demo 查看 已经有了ags的compact瓦片服务,点后面的PNG预览,白板????
不要急,F12调出开发工具,逐行扫描一遍代码,发现里面的origin参数错了,把整页代码拷贝出来,修改后,直接在浏览器里面查看,奇迹就发生了.
openlayers调用关键代码:
TileWMS方式:

  var layerName = 'tiles_test';
  var format = 'image/png';
  var resolutions = [156543.03392800014, 78271.51696399994, 39135.75848200009, 19567.87924099992, 9783.93962049996, 4891.96981024998, 2445.98490512499, 1222.992452562495, 611.4962262813797, 305.74811314055756, 152.87405657041106, 76.43702828507324, 38.21851414253662, 19.10925707126831, 9.554628535634155, 4.77731426794937, 2.388657133974685, 1.1943285668550503, 0.5971642835598172, 0.29858214164761665];
  var origin= [-2.0037508342787E7, 2.0037508342787E7];

     var tilesource = new ol.source.TileWMS({
          projection:"EPSG:3857",
          url:"http://ip:port/geoserver/gwc/service/wms",
          params:{
            "LAYERS":layerName,
            "FORMAT":format,
            "SRS":"EPSG:3857"
          },
          tileGrid:new ol.tilegrid.TileGrid({
            resolutions:resolutions,
            origin:origin
          })
      });


      var tileLayer = new ol.layer.Tile({
          title: 'base_tile',
          source: tilesource
      });

  var map = new ol.Map({
        controls: ol.control.defaults({
                  attribution: false
                }),
        layers: [
          tileLayer
        ],
        target: 'map',
        view: new ol.View({
          projection: 'EPSG:4326',
          center: [106.812, 39.6734],
          zoom: 10
        })
      });

WMTS方式:

//直接拷贝的预览里面自动生成的代码 只改了origin
function ScaleControl(opt_options) {
  var options = opt_options || {};

  var element = document.createElement('div');
  element.className = 'ol-scale-value';

  ol.control.Control.call(this, {
    element: element,
    target: options.target
  });

};
ol.inherits(ScaleControl, ol.control.Control);
ScaleControl.prototype.setMap = function(map) {
  map.on('postrender', function() {
    var view = map.getView();
    var resolution = view.getResolution();
    var dpi = 96.0;
    var mpu = map.getView().getProjection().getMetersPerUnit();
    var scale = resolution * mpu * 39.37 * dpi;

    if (scale >= 9500 && scale <= 950000) {
        scale = Math.round(scale / 1000) + 'K';
    } else if (scale >= 950000) {
        scale = Math.round(scale / 1000000) + 'M';
    } else {
        scale = Math.round(scale);
    } 
    this.element.innerHTML = 'Scale = 1 : ' + scale;
  }, this);
  ol.control.Control.prototype.setMap.call(this, map);
}

var gridsetName = 'EPSG:3857_tiles_test';
var gridNames = ['EPSG:3857_tiles_test:0', 'EPSG:3857_tiles_test:1', 'EPSG:3857_tiles_test:2', 'EPSG:3857_tiles_test:3', 'EPSG:3857_tiles_test:4', 'EPSG:3857_tiles_test:5', 'EPSG:3857_tiles_test:6', 'EPSG:3857_tiles_test:7', 'EPSG:3857_tiles_test:8', 'EPSG:3857_tiles_test:9', 'EPSG:3857_tiles_test:10', 'EPSG:3857_tiles_test:11', 'EPSG:3857_tiles_test:12', 'EPSG:3857_tiles_test:13', 'EPSG:3857_tiles_test:14', 'EPSG:3857_tiles_test:15', 'EPSG:3857_tiles_test:16', 'EPSG:3857_tiles_test:17', 'EPSG:3857_tiles_test:18', 'EPSG:3857_tiles_test:19'];
var baseUrl = 'http://ip:port/geoserver/gwc/service/wmts';
var style = '';
var format = 'image/png';
var infoFormat = 'text/html';
var layerName = 'tiles_test';
var projection = new ol.proj.Projection({
code: 'EPSG:3857',
units: 'm',
axisOrientation: 'neu'
});
var resolutions = [156543.03392800014, 78271.51696399994, 39135.75848200009, 19567.87924099992, 9783.93962049996, 4891.96981024998, 2445.98490512499, 1222.992452562495, 611.4962262813797, 305.74811314055756, 152.87405657041106, 76.43702828507324, 38.21851414253662, 19.10925707126831, 9.554628535634155, 4.77731426794937, 2.388657133974685, 1.1943285668550503, 0.5971642835598172, 0.29858214164761665];
baseParams = ['VERSION','LAYER','STYLE','TILEMATRIX','TILEMATRIXSET','SERVICE','FORMAT'];

params = {
  'VERSION': '1.0.0',
  'LAYER': layerName,
  'STYLE': style,
  'TILEMATRIX': gridNames,
  'TILEMATRIXSET': gridsetName,
  'SERVICE': 'WMTS',
  'FORMAT': format
};

function constructSource() {
  var url = baseUrl+'?'
  for (var param in params) {
    if (baseParams.indexOf(param.toUpperCase()) < 0) {
      url = url + param + '=' + params[param] + '&';
    }
  }
  url = url.slice(0, -1);

  var source = new ol.source.WMTS({
    url: url,
    layer: params['LAYER'],
    matrixSet: params['TILEMATRIXSET'],
    format: params['FORMAT'],
    projection: projection,
    tileGrid: new ol.tilegrid.WMTS({
      tileSize: [256,256],
      extent: [1.065631206462512E7,4379900.468506729,1.4194472948880006E7,6936710.55188378],
      origin: [-2.0037508342787E7, 2.0037508342787E7],
      resolutions: resolutions,
      matrixIds: params['TILEMATRIX']
    }),
    style: params['STYLE'],
    wrapX: true
  });
  return source;
}

var layer = new ol.layer.Tile({
  source: constructSource()
});

var view = new ol.View({
  center: [0, 0],
  zoom: 2,
  projection: projection,
  extent: [-20037508.342787,-20037508.342781033,20037508.342781033,20037508.342787]
});

var map = new ol.Map({
  controls: ol.control.defaults({attribution: false}).extend([
    new ol.control.MousePosition(),
    new ScaleControl()
  ]),
  layers: [layer],
  target: 'map',
  view: view
});
map.getView().fit([10817137.559363978,4495850.058465965,14033647.454141144,7044721.1747490745], map.getSize());

遗留:在geoserver图层控制台那里 显示tiles_test前面有给感叹号,猜测是因为直接在xml文件里面加的图层,没有选工作空间,所以有感叹号,不知道怎么加上工作空间,但是好在图层可以正常使用了。如果有读者知道怎么修正这个问题,还请赐教。

好吧夜已深,睡觉。

你可能感兴趣的:(GIS)