次のコードを使用して、OpenLayers 3(OL3)のベクターレイヤーに機能を追加しています。
marker = new ol.Feature({
geometry: new ol.geom.Point([longitude, latitude]),
name: "Location Marker"
});
markerStyle = new ol.style.Style({
image: new ol.style.Icon({
anchor: [0.5, 1.0],
anchorXUnits: "fraction",
anchorYUnits: "fraction",
src: "Content/Images/OpenLayers/marker_trans.png"
}),
zIndex: 100000
});
marker.setStyle(markerStyle);
marker.on("click", function(e) {
// do something
}, marker);
map.getSource().addFeature(marker);
マーカーは期待どおりに表示されますが、クリックイベントは発生しません。私は何を間違えていますか?
マップレベルで「クリック」に関連付けられたハンドラーが既にあることに注意してください。
map.on("click", function(e) {
// do something
}, marker);
最初:機能はクリックを発生させません!イベント機能の起動に関する情報については、 http://openlayers.org/en/master/apidoc/ol.Feature.html を確認してください。
機能がクリックされたかどうかを確認するために、ol.Mapの.forEachFeatureAtPixel(pixel, callback)
関数があります。 ( http://openlayers.org/en/master/apidoc/ol.Map.html#forEachFeatureAtPixel )コールバックはピクセルのすべてのフィーチャで実行されます。コールバックには2つの引数が渡されます:機能と機能が含まれるレイヤー。
Openlayersイベントハンドラーではなく、ビューポートのハンドラーを使用する場合は、.getEventPixel(event)
関数が便利です。 openlayers eventhandlerを使用している場合、イベントにはプロパティ_.pixel
_があります。 ( http://openlayers.org/en/master/apidoc/ol.Map.html#getEventPixel ).getEventCoordinate(event)
メソッドと.getCoordinateFromPixels(pixels)
メソッドが役立つ場合がありますも。
したがって、次のようにmap.on( "click"、...に追加します。
_map.on("click", function(e) {
map.forEachFeatureAtPixel(e.pixel, function (feature, layer) {
//do something
})
});
_
JQueryでも同じこと:
_$(map.getViewport()).on("click", function(e) {
map.forEachFeatureAtPixel(map.getEventPixel(e), function (feature, layer) {
//do something
});
});
_
純粋なJSでも同じこと:
_map.getViewport().addEventListener("click", function(e) {
map.forEachFeatureAtPixel(map.getEventPixel(e), function (feature, layer) {
//do something
});
});
_
これを確認することもできますexample、この関数には2つの用途があります。1つ目はopenlayersイベント、2つ目はjQueryイベントです: http://openlayers.org/en/master/examples/icon.js
Ol.interaction.Select( http://openlayers.org/en/master/apidoc/ol.interaction.Select.html?unstable=true )でこれを行う可能性もあります。しかし、これはこの場合には少し圧倒されます。また、選択されたフィーチャを、管理されていない別のレイヤーに内部的に移動するオープンレイヤーによって引き起こされる、直感的でない警告もあります。
とにかく、これはインタラクションに属するコレクションにリスナーを追加することで機能します。コレクションは、.getFeatures()
で取得できます。
_interaction.getFeatures().on("add", function (e) {
// do something. e.element is the feature which was added
});
_
地図上にクリック可能なマーカーを追加するだけの場合は、オーバーレイを使用できます。 HTMLヘッダーで、マーカーのスタイルを定義します。
<style>
#marker {
width: 20px;
height: 20px;
border: 1px solid #088;
border-radius: 10px;
background-color: #0FF;
opacity: 0.5;
}
</style>
次に、マップが作成された後、ファイルのスクリプト部分で:
// add marker
var pos = ol.proj.fromLonLat([0.01123, 0.00612]);
var marker = new ol.Overlay({
position: pos,
positioning: 'center-center',
element: $('<div id="marker" title="Marker"></div>')
.popover({
'placement': 'top',
'html': true,
'content': '<strong>anything...</strong>'
})
.on('click', function (e) { $(".location-popover").not(this).popover('hide'); }),
stopEvent: false
});
map.addOverlay(marker);