Opened 10 years ago
Last modified 10 years ago
#26432 closed Bug
Bug: X/Y inverted when using numpy.reshape() on a GDALRaster's GDALBand — at Initial Version
| Reported by: | Opa | Owned by: | nobody |
|---|---|---|---|
| Component: | GIS | Version: | 1.9 |
| Severity: | Normal | Keywords: | GDALRaster numpy GDALBand |
| Cc: | Opa | Triage Stage: | Accepted |
| Has patch: | yes | Needs documentation: | no |
| Needs tests: | no | Patch needs improvement: | no |
| Easy pickings: | no | UI/UX: | no |
Description
When importing GeoTIF data threw GDALRaster all the array is inverted because of a inverted X/Y parameters passed to numpy.reshape() function.
I was able to see this bug by importing a GeoTIF via GDALRaster then the generated datas did not make any sense so I decided to export the array to an image again to see if it was me doing shit or if there was a bug somewhere. When exporting the GeoTIF again to an image I get something really strange. You can see attached the original tif and the generated one that is not correct due to this X/Y mismatch. Here is the code to reproduce:
from PIL import Image
from django.contrib.gis.gdal import GDALRaster
import os, numpy
rst = GDALRaster(os.path.join('/tmp', 'cea.tif'))
data = rst.bands[0].data()
rescaled = (255.0 / data.max() * (data - data.min())).astype(numpy.uint8)
im = Image.fromarray(rescaled)
im.save('/tmp/cea_2.tif')
You can see in the (see | Numpy Reshape documentation) that you should pass a tuple with the height and the width (in that order). And in the django code, the size tuple is built with width first then height at line 111:
size = (self.width - offset[0], self.height - offset[1])
The bug is located in django.contrib.gis.gdal.raster.band.py at line 148:
data_array, dtype=numpy.dtype(data_array)).reshape(size)
should be replaced by
data_array, dtype=numpy.dtype(data_array)).reshape((size[1], size[0]))
Original GeoTIF sample