When you receive a map coordinate as user input or from some other source, you must be able to convert it back to the appropriate pixel location on a raster.
We will use the SatImage raster available at:
https://geospatialpython.googlecode.com/files/SatImage.zip
Place this raster in your /qgis_data/rasters
directory.
Similar to the previous recipe, we will define a function, extract the GDAL GeoTransform
object from our raster, and use it for the conversion.
from osgeo import gdal
GeoTransform
object containing the raster georeferencing information and the map x,y coordinates:def world2Pixel(geoMatrix, x, y): ulX = geoMatrix[0] ulY = geoMatrix[3] xDist = geoMatrix[1] yDist = geoMatrix[5] rtnX = geoMatrix[2] rtnY = geoMatrix[4] pixel = int((x - ulX) / xDist) line = int((y - ulY) / yDist) return (pixel, line)
src = gdal.Open("/qgis_data/rasters/satimage.tif")
geoTrans = src.GetGeoTransform()
world2Pixel(geoTrans, -89.59486002580364, 30.510227817850406)
(1296, 1346)
This conversion is very reliable over small areas, but as the area of interest expands you must account for elevation as well, which requires a far more complex transformation depending on how an image was generated.
The following presentation from the University of Massachusetts does an excellent job of explain the challenges of georeferencing data:
http://courses.umass.edu/nrc592g-cschweik/pdfs/Class_3_Georeferencing_concepts.pdf