If you check out the details of map services, you'll notice that they have several layers. For each layer, you can estimate the size based on the resolution of your source data, and the area that they cover:
size = sum(foreach layer: layer.area * (layer.resolution)^2 * layer.elementsize)
Satellite images are the easiest to compute, as you'll want worldwide coverage at some basic resolution level. But you can expect some source material to be focused on regions of interest, like aerial photography; these will presumably be higher resolution, but smaller in total area.
You will want to save reduced-size versions of your full-resolution data, in order to provide zoomed-out displays conveniently. However, this should only occupy a fraction of the space required by the full-resolution data. Every factor-of-2 reduction in image size will reduce the size of the additional data by a factor of 4; the additional size of a factor-of-2 image pyramid will be 1/3 of the full-resolution data.
Finally, you'll also need geographic information, like roads, geographic regions, and points of interest. The size of this data is naturally very elastic, but you can probably get some sort of rough estimate by evaluating the size of a commercial geographic database for a particular city, and scaling by population.