PostgreSQL has spatial indexing capability, too.
So you can do something like (the exact syntax for spatial ops escapes me right now):
SELECT DISTINCT obj
FROM media NATURAL JOIN mediatags
WHERE (location INTERSECTS somebox)
AND tag IN
(SELECT tag FROM usertags WHERE user = 137)
You will probably have to spend some quality time with the query planner figuring out how to set up your indexes so the common queries will be fast, but it should be possible.
(EDIT: fighting with the formatting. Why is there no preview?)
(EDIT: fighting with the formatting. Why is there no preview?)