[gdal-dev] Python Bindings - ReadArray direct to ctypes array?

Jay L. jzl5325 at psu.edu
Sat Jul 28 08:05:43 PDT 2012


Even,

Thanks so much!  I will give this a try and get it implemented into my
code.  This is also a wonderful primer on ctypes integration with existing
Python scripts.

Thanks,
Jay

On Sat, Jul 28, 2012 at 2:17 AM, Even Rouault
<even.rouault at mines-paris.org>wrote:

> Le samedi 28 juillet 2012 05:40:57, Jay L. a écrit :
> > List,
> >
> > I am working on a python script using the multiprocessing module with
> > shared memory ctype arrays.
> >
> > Currently the workflow is to open the dataset and grab the first band, as
> > usual. I then read in the array, create an empty ctype array, and use
> > memmove to move the numpy array to my ctypes array.
> >
> > Is it possible, via python, to read the array direct to a ctypes array
> and
> > bypass reading the array as an ndarray?
>
> No, although it could certainly be extended to do so.
>
> But with ctypes, you are able to bind all C functions of the GDAL API, so
> you
> can try the following snippet. Of course, due to the nature of ctypes
> bindings, you must be extra carefull of the value/size of arguments you
> use,
> otherwise crashes can easily happen.
>
> from ctypes import *
>
> def getlibgdal():
>     import sys
>     # Might need name tweaking depending on platfrom & version
>     if sys.platform == 'win32':
>         libgdal = windll.LoadLibrary("gdal19.dll")
>     else:
>         libgdal = cdll.LoadLibrary("libgdal.so.1")
>
>     libgdal.GDALOpen.argtypes = [ c_char_p, c_int ]
>     libgdal.GDALOpen.restype = c_void_p
>
>     libgdal.GDALClose.argtypes = [ c_void_p ]
>
>     libgdal.GDALGetRasterCount.argtypes = [ c_void_p ]
>     libgdal.GDALGetRasterCount.res_type = c_int
>
>     libgdal.GDALGetRasterXSize.argtypes = [ c_void_p ]
>     libgdal.GDALGetRasterXSize.res_type = c_int
>
>     libgdal.GDALGetRasterYSize.argtypes = [ c_void_p ]
>     libgdal.GDALGetRasterYSize.res_type = c_int
>
>     libgdal.GDALGetRasterBand.argtypes = [ c_void_p, c_int ]
>     libgdal.GDALGetRasterBand.restype = c_void_p
>
>     libgdal.GA_ReadOnly = 0
>     libgdal.GA_Update = 1
>
>     libgdal.GF_Read = 0
>     libgdal.GF_Write = 1
>
>     libgdal.GDT_Unknown = 0
>     libgdal.GDT_Byte = 1
>     libgdal.GDT_UInt16 = 2
>     libgdal.GDT_Int16 = 3
>     libgdal.GDT_UInt32 = 4
>     libgdal.GDT_Int32 = 5
>     libgdal.GDT_Float32 = 6
>     libgdal.GDT_Float64 = 7
>     libgdal.GDT_CInt16 = 8
>     libgdal.GDT_CInt32 = 9
>     libgdal.GDT_CFloat32 = 10
>     libgdal.GDT_CFloat64 = 11
>
>     libgdal.GDALRasterIO.argtypes = [
>         c_void_p, # rasterband
>         c_int, # eRWFlag
>         c_int, # nXOff
>         c_int, # nYOff
>         c_int, # nXSize
>         c_int, # nYSize
>         c_void_p, # pData
>         c_int, # nBufXSize
>         c_int, # nBufYSize
>         c_int, # eBufType
>         c_int, # nPixelSpace
>         c_int ] # nLineSpace
>     libgdal.GDALRasterIO.res_type = c_int
>
>     # Don't forget to register all drivers
>     libgdal.GDALAllRegister()
>
>     return libgdal
>
> libgdal = getlibgdal()
>
> ds = libgdal.GDALOpen("byte.tif", libgdal.GA_ReadOnly)
> if ds is 0:
>     import sys
>     sys.exit(1)
>
> xsize = libgdal.GDALGetRasterXSize(ds)
> ysize = libgdal.GDALGetRasterYSize(ds)
> band = libgdal.GDALGetRasterBand(ds, 1)
> ar = (c_byte * (xsize * ysize))()
>
> ret = libgdal.GDALRasterIO(band, libgdal.GF_Read,
>                            0, 0, xsize, ysize,
>                            cast(ar, c_void_p),
>                            xsize, ysize, libgdal.GDT_Byte,
>                            0, 0)
> if ret == 0:
>     print('success')
>
> libgdal.GDALClose(ds)
>
> >
> > Thanks,
> > J
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20120728/22cc8982/attachment-0001.html>


More information about the gdal-dev mailing list