how to include distance buffers in cluster randomized trial I need to incorporate distance buffers into the selection of treatment and control units in a randomized-controlled trial in order to minimize spillovers between arms. Cluster in this study is a village. 
Specifically, I have 2 rural provinces, each with 200+ villages / clusters. For simplicity, let's say I have 1 treatment arm and a control arm. I need an appropriate distance (e.g. 2 - 3 km) between villages selected into the study. 
 A: Option 1: Modify the sampling frame
This is tricky because you can be greedy.  For example villages A, B and C lie on a straight line 2km apart from each other, then you might want to drop B from the sample, rather than A and C.
One approach is to redefine the sampling frame:


*

*List all villages in the sampling frame and construct a distance matrix.

*Draw a network graph where each node represent a village connected to its nearest neighbor villages.  E.g. A ---- B ---- C ---- D.

*If A and C are <3km from B give B a score of 2.  A gets score of 1, ditto for C unless D is <3km away.  The score measures the number of neighboring villages that are too close.

*Delete the village with the highest score and recompute the graphs and scores.  E.g. after deleting B, A and C have score of 0.  

*Continue until all scores are 0.


If several villages have the same highest score, pick one at random.  If you are really greedy, pick one and run the routine see what happens, then start again but pick another, and so on, until your sampling frame ensures no two villages can be closer than 3km whilst dropping the fewest number of villages from the original sampling frame.
In this case some villages in the original sampling frame have zero probability of ever being chosen since they drop out from the modified frame (your population changes).
Option 2: Modify the sample
If you use randomization inference, then simply decide on an exact procedure to drop villages from the sample such that none are too close.  This defines your sampling procedure.  Use this sampling procedure to compute your test statistics.  
In this case most villages will have some positive probability of being chosen (your population does not change).
Option 3: Model the spillover effects.
Don't try to avoid the spillover, instead used distance information to model the spillover.  Spillover is an interesting question.
My preference is this last option, unless you have very low power.  
A: At a practical level, @Fred's suggestions would possibly work. But strictly speaking, there are problems with that approach. If you are using finite population (design based) methods of inference, then it is important that the probability that any two individuals both appear in the sample be greater than 0. But if Bob from Little Whingeing is in the sample, then Joe from Greater Whingeing, 1 km away, is excluded. There is 0 probability that we get both Bob and Joe.  @Fred's option 2 doesn't get around this. Option 1 redefines the population, so your inference is no longer about the real world population you have. You will end up culling a lot of villages in high density areas, while less populated areas have all their villages remaining in the frame. 
You didn't mention how many villages you are going to select, but if it is a small number, you could try a matched-pairs design. Explicitly select representative pairs of similar villages, and randomize intervention and control to the pair. You would analyse the results as a randomized block design, in which each pair would be a block. If all you care about is the comparison between case and control, it's OK to turn the villages into fixed, block effects. 
I don't know what kind of geography you have, but perhaps you could combine nearby villages and apply the intervention to the whole group. If they are so close that they function as a unit, perhaps they should be randomized as a unit. This also redefines the frame, but everyone is still included, and you don't have the Bob/Joe problem. This assumes that you have clusters of villages, then green space, then another cluster. If it's just villages everywhere, this won't work.
Modelling the spillover, Fred's option 3, sounds interesting, although challenging.
A: My previous answer (and comments) suggested a matched pairs design. If you want to keep the original idea: a random selection of villages subject to the constraint of "no close neighbours", you can simply make a random selection until you find a bunch of villages that are suitably distant. Chuck any randomization that does not meet the criteria. Presumably, in a second round of randomization, you will allocate treatment and control arms.
The randomization scheme described above actually does deliver a random selection of villages from the set of "villages that are suitably distant". You don't have to create a frame of distant villages. This randomization effectively does the work for you. 
The downside: potential bias is introduced since the sample no longer represents the true population. For example, if this is the UK, you will be undersampling the Home Counties and oversampling Scotland and Ulster. However, if the treatment effect is not affected by whatever governs the distribution of villages, your comparison will not be biased.
And furthermore: you can account for the sampling bias mentioned above by weighting the responses in terms of village density within (say) counties. If village distribution is homogeneous across the rural provinces you are studying, you don't need to worry about this.
A: I wrote a STATA command called clustermax which selects a maximum number of point clusters for user-selected distance parameters. It is based on the principle of resolving spatial conflicts as outlined by Fred in Option 1. 
Download:
github.com/FMBarba/clustermax
Example use from the helpfile:
Generate 100 random points
    . set obs 100
    . set seed 1
    . gen lat = 40  + runiform()
    . gen lon = -90 + runiform()*4

Set cluster size to exactly one; minimum between-cluster distance 20km:
    . clustermax lat lon, seed(1) gen(cluster) b(20) n(1)

Set minimum cluster size to one; minimum between-cluster distance 20km; maximum within-cluster distance 20km:
    . clustermax lat lon, seed(1) gen(cluster) w(20) b(20) n(1)

Set minimum cluster size to three; minimum between-cluster distance 25km; maximum within-cluster distance 15km:
    . clustermax lat lon, seed(1) gen(cluster) w(15) b(25) n(3)

Note: clustermax requires the packages geodist, tuples, distinct and ftools.
