Exemplo n.º 1
0
def get_closest_index(latlons, stationll):
    """
    Returns the indices of the four surrounding gridpoints in _latlons_ around _stationll_
    """
    import get_closest_gridpoint as getpoint

    lats, lons = latlons
    latt, lont = stationll
    print 'point of interest (lat,lon) ', latt, lont

    g = getpoint.grid_searcher(lats, lons, method=2)
    a, b, c, d = g.get_four_surrounding_points(latt, lont)
    index = (a, b, c, d)
    print 'Index:', index
    indices = ((index[0], index[2]), (index[0], index[3]),
               (index[1], index[3]), (index[1], index[2]))
    print 'Indices of 4 surrounding points: ', indices

    return indices
Exemplo n.º 2
0
def multi_interp(listdictvalues,
                 latlons,
                 stationlllist,
                 indices=None,
                 method='bilinear'):
    ''' 
    assume a number of fields to be interpolated, and a number of points
    Gather the interpolation characteristics to reuse(!)
    '''

    import get_closest_gridpoint as getpoint

    lats, lons = latlons
    #latt,lont = stationll

    try:
        f = open('line_intp.pkl')
        linedict = pickle.load(f)
    except:
        print 'no predefined coefficients available, compute'

        #if indices is None:
        indices = {}
        for s, ll in enumerate(stationlllist):
            latt, lont = ll
            print 'point of interest (lat,lon) ', latt, lont
            g = getpoint.grid_searcher(lats, lons, method=2)
            a, b, c, d = g.get_four_surrounding_points(latt, lont)
            index = (a, b, c, d)
            print 'Index:', index
            indices[s] = ((index[0], index[2]), (index[0], index[3]),
                          (index[1], index[3]), (index[1], index[2]))
            print 'Indices of 4 surrounding points: ', indices[s]

            lata, lona = lats[indices[0]], lons[indices[s][0]]
            latb, lonb = lats[indices[1]], lons[indices[s][1]]
            latc, lonc = lats[indices[2]], lons[indices[s][2]]
            latd, lond = lats[indices[3]], lons[indices[s][3]]

            if method == 'bilinear':
                xa, xb, xc, xd = {}, {}, {}, {}
                ya, yb, yc, yd = {}, {}, {}, {}
                distab, distbc, distcd, distda = {}, {}, {}, {}

                xa[s] = getpoint.get_distance_grcircle(lata, lona, lata, lont)
                xb[s] = getpoint.get_distance_grcircle(latb, lonb, latb, lont)
                xc[s] = getpoint.get_distance_grcircle(latc, lonc, latc, lont)
                xd[s] = getpoint.get_distance_grcircle(latd, lond, latd, lont)

                ya[s] = getpoint.get_distance_grcircle(lata, lona, latt, lona)
                yb[s] = getpoint.get_distance_grcircle(latb, lonb, latt, lonb)
                yc[s] = getpoint.get_distance_grcircle(latc, lonc, latt, lonc)
                yd[s] = getpoint.get_distance_grcircle(latd, lond, latt, lond)
                #yab[s]    = getpoint.get_distance_grcircle(lata,lona,latt,lona)

                #distap =  getpoint.get_distance_grcircle(lata,lona,latt,lont)
                #distbp =  getpoint.get_distance_grcircle(latb,lonb,latt,lont)
                #distcp =  getpoint.get_distance_grcircle(latc,lonc,latt,lont)
                #distdp =  getpoint.get_distance_grcircle(latd,lond,latt,lont)

                distab[s] = getpoint.get_distance_grcircle(
                    lata, lona, latb, lonb)
                distbc[s] = getpoint.get_distance_grcircle(
                    latc, lonc, latb, lonb)
                distcd[s] = getpoint.get_distance_grcircle(
                    latc, lonc, latd, lond)
                distda[s] = getpoint.get_distance_grcircle(
                    lata, lona, latd, lond)

                for l in listdictvalues.keys():
                    a = values[indices[0]]
                    b = values[indices[1]]
                    c = values[indices[2]]
                    d = values[indices[3]]
                    print indices, a, b, c, d

                    # bilinear:
                    #pab = a * xb[s] / distab[s] + b * xa[s] / distab[s]
                    #pcd = d * xc[s] / distab[s] + c * xd[s] / distcd[s]

                    pvalue = (yd[s] * xb[s] / (distab[s] * distda[s]) +
                              yc[s] * xa[s] / (distab[s] * distbc[s]) +
                              yb[s] * xd[s] / (distcd[s] * distbc[s]) +
                              ya[s] * xc[s] / (distcd[s] * distda[s]))
                    #pvalue = pab * ycd / distda + pcd * yab / distda[s]
                    print 'dus ', a, b, c, d, pvalue
                    print 'en  ', xa[s], xb[s], xc[s], xd[
                        s], xa[s] + xb[s], xc[s] + xd[s]

            if 0:  # debug
                print a, b, xb, xa, distab
                print lata, latb, ya, yb, yab
                print latc, latd, yc, yd, ycd
                print pab, pcd, pvalue

            return pvalue

        else:  # return average (?)
            return (a + b + c + d) / 4.
Exemplo n.º 3
0
def interp(values, latlons, stationll, indices=None, method='bilinear'):

    import get_closest_gridpoint as getpoint

    lats, lons = latlons
    latt, lont = stationll

    try:
        f = open('line_intp.pkl')
        linedict = pickle.load(f)
    except:
        print 'no predefined coefficients available, compute'

    if indices is None:
        print 'point of interest (lat,lon) ', latt, lont
        g = getpoint.grid_searcher(lats, lons, method=2)
        a, b, c, d = g.get_four_surrounding_points(latt, lont)
        index = (a, b, c, d)
        print 'Index:', index
        indices = ((index[0], index[2]), (index[0], index[3]),
                   (index[1], index[3]), (index[1], index[2]))
        print 'Indices of 4 surrounding points: ', indices

    elif indices is not None and len(indices) < 4:
        return values[indices[0], indices[1]]

    if 1:
        a = values[indices[0]]
        b = values[indices[1]]
        c = values[indices[2]]
        d = values[indices[3]]
        #print indices,a,b,c,d

        lata, lona = lats[indices[0]], lons[indices[0]]
        latb, lonb = lats[indices[1]], lons[indices[1]]
        latc, lonc = lats[indices[2]], lons[indices[2]]
        latd, lond = lats[indices[3]], lons[indices[3]]

        if method == 'bilinear':
            latt, lont = stationll

            xa = getpoint.get_distance_grcircle(lata, lona, lata, lont)
            xb = getpoint.get_distance_grcircle(latb, lonb, latb, lont)
            xc = getpoint.get_distance_grcircle(latc, lonc, latc, lont)
            xd = getpoint.get_distance_grcircle(latd, lond, latd, lont)

            ya = getpoint.get_distance_grcircle(lata, lona, latt, lona)
            yb = getpoint.get_distance_grcircle(latb, lonb, latt, lonb)
            yc = getpoint.get_distance_grcircle(latc, lonc, latt, lonc)
            yd = getpoint.get_distance_grcircle(latd, lond, latt, lond)
            #yab    = getpoint.get_distance_grcircle(lata,lona,latt,lona)

            distap = getpoint.get_distance_grcircle(lata, lona, latt, lont)
            distbp = getpoint.get_distance_grcircle(latb, lonb, latt, lont)
            distcp = getpoint.get_distance_grcircle(latc, lonc, latt, lont)
            distdp = getpoint.get_distance_grcircle(latd, lond, latt, lont)

            distab = getpoint.get_distance_grcircle(lata, lona, latb, lonb)
            distbc = getpoint.get_distance_grcircle(latc, lonc, latb, lonb)
            distcd = getpoint.get_distance_grcircle(latc, lonc, latd, lond)
            distda = getpoint.get_distance_grcircle(lata, lona, latd, lond)

            # bilinear:
            pab = a * xb / distab + b * xa / distab
            pcd = d * xc / distab + c * xd / distcd

            yab = ya * xb / distab + yb * xa / distab
            ycd = yd * xc / distab + yc * xd / distcd
            pvalue = pab * ycd / distda + pcd * yab / distda

            if 0:  # debug
                print a, b, xb, xa, distab
                print lata, latb, ya, yb, yab
                print latc, latd, yc, yd, ycd
                print pab, pcd, pvalue

            return pvalue

        else:  # return average (?)
            return (a + b + c + d) / 4.
Exemplo n.º 4
0
    def compute_dist(self, verb=True):
        '''
        get all distances in "square" around point of interest:

        d - c    a - b
        | t | or |   | 
        a - b    d - c
        '''
        lats, lons = self.latlons

        for s, ll in enumerate(self.stationll):
            latt, lont = ll
            if verb: print 'point of interest (lat,lon) ', s, latt, lont
            g = getpoint.grid_searcher(lats, lons, method=2)
            a, b, c, d = g.get_four_surrounding_points(latt, lont)
            index = (a, b, c, d)
            print 'Index:', index
            self.indices[s] = ((index[0], index[2]), (index[0], index[3]),
                               (index[1], index[3]), (index[1], index[2]))
            if verb: print 'Indices of 4 surrounding points: ', self.indices[s]

            lata, lona = lats[self.indices[s][0]], lons[self.indices[s][0]]
            latb, lonb = lats[self.indices[s][1]], lons[self.indices[s][1]]
            latc, lonc = lats[self.indices[s][2]], lons[self.indices[s][2]]
            latd, lond = lats[self.indices[s][3]], lons[self.indices[s][3]]

            self.xa[s] = getpoint.get_distance_grcircle(lata, lona, lata, lont)
            self.xb[s] = getpoint.get_distance_grcircle(latb, lonb, latb, lont)
            self.xc[s] = getpoint.get_distance_grcircle(latc, lonc, latc, lont)
            self.xd[s] = getpoint.get_distance_grcircle(latd, lond, latd, lont)

            self.ya[s] = getpoint.get_distance_grcircle(lata, lona, latt, lona)
            self.yb[s] = getpoint.get_distance_grcircle(latb, lonb, latt, lonb)
            self.yc[s] = getpoint.get_distance_grcircle(latc, lonc, latt, lonc)
            self.yd[s] = getpoint.get_distance_grcircle(latd, lond, latt, lond)

            self.distab[s] = getpoint.get_distance_grcircle(
                lata, lona, latb, lonb)
            self.distbc[s] = getpoint.get_distance_grcircle(
                latc, lonc, latb, lonb)
            self.distcd[s] = getpoint.get_distance_grcircle(
                latc, lonc, latd, lond)
            self.distda[s] = getpoint.get_distance_grcircle(
                lata, lona, latd, lond)

            #self.yab[s] = self.ya[s] * self.xb[s] / self.distab[s] + self.yb[s] * self.xa[s] / self.distab[s]
            #self.ycd[s] = self.yd[s] * self.xc[s] / self.distab[s] + self.yc[s] * self.xd[s] / self.distcd[s]

            self.xcorr[s] = (self.distab[s] / (self.xa[s] + self.xb[s]))
            self.ycorr[s] = (self.distda[s] / (self.ya[s] + self.yd[s]))

            if verb:
                print 'check x (xa+xb,xc+xd)', self.xa[s] + self.xb[
                    s], self.xc[s] + self.xd[s]
                print 'check y (ya+yd,yb+yc)', self.ya[s] + self.yd[
                    s], self.yb[s] + self.yc[s]
                print 'check corr x', (self.xa[s] +
                                       self.xb[s]) * (self.xcorr[s])
                print 'check corr y', (self.ya[s] +
                                       self.yd[s]) * (self.ycorr[s])
                print 'check dist (ab,bc,cd,da)', self.distab[s], self.distbc[
                    s], self.distcd[s], self.distda[s]
Exemplo n.º 5
0
    values = grbs[1].values
    values2 = grbs[2].values
    values3 = grbs[3].values

    values = grbs[5].values
    values2 = grbs[6].values
    values3 = grbs[7].values

    grbs.close()

    latt, lont = 52.376, 4.879
    latt, lont = 52.372, 4.85
    latt, lont = 52.361, 4.845
    llstat = (latt, lont)

    g = getpoint.grid_searcher(lats, lons, method=2)
    s = g.get_closest_point(latt, lont)
    a, b, c, d = g.get_four_surrounding_points(latt, lont)
    pts = (a, b, c, d)
    indic = ((pts[0], pts[2]), (pts[0], pts[3]), (pts[1], pts[3]), (pts[1],
                                                                    pts[2]))

    print('\n===== The index and lat,lon of closest gridpoint: =====')
    print latt, lont
    print 'single point: ', s, lats[s], lons[s]
    print 'four points:  ', a, b, c, d

    print('\n===== The indices and values of the surrounding points: =====')
    print indic
    for i in indic:
        print 'lat,lon,value: ', lats[i], lons[i], values[i]