web-dev-qa-db-ja.com

openlayersマーカーにマウスオーバー

とてもシンプルに聞こえますが、初心者向けのチュートリアルは見つかりません。OpenLayersで(vektor)マーカーを作成して、マウスオーバーで情報ウィンドウを開いたり、マウスアウトで閉じたりする簡単な例を誰かに教えてもらえますか?

私はこれの説明された部分を見つけましたが、それのすべてではありません...

19
user987875

これを行う簡単な例として、いくつかのことを行う必要があります。

マーカーを含むベクターレイヤーを作成し、マップに追加します。

this.markerLayer = new OpenLayers.Layer.Vector(
    "My Marker Layer",
    { /* configuration options are set here */ }
);
map.addLayer(this.markerLayer);

マーカーを作成して地図に追加します。

var marker = new OpenLayers.Feature.Vector(point, attributes, markerStyle);
this.markerLayer.addFeatures([marker]);

レイヤーの選択コントロールを作成し、ユーザーがマーカーにカーソルを合わせたときにポップアップを作成する関数を登録します。

var selectControl = new OpenLayers.Control.SelectFeature(this.markerLayer, {
    hover: true
});
selectControl.events.register('featurehighlighted', null, onFeatureHighlighted);

ポップアップを作成します。

onFeatureHighlighted: function (evt) {
    // Needed only for interaction, not for the display.
    var onPopupClose = function (evt) {
        // 'this' is the popup.
        var feature = this.feature;
        if (feature.layer) {
            selectControl.unselect(feature);
        }  
        this.destroy();
    }

    feature = evt.feature;
    popup = new OpenLayers.Popup.FramedCloud("featurePopup",
            feature.geometry.getBounds().getCenterLonLat(),
            new OpenLayers.Size(100,100),
            "<h2>"+feature.attributes.station_na + "</h2>" +
            "Location: " + feature.attributes.location + '<br/>' +
            "Elevation: " + feature.attributes.elev_,
            null, true, onPopupClose);
    feature.popup = popup;
    popup.feature = feature;
    map.addPopup(popup, true);
}, // ...
16
Kyle

マーカーとポップアップを使用できます

例:

var popup;
var marker_layer = new OpenLayers.Layer.Markers( "Markers" );
var size = new OpenLayers.Size(32,32);
var offset = new OpenLayers.Pixel(-(size.w/2), -size.h);
var icon_marker = new OpenLayers.Icon('http://www.openlayers.org/dev/img/marker.png',
                                       size, 
                                       offset);
marker = new OpenLayers.Marker(new OpenLayers.LonLat(5.6, 50.6), icon_marker);

