scipy tutorial question

Xristos Xristoou saxri89 at gmail.com
Sun Oct 2 16:06:18 EDT 2016


hello

i want to follow this scipy tutorial http://www2.geog.ucl.ac.uk/~plewis/geogg122-2011-12/dem2.html to calculate slope/aspect and more.

first question,this is a good way to calculate slope/aspect with scipy ?
can i find more easy way for this calculate ?

second question and most important,how can i use mine DEM (raster image) inside
the tutorial code to calculate slope/aspect from mine DEM (raster image)?
and how to export that calculation to new tiff images ?
i thing so easy but i am very new.
i have and gdal package in my python

the tutorial code :


import numpy as np

def gaussianFilter(sizex,sizey=None,scale=0.333):
    '''
    Generate and return a 2D Gaussian function
    of dimensions (sizex,sizey)

    If sizey is not set, it defaults to sizex
    A scale can be defined to widen the function (default = 0.333)
    '''
    sizey = sizey or sizex
    x, y = np.mgrid[-sizex:sizex+1, -sizey:sizey+1]
    g = np.exp(-scale*(x**2/float(sizex)+y**2/float(sizey)))
    return g/g.sum()

def randomDEM(nx,sizex,max,min,sizey=None,ny=None):
    '''
    Generate a pseudo-DEM from random correlated noise.

    Parameters:
        nx  :       number of pixels of the output
    sizex   :       number of pixels of the smoothing filter
    max     :       max height in DEM
    min     :       min height in DEM

    Options:
    sizey   :       defaults to sizex
            ny      :       defaults to nx

    '''
    from scipy import signal
    ny = ny or nx
    sizey = sizey or sizex
    dem1 = np.random.rand(nx+2*sizex,ny+2*sizey)
    demSmooth = signal.convolve(dem1,gaussianFilter(sizex,sizey),mode='valid')
    demSmooth = (demSmooth - demSmooth.min())/(demSmooth.max() - demSmooth.min())
    demSmooth = demSmooth*(max-min)+min
    return demSmooth

def plot(array,file=None):
    '''
    Produce a plot of the 2D array

    Options:
    file    :       specify an output file
    '''
    import matplotlib.pylab as plt
    plt.imshow(array,interpolation='nearest')
    if file == None:
        plt.show()
    else:
        plt.savefile(file)
smoothDEM = randomDEM(300,20,100.,0.,sizey=5)
#plot(smoothDEM)
def padding(dem,size=1):
    '''
    Apply a border of size to a spatial dataset

    Return the padded data with the original centred in the array
    '''
    out = np.zeros([dem.shape[0]+2*size,dem.shape[1]+2*size])
    out[:,:] = np.max(dem)+1
    out[size:-size,size:-size] = dem
    return out

padDEM = padding(smoothDEM)
#plot(padDEM)
def localMin(dem):
    '''
    We wish to return the location of the minimum grid value
    in a neighbourhood.

    We assume the array is 2D and defined (y,x)

    We return wx,wy which are the cell displacements in x and y directions.

    '''
    wy = np.zeros_like(dem).astype(int)
    wx = np.zeros_like(dem).astype(int)
    winx = np.ones([3,3])
    for i in xrange(3):
        winx[:,i] = i - 1
    winy = winx.transpose()
    demp = padding(dem,size=1)
    for y in np.arange(1,demp.shape[0]-1):
        for x in np.arange(1,demp.shape[1]-1):
            win = demp[y-1:y+2,x-1:x+2]
            ww = np.where(win == np.min(win))
            whereX = winx[ww][0]
            whereY = winy[ww][0]
            wy[y-1,x-1] = whereY
            wx[y-1,x-1] = whereX
    return wx,wy

(wx,wy) = localMin(smoothDEM)
#plot(wx)


def grad2d(dem):
    '''
    Calculate the slope and gradient of a DEM
    '''
    from scipy import signal
    f0 = gaussianFilter(3)
    I = signal.convolve(dem,f0,mode='valid')
    f1 = np.array([[-1,0,1],[-2,0,2],[-1,0,1]])
    f2 = f1.transpose()
    g1 = signal.convolve(I,f1,mode='valid')
    g2 = signal.convolve(I,f2,mode='valid')
    slope = np.sqrt(g1**2 + g2**2)
    aspect = np.arctan2(g2,g1)
    return slope, aspect
slope,  aspect = grad2d(smoothDEM)
plot(slope)
plot(aspect)



More information about the Python-list mailing list