javascript - 如何使用 Vuelayers 与 GeoServer 提供的 WMS 切片图层进行交互?

标签 javascript vue.js openlayers geoserver vuelayers

我正在使用 Vuelayers 开发网络 map 应用程序库,它是 具有 OpenLayers 强大功能的 Web map Vue 组件

我的模板中有以下代码:

<vl-map @singleclick="hideOverlay" @postcompose="onMapPostCompose"
 :load-tiles-while-animating="true" ref="map"
:load-tiles-while-interacting="true" data-projection="EPSG:4326"
style="height: 900px" @mounted="onMapMounted">
 ....

  <component v-for="layer in layers" :ref="layer.id" overlay
    :is="layer.cmp"
    :key="layer.id" v-bind="layer">
        <component :is="layer.source.cmp" v-if="layer.visible" v-bind="layer.source">
        </component>
    </component>
     ....
</vl-map>

在数据对象中我有以下属性:

     layers: [

            {
                id: 'sections',
                title: 'Sections',
                cmp: 'vl-layer-tile',
                visible: true,

                source: {
                    cmp: 'vl-source-wms',
                    url: 'http://localhost:8080/geoserver/sager/wms',
                    layers: 'sections',
                    tiled: true,
                    format: 'image/png',
                    serverType: 'geoserver',
                },
            },
     ....
    ]

那么点击图层时如何获取图层属性呢?知道 vl-tile-layer 没有提到的 @click 事件 here .

最佳答案

只需将点击处理程序放在顶级 map 组件上,如下所示:

<vl-map @click="mapClick" @singleclick="hideOverlay" @postcompose="onMapPostCompose"
 :load-tiles-while-animating="true" ref="map"
:load-tiles-while-interacting="true" data-projection="EPSG:4326"
style="height: 900px" @mounted="onMapMounted">

</vl-map>

然后在点击事件中使用forEachLayerAtPixel该函数在显示在该屏幕像素上的每一层上运行,并为您提供 ol.Layer.Layer您可以调用 getProperties() 的对象:

 methods: {
  mapClick: function(evt){
    evt.map.forEachLayerAtPixel(
        evt.pixel,
        function(layer){ layer.getProperties()},
        function(layer){/*filter layers you want to get property data on*/})
  }
}

只有在服务器上设置了 CORS 并且您可以在 vue-layers 在幕后使用的 OpenLayers 层上设置 crossOrigin 设置时,以上内容才有效。上面的方法更好但是如果你得到一个错误说明

"SecurityError: Failed to execute 'getImageData' on 
'CanvasRenderingContext2D': The canvas has been tainted by cross-origin data

然后你可以使用更通用的函数,比如

evt.map.getLayers().item(0)

or

evt.map.getLayers.forEach(
    function(layer){
        layerProps = layer.getProperties()
        if(layerProps.id === "the one you want")
        {
            // You will have to implement your own intersection logic here
            // to see if the click point intersected with the layer.
        }
})

关于javascript - 如何使用 Vuelayers 与 GeoServer 提供的 WMS 切片图层进行交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56318151/

相关文章:

javascript - lodash sortByOrder 未按预期工作?

javascript - 在 JavaScript 中链接 .bind() 调用。意想不到的结果?

vue.js - vue中可以不嵌套单文件组件标签吗

javascript - 无法导入/导出 vuejs 组件

javascript - OpenLayers 4概览 map 点击事件

javascript - 识别 Angular2 中的后退/前进浏览器按钮

javascript - 未捕获的引用错误 :. jspdf 未定义

vue.js - useMeta 不更新 Nuxt Composition API 中的标题

google-chrome - 使用源映射调试 openlayers 5 应用程序