2014-09-24 12 views
11

Sono riuscito ad aggiungere l'interattività a un feature layer aggiunto da una risorsa GeoJSON remota. Quando faccio clic su una funzione, ottengo il suo ID, sparo una richiesta AJAX e visualizzo alcune informazioni rilevanti sulla funzione, nella pagina al di fuori dell'area della mappa.Come cambiare il cursore al passaggio del mouse negli Openlayer 3?

Ho utilizzato un'interazione Select.

Vorrei rendere ancora più chiaro all'utente che può fare clic sulle funzionalità sulla mappa. C'è un modo in cui posso cambiare il cursore del mouse in "cursore" di "mano" quando il mouse passa su una caratteristica contenuta in un ol.layer.Vector?

Non ho trovato nulla nel documento, su questo sito o su Google.

+4

C'è un esempio: http://openlayers.org/en/v3.0.0/examples/icon.html. Per essere sincero, sto cercando di utilizzare lo stesso metodo nella mia mappa ma senza successo: ** Uncaught TypeError: Impossibile impostare la proprietà 'cursor' di undefined ** – Azathoth

+0

Grazie per il link. Ci proverò più tardi. –

+0

@Azathoth 'getTarget' ti dà cosa dare alla destinazione della mappa: stringa o HTMLElement. Dovrebbe essere HTMLElement, come nell'esempio, se vuoi cambiare il suo stile. – tonio

risposta

8

Grazie al collegamento ad esempio fornito da Azathoth nei commenti ho lavorato una soluzione out:

  • utilizzando OL3 pointermove evento
  • utilizzando jQuery per ottenere l'elemento di destinazione e cambiare il suo stile cursore

ecco il codice:

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", ""); 
    } 
}); 

Qui è il link per l'esempio in loco OpenLayers: http://openlayers.org/en/v3.0.0/examples/icon.html

10

Si può fare anche senza jQuery:

map.on("pointermove", function (evt) { 
    var hit = this.forEachFeatureAtPixel(evt.pixel, function(feature, layer) { 
     return true; 
    }); 
    if (hit) { 
     this.getTarget().style.cursor = 'pointer'; 
    } else { 
     this.getTarget().style.cursor = ''; 
    } 
}); 
+5

In 3.17.1 questo codice funziona. Ma non con this.getTarget(), usa this.getTargetElement() – David

11

Se questo non funziona, provare una combinazione di 2, sembrava funzionare per il mio vettore popup ...

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", ""); 
    } 
}); 
+0

questo funziona per me, gli altri no. OL3 // Versione: v3.1.0-pre.2-179-gca3dfe2 –

+0

lo stesso per me, solo questo funziona – radhoo

2

ho fatto con il seguente codice:

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', ''); 
    } 
}); 
1

modo semplice per ottenere elemento di destinazione

var target = map.getTarget(); 

target = typeof target === "string" ? 
    document.getElementById(target) : target; 

target.style.cursor = features.length > 0) ? 'pointer' : ''; 
+0

Motivo per downvote: utilizzare map.getTargetElement() (https://openlayers.org/en/latest /apidoc/ol.Map.html#getTargetElement). –

5

Ecco un altro modo per farlo:

map.on('pointermove', function(e){ 
    var pixel = map.getEventPixel(e.originalEvent); 
    var hit = map.hasFeatureAtPixel(pixel); 
    map.getViewport().style.cursor = hit ? 'pointer' : ''; 
}); 
+0

Nota a margine, è necessario aggiungere il paren mancante ");" alla fine per incollare facilmente le copie – fnicollet

0

Un altro modo (combinata dalle parti di risposte di cui sopra, ma ancora più semplice):

map.on("pointermove", function (evt) { 
    var hit = map.hasFeatureAtPixel(evt.pixel); 
    map.getTargetElement().style.cursor = (hit ? 'pointer' : ''); 
}); 
1

Uncaught TypeError: Cannot set property 'cursor' of undefined.

Riparato con: map.getTargetElement()s.style.cursor = hit ? 'pointer' : ''; anziché map.getTarget().style.cursor = hit ? 'pointer' : '';

0

Se voi ragazzi stanno usando angolare 2 è necessario utilizzare il seguente codice:

this.map.on("pointermove", function (evt) { 
    var hit = evt.map.hasFeatureAtPixel(evt.pixel); 
    this.getTargetElement().style.cursor = hit ? 'pointer' : ''; 
}); 

Se la variabile mappa è una classe membro si riferiscono ad essa come "this.map", invece se si è dichiarata all'interno della funzione corrente può essere indicato come "mappa".Ma soprattutto, non si scrive

map.getTargetElement() 

ma si scrive

this.getTargetElement() 
2

Per me ha funzionato così:

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' : ''; 
     }); 

Ho anche aggiunto un filtro layer:

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' : ''; 
    }); 

Ho dovuto selezionare una nuova soluzione come quello vecchio che avevo usato per il filtro di livello prima non funzionava più:

var hit = e.map.hasFeatureAtPixel(e.pixel, function(layer){ 
      return layer.get('name') === 'myLayer'; 
      }); 
+0

Idea interessante, ma non dimenticare di menzionare che un livello non ha attribuzioni di "nome" nativo, e questo deve essere impostato (qui, sulla creazione del livello). 'var mylayer = new ol.layer.Vector ({ fonte: mySource, stile: myStyle, nome: "myLayerName" });' –

Problemi correlati