2010-09-28 13 views
13

La mia mappa ha diverse centinaia di marker all'interno di una città. Di solito non più di un raggio di 20 miglia. Ho letto la documentazione e non ho trovato il modo di impostare l'init per scorrere automaticamente tra ogni marker, indipendentemente dalla distanza. Il comportamento predefinito è il pan se chiuso, salta se lontano. Capisco perché lo farebbero perché la mappa non carica tutto il mondo al livello di zoom selezionato e potrebbe rovinare se la distanza fosse troppo grande. Tuttavia, penso che possa gestire un raggio di 20 miglia con reclami minimi.Google Maps v3: posso garantire un panning uniforme ogni volta?

Se qualcuno ha qualche idea, mi piacerebbe sentirli. Grazie

risposta

15

La soglia del panning regolare non dipende dalla distanza tra il centro corrente e il nuovo target. Dipende se il cambiamento richiederà una pagina di scorrimento completo (orizzontale e verticale) oppure no:

Citando dal API Reference:

Panto (LatLng: LatLng)

Cambia il centro della mappa per il LatLng specificato. Se la modifica è inferiore sia alla larghezza che all'altezza della mappa, la transizione verrà animata in modo uniforme.

Pertanto, se si esegue lo zoom indietro in modo tale che il viewport sia di 20 miglia in altezza e larghezza, si dovrebbe garantire una panoramica uniforme per distanze inferiori a 20 miglia.

+1

mai meno, c'è un modo per sovrascrivere questo? –

+0

@Kai: non penso ci sia usando l'API. Potresti implementare l'animazione da solo, ma ciò potrebbe non valerne la pena (dipende da quanto è importante questa funzione). –

+0

Io sostengo che questa funzionalità non è importante, ma il cliente sembra pensarla così. Poiché la navigazione è anche elencata in un menu a fisarmonica sul lato, l'utente può far saltare la mappa dappertutto scorrendo lungo la lista, e mentre così facendo potrebbero perdere traccia di dove si trova il marker in relazione alle aree familiari. –

0

Come ha già detto Daniel, la funzione integrata panTo() non funzionerà per voi se i due punti sono troppo distanti. Puoi comunque animarlo manualmente, se è il caso: per ogni livello di zoom, calcola la distanza percorsa diciamo 100 pixel. Ora, quando devi eseguire una panoramica su un punto, puoi usare queste informazioni per capire se la funzione panTo() si animerà o salterà. Se la distanza spostata è così grande da non animare, dovresti eseguire manualmente l'animazione, calcolare alcuni waypoint intermedi tra il centro della mappa corrente e la tua destinazione, e scorrere in sequenza.

+0

questo è vero ma non stavo cercando di hackerare il sistema. Potrei calcolare la distanza tra i punti e impostare i marker invisibili a incrementi ragionevoli, quindi eseguire una panoramica su ciascuno finché la destinazione non viene soddisfatta. Comunque, sembra che sia troppo per lo scopo del mio progetto, quindi non lo farò ... Se avessi avuto altri giorni extra per giocarci, forse. Grazie –

4

Vedi questo altro SO risposta circa l'uso della funzione di javascript setInterval per creare una funzione periodica che chiama panBy sulla mappa: Can Google Maps be set to a slow constant pan? Like a globe revolution?

Questo può essere usato per scorrere la mappa da x pixel a ogni chiamata a panBy, permettendo per rallentare la velocità di panBy (dato che stai solo dicendo a gmap di eseguire una breve distanza).

10

Ecco una soluzione che pentole senza problemi e permette anche per altre richieste clic da queue'd mentre una padella precedente è già in corso:

var panPath = []; // An array of points the current panning action will use 
var panQueue = []; // An array of subsequent panTo actions to take 
var STEPS = 50;  // The number of steps that each panTo action will undergo 

function panTo(newLat, newLng) { 
    if (panPath.length > 0) { 
    // We are already panning...queue this up for next move 
    panQueue.push([newLat, newLng]); 
    } else { 
    // Lets compute the points we'll use 
    panPath.push("LAZY SYNCRONIZED LOCK"); // make length non-zero - 'release' this before calling setTimeout 
    var curLat = map.getCenter().lat(); 
    var curLng = map.getCenter().lng(); 
    var dLat = (newLat - curLat)/STEPS; 
    var dLng = (newLng - curLng)/STEPS; 

    for (var i=0; i < STEPS; i++) { 
     panPath.push([curLat + dLat * i, curLng + dLng * i]); 
    } 
    panPath.push([newLat, newLng]); 
    panPath.shift();  // LAZY SYNCRONIZED LOCK 
    setTimeout(doPan, 20); 
    } 
} 

function doPan() { 
    var next = panPath.shift(); 
    if (next != null) { 
    // Continue our current pan action 
    map.panTo(new google.maps.LatLng(next[0], next[1])); 
    setTimeout(doPan, 20); 
    } else { 
    // We are finished with this pan - check if there are any queue'd up locations to pan to 
    var queued = panQueue.shift(); 
    if (queued != null) { 
     panTo(queued[0], queued[1]); 
    } 
    } 
} 
+0

Questa è la soluzione migliore che ho trovato per V3. Ha funzionato perfettamente per me È possibile controllare la levigatezza aumentando la variabile STEPS. – user2618844