-
Notifications
You must be signed in to change notification settings - Fork 1
/
raster2numpy.py
68 lines (58 loc) · 2.47 KB
/
raster2numpy.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# adapted from http://gis.stackexchange.com/questions/28583/gdal-perform-simple-least-cost-path-analysis
import gdal, osr
import numpy as np
def raster2array(raster,npType):
'''
Converts an input raster to a numpy array of type npType
Inputs: raster -> input raster openable by GDAL
npType -> Numpy data type (e.g. numpy.uint16, see https://docs.scipy.org/doc/numpy/user/basics.types.html)
Returns: Numpy array
'''
raster = gdal.Open(raster)
band = raster.GetRasterBand(1)
array = band.ReadAsArray().astype(npType)
return array
def coord2pixelOffset(referenceRaster,x,y):
'''
Converts x-y geographic coordinates into x-y offsets for a numpy array
based on a reference raster
Inputs: referenceRaster -> reference raster to use for coordinate conversion
x -> x coordinate in the CRS of the reference raster
y -> y coordinate in the CRS of the reference raster
Returns: x and y array indexes
'''
raster = gdal.Open(referenceRaster)
geotransform = raster.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]
pixelWidth = geotransform[1]
pixelHeight = geotransform[5]
xOffset = int((x - originX)/pixelWidth)
yOffset = int((y - originY)/pixelHeight)
return xOffset,yOffset
def array2raster(outRaster,gdalType,referenceRaster,array):
'''
Converts a numpy array into a raster using a reference raster as a
template
Inputs: outRaster -> file path to save the output raster to
gdalType -> GDAL data type (e.g. gdal.GDT_UInt16, see http://www.gdal.org/gdal_8h.html#a22e22ce0a55036a96f652765793fb7a4)
referenceRaster -> reference raster to use for coordinate conversion
array -> numpy array to be converted to raster
'''
raster = gdal.Open(referenceRaster)
geotransform = raster.GetGeoTransform()
originX = geotransform[0]
originY = geotransform[3]
pixelWidth = geotransform[1]
pixelHeight = geotransform[5]
cols = array.shape[1]
rows = array.shape[0]
driver = gdal.GetDriverByName('GTiff')
outRaster = driver.Create(outRaster, cols, rows, eType=gdalType)
outRaster.SetGeoTransform((originX, pixelWidth, 0, originY, 0, pixelHeight))
outband = outRaster.GetRasterBand(1)
outband.WriteArray(array)
outRasterSRS = osr.SpatialReference()
outRasterSRS.ImportFromWkt(raster.GetProjectionRef())
outRaster.SetProjection(outRasterSRS.ExportToWkt())
outband.FlushCache()