我成功地给一个来自远程GeoJSON资源的要素图层添加了交互功能。当我点击一个要素时,我会获取它的ID,发起一个AJAX请求,并在地图区域之外的页面上显示一些相关信息。
我使用了一个名为Select
的交互模块。
我想让用户更清楚地知道他可以通过单击地图上的要素来进行操作。是否有任何方法可以在鼠标悬停在ol.layer.Vector
中包含的要素上时将鼠标光标更改为“手型”?
我在文档、这个网站或者谷歌搜索中都没有找到相关信息。
我成功地给一个来自远程GeoJSON资源的要素图层添加了交互功能。当我点击一个要素时,我会获取它的ID,发起一个AJAX请求,并在地图区域之外的页面上显示一些相关信息。
我使用了一个名为Select
的交互模块。
我想让用户更清楚地知道他可以通过单击地图上的要素来进行操作。是否有任何方法可以在鼠标悬停在ol.layer.Vector
中包含的要素上时将鼠标光标更改为“手型”?
我在文档、这个网站或者谷歌搜索中都没有找到相关信息。
同样可以不用 jQuery 完成:
map.on("pointermove", function (evt) {
var hit = this.forEachFeatureAtPixel(evt.pixel, function(feature, layer) {
return true;
});
if (hit) {
this.getTargetElement().style.cursor = 'pointer';
} else {
this.getTargetElement().style.cursor = '';
}
});
这里是另一种方法:
map.on('pointermove', function(e){
var pixel = map.getEventPixel(e.originalEvent);
var hit = map.hasFeatureAtPixel(pixel);
map.getViewport().style.cursor = hit ? 'pointer' : '';
});
如果那个方法不起作用,可以尝试两种方法结合,这似乎对我的向量弹出窗口有用...
var target = map.getTarget();
var jTarget = typeof target === "string" ? $("#" + target) : $(target);
// change mouse cursor when over marker
$(map.getViewport()).on('mousemove', function (e) {
var pixel = map.getEventPixel(e.originalEvent);
var hit = map.forEachFeatureAtPixel(pixel, function (feature, layer) {
return true;
});
if (hit) {
jTarget.css("cursor", "pointer");
} else {
jTarget.css("cursor", "");
}
});
感谢 Azathoth 在评论中提供的示例链接,我已经想出了解决方案:
pointermove
事件以下是代码:
var cursorHoverStyle = "pointer";
var target = map.getTarget();
//target returned might be the DOM element or the ID of this element dependeing on how the map was initialized
//either way get a jQuery object for it
var jTarget = typeof target === "string" ? $("#"+target) : $(target);
map.on("pointermove", function (event) {
var mouseCoordInMapPixels = [event.originalEvent.offsetX, event.originalEvent.offsetY];
//detect feature at mouse coords
var hit = map.forEachFeatureAtPixel(mouseCoordInMapPixels, function (feature, layer) {
return true;
});
if (hit) {
jTarget.css("cursor", cursorHoverStyle);
} else {
jTarget.css("cursor", "");
}
});
这是OpenLayers网站上的示例链接:http://openlayers.org/en/v3.0.0/examples/icon.html
对于我而言,它是这样起作用的:
map.on('pointermove', function(e) {
if (e.dragging) return;
var pixel = e.map.getEventPixel(e.originalEvent);
var hit = e.map.forEachFeatureAtPixel(pixel, function (feature, layer) {
return true;
});
e.map.getTargetElement().style.cursor = hit ? 'pointer' : '';
});
我还添加了一个层过滤器:
map.on('pointermove', function(e) {
if (e.dragging) return;
var pixel = e.map.getEventPixel(e.originalEvent);
var hit = e.map.forEachFeatureAtPixel(pixel, function (feature, layer) {
return layer.get('name') === 'myLayer';
});
e.map.getTargetElement().style.cursor = hit ? 'pointer' : '';
});
我不得不选择一个新的解决方案,因为我之前用于图层过滤器的旧解决方案已经不再可用:
var hit = e.map.hasFeatureAtPixel(e.pixel, function(layer){
return layer.get('name') === 'myLayer';
});
var myLayer = new ol.layer.Vector({ source: mySource, style: myStyle, name: "myLayerName" });
- Josef M. Schomburgmap.on("pointermove", function (evt) {
var hit = map.hasFeatureAtPixel(evt.pixel);
map.getTargetElement().style.cursor = (hit ? 'pointer' : '');
});
var target = $(map.getTargetElement()); //getTargetElement is experimental as of 01.10.2015
map.on('pointermove', function (evt) {
if (map.hasFeatureAtPixel(evt.pixel)) { //hasFeatureAtPixel is experimental as of 01.10.2015
target.css('cursor', 'pointer');
} else {
target.css('cursor', '');
}
});
Uncaught TypeError: Cannot set property 'cursor' of undefined.
修复方法: map.getTargetElement()s.style.cursor = hit ? 'pointer' : '';
,而不是map.getTarget().style.cursor = hit ? 'pointer' : '';
var target = map.getTarget();
target = typeof target === "string" ?
document.getElementById(target) : target;
target.style.cursor = features.length > 0) ? 'pointer' : '';
this.map.on("pointermove", function (evt) {
var hit = evt.map.hasFeatureAtPixel(evt.pixel);
this.getTargetElement().style.cursor = hit ? 'pointer' : '';
});
map.getTargetElement()
this.getTargetElement()
getTarget
函数会返回一个用于映射目标的参数:字符串或 HTMLElement。如果你想改变其样式,应该使用 HTMLElement,就像示例中一样。 - toniomap.getTargetElement().style.cursor = 'pointer';
对我有效 - Pratik Goenka