diff --git a/AUTHORS b/AUTHORS
index e9e2a597b3..6bd44281c7 100644
--- a/AUTHORS
+++ b/AUTHORS
@@ -168,6 +168,7 @@ answer newbie questions, and generally made Django that much better:
Daniel Poelzleithner
Daniel Pyrathon
Daniel Roseman
+ Daniel Wiesmann
Danilo Bargen
Dan Johnson
Dan Poirier
diff --git a/django/contrib/gis/gdal/prototypes/generation.py b/django/contrib/gis/gdal/prototypes/generation.py
index 3d2e3046c8..69477ba044 100644
--- a/django/contrib/gis/gdal/prototypes/generation.py
+++ b/django/contrib/gis/gdal/prototypes/generation.py
@@ -130,9 +130,10 @@ def void_output(func, argtypes, errcheck=True):
return func
-def voidptr_output(func, argtypes):
+def voidptr_output(func, argtypes, errcheck=True):
"For functions that return c_void_p."
func.argtypes = argtypes
func.restype = c_void_p
- func.errcheck = check_pointer
+ if errcheck:
+ func.errcheck = check_pointer
return func
diff --git a/django/contrib/gis/gdal/prototypes/raster.py b/django/contrib/gis/gdal/prototypes/raster.py
new file mode 100644
index 0000000000..991e3c6ef0
--- /dev/null
+++ b/django/contrib/gis/gdal/prototypes/raster.py
@@ -0,0 +1,56 @@
+"""
+This module houses the ctypes function prototypes for GDAL DataSource (raster)
+related data structures.
+"""
+from ctypes import c_char_p, c_double, c_int, c_void_p, POINTER
+from django.contrib.gis.gdal.libgdal import lgdal
+from django.contrib.gis.gdal.prototypes.generation import (const_string_output,
+ double_output, int_output, void_output, voidptr_output)
+
+# For more detail about c function names and definitions see
+# http://gdal.org/gdal_8h.html
+# http://gdal.org/gdalwarper_8h.html
+
+### Raster Driver Routines ###
+register_all = void_output(lgdal.GDALAllRegister, [])
+get_driver = voidptr_output(lgdal.GDALGetDriver, [c_int])
+get_driver_by_name = voidptr_output(lgdal.GDALGetDriverByName, [c_char_p], errcheck=False)
+get_driver_count = int_output(lgdal.GDALGetDriverCount, [])
+get_driver_description = const_string_output(lgdal.GDALGetDescription, [c_void_p])
+
+### Raster Data Source Routines ###
+create_ds = voidptr_output(lgdal.GDALCreate, [c_void_p, c_char_p, c_int, c_int, c_int, c_int])
+open_ds = voidptr_output(lgdal.GDALOpen, [c_char_p, c_int])
+close_ds = void_output(lgdal.GDALClose, [c_void_p])
+copy_ds = voidptr_output(lgdal.GDALCreateCopy, [c_void_p, c_char_p, c_void_p, c_int,
+ POINTER(c_char_p), c_void_p, c_void_p])
+add_band_ds = void_output(lgdal.GDALAddBand, [c_void_p, c_int])
+get_ds_description = const_string_output(lgdal.GDALGetDescription, [])
+get_ds_driver = voidptr_output(lgdal.GDALGetDatasetDriver, [c_void_p])
+get_ds_xsize = int_output(lgdal.GDALGetRasterXSize, [c_void_p])
+get_ds_ysize = int_output(lgdal.GDALGetRasterYSize, [c_void_p])
+get_ds_raster_count = int_output(lgdal.GDALGetRasterCount, [c_void_p])
+get_ds_raster_band = voidptr_output(lgdal.GDALGetRasterBand, [c_void_p, c_int])
+get_ds_projection_ref = const_string_output(lgdal.GDALGetProjectionRef, [c_void_p])
+set_ds_projection_ref = void_output(lgdal.GDALSetProjection, [c_void_p, c_char_p])
+get_ds_geotransform = void_output(lgdal.GDALGetGeoTransform, [c_void_p, POINTER(c_double * 6)], errcheck=False)
+set_ds_geotransform = void_output(lgdal.GDALSetGeoTransform, [c_void_p, POINTER(c_double * 6)])
+
+### Raster Band Routines ###
+band_io = void_output(lgdal.GDALRasterIO, [c_void_p, c_int, c_int, c_int, c_int, c_int,
+ c_void_p, c_int, c_int, c_int, c_int, c_int])
+get_band_xsize = int_output(lgdal.GDALGetRasterBandXSize, [c_void_p])
+get_band_ysize = int_output(lgdal.GDALGetRasterBandYSize, [c_void_p])
+get_band_index = int_output(lgdal.GDALGetBandNumber, [c_void_p])
+get_band_description = const_string_output(lgdal.GDALGetDescription, [c_void_p])
+get_band_ds = voidptr_output(lgdal.GDALGetBandDataset, [c_void_p])
+get_band_datatype = int_output(lgdal.GDALGetRasterDataType, [c_void_p])
+get_band_nodata_value = double_output(lgdal.GDALGetRasterNoDataValue, [c_void_p, POINTER(c_int)])
+set_band_nodata_value = void_output(lgdal.GDALSetRasterNoDataValue, [c_void_p, c_double])
+get_band_minimum = double_output(lgdal.GDALGetRasterMinimum, [c_void_p])
+get_band_maximum = double_output(lgdal.GDALGetRasterMaximum, [c_void_p])
+
+### Reprojection routine ###
+reproject_image = void_output(lgdal.GDALReprojectImage, [c_void_p, c_char_p, c_void_p, c_char_p,
+ c_int, c_double, c_double,
+ c_void_p, c_void_p, c_void_p])