openlayers(三)之配合geoserver发布并展示wmts图层

step1. 在geoserver中发布wmts图层首先需要在指定的工作区中勾上wmts

在这里插入图片描述

step2. geoserver中添加数据存储

我这里是发布的多个tif,所以我选择ImageMosaic类型,弄好之后点击发布,配置好自己的发布参数,点击发布。
在这里插入图片描述
发布完成之后可以在图层中预览,但是现在的图层是以wms方式来预览的

setp3. 切片处理

在这里插入图片描述
点击tile Layers项,选择要切片的图层之前,可以切换到Gridsets项,可以看到目前内置了几个坐标系的切片设置,如常见的4326坐标系,这个切片的设置跟后面openlayers展示wmts图层强关联,展示的时候再说
在这里插入图片描述
回到切片tile Layers,点击Seed/Truncate进行切片
在这里插入图片描述
切片时选择自己的样式文件以及切片坐标系,点击submit进行切片
在这里插入图片描述
点击submit后就会进行切片了,可以看到切片的进度,这里就不截图了,完成切片后回到tile Layers,点击这个即可预览wmts图层了
在这里插入图片描述

setp4. openlayers展示wmts图层

我这里的版本是openlayers3,其它高版本的发布应该差不多,可能有细微差别,根据官方文档来看就好了

function showWMTSLayer (url, layerId, layerName, zIndex) {
    return new Promise((resolve) => {
        const self = this;
        // 首先设置好WMTS瓦片地图的瓦片坐标系
        const projection = ol.proj.get('EPSG:4326');          // 获取web墨卡托投影坐标系
        const projectionExtent = projection.getExtent();      // web墨卡托投影坐标系的四至范围
        const width = ol.extent.getWidth(projectionExtent);   // web墨卡托投影坐标系的水平宽度,单位米
        const resolutions = [];                               // 瓦片地图分辨率
        const matrixIds = [];                                  //矩阵ID
        for (let z = 0; z < 11; z++) {
            resolutions[z] = width / (256 * Math.pow(2, z + 1));//注意这里的分辨率需要根据geoserver切片参数对应
            matrixIds[z] = "EPSG:4326:" + z;              // 注意这里的matrixId的格式为EPSG:4326:z
        }
        const wmtsTileGrid = new ol.tilegrid.WMTS({
            origin: ol.extent.getTopLeft(projectionExtent), // 原点(左上角)
            resolutions: resolutions,                       // 瓦片地图分辨率
            matrixIds: matrixIds,                           // 矩阵ID,就是瓦片坐标系z维度各个层级的标识
        });

        // WMTS数据源与地图
        const wmtsSource = new ol.source.WMTS({
            url: url,
            layer: layerName,                   // 图层名
            matrixSet: 'EPSG:4326',           // 投影坐标系参数矩阵集
            format: 'image/png',                // 图片格式
            projection: projection,             // 投影坐标系
            // 投影坐标系
            tileGrid: wmtsTileGrid
        });

        console.log(wmtsSource.getUrls())
        const xmlUrl = wmtsSource.getUrls()[0] + "?service=WMTS&version=1.0.0&request=GetCapabilities&layers=" + layerName;
        let extent = [];
        const parser = new ol.format.WMTSCapabilities();
        fetch(xmlUrl)
            .then(function (response) {
                return response.text();
            })
            .then(function (text) {
                const result = parser.read(text);
                const Layers = result.Contents.Layer;
                for (let i = 0; i < Layers.length; i++) {
                    if (Layers[i].Identifier === layerName) {
                        extent = Layers[i].WGS84BoundingBox;
                        break;
                    }
                }

                const wmtsLayer = new ol.layer.Tile({
                    source: wmtsSource,
                    zIndex: zIndex,
                    extent: extent
                })
                wmtsLayer.set("id", layerId);
                self.map.addLayer(wmtsLayer);
                resolve(true)
            });
    })
}

代码说明:代码中为啥做了个获取xml的操作,这个是根据GetCapabilities获取当前图层的属性,我这里获取的是图层的范围

上面切片的时候里面有个坐标系方案Gridsets,代码中的resolutions分辨率,需要根据切片方案来设置,如4326坐标系要openlayers和geoserver中对应(我估计这个可以自定义切片方案,只要这个设置相同就能显示,虽然没做过)
在这里插入图片描述
end

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值