Download high-resolution satellite/map imagery from Google Maps for any bounding box and save it as a fully georeferenced GeoTIFF (or PNG/JPEG).
Give it two corner coordinates (top-left and bottom-right), a zoom level, and an output path — the tool fetches all the required map tiles in parallel, stitches them into a single image, and writes out a GeoTIFF with correct WGS-84 georeferencing (or a plain image if you use a .png/.jpg extension).
- Download any bounding box at zoom levels 0–22
- Concurrent tile downloads (configurable worker count)
- Output as GeoTIFF with correct geotransform + WGS-84 CRS, ready to open in QGIS/ArcGIS/GDAL
- Multiple map styles: satellite, satellite with labels, terrain, roadmap, labels only
- Supports both the standard Google Maps tile server and the China-specific server (GCJ-02 -> WGS-84 corrected)
- Python 3.12+
- GDAL native library and development headers (required to build the
gdalPython bindings) - uv for dependency management
On Debian/Ubuntu, install the GDAL system packages first:
sudo apt-get install -y gdal-bin libgdal-dev python3-gdalMake sure the installed GDAL version matches (or is compatible with) the version pinned in pyproject.toml.
Clone the repo first:
git clone <your-repo-url>
cd satellite-image-downloaderThen set up your environment using either uv (recommended) or plain python/pip.
./setup_env.shsetup_env.sh creates a .venv with uv, activates it, and builds the project. Alternatively, run the steps manually:
uv venv --python=3.12
source .venv/bin/activate
uv syncpython3 -m venv .venv
source .venv/bin/activate # On Windows: .venv\Scripts\activate
pip install -r requirements.txtWith uv:
uv run main.py \
--top-left <lat,lon> \
--bottom-right <lat,lon> \
--zoom <0-22> \
--output <path/to/output.tif>With plain python (after activating your virtual environment):
python main.py \
--top-left <lat,lon> \
--bottom-right <lat,lon> \
--zoom <0-22> \
--output <path/to/output.tif>| Flag | Required | Default | Description |
|---|---|---|---|
--top-left |
yes | - | Top-left corner as latitude,longitude |
--bottom-right |
yes | - | Bottom-right corner as latitude,longitude |
--output |
yes | - | Output file path (.tif for GeoTIFF, or .png/.jpg for plain image) |
--zoom |
no | 22 |
Zoom level (0-22). Higher = more detail, more tiles, longer download |
--style |
no | s |
Map style, see Map styles |
--server |
no | Google |
Tile server: Google or Google China |
--workers |
no | 16 |
Number of concurrent download workers |
Download a satellite GeoTIFF over a small area in Singapore at zoom 18:
# uv
uv run main.py \
--top-left 1.288221,103.673125 \
--bottom-right 1.266984,103.699828 \
--zoom 18 \
--output ~/sat.tif
# plain python
python main.py \
--top-left 1.288221,103.673125 \
--bottom-right 1.266984,103.699828 \
--zoom 18 \
--output ~/sat.tifDownload roadmap-style imagery as a PNG:
# uv
uv run main.py \
--top-left 1.288221,103.673125 \
--bottom-right 1.266984,103.699828 \
--zoom 16 \
--style m \
--output ~/map.png
# plain python
python main.py \
--top-left 1.288221,103.673125 \
--bottom-right 1.266984,103.699828 \
--zoom 16 \
--style m \
--output ~/map.png| Style | Description |
|---|---|
m |
Standard map |
s |
Satellite imagery |
y |
Satellite imagery with labels |
t |
Terrain |
p |
Terrain with labels |
h |
Labels only (transparent) |
- Higher zoom levels and larger bounding boxes download significantly more tiles — expect longer download times and larger output files.
- GeoTIFF output is written using WGS-84 (EPSG:4326) coordinates, matching the corners you provide.
- This tool talks directly to Google's map tile endpoints; usage is subject to Google's terms of service.
No license specified yet. Add one (e.g. MIT) if you plan to open-source this repository.