﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
26432	Bug: X/Y inverted when using numpy.reshape() on a GDALRaster's GDALBand	Opa	Opa	"When importing GeoTIF data through `GDALRaster` with `numpy` package installed all the array is a mess because of a reversed X/Y parameters passed to the `numpy.reshape()` function.
I was able to see this bug by importing a GeoTIF via `GDALRaster`. The generated data 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 I ran into something really strange. You can see in attachements 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 [http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.reshape.html | 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]))
}}}
"	Bug	assigned	GIS	1.9	Normal		GDALRaster numpy GDALBand	Opa	Unreviewed	1	0	0	0	0	0
