I use option 1 for my Rift System in my PW.
At random intervals, a random area is chosen (above ground, outdoors)
Then a random location is selected -
I spawn an invisible creature, get its location then destroy the creature.
If the location's X and Y do not match the vector I targetted, then I know that the location was not valid.
The thing to remember about Z axes is that even a little bit of debris or change in elevation on the ground can affect the Z axes of the creatures standing location.
So you might want to disregard the Z part of the vector, or at the very least append some buffer to the z axes if you are planning on spawning anything in the air at that location.
Eg: I do : Z = creatureLocation.Z+4; or something like that.
Result is a rift system that spawns at always 'valid' locations. (Note - it can still spawn in inaccessible areas though)
Below is an early POC I did (before it was refined) - I was planning on using tilemagic to turn water in the area to lava when a fire rift spawned etc