Numbers as Markers on Google Maps
I was making a heatmap for a client today, and thought to myself. Boy wouldn't it be great to have the 'total heat' of an area show up on top of the map.
Turns out, it's easy to put down a marker, and only slightly harder to get a number down instead. The key here is that you have to use an overlay and then have the map position everything for you via projection.
So how do you do it?
function NumberMarker(latlng, map, value) {
this.latlng_ = latlng;
this.value = value;
/*Do this or nothing will happen:*/
this.setMap(map);
}
NumberMarker.prototype = new google.maps.OverlayView();
NumberMarker.prototype.draw = function() {
var me = this;
var div = this.div_;
if (!div) {
// Create a overlay text DIV
div = this.div_ = document.createElement('DIV');
// Create the DIV representing our NumberMarker
div.style.border = "none";
div.style.position = "absolute";
div.style.paddingLeft = "0px";
div.style.cursor = 'pointer';
var span = document.createElement("span");
span.className = "markerOverlay";
span.appendChild(document.createTextNode(this.value));
div.appendChild(span);
google.maps.event.addDomListener(div, "click", function(event) {
google.maps.event.trigger(me, "click");
});
// Then add the overlay to the DOM
var panes = this.getPanes();
panes.overlayImage.appendChild(div);
}
// Position the overlay
var point = this.getProjection().fromLatLngToDivPixel(this.latlng_);
if (point) {
div.style.left = point.x + 'px';
div.style.top = point.y + 'px';
}
};
NumberMarker.prototype.remove = function() {
// Check if the overlay was on the map and needs to be removed.
if (this.div_) {
this.div_.parentNode.removeChild(this.div_);
this.div_ = null;
}
};
NumberMarker.prototype.getPosition = function() {
return this.latlng_;
};
var myLatlng = new google.maps.LatLng(75,45);
// define map properties
var myOptions = {
zoom: 5,
center: myLatlng,
mapTypeId: google.maps.MapTypeId.ROADMAP,
disableDefaultUI: false,
scrollwheel: true,
draggable: true,
navigationControl: true,
mapTypeControl: false,
scaleControl: true,
disableDoubleClickZoom: false
};
// we'll use the heatmapArea
var map = new google.maps.Map($('#maparea'')[0], myOptions);
var overlay;
overlay = new NumberMarker(myLatlng, map, 'whatever text or numbers you want here');
Bam. There you go. In my application I loop through a bunch of information and create a number of these markers on the map. I also use heatmap.js to create my heat maps at the same time. Overall, it works pretty well.
If you need any type of information positioned on a map, then just change the span tag to be whatever you need it to be and create it appropriately.