First, thanks to Mortiz for pointing out the buffering issue. By adding centroids to the buffered output, that now corresponds to the source set of points.
Overlaying is still causing some pain - I need to explain what I have to ask my question, so bear with me.
One input is a population map divided into adjacent areas. The second input is (mostly) non-overlapping polygons. The aim is to calculate the population which lies inside / outside these polygons (rather like John Field's query which was provided by Mortiz under the recent "strategy required" thread.
ainput = populations
binput = catchment
When I run v.overlay, I get a table output:
cat, a_cat, population, b_cat, catchment_name
However: there are areas within the catchment polygons for which b_cat and catchment_name are null. In this state, they can't be used to count populations, so I have to then run v.distance (dmax=0) to assign the correct b_cat and catchment_names to the nulls.
While it's merely inconvenent rather than being a crisis, I'd be interested to know whether the overlay problem is my own fault, or whether something is going wrong with v.overlay.
Richard