Using ArcGIS, QGIS, Grass, and/or GVSIG:

  • What are some of the tools and processes involved in building effective heat maps?
  • What are the plugins involved?
  • What are the major data requirements?
  • What are some of the flaws with existing heat maps?
  • What are some of the issues that heat maps cannot cover effectively?
  • How not to do a heat map?
  • Are there better alternatives (in the same context) than heat map for data representation?

5 Answers 5


This question has been converted to Community Wiki and wiki locked because it is an example of a question that seeks a list of answers and appears to be popular enough to protect it from closure. It should be treated as a special case and should not be viewed as the type of question that is encouraged on this, or any Stack Exchange site, but if you wish to contribute more content to it then feel free to do so by editing this answer.

There are at least two different kinds of heat maps:

  1. Heatmaps representing concentration of points, and
  2. Heatmaps representing distributions of attribute values

Every method has advantages and problems, I'm afraid going into detail is far beyond this Q&A.

I'll try to list some methods and functions for QGIS and GRASS.

Concentration of points

If you are tracking movement of wildlife, vehicles, etc. it can be useful to assess regions with high concentration of location messages.

Tools: e.g. QGIS Heatmap plugin (available in versions > 1.7.x) or GRASS v.neighbors or v.kernel

Distributions of attribute values

Here, we're basically talking more or less about interpolation methods. Methods include:

  1. IDW

    Depending on the implementation this can be global (using all available points in the set) or local (limited by number of points or maximum distance between points and interpolated position).

    Tools: QGIS interpolation plugin (global), GRASS v.surf.idw or r.surf.idw (local)

  2. Splines

    Again, huge number of possible implementations. B-Splines are popular.

    Tools: GRASS v.surf.bspline

  3. Kriging

    Statistical method with various sub-types.

    Tools: GRASS v.krige (thanks to om_henners for the tip) or using R.

  • 1
    There is an interface through GRASS for kriging, v.krige (grass.osgeo.org/wiki/V.krige_GSoC_2009), but it still requires R, and the various R packages and bindings mentioned on the GRASS Wiki page.
    – om_henners
    Commented Jul 27, 2010 at 17:52
  • Since QGIS 2.8 there is a Heatmap renderer for point layers. No need to create new data. Commented Dec 16, 2015 at 10:57

Statistically, here is how you should go about doing a heat map:

1) Integrate point features. The idea of integration is to take points that should be considered coincident and merge them together as a single location. I like to use nearest neighbor analysis and use an appropriate value from there. (For example, when doing a crime heat map, I use the average 1st nearest neighbor for the underlying parcel dataset against which the crimes are geocoded).

2) Collect events. This creates a spatial weight for all of your integrated points. E.g. if you have 5 events at a single location, it will become one point with weight 5. This is essential for the next two steps. If you need to aggregate an attribute in the events pooled, i.e. different events have higher weight, then you can use a one-to-one spatial join. Use the 'collect event' output as the target and your original integrated events as the join features. Set the field map merge rules statistically combined the attribute on the integrated events (normally with a SUM, though you can use other statistics).

3) Determine peak spatial autocorrelation using Global Moran's I. Just like it says, run global moran's I at different intervals to determine the peak band of spatial autocorrelation in the scale appropriate to the analysis you are doing. You might want to run nearest neighbor again on your collected events to determine the start range for your moran's I tests. (e.g. use the max value for first nearest neighbor)

4) Run Getis-Ord Gi*. Use a fixed distance band based on your moran's I analysis, or use the fixed distance band as a zone of indifference. Your spatial weight from collect events is your numeric count field. This will give you z-scores for each event point in your set.

5) Run IDW against your outcomes from Getis-Ord Gi*.

This outcome is significantly different from what you get with kernel density. It will show you where high values and low values are clustered together rather than just where values are high, without regard to clustering, like in kernel density.


While I like heat maps, I realize they are often mis-used.

Typically what I've seen is a process whereby the color of each pixel is based on the result of an inverse distance weighted function applied to a collection of points. Any time a map has a lot of overlapping point markers, I think it is worth considering a heatmap.

Here's a web based api.

GeoChalkboard has a good tutorial for it.

You can use IDW in ArcGIS.


For simple heat maps and generating countour lines I've used QGis with the Grass intergration:

  1. Load data-points
  2. Load a limiting shape – eg county boundary
  3. Create a Grass mapset
  4. Open the Grass toolbox and click on the module list to search for each tool
  5. Load v.in.ogr.qgis module and load both the point data and the boundary shape, each time remembering to click view output for each – give each a useful name like pointdata and maskshape
  6. Convert maskshape to a raster to use it as a mask with v.to.rast and add to the mapset – call it something like maskraster - this can take time for complex polygons.
  7. Load the r.mask module to force the next action to be limited to the buffer region.
  8. Run v.surf.rst to produce an interpolated grid from pointdata– choose the appropriate column as the attribute field for doing the interpolation, and call it something like rastersurface. This is the bit that takes time and generates a raster that can be used as a for of heat map or could be 3D shaded.
  9. Close the Grass toolbox
  10. Use the GDAL Raster Contours plug-in choosing the GRASS raster as input; leave the default levels value at 10, and choose an output directory where the contours shapefile will be saved. Check the “Attribute Name” and type in a name.

NB: For this to work, the datasets should be in the same projection!


I think this question has been largely answered except for a couple of points about the issues.

Heat maps can be great, but a classic flaw and issue lies with interpretation. Take the difference between a heat map of crime events compared to a map (heat or otherwise) of crime rate/proportion. While the event heat map might be useful in terms of identifying overall event density, it is blind as an estimate of risk, but would often be interpreted or misused in this way. Consider the same number of events in a region of the same size and shape, but with a different population, while crime might be concentrated in an area, that simply could be because there are more people in that space. Additionally, rates for event data, like for crimes, can be difficult to model, because to produce a heat map raster, they can require an event like model of population, but people don't tend to stand still. The average household composition may be used against a cadastral map for small regions, but this can be problematic, for example crime might not relate to presence at home, but this would be a perfectly valid way to study home invasions and domestic violence.

A second issue is that a heat map is limited to considering a single space-scale, and selecting this space-scale, ie the kernel size or rate of decay, can be complicated and depends on the goals of the study, but must be justified. If the point is to identify the centre of the strongest cluster, and the scale at which it occurs (perhaps to identify the source of a disease outbreak, and a factor in it's spread) a better option might be to consider multiple scales. With appropriate weightings proportional to the scale/area to produce a 3 dimensional raster, where local maximums in the 3D space-scale raster indicate the location of the centre of clusters and their respective sizes, and persistence between scales.

  • Consider also Thiessen polygons as a first-cut look at spatial patterns. They are quite simple, but also are capable of showing a lot of detail, are an exact interpolator, and seem to get around some of the scale issues that plague other more sophisticated interpolation methods - gislandscapeecology.blogspot.com/2016/04/…
    – Tom Dilts
    Commented May 2, 2016 at 23:26

Not the answer you're looking for? Browse other questions tagged or ask your own question.