Example #1
0
def pointfind2(plat, plon, lat, lon, pdif=1):
    """ return indeces and values of the grid point closest to lat/lon point
    the same as pointfind but could be faster
    Usage: 
        pointfind(plat, plon, lat, lon, pdif = 0.5)
    Input:
        plat - latitude of the point
        plon - longitude of the point
        lat  - 2d array of latutudes
        lon  - 2d array of longitudes
        pdif  - we don't need it but leave it to have the same input as pointfind
    Output:
        indeces and values of the points that fulfil conditions 
        
        
    
    """

    dist_min = 1000000.
    
    
    for i in range(lon.shape[0]):
        for j in range(lon.shape[1]):
            dist = Ngl.gc_dist(plat,plon,lat[i,j],lon[i,j])
            if dist_min > dist:
                dist_min = dist
                i_min = i
                j_min = j
                lat_min = lat[i,j]
                lon_min = lon[i,j]
    
    print(i_min,j_min,lat_min,lon_min)
    gg1 = i_min, j_min
    
    return(gg1, lat_min, lon_min)
def pointfind2(plat, plon, lat, lon, pdif=1):
    """ return indeces and values of the grid point closest to lat/lon point
    the same as pointfind but could be faster
    Usage: 
        pointfind(plat, plon, lat, lon, pdif = 0.5)
    Input:
        plat - latitude of the point
        plon - longitude of the point
        lat  - 2d array of latutudes
        lon  - 2d array of longitudes
        pdif  - we don't need it but leave it to have the same input as pointfind
    Output:
        indeces and values of the points that fulfil conditions 
        
        
    
    """

    dist_min = 1000000.

    for i in range(lon.shape[0]):
        for j in range(lon.shape[1]):
            dist = Ngl.gc_dist(plat, plon, lat[i, j], lon[i, j])
            if dist_min > dist:
                dist_min = dist
                i_min = i
                j_min = j
                lat_min = lat[i, j]
                lon_min = lon[i, j]

    print(i_min, j_min, lat_min, lon_min)
    gg1 = i_min, j_min

    return (gg1, lat_min, lon_min)
Example #3
0
def find_closest(lats, lons, lat, lon, mask=None):
    mindist = 1e20
    if mask == None:
        mask = np.zeros([len(lats), len(lons)], dtype=np.bool)
    for i in range(len(lons)):
        for j in range(len(lats)):
            if not mask[j, i]:
                dist = Ngl.gc_dist(lons[i], lats[j], lon, lat)
                if dist < mindist:
                    closest_i = i
                    closest_j = j
                    mindist = dist
    return closest_i, closest_j
Example #4
0
def find_closest(lats, lons, lat, lon, mask=None):
    mindist = 1e20
    if mask == None:
        mask = np.zeros([len(lats), len(lons)], dtype=np.bool)
    for i in range(len(lons)):
        for j in range(len(lats)):
            if not mask[j,i]:
                dist = Ngl.gc_dist(lons[i], lats[j], lon, lat)
                if dist < mindist:
                    closest_i = i
                    closest_j = j
                    mindist = dist
    return closest_i, closest_j
Example #5
0
def find_distances(x1, y1, x2, y2):
    """ generalization of Ngl.gc_dist that can take arrays of lat and lon as input and return a ndarray of distances. """
    narrays = 0
    size_output = []
    order_input = []
    if isinstance(x1, np.ndarray):
        IM1 = x1.size
        narrays = narrays + 1
        size_output.append(IM1)
        order_input.append(0)
    if isinstance(y1, np.ndarray):
        JM1 = y1.size
        narrays = narrays + 1
        size_output.append(JM1)
        order_input.append(1)
    if isinstance(x2, np.ndarray):
        IM2 = x2.size
        narrays = narrays + 1
        size_output.append(IM2)
        order_input.append(2)
    if isinstance(y2, np.ndarray):
        JM2 = y2.size
        narrays = narrays + 1
        size_output.append(JM2)
        order_input.append(3)

    if narrays == 0:
        output = Ngl.gc_dist(x1, y1, x2, y2)
    else:
        output = np.zeros(size_output)
        if narrays == 1:
            if order_input[0] == 0:
                for i in range(0, IM1):
                    output[i] = Ngl.gc_dist(x1[i], y1, x2, y2)
            if order_input[0] == 1:
                for i in range(0, JM1):
                    output[i] = Ngl.gc_dist(x1, y1[i], x2, y2)
            if order_input[0] == 2:
                for i in range(0, IM2):
                    output[i] = Ngl.gc_dist(x1, y1, x2[i], y2)
            if order_input[0] == 3:
                for i in range(0, JM2):
                    output[i] = Ngl.gc_dist(x1, y1, x2, y2[i])
        if narrays == 2:
            if order_input[0] == 0:
                if order_input[1] == 1:
                    for i in range(0, IM1):
                        for j in range(0, JM1):
                            output[i, j] = Ngl.gc_dist(x1[i], y1[j], x2, y2)
                if order_input[1] == 2:
                    for i in range(0, IM1):
                        for j in range(0, IM2):
                            output[i, j] = Ngl.gc_dist(x1[i], y1, x2[j], y2)
                if order_input[1] == 3:
                    for i in range(0, IM1):
                        for j in range(0, JM2):
                            output[i, j] = Ngl.gc_dist(x1[i], y1, x2, y2[j])
            if order_input[0] == 1:
                if order_input[1] == 2:
                    for i in range(0, JM1):
                        for j in range(0, IM2):
                            output[i, j] = Ngl.gc_dist(x1, y1[i], x2[j], y2)
                if order_input[1] == 3:
                    for i in range(0, JM1):
                        for j in range(0, JM2):
                            output[i, j] = Ngl.gc_dist(x1, y1[i], x2, y2[j])
            if order_input[0] == 2:
                if order_input[1] == 3:
                    for i in range(0, IM2):
                        for j in range(0, JM2):
                            output[i, j] = Ngl.gc_dist(x1, y1, x2[i], y2[j])
        if narrays == 3:
            raise NotImplementedError
        if narrays == 4:
            for i in range(0, IM1):
                for j in range(0, JM1):
                    for k in range(0, IM2):
                        for l in range(0, JM2):
                            output[i, j, k,
                                   l] = Ngl.gc_dist(x1[i], y1[j], x2[k], y2[l])

    return output
Example #6
0
def get_transect(lat, lon, data, lat1, lon1, lat2, lon2, npoints = 10, pdif = 1, norep=False):
    

    plat, plon = Ngl.gc_interp(lat1,lon1,lat2,lon2,npoints)
    
    m_grid = numpy.zeros((plon.shape[0]))
    n_grid = numpy.zeros((plat.shape[0]))
    grid_lats = numpy.zeros((plat.shape[0]))
    grid_lons = numpy.zeros((plat.shape[0]))
    
    for k in range(plon.shape[0]):
        coord, trash1, trash1 = pointfind2(plat[k], plon[k], lat, lon, pdif)
        m_grid[k] = coord[0]
        n_grid[k] = coord[1]
        grid_lats[k] = lat[m_grid[k],n_grid[k]]
        grid_lons[k] = lon[m_grid[k],n_grid[k]]
    
    
    if len(data.shape) == 4:
        data = data[0,:,:,:]
    elif len(data.shape) == 5:
        data = data[0,0,:,:,:]
    
        
    data_prof = numpy.zeros(([data.shape[0],npoints]))   
    
    
    
    for j in range(data_prof.shape[1]):
        data_prof[:,j] = data[:,m_grid[j],n_grid[j]]
    
    
    x_kilometers = numpy.zeros((grid_lats.shape[0]))
    
    for j in range(grid_lats.shape[0] - 1):
        angle = Ngl.gc_dist(grid_lats[j], grid_lons[j], grid_lats[j+1], grid_lons[j+1] )
        x_kilometers[j+1] = Ngl.gc_convert(angle, 2) + x_kilometers[j]
    
    
    numpy.savez("outfile.npz", data_prof, x_kilometers)
    
    
    
    if norep == True:
        data_prof_norep = numpy.zeros(([data_prof.shape[0],1]))
        x_kilometers_norep = numpy.array(([]))
        m_grid_norep       = numpy.array(([]))
        n_grid_norep       = numpy.array(([]))
        present_location = -999999.999

        for k in range(x_kilometers.shape[0]):
            if int(x_kilometers[k]) != int(present_location):
                present_location = x_kilometers[k]
                data_prof_norep = numpy.hstack((data_prof_norep, data_prof[:,k:k+1])) 
                x_kilometers_norep = numpy.append(x_kilometers_norep, x_kilometers[k:k+1])
                m_grid_norep = numpy.append(m_grid_norep, m_grid[k:k+1])
                n_grid_norep = numpy.append(n_grid_norep, n_grid[k:k+1])
            

        data_prof_norep = data_prof_norep[:,1:] 
        data_prof = data_prof_norep
        x_kilometers = x_kilometers_norep
        m_grid = m_grid_norep
        n_grid = n_grid_norep
        
    print(x_kilometers)
    print(m_grid)
    print(n_grid)
    
    return(data_prof, x_kilometers, m_grid, n_grid )
