You have quite a few options.
All of these tools are free and using them (possibly in combination with PostGIS) will allow you to build a solution along the lines you describe.
If you want it totally offline, you can create Google-like tiles with gdal2tiles.py, store them in the usual folder hierarchy, and display them with Openlayers or Leaflet.
You have to take care about the tile naming. gdal2tiles.py uses the official TMS standard, while Google (and Openstreetmap) do not.
I have explained here: GDAL2Tiles: MapTiles from BSB/KAP are Switched
how to modify gdal2tiles.py to overcome this.