Package osgeo :: Module gdal_array
[hide private]
[frames] | no frames]

Source Code for Module osgeo.gdal_array

  1  # This file was automatically generated by SWIG (http://www.swig.org). 
  2  # Version 1.3.40 
  3  # 
  4  # Do not make changes to this file unless you know what you are doing--modify 
  5  # the SWIG interface file instead. 
  6  # This file is compatible with both classic and new-style classes. 
  7   
  8  from sys import version_info 
  9  if version_info >= (2,6,0): 
10 - def swig_import_helper():
11 from os.path import dirname 12 import imp 13 fp = None 14 try: 15 fp, pathname, description = imp.find_module('_gdal_array', [dirname(__file__)]) 16 except ImportError: 17 import _gdal_array 18 return _gdal_array 19 if fp is not None: 20 try: 21 _mod = imp.load_module('_gdal_array', fp, pathname, description) 22 finally: 23 fp.close() 24 return _mod
25 _gdal_array = swig_import_helper() 26 del swig_import_helper 27 else: 28 import _gdal_array 29 del version_info 30 try: 31 _swig_property = property 32 except NameError: 33 pass # Python < 2.2 doesn't have 'property'.
34 -def _swig_setattr_nondynamic(self,class_type,name,value,static=1):
35 if (name == "thisown"): return self.this.own(value) 36 if (name == "this"): 37 if type(value).__name__ == 'SwigPyObject': 38 self.__dict__[name] = value 39 return 40 method = class_type.__swig_setmethods__.get(name,None) 41 if method: return method(self,value) 42 if (not static) or hasattr(self,name): 43 self.__dict__[name] = value 44 else: 45 raise AttributeError("You cannot add attributes to %s" % self)
46
47 -def _swig_setattr(self,class_type,name,value):
48 return _swig_setattr_nondynamic(self,class_type,name,value,0)
49
50 -def _swig_getattr(self,class_type,name):
51 if (name == "thisown"): return self.this.own() 52 method = class_type.__swig_getmethods__.get(name,None) 53 if method: return method(self) 54 raise AttributeError(name)
55
56 -def _swig_repr(self):
57 try: strthis = "proxy of " + self.this.__repr__() 58 except: strthis = "" 59 return "<%s.%s; %s >" % (self.__class__.__module__, self.__class__.__name__, strthis,)
60 61 try: 62 _object = object 63 _newclass = 1 64 except AttributeError:
65 - class _object : pass
66 _newclass = 0 67 68 69 import gdal
70 -class VirtualMem(_object):
71 """Proxy of C++ CPLVirtualMemShadow class""" 72 __swig_setmethods__ = {} 73 __setattr__ = lambda self, name, value: _swig_setattr(self, VirtualMem, name, value) 74 __swig_getmethods__ = {} 75 __getattr__ = lambda self, name: _swig_getattr(self, VirtualMem, name)
76 - def __init__(self, *args, **kwargs): raise AttributeError("No constructor defined")
77 __repr__ = _swig_repr 78 __swig_destroy__ = _gdal_array.delete_VirtualMem 79 __del__ = lambda self : None;
80 - def GetAddr(self):
81 """GetAddr(self)""" 82 return _gdal_array.VirtualMem_GetAddr(self)
83
84 - def Pin(self, start_offset = 0, nsize = 0, bWriteOp = 0):
85 """ 86 Pin(self, size_t start_offset = 0, size_t nsize = 0, int bWriteOp = 0) 87 Pin(self, size_t start_offset = 0, size_t nsize = 0) 88 Pin(self, size_t start_offset = 0) 89 Pin(self) 90 """ 91 return _gdal_array.VirtualMem_Pin(self, start_offset, nsize, bWriteOp)
92 93 VirtualMem_swigregister = _gdal_array.VirtualMem_swigregister 94 VirtualMem_swigregister(VirtualMem) 95 96
97 -def TermProgress_nocb(*args, **kwargs):
98 """TermProgress_nocb(double dfProgress, char pszMessage = None, void pData = None) -> int""" 99 return _gdal_array.TermProgress_nocb(*args, **kwargs)
100 TermProgress = _gdal_array.TermProgress 101
102 -def OpenNumPyArray(*args):
103 """OpenNumPyArray(PyArrayObject psArray) -> Dataset""" 104 return _gdal_array.OpenNumPyArray(*args)
105 OpenNumPyArray = _gdal_array.OpenNumPyArray 106
107 -def GetArrayFilename(*args):
108 """GetArrayFilename(PyArrayObject psArray) -> retStringAndCPLFree""" 109 return _gdal_array.GetArrayFilename(*args)
110 GetArrayFilename = _gdal_array.GetArrayFilename 111
112 -def BandRasterIONumPy(*args, **kwargs):
113 """ 114 BandRasterIONumPy(Band band, int bWrite, double xoff, double yoff, double xsize, 115 double ysize, PyArrayObject psArray, 116 int buf_type, GDALRIOResampleAlg resample_alg, 117 GDALProgressFunc callback = None, void callback_data = None) -> CPLErr 118 """ 119 return _gdal_array.BandRasterIONumPy(*args, **kwargs)
120 BandRasterIONumPy = _gdal_array.BandRasterIONumPy 121
122 -def DatasetIONumPy(*args, **kwargs):
123 """ 124 DatasetIONumPy(Dataset ds, int bWrite, int xoff, int yoff, int xsize, 125 int ysize, PyArrayObject psArray, int buf_type, 126 GDALRIOResampleAlg resample_alg, GDALProgressFunc callback = None, 127 void callback_data = None) -> CPLErr 128 """ 129 return _gdal_array.DatasetIONumPy(*args, **kwargs)
130 DatasetIONumPy = _gdal_array.DatasetIONumPy 131
132 -def VirtualMemGetArray(*args):
133 """VirtualMemGetArray(VirtualMem virtualmem)""" 134 return _gdal_array.VirtualMemGetArray(*args)
135 VirtualMemGetArray = _gdal_array.VirtualMemGetArray 136
137 -def RATValuesIONumPyWrite(*args, **kwargs):
138 """ 139 RATValuesIONumPyWrite(RasterAttributeTable poRAT, int nField, int nStart, 140 PyArrayObject psArray) -> CPLErr 141 """ 142 return _gdal_array.RATValuesIONumPyWrite(*args, **kwargs)
143 RATValuesIONumPyWrite = _gdal_array.RATValuesIONumPyWrite 144
145 -def RATValuesIONumPyRead(*args, **kwargs):
146 """ 147 RATValuesIONumPyRead(RasterAttributeTable poRAT, int nField, int nStart, 148 int nLength) -> PyObject 149 """ 150 return _gdal_array.RATValuesIONumPyRead(*args, **kwargs)
151 RATValuesIONumPyRead = _gdal_array.RATValuesIONumPyRead 152 import numpy 153 import _gdal_array 154 155 import gdalconst 156 import gdal 157 gdal.AllRegister() 158 159 codes = { gdalconst.GDT_Byte : numpy.uint8, 160 gdalconst.GDT_UInt16 : numpy.uint16, 161 gdalconst.GDT_Int16 : numpy.int16, 162 gdalconst.GDT_UInt32 : numpy.uint32, 163 gdalconst.GDT_Int32 : numpy.int32, 164 gdalconst.GDT_Float32 : numpy.float32, 165 gdalconst.GDT_Float64 : numpy.float64, 166 gdalconst.GDT_CInt16 : numpy.complex64, 167 gdalconst.GDT_CInt32 : numpy.complex64, 168 gdalconst.GDT_CFloat32 : numpy.complex64, 169 gdalconst.GDT_CFloat64 : numpy.complex128 170 } 171
172 -def OpenArray( array, prototype_ds = None ):
173 174 ds = OpenNumPyArray( array ) 175 176 if ds is not None and prototype_ds is not None: 177 if type(prototype_ds).__name__ == 'str': 178 prototype_ds = gdal.Open( prototype_ds ) 179 if prototype_ds is not None: 180 CopyDatasetInfo( prototype_ds, ds ) 181 182 return ds
183 184
185 -def flip_code(code):
186 if isinstance(code, (numpy.dtype,type)): 187 # since several things map to complex64 we must carefully select 188 # the opposite that is an exact match (ticket 1518) 189 if code == numpy.int8: 190 return gdalconst.GDT_Byte 191 if code == numpy.complex64: 192 return gdalconst.GDT_CFloat32 193 194 for key, value in codes.items(): 195 if value == code: 196 return key 197 return None 198 else: 199 try: 200 return codes[code] 201 except KeyError: 202 return None
203
204 -def NumericTypeCodeToGDALTypeCode(numeric_type):
205 if not isinstance(numeric_type, (numpy.dtype,type)): 206 raise TypeError("Input must be a type") 207 return flip_code(numeric_type)
208
209 -def GDALTypeCodeToNumericTypeCode(gdal_code):
210 return flip_code(gdal_code)
211
212 -def LoadFile( filename, xoff=0, yoff=0, xsize=None, ysize=None, 213 buf_xsize=None, buf_ysize=None, buf_type=None, 214 resample_alg = gdal.GRIORA_NearestNeighbour, 215 callback=None, callback_data=None ):
216 ds = gdal.Open( filename ) 217 if ds is None: 218 raise ValueError("Can't open "+filename+"\n\n"+gdal.GetLastErrorMsg()) 219 220 return DatasetReadAsArray( ds, xoff, yoff, xsize, ysize, 221 buf_xsize=buf_xsize, buf_ysize=buf_ysize, buf_type=buf_type, 222 resample_alg=resample_alg, 223 callback = callback, callback_data = callback_data )
224
225 -def SaveArray( src_array, filename, format = "GTiff", prototype = None ):
226 driver = gdal.GetDriverByName( format ) 227 if driver is None: 228 raise ValueError("Can't find driver "+format) 229 230 return driver.CreateCopy( filename, OpenArray(src_array,prototype) )
231 232
233 -def DatasetReadAsArray( ds, xoff=0, yoff=0, win_xsize=None, win_ysize=None, buf_obj=None, 234 buf_xsize = None, buf_ysize = None, buf_type = None, 235 resample_alg = gdal.GRIORA_NearestNeighbour, 236 callback=None, callback_data=None ):
237 """Pure python implementation of reading a chunk of a GDAL file 238 into a numpy array. Used by the gdal.Dataset.ReadAsArray method.""" 239 240 if win_xsize is None: 241 win_xsize = ds.RasterXSize 242 if win_ysize is None: 243 win_ysize = ds.RasterYSize 244 245 if ds.RasterCount == 0: 246 return None 247 248 if ds.RasterCount == 1: 249 return BandReadAsArray( ds.GetRasterBand(1), xoff, yoff, win_xsize, win_ysize, 250 buf_xsize = buf_xsize, buf_ysize = buf_ysize, buf_type = buf_type, 251 buf_obj = buf_obj, 252 resample_alg = resample_alg, 253 callback = callback, 254 callback_data = callback_data ) 255 256 if buf_obj is None: 257 if buf_xsize is None: 258 buf_xsize = win_xsize 259 if buf_ysize is None: 260 buf_ysize = win_ysize 261 if buf_type is None: 262 buf_type = ds.GetRasterBand(1).DataType 263 for band_index in range(2,ds.RasterCount+1): 264 if buf_type != ds.GetRasterBand(band_index).DataType: 265 buf_type = gdalconst.GDT_Float32 266 267 typecode = GDALTypeCodeToNumericTypeCode( buf_type ) 268 if typecode == None: 269 buf_type = gdalconst.GDT_Float32 270 typecode = numpy.float32 271 if buf_type == gdalconst.GDT_Byte and ds.GetRasterBand(1).GetMetadataItem('PIXELTYPE', 'IMAGE_STRUCTURE') == 'SIGNEDBYTE': 272 typecode = numpy.int8 273 buf_obj = numpy.empty([ds.RasterCount, buf_ysize,buf_xsize], dtype = typecode) 274 275 else: 276 if len(buf_obj.shape) != 3: 277 raise ValueError('Array should have 3 dimensions') 278 279 shape_buf_xsize = buf_obj.shape[2] 280 shape_buf_ysize = buf_obj.shape[1] 281 if buf_xsize is not None and buf_xsize != shape_buf_xsize: 282 raise ValueError('Specified buf_xsize not consistent with array shape') 283 if buf_ysize is not None and buf_ysize != shape_buf_ysize: 284 raise ValueError('Specified buf_ysize not consistent with array shape') 285 if buf_obj.shape[0] != ds.RasterCount: 286 raise ValueError('Array should have space for %d bands' % ds.RasterCount) 287 288 datatype = NumericTypeCodeToGDALTypeCode( buf_obj.dtype.type ) 289 if not datatype: 290 raise ValueError("array does not have corresponding GDAL data type") 291 if buf_type is not None and buf_type != datatype: 292 raise ValueError("Specified buf_type not consistent with array type") 293 buf_type = datatype 294 295 if DatasetIONumPy( ds, 0, xoff, yoff, win_xsize, win_ysize, 296 buf_obj, buf_type, resample_alg, callback, callback_data ) != 0: 297 return None 298 299 return buf_obj
300
301 -def BandReadAsArray( band, xoff = 0, yoff = 0, win_xsize = None, win_ysize = None, 302 buf_xsize=None, buf_ysize=None, buf_type=None, buf_obj=None, 303 resample_alg = gdal.GRIORA_NearestNeighbour, 304 callback=None, callback_data=None):
305 """Pure python implementation of reading a chunk of a GDAL file 306 into a numpy array. Used by the gdal.Band.ReadAsArray method.""" 307 308 if win_xsize is None: 309 win_xsize = band.XSize 310 if win_ysize is None: 311 win_ysize = band.YSize 312 313 if buf_obj is None: 314 if buf_xsize is None: 315 buf_xsize = win_xsize 316 if buf_ysize is None: 317 buf_ysize = win_ysize 318 if buf_type is None: 319 buf_type = band.DataType 320 321 typecode = GDALTypeCodeToNumericTypeCode( buf_type ) 322 if typecode == None: 323 buf_type = gdalconst.GDT_Float32 324 typecode = numpy.float32 325 else: 326 buf_type = NumericTypeCodeToGDALTypeCode( typecode ) 327 328 if buf_type == gdalconst.GDT_Byte and band.GetMetadataItem('PIXELTYPE', 'IMAGE_STRUCTURE') == 'SIGNEDBYTE': 329 typecode = numpy.int8 330 buf_obj = numpy.empty([buf_ysize,buf_xsize], dtype = typecode) 331 332 else: 333 if len(buf_obj.shape) == 2: 334 shape_buf_xsize = buf_obj.shape[1] 335 shape_buf_ysize = buf_obj.shape[0] 336 else: 337 shape_buf_xsize = buf_obj.shape[2] 338 shape_buf_ysize = buf_obj.shape[1] 339 if buf_xsize is not None and buf_xsize != shape_buf_xsize: 340 raise ValueError('Specified buf_xsize not consistent with array shape') 341 if buf_ysize is not None and buf_ysize != shape_buf_ysize: 342 raise ValueError('Specified buf_ysize not consistent with array shape') 343 344 datatype = NumericTypeCodeToGDALTypeCode( buf_obj.dtype.type ) 345 if not datatype: 346 raise ValueError("array does not have corresponding GDAL data type") 347 if buf_type is not None and buf_type != datatype: 348 raise ValueError("Specified buf_type not consistent with array type") 349 buf_type = datatype 350 351 if BandRasterIONumPy( band, 0, xoff, yoff, win_xsize, win_ysize, 352 buf_obj, buf_type, resample_alg, callback, callback_data ) != 0: 353 return None 354 355 return buf_obj
356
357 -def BandWriteArray( band, array, xoff=0, yoff=0, 358 resample_alg = gdal.GRIORA_NearestNeighbour, 359 callback=None, callback_data=None ):
360 """Pure python implementation of writing a chunk of a GDAL file 361 from a numpy array. Used by the gdal.Band.WriteArray method.""" 362 363 if array is None or len(array.shape) != 2: 364 raise ValueError("expected array of dim 2") 365 366 xsize = array.shape[1] 367 ysize = array.shape[0] 368 369 if xsize + xoff > band.XSize or ysize + yoff > band.YSize: 370 raise ValueError("array larger than output file, or offset off edge") 371 372 datatype = NumericTypeCodeToGDALTypeCode( array.dtype.type ) 373 374 # if we receive some odd type, like int64, try casting to a very 375 # generic type we do support (#2285) 376 if not datatype: 377 gdal.Debug( 'gdal_array', 'force array to float64' ) 378 array = array.astype( numpy.float64 ) 379 datatype = NumericTypeCodeToGDALTypeCode( array.dtype.type ) 380 381 if not datatype: 382 raise ValueError("array does not have corresponding GDAL data type") 383 384 return BandRasterIONumPy( band, 1, xoff, yoff, xsize, ysize, 385 array, datatype, resample_alg, callback, callback_data )
386
387 -def RATWriteArray(rat, array, field, start=0):
388 """ 389 Pure Python implementation of writing a chunk of the RAT 390 from a numpy array. Type of array is coerced to one of the types 391 (int, double, string) supported. Called from RasterAttributeTable.WriteArray 392 """ 393 if array is None: 394 raise ValueError("Expected array of dim 1") 395 396 # if not the array type convert it to handle lists etc 397 if not isinstance(array, numpy.ndarray): 398 array = numpy.array(array) 399 400 if array.ndim != 1: 401 raise ValueError("Expected array of dim 1") 402 403 if (start + array.size) > rat.GetRowCount(): 404 raise ValueError("Array too big to fit into RAT from start position") 405 406 if numpy.issubdtype(array.dtype, numpy.integer): 407 # is some type of integer - coerce to standard int 408 # TODO: must check this is fine on all platforms 409 # confusingly numpy.int 64 bit even if native type 32 bit 410 array = array.astype(numpy.int32) 411 elif numpy.issubdtype(array.dtype, numpy.floating): 412 # is some type of floating point - coerce to double 413 array = array.astype(numpy.double) 414 elif numpy.issubdtype(array.dtype, numpy.character): 415 # cast away any kind of Unicode etc 416 array = array.astype(numpy.character) 417 else: 418 raise ValueError("Array not of a supported type (integer, double or string)") 419 420 return RATValuesIONumPyWrite(rat, field, start, array)
421
422 -def RATReadArray(rat, field, start=0, length=None):
423 """ 424 Pure Python implementation of reading a chunk of the RAT 425 into a numpy array. Called from RasterAttributeTable.ReadAsArray 426 """ 427 if length is None: 428 length = rat.GetRowCount() - start 429 430 return RATValuesIONumPyRead(rat, field, start, length)
431
432 -def CopyDatasetInfo( src, dst, xoff=0, yoff=0 ):
433 """ 434 Copy georeferencing information and metadata from one dataset to another. 435 src: input dataset 436 dst: output dataset - It can be a ROI - 437 xoff, yoff: dst's offset with respect to src in pixel/line. 438 439 Notes: Destination dataset must have update access. Certain formats 440 do not support creation of geotransforms and/or gcps. 441 442 """ 443 444 dst.SetMetadata( src.GetMetadata() ) 445 446 447 448 #Check for geo transform 449 gt = src.GetGeoTransform() 450 if gt != (0,1,0,0,0,1): 451 dst.SetProjection( src.GetProjectionRef() ) 452 453 if (xoff == 0) and (yoff == 0): 454 dst.SetGeoTransform( gt ) 455 else: 456 ngt = [gt[0],gt[1],gt[2],gt[3],gt[4],gt[5]] 457 ngt[0] = gt[0] + xoff*gt[1] + yoff*gt[2]; 458 ngt[3] = gt[3] + xoff*gt[4] + yoff*gt[5]; 459 dst.SetGeoTransform( ( ngt[0], ngt[1], ngt[2], ngt[3], ngt[4], ngt[5] ) ) 460 461 #Check for GCPs 462 elif src.GetGCPCount() > 0: 463 464 if (xoff == 0) and (yoff == 0): 465 dst.SetGCPs( src.GetGCPs(), src.GetGCPProjection() ) 466 else: 467 gcps = src.GetGCPs() 468 #Shift gcps 469 new_gcps = [] 470 for gcp in gcps: 471 ngcp = gdal.GCP() 472 ngcp.GCPX = gcp.GCPX 473 ngcp.GCPY = gcp.GCPY 474 ngcp.GCPZ = gcp.GCPZ 475 ngcp.GCPPixel = gcp.GCPPixel - xoff 476 ngcp.GCPLine = gcp.GCPLine - yoff 477 ngcp.Info = gcp.Info 478 ngcp.Id = gcp.Id 479 new_gcps.append(ngcp) 480 481 try: 482 dst.SetGCPs( new_gcps , src.GetGCPProjection() ) 483 except: 484 print ("Failed to set GCPs") 485 return 486 487 return
488