3

機能IDを持っています。GeoRSSロードエンドでマーカーレイヤーを取得できますが、プログラムでポップアップを表示する方法がわかりません。

必要に応じてポップアップを作成しますが、地図上に描かれているマーカーのIDを取得して、そのイベントを呼び出すことができるはずです。jQueryを使用$(marker-id).click()してマップ要素でイベントを呼び出してみましたが、機能していないようです。私は何が欠けていますか?

私はコードを求められたので、そしてそれが定型文であると推定したので、これまでのところここにいます:

map = new OpenLayers.Map('myMap'); 
map.addLayer(new OpenLayers.Layer.OSM()); 
map.addLayer(new OpenLayers.Layer.GeoRSS(name,url));

//I've done some stuff as well in re: projections and centering and 
//setting extents, but those really don't pertain to this question.

他の場所では、jQueryのテンプレートを少し作成して、マップに表示されているすべてのポイントのリストを作成しました。レイヤーからコールバックを実行しloadendてレイヤーオブジェクトを取得する方法、マップからレイヤーを手動で取得する方法、レイヤーコレクションを繰り返し処理してレイヤーを見つける方法を知っています。element.click()したがって、ポップアップに関するこれらの詳細を取得することはできますが、DOMまたはこのAPIの組み込みメソッドを使用して、どちらを実行したいかを簡単にする方法がわかりません。 。

4

2 に答える 2

4

ポップアップを開くために機能をクリックする必要はありません。

まず、機能 ID から機能への参照が必要です。レイヤーのプロパティをloadend使用して、GeoRSS レイヤーのイベントでそれを行います。markers

機能への参照があると仮定すると、自動ポップアップを処理するメソッドを記述します。

var popups = {}; // to be able to handle them later 

function addPopup(feature) {

var text = getHtmlContent(feature); // handle the content in a separate function.

var popupId = evt.xy.x + "," + evt.xy.y; 
var popup = popups[popupId];
if (!popup || !popup.map) {
    popup = new OpenLayers.Popup.Anchored(
        popupId,
        feature.lonlat,
        null,
        " ",
        null,
        true,
        function(evt) {
            delete popups[this.id];
            this.hide();
            OpenLayers.Event.stop(evt);
        }
    );
    popup.autoSize = true;
    popup.useInlineStyles = false;
    popups[popupId] = popup;
    feature.layer.map.addPopup(popup, true);
}
popup.setContentHTML(popup.contentHTML + text);
popup.show();

}
于 2011-04-04T08:28:04.930 に答える
1

fwiw 最終的にこれに戻って、まったく別のことをしましたが、彼の答えは良いものでした。

//I have a list of boxes that contain the information on the map (think google maps)
$('.paginatedItem').live('mouseenter', onFeatureSelected).live('mouseleave',onFeatureUnselected);

function onFeatureSelected(event) {
    // I stuff the lookup attribute (I'm lazy) into a global
    // a global, because there can be only one
    hoveredItem = $(this).attr('lookup');

    /* Do something here to indicate the onhover */
    // find the layer pagination id
    var feature = findFeatureById(hoveredItem);

    if (feature) {

        // use the pagination id to find the event, and then trigger the click for that event to show the popup
        // also, pass a null event, since we don't necessarily have one. 
        feature.marker.events.listeners.click[0].func.call(feature, event)
    }
}
function onFeatureUnselected(event) {
    /* Do something here to indicate the onhover */
    // find the layer pagination id
    var feature = findFeatureById(hoveredItem);

    if (feature) {

        // use the pagination id to find the event, and then trigger the click for that event to show the popup
        // also, pass a null event, since we don't necessarily have one. 
        feature.marker.events.listeners.click[0].func.call(feature, event)
    }

    /* Do something here to stop the indication of the onhover */

    hoveredItem = null;
}

function findFeatureById(featureId) {
    for (var key in map.layers) {
        var layer = map.layers[key];
        if (layer.hasOwnProperty('features')) {
            for (var key1 in layer.features) {
                var feature = layer.features[key1];
                if (feature.hasOwnProperty('id') && feature.id == featureId) {
                    return feature;
                }
            }
        }
    }
    return null;
}

mapまた、グローバルとして保持しているため、使用するたびに再取得する必要がないことにも注意してください

于 2011-11-04T18:41:44.853 に答える