//here add mouseover event
marker.events.register('mouseover', marker, function(evt) {
    popup = new OpenLayers.Popup.FramedCloud("Popup",
        new OpenLayers.LonLat(5.6, 50.6),
        null,
        '<div>Hello World! Put your html here</div>',
        null,
        false);
    map.addPopup(popup);
}
//here add mouseout event
marker.events.register('mouseout', marker, function(evt) {popup.hide();});

marker_layer.addMarker(marker);
map.addLayer(marker_layer);
9
bsuttor

これでうまくいきます。結局シンプルになりましたが、しばらく時間がかかりました:

 var marker = new OpenLayers.Marker(position, icon.clone());           
 boothLayer.addMarker(marker);                                         

 marker.events.register('mouseover', marker, function() {           
   var msg = booth.get('name') +' - ' + booth.get('premises');      
   var popup = new OpenLayers.Popup.FramedCloud("Popup",            
       position, null, '<div>'+msg+'</div>', null, false);          
   map.addPopup(popup);                                             
   marker.events.register('mouseout', marker,                       
     setTimeout( function() { popup.destroy(); }, 4000));           
   });                                                              

マウスアウトイベントでの4000マイクロ秒の遅延に注意してください。これは、使用状況によっては短くなる可能性があります。

2
ErichBSchulz

ポップアップを作成するには、selectControlを使用する必要があります。クリックする代わりにホバーに応答するには、コンストラクターでhover:trueを設定します。

1
Jon Lynch

私はそれを追加するために関数を使用します、これは簡単なバージョンです。詳細を設定し、下部の関数を呼び出すことに注意してください。また、複数のレイヤーに複数のセレクターを配置することはできないことに注意してください。最後に追加されたセレクターのみが機能すると思うので、1つのレイヤーに複数の機能が必要な場合は調整する必要があります。

function addMarkerLayer(markerInfo){
    var details= markerInfo.details || "<h3>"+markerInfo.title+"</h3>"+
        "[Location] Lat:"+markerInfo.latitude + " Lon:"+markerInfo.longitude;

    var features=[];
    features.Push(new OpenLayers.Feature.Vector(
        new OpenLayers.Geometry.Point(markerInfo.longitude, markerInfo.latitude),
        {title: markerInfo.title, details:details, externalGraphic:markerInfo.icon},
        {
            externalGraphic:markerInfo.icon,
            fillColor: markerInfo.markerColor || '#ff0',
            fillOpacity: markerInfo.iconOpacity || 0.8,
            graphicWidth   : markerInfo.iconSize || 24,
            graphicHeight  : markerInfo.iconSize || 24,
            strokeColor: markerInfo.markerStrokeColor || "#ee9900",
            strokeOpacity: 1,
            strokeWidth: 1,
            pointRadius: 7
        }
    ));

    // create the layer with listeners to create and destroy popups
    var vector = new OpenLayers.Layer.Vector(markerInfo.layerName, {
        eventListeners: {
            'featureselected': function(evt) {
                var feature = evt.feature;
                var popup = new OpenLayers.Popup.FramedCloud("popup",
                    OpenLayers.LonLat.fromString(feature.geometry.toShortString()),
                    null,
                    feature.attributes.details,
                    null,
                    true);
                feature.popup = popup;
                map.addPopup(popup);
            },
            'featureunselected': function(evt) {
                var feature = evt.feature;
                map.removePopup(feature.popup);
                feature.popup.destroy();
                feature.popup = null;
            }
        }
    });
    vector.addFeatures(features);

    var selector = new OpenLayers.Control.SelectFeature(vector, {
        hover: true
    });

    map.addLayer(vector);
    map.addControl(selector);
}


var markerInfo={
    title:'Washington DC',
    latitude:38.8,
    longitude:-77,
    icon:"/icons/event.png",
    iconSize:24
};
addMarkerLayer(markerInfo);
1
JayCrossler

私はol 5.2の「カスタムインタラクション」の例でこの作業例を書きましたopenlayers.org/en/latest/examples/select-features.html

レイヤーに機能を追加してマップに追加し、次のような新しいインタラクションを作成します

const interact = new ol.interaction.Select({condition: ol.events.condition.pointerMove});

ホバー(ポインター移動)時に機能を選択することを指定します。次に、それをマップに追加し、インタラクションが機能を選択したときに(つまり、機能にカーソルを合わせたときに)呼び出される関数を関連付けます。

map.addInteraction(interact);
interact.on('select', showInfoWindow);

そして、情報ウィンドウを表示する関数を宣言します

function showInfoWindow(evt){
    if(evt.selected.length>0){
        const feature = evt.selected[0];
        const id = feature.getId();

        infoWindow.innerHTML = '<p>' + id + '</p>';
        infoWindow.show();//if you have something like that, you could use an openLayers overlay
    }
}

イベントが(この場合は)オブジェクトを返すことに注意してください。このオブジェクトにカーソルを合わせると、 'selected'属性で選択された機能を見つけることができます。マウスオーバーすると、この場合、新しいオブジェクトを選択するまで、同じオブジェクトが「選択解除」属性で使用可能になります

1
Clement

このユーザーリストの例 は、ホバーイベントとクリックイベントの両方をベクターレイヤーに割り当てる方法を示すのに非常に役立ちました。

0
Evan Siroky