def interpolate_raster_vector_points(R, V, name=None): """Interpolate from raster layer to point data Input R: Raster data set (grid) V: Vector data set (points) name: Name for new attribute. If None (default) the name of R is used Output I: Vector data set; points located as V with values interpolated from R """ msg = ('There are no data points to interpolate to. Perhaps zoom out ' 'and try again') verify(len(V) > 0, msg) # Input checks verify(R.is_raster) verify(V.is_vector) verify(V.is_point_data) # Get raster data and corresponding x and y axes A = R.get_data(nan=True) longitudes, latitudes = R.get_geometry() verify(len(longitudes) == A.shape[1]) verify(len(latitudes) == A.shape[0]) # Get vector point geometry as Nx2 array coordinates = numpy.array(V.get_geometry(), dtype='d', copy=False) # Interpolate and create new attribute N = len(V) attributes = [] if name is None: name = R.get_name() values = interpolate_raster(longitudes, latitudes, A, coordinates, mode='linear') # Create list of dictionaries for this attribute and return for i in range(N): attributes.append({name: values[i]}) return Vector(data=attributes, projection=V.get_projection(), geometry=coordinates)
def test_interpolation_raster_data(self): """Interpolation library works for raster data This shows interpolation of data arranged with latitudes bottom - up and longitudes left - right """ # Create test data lon_ul = 100 # Longitude of upper left corner lat_ul = 10 # Latitude of upper left corner numlon = 8 # Number of longitudes numlat = 5 # Number of latitudes dlon = 1 dlat = -1 # Define array where latitudes are rows and longitude columns A = numpy.zeros((numlat, numlon)) # Establish coordinates for lower left corner lat_ll = lat_ul - numlat lon_ll = lon_ul # Define pixel centers along each direction longitudes = numpy.linspace(lon_ll + 0.5, lon_ll + numlon - 0.5, numlon) latitudes = numpy.linspace(lat_ll + 0.5, lat_ll + numlat - 0.5, numlat) # Define raster with latitudes going bottom-up (south to north). # Longitudes go left-right (west to east) for i in range(numlat): for j in range(numlon): A[numlat - 1 - i, j] = linear_function(longitudes[j], latitudes[i]) # Then test that interpolated points are correct xis = numpy.linspace(lon_ll + 1, lon_ll + numlon - 1, 100) etas = numpy.linspace(lat_ll + 1, lat_ll + numlat - 1, 100) points = combine_coordinates(xis, etas) vals = interpolate_raster(longitudes, latitudes, A, points, mode='linear') refs = linear_function(points[:, 0], points[:, 1]) assert numpy.allclose(vals, refs, rtol=1e-12, atol=1e-12)