2011-03-31 3 views
3

J'ai l'ID de l'entité, je peux saisir le calque de marqueur sur le loadend de GeoRSS, mais je ne suis toujours pas sûr de savoir comment faire apparaître le popup par programmation.Quelle est la manière correcte dans OpenLayers (OSM) de déclencher un popup pour une fonctionnalité?

Je créerai la popup à la demande si c'est nécessaire, mais il semble que je devrais être capable d'obtenir l'identifiant du marqueur dessiné sur la carte et d'appeler un événement là-dessus. J'ai essayé d'utiliser jQuery et d'appeler l'événement $(marker-id).click() sur les éléments de la carte, mais cela ne semble pas fonctionner. Qu'est-ce que je rate?

Depuis, on m'a demandé de code, et que je présumais à être passe-partout, voici où je suis jusqu'à présent:

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. 

Ailleurs, je l'ai fait un peu de jQuery modèlet me construit une belle liste de tous les points qui sont affichés sur la carte. Je sais comment faire un rappel à partir de la couche loadend et obtenir l'objet de calque, je sais comment extraire manuellement ma couche de la carte, je sais comment iter sur la collection de calques et trouver ma couche. Donc, je peux saisir n'importe lequel de ces détails sur la popup, mais je ne sais toujours pas comment utiliser les méthodes intégrées du DOM ou de cette API pour le rendre aussi facile que element.click() ce qui est ce que je préférerais faire.

+0

Lorsque vous ajoutez un popup à la couche d'un Popup, son ouverture automatique. Pouvez-vous poster un petit code source de votre développement? –

+0

@Fran ~ J'ajoute une couche georss et je veux juste pouvoir faire quelque chose comme la page map de google, où cliquer sur un lien sur la gauche fait apparaître la popup sur la droite. Je ne pense vraiment pas que mon code si loin signifierait quelque chose. C'est littéralement quelque chose pour construire la chose sur la gauche pour l'affichage, et ensuite pour la carte c'est 'map = new OpenLayers.Map ('myMap'); map.addLayer (new OpenLayers.Layer.OSM()); map.addLayer (new OpenLayers.Layer.GeoRSS (name, url)); 'Tout autre code que j'ai écrit ne serait pas lié à la question en question, j'en suis sûr. – jcolebrand

+0

Avez-vous assez pour fermer le problème? –

Répondre

4

Vous n'avez pas besoin de cliquer sur la fonctionnalité pour ouvrir une fenêtre contextuelle.

Vous devez d'abord faire référence à la fonction à partir de l'ID de fonction. Je le ferais dans l'événement loadend de la couche GeoRSS, en utilisant la propriété markers sur la couche.

En supposant que vous avez une référence à votre fonction, j'écrire une méthode qui gère la fenêtre contextuelle automatique:

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(); 

} 
+0

"Puisque je dois de toute façon saisir une référence à l'information de l'événement loadend" - de quelle information s'agit-il? Les informations spécifiques aux entités sont stockées dans feature.attributes et si vous souhaitez des informations sur les couches, vous disposez de la propriété feature.layer pour les obtenir. La seule information dont vous avez besoin dans l'événement loadend est l'identifiant de la fonctionnalité, et je le comprends comme vous l'avez? –

+0

err, gratter tout ça, oui oui, j'ai déjà le contenu html/facepalm ... merci encore – jcolebrand

+1

pas besoin de facepalms :-) –

1

FWIW je finalement est revenu à cela et a fait tout autre chose, mais sa réponse était une bonne un.

//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; 
} 

noter aussi que je garde map comme mondiale donc je n'ai pas réacquérir chaque fois que je veux l'utiliser

Questions connexes