1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 利用Geoserver自带GeoWebCache插件发布ArcGIS Server (Compact)紧凑型瓦片

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

时间:2022-01-03 15:40:31

相关推荐

利用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 文件里面 增加<import resource="geowebcache-arcgiscache-context.xml"/>

更细于-5-25

基于GeoWebCache Github帖子 No ArcGISCacheGridsetConfiguration could be found

/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方式:

//直接拷贝的预览里面自动生成的代码 只改了originfunction 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: [-7508.342787,-7508.342781033,7508.342781033,7508.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文件里面加的图层,没有选工作空间,所以有感叹号,不知道怎么加上工作空间,但是好在图层可以正常使用了。如果有读者知道怎么修正这个问题,还请赐教。

好吧夜已深,睡觉。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。