Interpolation over an irregular grid

后端 未结 6 1691
不知归路
不知归路 2020-12-01 01:30

So, I have three numpy arrays which store latitude, longitude, and some property value on a grid -- that is, I have LAT(y,x), LON(y,x), and, say temperature T(y,x), for some

相关标签:
6条回答
  • 2020-12-01 01:57

    I suggest you taking a look at GRASS (an open source GIS package) interpolation features (http://grass.ibiblio.org/gdp/html_grass62/v.surf.bspline.html). It's not in python but you can reimplement it or interface with C code.

    0 讨论(0)
  • 2020-12-01 02:06

    Try the combination of inverse-distance weighting and scipy.spatial.KDTree described in SO inverse-distance-weighted-idw-interpolation-with-python. Kd-trees work nicely in 2d 3d ..., inverse-distance weighting is smooth and local, and the k= number of nearest neighbours can be varied to tradeoff speed / accuracy.

    0 讨论(0)
  • 2020-12-01 02:06

    There is a nice inverse distance example by Roger Veciana i Rovira along with some code using GDAL to write to geotiff if you're into that.

    This is of coarse to a regular grid, but assuming you project the data first to a pixel grid with pyproj or something, all the while being careful what projection is used for your data.

    A copy of his algorithm with test:

    from math import pow  
    from math import sqrt  
    import numpy as np  
    import matplotlib.pyplot as plt  
    
    def pointValue(x,y,power,smoothing,xv,yv,values):  
        nominator=0  
        denominator=0  
        for i in range(0,len(values)):  
            dist = sqrt((x-xv[i])*(x-xv[i])+(y-yv[i])*(y-yv[i])+smoothing*smoothing);  
            #If the point is really close to one of the data points, return the data point value to avoid singularities  
            if(dist<0.0000000001):  
                return values[i]  
            nominator=nominator+(values[i]/pow(dist,power))  
            denominator=denominator+(1/pow(dist,power))  
        #Return NODATA if the denominator is zero  
        if denominator > 0:  
            value = nominator/denominator  
        else:  
            value = -9999  
        return value  
    
    def invDist(xv,yv,values,xsize=100,ysize=100,power=2,smoothing=0):  
        valuesGrid = np.zeros((ysize,xsize))  
        for x in range(0,xsize):  
            for y in range(0,ysize):  
                valuesGrid[y][x] = pointValue(x,y,power,smoothing,xv,yv,values)  
        return valuesGrid  
    
    
    if __name__ == "__main__":  
        power=1  
        smoothing=20  
    
        #Creating some data, with each coodinate and the values stored in separated lists  
        xv = [10,60,40,70,10,50,20,70,30,60]  
        yv = [10,20,30,30,40,50,60,70,80,90]  
        values = [1,2,2,3,4,6,7,7,8,10]  
    
        #Creating the output grid (100x100, in the example)  
        ti = np.linspace(0, 100, 100)  
        XI, YI = np.meshgrid(ti, ti)  
    
        #Creating the interpolation function and populating the output matrix value  
        ZI = invDist(xv,yv,values,100,100,power,smoothing)  
    
    
        # Plotting the result  
        n = plt.normalize(0.0, 100.0)  
        plt.subplot(1, 1, 1)  
        plt.pcolor(XI, YI, ZI)  
        plt.scatter(xv, yv, 100, values)  
        plt.title('Inv dist interpolation - power: ' + str(power) + ' smoothing: ' + str(smoothing))  
        plt.xlim(0, 100)  
        plt.ylim(0, 100)  
        plt.colorbar()  
    
        plt.show() 
    
    0 讨论(0)
  • 2020-12-01 02:17

    Am I right in thinking your data grids look something like this (red is the old data, blue is the new interpolated data)?

    alt text http://www.geekops.co.uk/photos/0000-00-02%20%28Forum%20images%29/DataSeparation.png

    This might be a slightly brute-force-ish approach, but what about rendering your existing data as a bitmap (opengl will do simple interpolation of colours for you with the right options configured and you could render the data as triangles which should be fairly fast). You could then sample pixels at the locations of the new points.

    Alternatively, you could sort your first set of points spatially and then find the closest old points surrounding your new point and interpolate based on the distances to those points.

    0 讨论(0)
  • 2020-12-01 02:20

    There's a bunch of options here, which one is best will depend on your data... However I don't know of an out-of-the-box solution for you

    You say your input data is from tripolar data. There are three main cases for how this data could be structured.

    1. Sampled from a 3d grid in tripolar space, projected back to 2d LAT, LON data.
    2. Sampled from a 2d grid in tripolar space, projected into 2d LAT LON data.
    3. Unstructured data in tripolar space projected into 2d LAT LON data

    The easiest of these is 2. Instead of interpolating in LAT LON space, "just" transform your point back into the source space and interpolate there.

    Another option that works for 1 and 2 is to search for the cells that maps from tripolar space to cover your sample point. (You can use a BSP or grid type structure to speed up this search) Pick one of the cells, and interpolate inside it.

    Finally there's a heap of unstructured interpolation options .. but they tend to be slow. A personal favourite of mine is to use a linear interpolation of the nearest N points, finding those N points can again be done with gridding or a BSP. Another good option is to Delauney triangulate the unstructured points and interpolate on the resulting triangular mesh.

    Personally if my mesh was case 1, I'd use an unstructured strategy as I'd be worried about having to handle searching through cells with overlapping projections. Choosing the "right" cell would be difficult.

    0 讨论(0)
  • 2020-12-01 02:23

    There is a FORTRAN library called BIVAR, which is very suitable for this problem. With a few modifications you can make it usable in python using f2py.

    From the description:

    BIVAR is a FORTRAN90 library which interpolates scattered bivariate data, by Hiroshi Akima.

    BIVAR accepts a set of (X,Y) data points scattered in 2D, with associated Z data values, and is able to construct a smooth interpolation function Z(X,Y), which agrees with the given data, and can be evaluated at other points in the plane.

    0 讨论(0)
提交回复
热议问题