2012-09-06 11 views
7

Desidero essere in grado di specificare il raggio dei punti in modo efficace in metri. L'API è configurata in modo che la proprietà radius sia mantenuta costante per i pixel, in modo che l'ingrandimento causi l'erosione della mappa di calore (so che è possibile rendere la heatmap non eroda con la proprietà dissipating, ma ciò solleva altri problemi, ad es. per fare in modo che la heatmap venga visualizzata correttamente. Ecco le heatmap reference.Raggio del punto di livello heatmap di Google Maps

In particolare, sto provando a visualizzare una distribuzione di probabilità su una mappa, ho la distribuzione in forma di immagine e voglio mappare i 0-1 pesi ad uno strato heatmap. (posso, e non voglio, sovrapporre le immagini).

Qualche suggerimento?

+1

penso che sarà necessario utilizzare il fatto che ad ogni livello di zoom, le distanze per pixel doppia, quindi ridisegnare una mappa termica per ogni livello di zoom? –

risposta

12

Ok, ho provato alcune cose:

Uso Mercator Projection example (check the source) per estrarre il coordinate x, y di pixel di qualsiasi punto da un LatLng, utilizzare al più tardi il geometry library, specifically the computeOffset function ottiene un altro LatLng distanza "DM" (in metri) alla destra il precedente, ottieni la differenza (in pixel) come valore assoluto "DP" e da lì ottieni il rapporto "pixelPerMeter" DP/DM.

Allora, se volete che il vostro raggio di essere a 100 metri è sufficiente impostare le proprietà per {radius:Math.floor(desiredRadiusPerPointInMeters*pixelsPerMeter)}

e manipolare il cambio di zoom basta usare un ascoltatore

google.maps.event.addListener(map, 'zoom_changed', function() { 
      heatmap.setOptions({radius:getNewRadius()}); 
     }); 

Ho caricato un small example (prova a zoomare), puoi controllare se la distanza sembra giusta con il pulsante in basso.

+1

Penso di averlo quasi funzionante, tuttavia, il parametro TILE_SIZE mi sta buttando fuori. Perché è impostato a '256', è arbitrario? La mappa, per impostazione predefinita, ha una dimensione tile di (256x256)? Come posso ottenere le dimensioni corrette delle piastrelle? – eqzx

+1

grazie. una cosa da notare è che quando si riduce troppo lo zoom, ogni punto non può più adattarsi a un pixel e i raggi sono impostati su zero. aggiungendo questo codice nel metodo 'getNewRadius()' lo rende così i punti sono resi come non cancellanti (inaccurati), ma almeno sono resi ('dissipating = false' a init) ' if (totalPixelSize == 0 && dissipating == true) {heatmap.setOptions ({dissipating: false}); totalPixelSize =.01; dissipare = false;} else if (totalPixelSize> 0 && dissipare == false) {heatmap.setOptions ({dissipazione: true}); dissipare = true;} else if (totalPixelSize == 0) {totalPixelSize = .01;} ' – eqzx

+1

@ nrhine1 Il numero 256 viene da' Perché la base di piastrelle Mercator Google Maps è di 256 x 256 pixel, coordinare il mondo utilizzabile spazio è {0-256}, {0-256} '[in questa pagina di documentazione] (https://developers.google.com/maps/documentation/javascript/maptypes?hl=it#WorldCoordinates), grazie per il feedback relativo al dissipazione :) – lccarrasco

1

Per chi desidera avere una versione coffeescript ben confezionata dell'esempio jsbin di @ lccarrasco, è possibile visualizzare l'essenza dello MercatorProjection coffeescript class che ho creato utilizzando il suo codice.

volta la classe caricata, è possibile utilizzarlo con il seguente:

map = new google.maps.Map(...) 
heatmap = new google.maps.visualization.HeatmapLayer({map: map}) 
google.maps.event.addListener(map, 'zoom_changed',() -> 
    projection = new MercatorProjection() 
    heatmap.setOptions(radius: projection.getNewRadius(map, 15)) 
) 

Dove '15' è il raggio in metri che si può giocare con o impostare a livello di codice con altri mezzi per ottenere il vostro heatmap per sembrare come tu lo vuoi

+0

assicurarsi di includere la libreria geometria, vale a dire: