forDataAtCoordinateAndResolution(coordinate, resolution, callback, request) {
    if (this.tileGrid) {
      const z = this.tileGrid.getZForResolution(resolution, this.zDirection);
      const tileCoord = this.tileGrid.getTileCoordForCoordAndZ(coordinate, z);
      const tile = /** @type {!CustomTile} */ (
        this.getTile(
          tileCoord[0],
          tileCoord[1],
          tileCoord[2],
          1,
          this.getProjection(),
        )
      );
      if (tile.getState() == TileState.IDLE) {
        tile.load();
      }
      tile.forDataAtCoordinate(coordinate, callback, request);
    } else {
      if (request === true) {
        setTimeout(function () {
          callback(null);
        }, 0);
      } else {
        callback(null);
      }
    }
  }
Calls the callback (synchronously by default) with the available data
for given coordinate and resolution (or `null` if not yet loaded or
in case of an error).
@param {import("../coordinate.js").Coordinate} coordinate Coordinate.
@param {number} resolution Resolution.
@param {function(*): void} callback Callback.
@param {boolean} [request] If `true` the callback is always async.
                              The tile data is requested if not yet loaded.
@api