The first question I have to ask is what kind of view are you going to be using? you plan on using flat side view (Terraria style), a flat top down view(old rpg style) or a fake 3D view (Gnomaria) ? Each view brings different challenges when it comes to 2D maps.
A lot of the stuff you mention comes with basic map setup and I'll try my best to explain the points the best I can.
Need to generate it at random
It needs to hold a info what type each tile is (because of gathering, mining, digging)
Should be able to stream it (during runtime save peaces of map that are far from user and open the ones hes gonna cross up to (if nothing to load, generate)
Able to manipulate the terrain ( Because of digging, mining...)
For this stuff some basic map chunk setup should be enough to set up a good map with everything you want here.
What is a chunk? well a chunk is just a group of blocks in some format: 64x64(x64 if we are faking 3D)
That's all it is. Simple!
Each block in a chunk is your basic block, has a type ( could be dirt, grass, rock, wall.. whatever) which can be set any way you want. I prefer to use enums.
Now that we have a chunk, we have a manageable chunk of data we can work with, even replicate. A ChunkManager class will allow us to create and destroy chunks, draw them, manipulate them and let the magic happen.
This just scratches the surface of it. Once you have this very basic setup complete, you can start performing more magic to your work.
I will expand on this stuff a bit later, work just seems to keep piling up and I can't ignore it forever.
Good luck with this though, A proper map generator can be an amazing piece of work!