I see two ways to achieve this:
1. Restrict movement via Dynamic
You can restrict the movement of the Locator object by specifying a suitable function as a second argument for the Dynamic expression.
pt = {0, 0};
LocatorPane[Dynamic[pt, (pt = If[Total[#^2] > 1, Normalize@#, #]) &],
Graphics[{Dashed, Circle[]}, ImageSize -> 200]]

This is easy to do with circular objects (and rectangular ones of course), but it get's complicated when the region is something more complex. Luckily, for complicated polygons, we already have a good community-solution, that simply tests whether a point is inside a polygon or not: see here (SE), here (SE) and here (MathGroup). Now the problem is that whenever the mouse moves out of the boundary, the coordinate pair should be modified to be the closes point inside the polygon. I used the distance function defined in this demonstration.
(* define boundary polygon *)
poly = N@Rescale[ExampleData[{"Statistics", "WesternUgandaBorder"}]];
(* function tests whether a point is inside a polygon *)
inPolyQ =
Compile[{{polygon, _Real, 2}, {x, _Real}, {y, _Real}},
Block[{polySides = Length[polygon], X = polygon[[All, 1]],
Y = polygon[[All, 2]], Xi, Yi, Yip1, wn = 0, i = 1},
While[i < polySides, Yi = Y[[i]]; Yip1 = Y[[i + 1]];
If[Yi <= y, If[Yip1 > y, Xi = X[[i]];
If[(X[[i + 1]] - Xi) (y - Yi) - (x - Xi) (Yip1 - Yi) > 0,
wn++;];];, If[Yip1 <= y, Xi = X[[i]];
If[(X[[i + 1]] - Xi) (y - Yi) - (x - Xi) (Yip1 - Yi) < 0,
wn--;];];]; i++]; ! wn == 0]];
(* distance between two points *)
distance[{a_, b_}, p_] := Module[{pz, az, bz, z, d1, d2},
If[a == b, {a, Norm[p - a]},
{pz, az, bz} = Map[First[#] + I Last[#] &, {p, a, b}];
z = (pz - az)/(bz - az);
If[Not[0 <= Re[z] <= 1], d1 = Norm[p - a]; d2 = Norm[p - b];
If[d1 < d2, {a, d1}, {b, d2}],
{a + Re[z] (b - a), Norm[Im[z] (b - a)]}]]];
(* closest point of a polygon to a point *)
closest[pt_, poly_] := Module[{f},
f = Map[distance[#, pt] &, Partition[poly, 2, 1, 1]];
First@First[Sort[f, Last@#1 <= Last@#2 &]]
];
pt = {0.4, 0.5};
LocatorPane[
Dynamic[pt, (pt =
If[inPolyQ[poly, First@#, Last@#], #, closest[#, poly]]) &],
Graphics[{FaceForm@None, EdgeForm@Dashed, Polygon@poly},
ImageSize -> 200]]

Now the locator nicely follows the boundary if the mouse is outside the area. If there are multiple adjoining areas (tiled space) each with a locator that is constrained to move inside the given polygon then there should be no problem on which locator to select when interacting with the graphics.
2. Restrict movement via graphics primitive
This basically involves creating your own LocatorPane object. The following code gives some ideas on how to do this. Let's define three hexagons, and put a dynamically updated locator in the middle of each. One can restrict the dynamically tracked mouse position to the given hexagon by reverting the point coordinate to the last valid value before leaving the hexagon (second argument of MousePosition). It is not perfect (a little rough around the edges) but I think it can be finetuned.
hexagon = {{1/2, Sqrt[3]/2}, {-(1/2), Sqrt[3]/2}, {-1,
0}, {-(1/2), -(Sqrt[3]/2)}, {1/2, -(Sqrt[3]/2)}, {1, 0}};
{pt1, pt2,
pt3} = {{1.5, Sqrt[3]/2}, {1.5, -(Sqrt[3]/2)}, {0,
0}}; (* initial positions *)
Dynamic@{pt1, pt2, pt3}
Graphics[{
EdgeForm@Black, GrayLevel@.9,
EventHandler[Polygon[# + {3/2, Sqrt[3]/2} & /@ hexagon],
{
"MouseClicked" :> (pt1 = MousePosition["Graphics", pt1]),
"MouseDragged" :> (pt1 = MousePosition["Graphics", pt1])
}],
EventHandler[Polygon[# + {3/2, -(Sqrt[3]/2)} & /@ hexagon],
{
"MouseClicked" :> (pt2 = MousePosition["Graphics", pt2]),
"MouseDragged" :> (pt2 = MousePosition["Graphics", pt2])
}],
EventHandler[Polygon[hexagon],
{
"MouseClicked" :> (pt3 = MousePosition["Graphics", pt3]),
"MouseDragged" :> (pt3 = MousePosition["Graphics", pt3])
}],
{Blue, Circle[Dynamic@pt1, .05], AbsolutePointSize@5,
Point@Dynamic@pt1},
{Red, Circle[Dynamic@pt2, .05], AbsolutePointSize@5,
Point@Dynamic@pt2},
{Darker@Green, Circle[Dynamic@pt3, .05], AbsolutePointSize@5,
Point@Dynamic@pt3}
}, Frame -> True, PlotRange -> {{-1.1, 2.6}, {-2, 2}},
ImageSize -> 400, ImagePadding -> 20]

Dynamicneeds to be modified. I will post an edit when I get a version that works withLocatorAutoCreate. – kglr May 25 '12 at 11:57Mapthe normalization function inside the second argument ofDynamicto each element of#; but i need to verify that it will work. – kglr May 25 '12 at 12:03