Просто поместите обработчик кликов на компонент карты верхнего уровня, например:
<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>
Затем в событии click используйте функцию forEachLayerAtPixel , которая работает на каждом слое, отображаемом в этом пикселе экрана, и предоставляет вам объект ol.Layer.Layer , который вы можете вызвать getProperties () on:
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 настроен на сервере и если вы можете установить параметр crossOrigin на слое OpenLayers, который vue-layer использует за кулисами. вышеупомянутый метод лучше, но если вы получаете сообщение об ошибке
"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.
}
})