OpenLayers中加载WMS图层并实现定位功能

我们在通过OpenLayers加载WMS服务后发现OpenLayers没有现成的定位到WMS图层的方法,这时候我们需要自己去获取到图层extents来自己手动定位到该位置,下面是实现方法

// 添加新的WMS图层
    const newWMSLayer = new TileLayer({
        source: new TileWMS({
            url: newWMSConfig.url,
            params: {
                'LAYERS': newWMSConfig.layers,
                'TILED': true
            },
            serverType: 'geoserver',
            crossOrigin: 'anonymous'
        })
    });
    map.addLayer(newWMSLayer);

//图层定位
const locateLayer = async (layerName) => {
    try {
        const wmsSource = new TileWMS({
            url: url,
            params: {
                'LAYERS': LAYERS,
                'VERSION': '1.1.0',
                REQUEST: 'GetCapabilities',
                SERVER: 'WMS'
            },
            projection: getProjection('EPSG:4326'),
            crossOrigin: 'anonymous'
        })
        try {
            const respose = await fetch(
                wmsSource.getUrls()[0] + '?SERVICE=WMS&REQUEST=GetCapabilities'
            )
            const text = await respose.text()
            const parser = new DOMParser();
            const xmlDoc = parser.parseFromString(text, "text/xml");
            const layers = xmlDoc.getElementsByTagName('Layer');
            const layerNames = [];

            for (let layer of Array.from(layers)) {
                const name = layer.getElementsByTagName('Name')[0].textContent;
                if (name === layerName) {
                    const bbox = layer.getElementsByTagName('BoundingBox')[0]
                    if (!bbox) {
                        console.warn('未找到图层边界框信息')
                        return
                    }
                    const minX = parseFloat(bbox.getAttribute('minx'));
                    const minY = parseFloat(bbox.getAttribute('miny'));
                    const maxX = parseFloat(bbox.getAttribute('maxx'));
                    const maxY = parseFloat(bbox.getAttribute('maxy'));
                    const extent = [minX, minY, maxX, maxY];
                    map.getView().fit(extent, { padding: [50, 50, 50, 50], duration: 1000 })
                    return;
                }
            }
            console.warn('未找到指定图层')
            return;
        } catch (error) {
            console.error('获取WMS图层信息失败', error);
        }

    } catch (error) {
        console.error('获取WMS图层信息失败', error);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值