2012-09-06 10 views
7

Ich möchte in der Lage sein, den Radius von Punkten effektiv in Metern anzugeben. Die API ist so konfiguriert, dass die radius Eigenschaft für Pixel konstant gehalten wird, so dass das Heranzoomen dazu führt, dass die Heatmap erodiert (ich weiß, dass Sie die Heatmap nicht mit der dissipating Eigenschaft erodieren können, aber dies wirft andere Probleme auf, dh um den Heatmap manuell anzuzeigen, um meine Heatmap richtig angezeigt zu bekommen. Hier ist die Heatmaps reference.Google Maps Heatmap Layer Punkt Radius

Ich versuche speziell, eine Wahrscheinlichkeitsverteilung auf einer Karte anzuzeigen Karte die 0-1 Gewichte auf eine Heatmap Schicht. (ich kann, und wollen nicht, die Bilder überlagern).

Irgendwelche Vorschläge?

+1

Ich denke, Sie müssen die Tatsache nutzen, dass bei jeder Zoomstufe, die Abstände pro Pixel doppelt, dann eine Heatmap für jede Zoomstufe neu zu zeichnen? –

Antwort

12

Ok, habe ich versucht, einige Dinge:

die Mercator Projection example (check the source) Mit der x, y-Pixelkoordinaten eines beliebigen Punktes aus einem latLng, extrahieren später verwenden, um die geometry library, specifically the computeOffset function bekommen eine andere einen Abstand „DM“ latLng (in Metern) rechts von die vorherige, erhalte die Differenz (in Pixel) als absoluten Wert "DP" und von dort bekommst du dein "pixelsPerMeter" Verhältnis DP/DM.

Also dann, wenn Sie Ihren Radius wollen 100 Meter sein, Sie setzen nur die Eigenschaften {radius:Math.floor(desiredRadiusPerPointInMeters*pixelsPerMeter)}

und die Änderung der Zoom zu behandeln nur einen Listener verwenden

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

ich hochgeladen ein small example (Zoomen), mit der Schaltfläche unten können Sie prüfen, ob die Entfernung richtig ist.

+1

Ich denke, ich habe es fast funktioniert, aber der TILE_SIZE Parameter wirft mich ab. Warum ist es auf 256 gesetzt, ist das willkürlich? Hat die Karte standardmäßig eine Kachelgröße von (256x256)? Wie kann ich die richtige Kachelgröße erhalten? – eqzx

+1

danke. eine Sache zu beachten ist, dass, wenn Sie zu weit herauszoomen, jeder Punkt nicht mehr in einen Pixel passen kann und die Radien auf Null gesetzt sind. Das Hinzufügen dieses Codes in der 'getNewRadius()' Methode macht es so, dass die Punkte als nichtdissipierend (ungenau) gerendert werden, aber zumindest werden sie gerendert ('dissipating = false' bei der Initialisierung) ' if (totalPixelSize == 0 && dissipierend == wahr) {heatmap.setOptions ({dissipating: false}); totalPixelSize =.01; dissipate = false;} sonst if (totalPixelSize> 0 && dissipate == false) {heatmap.setOptions ({dissipating: true}); dissipate = true;} sonst if (totalPixelSize == 0) {totalPixelSize = .01;} ' – eqzx

+1

@ nrhine1 Die Zahl 256 kommt von' Da die Grundkarte Mercator Google Maps 256 x 256 Pixel groß ist, ist der nutzbare Weltkoordinatenraum {0-256}, {0-256} '[in dieser Dokumentationsseite] (https://developers.google.com/maps/documentation/javascript/maptypes?hl=en#WorldCoordinates), danke für das Feedback bezüglich der Dissipation :) – lccarrasco

1

Für alle, die eine schön verpackte coffeescript-Version von @ lccarrascos jsbin-Beispiel haben möchten, können Sie den Kern des MercatorProjection coffeescript class, den ich mit seinem Code erstellt habe, anzeigen.

Sobald Sie die Klasse geladen haben, können Sie es mit den folgenden verwenden:

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

Wo ‚15‘ ist der Radius in Metern, die Sie mit oder programmgesteuert durch andere Mittel, um Ihre Heatmap zu bekommen spielen so aussehen, wie du es willst.

+0

Stellen Sie sicher, dass Sie die Geometriebibliothek einschließen, z. B .: