Well, as @Matteo Fischetti has said in the comments to your question, your case of multiple "easy" secondary level problems is definitely more tractible than multiple levels. Even in a continuous linear case, you go one level higher in the polynomial hierarchy as you increase the number of levels .
But having multiple "easy" problems is not a complete ...
Some tools provide facilities for specifying and solving bilevel optimization problems. GAMS and Pyomo come to mind. See e.g. Modeling Bilevel Programs in Pyomo.
Otherwise, a standard approach for continuous bilevel problems is to formulate the first-order (or KKT) conditions for the inner problem and add these as constraints to the outer problem.
Following is a possible way of its implementation:
First, you define a function that takes an OD matrix, solves the GUROBI model, and returns the optimal locations.
// This part will prepare the gurobi model and change the parameters related to OD matrix
// Solve the model and return locations