GDALRaster Processing

gdalmove

What is gdalmove?

gdalmove.py transforms the georeferencing of a raster from one CRS to another without resampling the pixels. It keeps the source pixel grid intact but rewrites the geotransform (or converts it to GCPs) so the dataset's footprint in the new CRS is approximately correct. The pixels themselves are never read, so this is orders of magnitude faster than gdalwarp — but the trade-off is approximation, and it only works sensibly for small areas where the reprojection is nearly affine.

Shell
gdalmove.py [-s_srs <src_srs>] -t_srs <target_srs> [-et <max_geom_error>] <filename>

Commonly used options:

  • -s_srs <CRS> — source CRS (if different from what the file reports)
  • -t_srs <CRS> — target CRS
  • -et <max_error> — maximum tolerated geometric error, in target CRS units. Smaller means more GCPs are inserted
  • The tool edits the file in place unless -et triggers a mode that writes GCPs

When would you use gdalmove?

Use gdalmove.py when you have a raster in the wrong CRS label or want a fast approximate CRS change on a small-extent dataset. Typical jobs: relabelling a site-scale drone ortho from a state-plane CRS to a neighbouring one without the cost of a full resample, or correcting a raster that was tagged with a subtly wrong CRS and needs the geotransform nudged into a close-by system.

For any serious reprojection — continental, intercontinental, changing datum families, or anything where pixel alignment with a reference grid matters — use gdalwarp instead. gdalmove.py is a convenience tool, not a substitute for correct resampling. It is best when the transformation from source to target CRS is smooth enough over the raster's extent that a single affine approximation is good enough, and when you are willing to tolerate a tiny geometric error in exchange for skipping pixel I/O.

FAQs

Why is gdalmove so much faster than gdalwarp?

It does not read pixels. gdalmove.py only transforms the georeferencing — the four corner points or a small lattice of tie points — and rewrites the file's geotransform (or embeds GCPs). gdalwarp must read every pixel, reproject, and write out a new grid. On a 100 GB raster this is the difference between a few milliseconds and hours.

When is gdalmove the wrong choice?

Any large-area raster where the projection distortion varies meaningfully across its footprint. A continental reprojection through gdalmove.py will produce visibly wrong geometry in the corners. Cross-datum shifts also need proper resampling because the per-pixel displacement is irregular. If in doubt, gdalwarp.

Does gdalmove modify my file?

Yes — it edits the source file's georeferencing in place. Always back up before running or copy the file first. There is no separate output argument.

What does -et actually control?

-et is the maximum allowed geometric error (in target CRS units) when approximating the source-to-target transformation. If the simple geotransform cannot meet this tolerance, gdalmove.py inserts GCPs. Set -et 0 to force a pure GCP representation; set a generous value (e.g. 0.5 metres) to prefer a clean geotransform when good enough.