背景:之所以有这篇文章也是实属无赖,很多时候个人技术的突破往往都是被逼的。为什么要发布紧凑型瓦片,而不老老实实用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文件里面加的图层,没有选工作空间,所以有感叹号,不知道怎么加上工作空间,但是好在图层可以正常使用了。如果有读者知道怎么修正这个问题,还请赐教。
好吧夜已深,睡觉。