docs: def execute(self, eopatch, seed=None):
          """ Execute random spatial sampling of time-series stored in the input eopatch
  
          :param eopatch: Input eopatch to be sampled
          :type eopatch: EOPatch
          :param seed: Setting seed of random sampling. If None no seed will be used.
          :type seed: int or None
          :return: An EOPatch with spatially sampled temporal features and associated labels
          :type eopatch: EOPatch
          """
          np.random.seed(seed)
  
          # Retrieve data and raster label image from eopatch
          f_type, f_name = next(self.ref_mask_feature(eopatch))
          raster = eopatch[f_type][f_name]
  
          # Initialise sampler
          sampler = PointRasterSampler(self.ref_labels, **self.sampling_params)
          # Perform sampling
          rows, cols = sampler.sample(raster, n_samples=self.n_samples)
  
          if self.return_new_eopatch:
              new_eopatch = EOPatch()
              new_eopatch.timestamp = eopatch.timestamp[:]
              new_eopatch.bbox = eopatch.bbox  # Should be copied
              new_eopatch.meta_info = eopatch.meta_info.copy()  # Should be deep copied - implement this in core
          else:
              new_eopatch = eopatch
  
          # Add sampled features
          for feature_type, feature_name, new_feature_name in self.sample_features(eopatch):
  
              if feature_type.is_time_dependent():
                  sampled_data = eopatch[feature_type][feature_name][:, rows, cols, :]
              else:
                  sampled_data = eopatch[feature_type][feature_name][rows, cols, :]
              new_eopatch[feature_type][new_feature_name] = sampled_data[..., np.newaxis, :]
  
          return new_eopatch