def interpolate(self, raster: Union[(Raster, List[Raster])], method: Literal[('spline', 'linear', 'nearest')]='spline', nprocs: Optional[int]=None, info_out_path: Union[(pathlib.Path, str, None)]=None, filter_by_shape: bool=False) -> None:
    "Interplate values from raster inputs to the mesh nodes.\n\n        Parameters\n        ----------\n        raster : Raster or list of Raster\n            A single or a list of rasters from which values are\n            interpolated onto the mesh\n        method : {'spline', 'linear', 'nearest'}, default='spline'\n            Method of interpolation.\n        nprocs : int or None, default=None\n            Number of workers to use when interpolating data.\n        info_out_path : pathlike or str or None\n            Path for the output node interpolation information file\n        filter_by_shape : bool\n            Flag for node filtering based on raster bbox or shape\n\n        Returns\n        -------\n        None\n        "
    if isinstance(raster, Raster):
        raster = [raster]
    nprocs = ((- 1) if (nprocs is None) else nprocs)
    nprocs = (cpu_count() if (nprocs == (- 1)) else nprocs)
    if (nprocs > 1):
        with Pool(processes=nprocs) as pool:
            res = pool.starmap(_mesh_interpolate_worker, [(self.vert2['coord'], self.crs, _raster.tmpfile, _raster.chunk_size, method, filter_by_shape) for _raster in raster])
        pool.join()
    else:
        res = [_mesh_interpolate_worker(self.vert2['coord'], self.crs, _raster.tmpfile, _raster.chunk_size, method, filter_by_shape) for _raster in raster]
    values = self.msh_t.value.flatten()
    interp_info_map = {}
    for ((mask, _values), rast) in zip(res, raster):
        values[mask] = _values
        if (info_out_path is not None):
            vert_cs = None
            rast_crs = rast.crs
            if rast_crs.is_vertical:
                if (rast_crs.sub_crs_list is not None):
                    for sub_crs in rast_crs.sub_crs_list:
                        if sub_crs.is_vertical:
                            vert_cs = sub_crs
                elif (rast_crs.source_crs is not None):
                    if rast_crs.source_crs.is_vertical:
                        vert_cs = rast_crs.source_crs
            vert_cs_name = vert_cs.name
            idxs = np.argwhere(mask).ravel()
            interp_info_map.update({idx: (rast.path, vert_cs_name) for idx in idxs})
    if (info_out_path is not None):
        coords = self.msh_t.vert2['coord'].copy()
        geo_coords = coords.copy()
        if (not self.crs.is_geographic):
            transformer = Transformer.from_crs(self.crs, CRS.from_epsg(4326), always_xy=True)
            (geo_coords[:, 0], geo_coords[:, 1]) = transformer.transform(coords[:, 0], coords[:, 1])
        vd_idxs = np.array(list(interp_info_map.keys()))
        df_interp_info = pd.DataFrame(index=vd_idxs, data={'x': coords[(vd_idxs, 0)], 'y': coords[(vd_idxs, 1)], 'lat': geo_coords[(vd_idxs, 0)], 'lon': geo_coords[(vd_idxs, 1)], 'elev': values[vd_idxs], 'crs': [i[1] for i in interp_info_map.values()], 'source': [i[0] for i in interp_info_map.values()]})
        df_interp_info.sort_index().to_csv(info_out_path, header=False, index=True)
    self.msh_t.value = np.array(values.reshape((values.shape[0], 1)), dtype=jigsaw_msh_t.REALS_t)
Interplate values from raster inputs to the mesh nodes.

Parameters
----------
raster : Raster or list of Raster
    A single or a list of rasters from which values are
    interpolated onto the mesh
method : {'spline', 'linear', 'nearest'}, default='spline'
    Method of interpolation.
nprocs : int or None, default=None
    Number of workers to use when interpolating data.
info_out_path : pathlike or str or None
    Path for the output node interpolation information file
filter_by_shape : bool
    Flag for node filtering based on raster bbox or shape

Returns
-------
None
def interpolate(self, raster: Union[(Raster, List[Raster])], method: Literal[('spline', 'linear', 'nearest')]='spline', nprocs: Optional[int]=None, info_out_path: Union[(pathlib.Path, str, None)]=None, filter_by_shape: bool=False) -> None:
    "Interplate values from raster inputs to the mesh nodes.\n\n        Parameters\n        ----------\n        raster : Raster or list of Raster\n            A single or a list of rasters from which values are\n            interpolated onto the mesh\n        method : {'spline', 'linear', 'nearest'}, default='spline'\n            Method of interpolation.\n        nprocs : int or None, default=None\n            Number of workers to use when interpolating data.\n        info_out_path : pathlike or str or None\n            Path for the output node interpolation information file\n        filter_by_shape : bool\n            Flag for node filtering based on raster bbox or shape\n\n        Returns\n        -------\n        None\n        "
    if isinstance(raster, Raster):
        raster = [raster]
    nprocs = ((- 1) if (nprocs is None) else nprocs)
    nprocs = (cpu_count() if (nprocs == (- 1)) else nprocs)
    if (nprocs > 1):
        with Pool(processes=nprocs) as pool:
            res = pool.starmap(_mesh_interpolate_worker, [(self.vert2['coord'], self.crs, _raster.tmpfile, _raster.chunk_size, method, filter_by_shape) for _raster in raster])
        pool.join()
    else:
        res = [_mesh_interpolate_worker(self.vert2['coord'], self.crs, _raster.tmpfile, _raster.chunk_size, method, filter_by_shape) for _raster in raster]
    values = self.msh_t.value.flatten()
    interp_info_map = {}
    for ((mask, _values), rast) in zip(res, raster):
        values[mask] = _values
        if (info_out_path is not None):
            vert_cs = None
            rast_crs = rast.crs
            if rast_crs.is_vertical:
                if (rast_crs.sub_crs_list is not None):
                    for sub_crs in rast_crs.sub_crs_list:
                        if sub_crs.is_vertical:
                            vert_cs = sub_crs
                elif (rast_crs.source_crs is not None):
                    if rast_crs.source_crs.is_vertical:
                        vert_cs = rast_crs.source_crs
            vert_cs_name = vert_cs.name
            idxs = np.argwhere(mask).ravel()
            interp_info_map.update({idx: (rast.path, vert_cs_name) for idx in idxs})
    if (info_out_path is not None):
        coords = self.msh_t.vert2['coord'].copy()
        geo_coords = coords.copy()
        if (not self.crs.is_geographic):
            transformer = Transformer.from_crs(self.crs, CRS.from_epsg(4326), always_xy=True)
            (geo_coords[:, 0], geo_coords[:, 1]) = transformer.transform(coords[:, 0], coords[:, 1])
        vd_idxs = np.array(list(interp_info_map.keys()))
        df_interp_info = pd.DataFrame(index=vd_idxs, data={'x': coords[(vd_idxs, 0)], 'y': coords[(vd_idxs, 1)], 'lat': geo_coords[(vd_idxs, 0)], 'lon': geo_coords[(vd_idxs, 1)], 'elev': values[vd_idxs], 'crs': [i[1] for i in interp_info_map.values()], 'source': [i[0] for i in interp_info_map.values()]})
        df_interp_info.sort_index().to_csv(info_out_path, header=False, index=True)
    self.msh_t.value = np.array(values.reshape((values.shape[0], 1)), dtype=jigsaw_msh_t.REALS_t)