リモートのGeoJSONリソースから追加されたフィーチャレイヤーに対話機能を追加できました。機能をクリックしてIDを取得し、AJAX=リクエストを発行して、機能に関するいくつかの関連情報をマップ領域外のページに表示します。
Select
インタラクションを使用しました。
ユーザーがマップ上のフィーチャをクリックできることをユーザーにさらに明確にしたいと思います。マウスがol.layer.Vector
に含まれる機能にカーソルを合わせたときに、マウスカーソルを「手」の「カーソル」に変更する方法はありますか?
ドキュメント、このサイト、またはグーグルで何も見つかりませんでした。
コメントで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
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 = '';
}
});
それがうまくいかない場合は、2の組み合わせを試してみてください。私のベクトルポップアップではうまくいくようです...
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", "");
}
});
これを行う別の方法を次に示します。
map.on('pointermove', function(e){
var pixel = map.getEventPixel(e.originalEvent);
var hit = map.hasFeatureAtPixel(pixel);
map.getViewport().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 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 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', '');
}
});
ターゲット要素を取得する簡単な方法
var target = map.getTarget();
target = typeof target === "string" ?
document.getElementById(target) : target;
target.style.cursor = features.length > 0) ? 'pointer' : '';
Angular 2を使用している場合は、次のコードを使用する必要があります。
this.map.on("pointermove", function (evt) {
var hit = evt.map.hasFeatureAtPixel(evt.pixel);
this.getTargetElement().style.cursor = hit ? 'pointer' : '';
});
マップ変数がメンバークラスである場合は、「this.map」として参照しますが、現在の関数内で宣言されている場合は、「マップ」として参照できます。しかし何よりも、あなたは書きません
map.getTargetElement()
しかしあなたは書く
this.getTargetElement()
_Uncaught TypeError: Cannot set property 'cursor' of undefined.
_
修正:map.getTargetElement()s.style.cursor = hit ? 'pointer' : '';
の代わりにmap.getTarget().style.cursor = hit ? 'pointer' : '';
別の方法(上記の回答の一部を組み合わせたものですが、さらに簡単です):
map.on("pointermove", function (evt) {
var hit = map.hasFeatureAtPixel(evt.pixel);
map.getTargetElement().style.cursor = (hit ? 'pointer' : '');
});
簡単な方法
map.on('pointermove', (e) => {
const pixel = map.getEventPixel(e.originalEvent);
const hit = map.hasFeatureAtPixel(pixel);
document.getElementById('map').style.cursor = hit ? 'pointer' : '';
});
}
Itriedpointermove
イベントクロージャを最小限に抑えるために、必要でないときにスタイルを更新しないようにします。
例1:使用jQuery:
var cursorStyle = "";
map.on("pointermove", function (e) {
let newStyle = this.hasFeatureAtPixel(e.pixel) ? "pointer" : "";
newStyle !== cursorStyle && $(this.getTargetElement()).css("cursor", cursorStyle = newStyle);
});
例2:no jQuery:
var cursorStyle = "";
map.on("pointermove", function (e) {
let newStyle = this.hasFeatureAtPixel(e.pixel) ? "pointer" : "";
if (newStyle !== cursorStyle) {
this.getTargetElement().style.cursor = cursorStyle = newStyle;
}
});