For simple heat maps and generating countour lines I've used QGis with the Grass intergration:
- Load data-points
- Load a limiting shape – eg county boundary
- Create a Grass mapset
- Open the Grass toolbox and click on the module list to search for each tool
- 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
- 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.
- Load the r.mask module to force the next action to be limited to the buffer region.
- 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.
- Close the Grass toolbox
- 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!