Come utilizzare Marker Clanter Plus su una mappa Google con immagini Retina
-
21-12-2019 - |
Domanda
Sto usando Marker ClanterPLUS per raggruppare i marcatori su una mappa di Google ma l'opzione EnableRetinaCons non sembra funzionare.
// Custom style to alter the default font color (style is always the same).
var styles = [
{
url: 'PATH_TO_MY_66x66px_IMAGE',
textColor: '#ddddd',
textSize: 18,
width: 33,
height: 33,
}
];
// Calculator function to determine which style to use (I only have one)
var calculator = function (markers, iconstyles){
return{ text: markers.length.toString(), index:1};
};
// Set Options
var clusterOptions = {
title: 'Cluster Title',
enableRetinaIcons: true,
styles: styles,
calculator: calculator
}
// Add to map
new MarkerClusterer(this.map, this.markers, clusterOptions);
.
.
L'opzione EnablereRetinaInnons non sembra funzionare, l'immagine viene visualizzata il doppio delle dimensioni.
Impostazione della larghezza a 66x66px non aiuta neanche.
Qualcuno sa come configurarlo correttamente?
Soluzione
Questo è apparentemente bug in Marker Clanter Plus. L'unico posto nel codice in cui effettivamente usano questa opzione è qui:
img = "<img src='" + this.url_ + "' style='position: absolute; top: " + spriteV + "px; left: " + spriteH + "px; ";
if (!this.cluster_.getMarkerClusterer().enableRetinaIcons_) {
img += "clip: rect(" + (-1 * spriteV) + "px, " + ((-1 * spriteH) + this.width_) + "px, " +
((-1 * spriteV) + this.height_) + "px, " + (-1 * spriteH) + "px);";
}
img += "'>";
.
Quindi, in realtà, disabilitano solo il ritaglio per le icone sprite, ma non eseguono effettivamente l'azione retina richiesta. L'albero HTML dell'icona è in realtà simile:
Quindi puoi vedere che il div che circonda l'icona ha dimensioni corrette (33x33), ma l'immagine stessa (il codice blu) non ha alcun set di dimensioni.
Ho provato a risolvere il problema patching la libreria dei cluster del marker, solo aggiungendo un altro ramo:
img = "<img src='" + this.url_ + "' style='position: absolute; top: " + spriteV + "px; left: " + spriteH + "px; ";
if (!this.cluster_.getMarkerClusterer().enableRetinaIcons_) {
img += "clip: rect(" + (-1 * spriteV) + "px, " + ((-1 * spriteH) + this.width_) + "px, " +
((-1 * spriteV) + this.height_) + "px, " + (-1 * spriteH) + "px);";
}
else {
img += "width: " + this.width_ + "px;" + "height: " + this.height_ + "px;";
}
img += "'>";
.
sembra funzionare:
Completa Biblioteca patch @pastebin
Esempio di test - http://jsfiddle.net/rt28t/2/
Puoi segnalare un bug e aggiungere questo come patch proposto: -)
Altri suggerimenti
So che questa domanda è stata data una risposta, ma un altro modo per risolvere questo problema (e probabilmente più facile) è solo utilizzando un'icona di marcatore SVG .In questo modo:
- .
- La tua soluzione supporterà qualsiasi dispositivo di densità pixel
- Non è necessario patchare la libreria (con tutti i problemi che può causare)
- Il supporto del browser corrente è abbastanza buono - controlla caniuse.com svg-img per il browserStatistiche
Basta caricare le icone due volte la taglia:
m1.png = 53x53 (normal) 106x106 (retina)
m2.png = 56x56 (normal) 112x112 (retina)
m3.png = 66x66 (normal) 132x132 (retina)
m4.png = 78x78 (normal) 156x156 (retina)
m5.png = 90x90 (normal) 180x180 (retina)
.
e aggiungi al tuo CSS:
#map .cluster img {
max-width: 100%;
}
.