def get_transect(lat,
                 lon,
                 data,
                 lat1,
                 lon1,
                 lat2,
                 lon2,
                 npoints=10,
                 pdif=1,
                 norep=False):

    plat, plon = Ngl.gc_interp(lat1, lon1, lat2, lon2, npoints)

    m_grid = numpy.zeros((plon.shape[0]))
    n_grid = numpy.zeros((plat.shape[0]))
    grid_lats = numpy.zeros((plat.shape[0]))
    grid_lons = numpy.zeros((plat.shape[0]))

    for k in range(plon.shape[0]):
        coord, trash1, trash1 = pointfind2(plat[k], plon[k], lat, lon, pdif)
        m_grid[k] = coord[0]
        n_grid[k] = coord[1]
        grid_lats[k] = lat[m_grid[k], n_grid[k]]
        grid_lons[k] = lon[m_grid[k], n_grid[k]]

    if len(data.shape) == 4:
        data = data[0, :, :, :]
    elif len(data.shape) == 5:
        data = data[0, 0, :, :, :]

    data_prof = numpy.zeros(([data.shape[0], npoints]))

    for j in range(data_prof.shape[1]):
        data_prof[:, j] = data[:, m_grid[j], n_grid[j]]

    x_kilometers = numpy.zeros((grid_lats.shape[0]))

    for j in range(grid_lats.shape[0] - 1):
        angle = Ngl.gc_dist(grid_lats[j], grid_lons[j], grid_lats[j + 1],
                            grid_lons[j + 1])
        x_kilometers[j + 1] = Ngl.gc_convert(angle, 2) + x_kilometers[j]

    numpy.savez("outfile.npz", data_prof, x_kilometers)

    if norep == True:
        data_prof_norep = numpy.zeros(([data_prof.shape[0], 1]))
        x_kilometers_norep = numpy.array(([]))
        m_grid_norep = numpy.array(([]))
        n_grid_norep = numpy.array(([]))
        present_location = -999999.999

        for k in range(x_kilometers.shape[0]):
            if int(x_kilometers[k]) != int(present_location):
                present_location = x_kilometers[k]
                data_prof_norep = numpy.hstack(
                    (data_prof_norep, data_prof[:, k:k + 1]))
                x_kilometers_norep = numpy.append(x_kilometers_norep,
                                                  x_kilometers[k:k + 1])
                m_grid_norep = numpy.append(m_grid_norep, m_grid[k:k + 1])
                n_grid_norep = numpy.append(n_grid_norep, n_grid[k:k + 1])

        data_prof_norep = data_prof_norep[:, 1:]
        data_prof = data_prof_norep
        x_kilometers = x_kilometers_norep
        m_grid = m_grid_norep
        n_grid = n_grid_norep

    print(x_kilometers)
    print(m_grid)
    print(n_grid)

    return (data_prof, x_kilometers, m_grid, n_grid)
Example #8
0
def find_distances(x1, y1, x2, y2):
    """ generalization of Ngl.gc_dist that can take arrays of lat and lon as input and return a ndarray of distances. """
    narrays = 0
    size_output = []
    order_input = []
    if isinstance(x1, np.ndarray):
        IM1 = x1.size
        narrays = narrays+1
        size_output.append(IM1)
        order_input.append(0)
    if isinstance(y1, np.ndarray):
        JM1 = y1.size
        narrays = narrays+1
        size_output.append(JM1)
        order_input.append(1)
    if isinstance(x2, np.ndarray):
        IM2 = x2.size
        narrays = narrays+1
        size_output.append(IM2)
        order_input.append(2)
    if isinstance(y2, np.ndarray):
        JM2 = y2.size
        narrays = narrays+1
        size_output.append(JM2)
        order_input.append(3)
    
    if narrays == 0:
        output = Ngl.gc_dist(x1, y1, x2, y2)
    else:
        output = np.zeros(size_output)
        if narrays == 1:
            if order_input[0] == 0:
                for i in range(0,IM1):
                    output[i] = Ngl.gc_dist(x1[i], y1, x2, y2)
            if order_input[0] == 1:
                for i in range(0,JM1):
                    output[i] = Ngl.gc_dist(x1, y1[i], x2, y2)
            if order_input[0] == 2:
                for i in range(0,IM2):
                    output[i] = Ngl.gc_dist(x1, y1, x2[i], y2)
            if order_input[0] == 3:
                for i in range(0,JM2):
                    output[i] = Ngl.gc_dist(x1, y1, x2, y2[i])
        if narrays == 2:
            if order_input[0] == 0:
                if order_input[1] == 1:
                    for i in range(0,IM1):
                        for j in range(0,JM1):
                            output[i,j] = Ngl.gc_dist(x1[i], y1[j], x2, y2)
                if order_input[1] == 2:
                    for i in range(0,IM1):
                        for j in range(0,IM2):
                            output[i,j] = Ngl.gc_dist(x1[i], y1, x2[j], y2)
                if order_input[1] == 3:
                    for i in range(0,IM1):
                        for j in range(0,JM2):
                            output[i,j] = Ngl.gc_dist(x1[i], y1, x2, y2[j])
            if order_input[0] == 1:
                if order_input[1] == 2:
                    for i in range(0,JM1):
                        for j in range(0,IM2):
                            output[i,j] = Ngl.gc_dist(x1, y1[i], x2[j], y2)
                if order_input[1] == 3:
                    for i in range(0,JM1):
                        for j in range(0,JM2):
                            output[i,j] = Ngl.gc_dist(x1, y1[i], x2, y2[j])
            if order_input[0] == 2:
                if order_input[1] == 3:
                    for i in range(0,IM2):
                        for j in range(0,JM2):
                            output[i,j] = Ngl.gc_dist(x1, y1, x2[i], y2[j])
        if narrays == 3:
            raise NotImplementedError
        if narrays == 4:
            for i in range(0,IM1):
                for j in range(0,JM1):
                    for k in range(0,IM2):
                        for l in range(0,JM2):
                            output[i,j,k,l] = Ngl.gc_dist(x1[i], y1[j], x2[k], y2[l])
                            
    return output